Changeset 2040
- Timestamp:
- 06/17/09 14:56:26 (9 months ago)
- Location:
- branches/0.9/pylucid_project
- Files:
-
- 9 modified
-
apps/pylucid/admin.py (modified) (8 diffs)
-
apps/pylucid/models.py (modified) (10 diffs)
-
apps/pylucid/shortcuts.py (modified) (2 diffs)
-
apps/pylucid/system/auto_model_info.py (modified) (4 diffs)
-
apps/pylucid_update/views.py (modified) (10 diffs)
-
pylucid_plugins/page_admin/views.py (modified) (1 diff)
-
pylucid_plugins/redirect/admin.py (modified) (1 diff)
-
tests/test_tools/basetest.py (modified) (1 diff)
-
tests/test_tools/pylucid_test_data.py (modified) (20 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/0.9/pylucid_project/apps/pylucid/admin.py
r2038 r2040 25 25 26 26 from pylucid import models 27 from pylucid.system.auto_model_info import UpdateInfoBaseAdmin28 27 29 28 #_____________________________________________________________________________ … … 52 51 53 52 54 class PageTreeAdmin( UpdateInfoBaseAdmin,VersionAdmin):53 class PageTreeAdmin(VersionAdmin): 55 54 #prepopulated_fields = {"slug": ("title",)} 56 55 … … 73 72 74 73 75 class PageMetaAdmin( UpdateInfoBaseAdmin,VersionAdmin):74 class PageMetaAdmin(VersionAdmin): 76 75 list_display = ("title_or_slug", "get_absolute_url", "get_site", "lastupdatetime", "lastupdateby",) 77 76 list_display_links = ("title_or_slug", "get_absolute_url") … … 83 82 84 83 85 class PageContentAdmin( UpdateInfoBaseAdmin,VersionAdmin):84 class PageContentAdmin(VersionAdmin): 86 85 list_display = ("title_or_slug", "get_absolute_url", "get_site", "lastupdatetime", "lastupdateby",) 87 86 list_display_links = ("title_or_slug", "get_absolute_url") … … 93 92 94 93 95 class PluginPageAdmin( UpdateInfoBaseAdmin,VersionAdmin):94 class PluginPageAdmin(VersionAdmin): 96 95 list_display = ( 97 96 "get_plugin_name", "get_absolute_url", "app_label", "get_site", "lastupdatetime", "lastupdateby", … … 105 104 106 105 107 class DesignAdmin( UpdateInfoBaseAdmin,VersionAdmin):106 class DesignAdmin(VersionAdmin): 108 107 list_display = ("name", "template", "lastupdatetime", "lastupdateby") 109 108 list_display_links = ("name",) … … 114 113 115 114 116 class EditableHtmlHeadFileAdmin( UpdateInfoBaseAdmin,VersionAdmin):115 class EditableHtmlHeadFileAdmin(VersionAdmin): 117 116 list_display = ("filepath", "description", "lastupdatetime", "lastupdateby") 118 117 list_display_links = ("filepath", "description") … … 122 121 123 122 124 class UserProfileAdmin( UpdateInfoBaseAdmin,VersionAdmin):123 class UserProfileAdmin(VersionAdmin): 125 124 list_display = ("user", "site_info", "lastupdatetime", "lastupdateby") 126 125 list_display_links = ("user",) -
branches/0.9/pylucid_project/apps/pylucid/models.py
r2038 r2040 40 40 from pylucid_project.utils import crypt 41 41 42 from pylucid.system.auto_model_info import UpdateInfoBaseModel , UpdateInfoBaseModelManager42 from pylucid.system.auto_model_info import UpdateInfoBaseModel 43 43 from pylucid.system import headfile 44 45 46 class PageTreeManager(UpdateInfoBaseModelManager): 44 from pylucid.shortcuts import user_message_or_warn 45 46 47 class PageTreeManager(models.Manager): 47 48 """ 48 49 Manager class for PageTree model 49 50 50 inherited from UpdateInfoBaseModelManager:51 inherited from models.Manager: 51 52 get_or_create() method, witch expected a request object as the first argument. 52 53 """ … … 352 353 353 354 354 class PageContentManager( UpdateInfoBaseModelManager):355 class PageContentManager(models.Manager): 355 356 """ 356 357 Manager class for PageContent model 357 358 358 inherited from UpdateInfoBaseModelManager:359 inherited from models.Manager: 359 360 get_or_create() method, witch expected a request object as the first argument. 360 361 """ … … 434 435 #------------------------------------------------------------------------------ 435 436 437 class DesignManager(models.Manager): 438 pass 439 436 440 class Design(UpdateInfoBaseModel): 437 441 """ … … 444 448 lastupdateby -> ForeignKey to user who has edited this entry 445 449 """ 450 objects = DesignManager() 451 446 452 site = models.ManyToManyField(Site, default=[settings.SITE_ID]) 447 453 on_site = CurrentSiteManager() … … 468 474 #------------------------------------------------------------------------------ 469 475 470 class EditableHtmlHeadFileManager( UpdateInfoBaseModelManager):476 class EditableHtmlHeadFileManager(models.Manager): 471 477 def get_HeadfileLink(self, filename): 472 478 """ … … 518 524 f.close() 519 525 except Exception, err: 520 warnings.warn("Can't cache EditableHtmlHeadFile into %r: %s" % (cachepath, err))526 user_message_or_warn("Can't cache EditableHtmlHeadFile into %r: %s" % (cachepath, err)) 521 527 else: 522 528 if settings.DEBUG: 523 warnings.warn("EditableHtmlHeadFile cached successful into: %r" % cachepath)529 user_message_or_warn("EditableHtmlHeadFile cached successful into: %r" % cachepath) 524 530 525 531 def get_absolute_url(self): … … 591 597 ) 592 598 593 def set_sha_login_password(self, r equest, raw_password):599 def set_sha_login_password(self, raw_password): 594 600 """ 595 601 create salt+checksum for JS-SHA-Login. … … 600 606 self.sha_login_salt = salt 601 607 self.sha_login_checksum = sha_checksum 602 request.user.message_set.create( 603 message="SHA Login salt+checksum created for user '%s'." % self.user 604 ) 608 user_message_or_warn("SHA Login salt+checksum created for user '%s'." % self.user) 605 609 606 610 def __unicode__(self): … … 622 626 """ signal handler: creating user profile, after a new user created. """ 623 627 user = kwargs["instance"] 624 request = ThreadLocal.get_current_request() 625 626 userprofile, created = UserProfile.objects.get_or_create(request, user=user) 628 629 userprofile, created = UserProfile.objects.get_or_create(user=user) 627 630 if created: 628 request.user.message_set.create(message="UserProfile entry for user '%s' created." % user)629 631 user_message_or_warn("UserProfile entry for user '%s' created." % user) 632 630 633 if not user.is_superuser: # Info: superuser can automaticly access all sites 631 634 site = Site.objects.get_current() 632 635 userprofile.site.add(site) 633 request.user.message_set.create( 634 message="Add site '%s' to '%s' UserProfile." % (site.name, user) 635 ) 636 user_message_or_warn("Add site '%s' to '%s' UserProfile." % (site.name, user)) 636 637 637 638 signals.post_save.connect(create_user_profile, sender=User) … … 660 661 661 662 user_profile = user.get_profile() 662 request = ThreadLocal.get_current_request()663 663 664 664 # Save the password for the JS-SHA-Login: 665 user_profile.set_sha_login_password(r equest, raw_password)666 user_profile.save( request)665 user_profile.set_sha_login_password(raw_password) 666 user_profile.save() 667 667 668 668 -
branches/0.9/pylucid_project/apps/pylucid/shortcuts.py
r2037 r2040 18 18 """ 19 19 20 import warnings 21 20 22 from django import http 21 23 from django.conf import settings 24 from django.contrib.auth.models import User 22 25 from django.shortcuts import render_to_response 23 26 from django.template.loader import render_to_string 27 28 from django_tools.middlewares import ThreadLocal 29 24 30 25 31 def render_pylucid_response(request, template_name, context, **kwargs): … … 59 65 # the PyLucid context middleware pylucid_plugin.extrahead.context_middleware 60 66 return response_content 67 68 69 70 71 72 73 def user_message_or_warn(msg): 74 """ Display a message with user.message_set.create if available or use warnings.warn """ 75 user = ThreadLocal.get_current_user() 76 if user and isinstance(user, User): 77 user.message_set.create(message=msg) 78 else: 79 warnings.warn(msg) 80 81 82 def page_msg_or_warn(msg): 83 """ Display a message with request.page_msg if available or use warnings.warn """ 84 request = ThreadLocal.get_current_request() 85 if request: 86 request.page_msg(msg) 87 else: 88 warnings.warn(msg) -
branches/0.9/pylucid_project/apps/pylucid/system/auto_model_info.py
r1971 r2040 19 19 20 20 import sys 21 import warnings 21 22 22 23 from django.db import models … … 26 27 from django.db import transaction, IntegrityError 27 28 28 29 class UpdateInfoBaseAdmin(admin.ModelAdmin): 30 """ 31 Base class for all models witch use UpdateInfoBaseModel(): 32 The save method need the request object as the first argument (For automatic update user ForeignKey). 33 Add request object to save() methods witch used in the django admin site. 34 See also: http://code.djangoproject.com/wiki/CookBookNewformsAdminAndUser 35 """ 36 def save_model(self, request, obj, form, change): 37 instance = form.save(commit=False) 38 instance.save(request) 39 form.save_m2m() 40 return instance 41 42 # def save_formset(self, request, form, formset, change): 43 # def set_user(instance): 44 # instance.user = request.user 45 # instance.save() 46 # 47 # if formset.model == Comment: 48 # instances = formset.save(commit=False) 49 # map(set_user, instances) 50 # formset.save_m2m() 51 # return instances 52 # else: 53 # return formset.save() 54 55 #------------------------------------------------------------------------------ 56 57 def _get_request_from_args(args): 58 """ 59 Helper function for getting the request object from the method arguments. 60 Add a better traceback message if not requets object are in the method arguments. 61 62 Used in UpdateInfoBaseModelManager().get_or_create() and UpdateInfoBaseModel().save() 63 returns the request object and the args without the request object. 64 """ 65 args = list(args) # convert tuple into list, so we can pop the first argument out. 66 67 try: 68 request = args.pop(0) 69 except IndexError, err: 70 # insert more information into the traceback 71 etype, evalue, etb = sys.exc_info() 72 # FIXME: How can we insert the original called method name? 73 evalue = etype('Method needs request object as first argument!') 74 raise etype, evalue, etb 75 76 assert isinstance(request, HttpRequest), \ 77 "First argument must be the request object! (It's type: %s)" % type(request) 78 79 assert isinstance(request.user, User) 80 81 return request, args 82 83 84 85 class UpdateInfoBaseModelManager(models.Manager): 86 def get_or_create(self, *args, **kwargs): 87 """ 88 Same as django.db.models.query.QuerySet().get_or_create(), but here the first 89 method argument must be the request object for passing it to the save() method. 90 (For automatic update user ForeignKey in all UpdateInfoBaseModel's) 91 """ 92 assert kwargs, \ 93 'get_or_create() must be passed at least one keyword argument' 94 95 # pop the request object from the arguments, insert a helpfull information in 96 # the traceback, if the request object is not the first argument 97 request, args = _get_request_from_args(args) 98 99 defaults = kwargs.pop('defaults', {}) 100 101 try: 102 return self.get(**kwargs), False 103 except self.model.DoesNotExist: 104 try: 105 params = dict([(k, v) for k, v in kwargs.items() if '__' not in k]) 106 params.update(defaults) 107 obj = self.model(**params) 108 sid = transaction.savepoint() 109 obj.save(request, force_insert=True) 110 transaction.savepoint_commit(sid) 111 return obj, True 112 except IntegrityError, e: 113 transaction.savepoint_rollback(sid) 114 try: 115 return self.get(**kwargs), False 116 except self.model.DoesNotExist: 117 raise e 29 from django_tools.middlewares import ThreadLocal 118 30 119 31 … … 125 37 126 38 Important: Every own objects manager should be inherit from UpdateInfoBaseModelManager! 127 """ 128 objects = UpdateInfoBaseModelManager() 129 39 """ 130 40 createtime = models.DateTimeField(auto_now_add=True, help_text="Create time",) 131 41 lastupdatetime = models.DateTimeField(auto_now=True, help_text="Time of the last change.",) 42 132 43 createby = models.ForeignKey(User, editable=False, related_name="%(class)s_createby", 44 null=True, blank=True, # <- If the model used outsite a real request (e.g. unittest, db shell) 133 45 help_text="User how create the current page.",) 134 46 lastupdateby = models.ForeignKey(User, editable=False, related_name="%(class)s_lastupdateby", 47 null=True, blank=True, # <- If the model used outsite a real request (e.g. unittest, db shell) 135 48 help_text="User as last edit the current page.",) 136 49 … … 139 52 Automatic update createby and lastupdateby attributes with the request object witch must be 140 53 the first argument. 141 """ 142 # pop the request object from the arguments, insert a helpfull information in 143 # the traceback, if the request object is not the first argument: 144 request, args = _get_request_from_args(args) 54 """ 55 current_user = ThreadLocal.get_current_user() 145 56 146 try: 147 current_user = request.user 148 except AttributeError, err: 149 # insert more information into the traceback 150 etype, evalue, etb = sys.exc_info() 151 # FIXME: How can we insert the original called method name? 152 evalue = etype('request object has no user object!? (Original error: %s)' % err) 153 raise etype, evalue, etb 154 155 if self.pk == None or kwargs.get("force_insert", False): # New model entry 156 self.createby = current_user 157 self.lastupdateby = current_user 57 if current_user and isinstance(current_user, User): 58 if self.pk == None or kwargs.get("force_insert", False): # New model entry 59 self.createby = current_user 60 self.lastupdateby = current_user 61 158 62 return super(UpdateInfoBaseModel, self).save(*args, **kwargs) 159 63 -
branches/0.9/pylucid_project/apps/pylucid_update/views.py
r2034 r2040 43 43 sha_login_salt = old_entry.salt 44 44 45 userprofile, created = UserProfile.objects.get_or_create( request,45 userprofile, created = UserProfile.objects.get_or_create( 46 46 user = user, 47 47 defaults = { … … 81 81 cssfiles = {} 82 82 for style in Style08.objects.all(): 83 new_staticfile, created = EditableHtmlHeadFile.objects.get_or_create( request,83 new_staticfile, created = EditableHtmlHeadFile.objects.get_or_create( 84 84 filepath = settings.SITE_TEMPLATE_PREFIX + style.name + ".css", 85 85 defaults = { … … 119 119 new_design_name = "%s + %s" % (old_page.template.name, old_page.style.name) 120 120 121 design, created = Design.objects.get_or_create( request,121 design, created = Design.objects.get_or_create( 122 122 name = new_design_name, 123 123 defaults = { … … 143 143 parent = page_dict[old_page.parent.id] 144 144 145 tree_entry, created = PageTree.objects.get_or_create( request,145 tree_entry, created = PageTree.objects.get_or_create( 146 146 site = site, 147 147 slug = old_page.shortcut, … … 163 163 ) 164 164 if created: 165 tree_entry.save( request)165 tree_entry.save() 166 166 out.write("PageTree entry '%s' created." % tree_entry.slug) 167 167 else: … … 173 173 # create/get PageMeta entry 174 174 175 pagemeta_entry, created = PageMeta.objects.get_or_create( request,175 pagemeta_entry, created = PageMeta.objects.get_or_create( 176 176 page = tree_entry, 177 177 lang = language, … … 189 189 ) 190 190 if created: 191 pagemeta_entry.save( request)191 pagemeta_entry.save() 192 192 out.write("PageMeta entry '%s' - '%s' created." % (language, tree_entry.slug)) 193 193 else: … … 197 197 # create/get PageContent entry 198 198 199 content_entry, created = PageContent.objects.get_or_create( request,199 content_entry, created = PageContent.objects.get_or_create( 200 200 page = tree_entry, 201 201 lang = language, … … 212 212 ) 213 213 if created: 214 content_entry.save( request)214 content_entry.save() 215 215 out.write("PageContent entry '%s' - '%s' created." % (language, tree_entry.slug)) 216 216 else: … … 374 374 content = additional_styles + content 375 375 style.content = content 376 style.save( request)376 style.save() 377 377 out.write("additional styles inserted.") 378 378 -
branches/0.9/pylucid_project/pylucid_plugins/page_admin/views.py
r2037 r2040 45 45 new_content = edit_page_form.cleaned_data["content"] 46 46 pagecontent_instance.content = new_content 47 pagecontent_instance.save( request)47 pagecontent_instance.save() 48 48 request.page_msg.successful(_("Page content updated.")) 49 49 return HttpResponseRedirect(request.path) -
branches/0.9/pylucid_project/pylucid_plugins/redirect/admin.py
r1965 r2040 19 19 from django.contrib import admin 20 20 21 from pylucid.system.auto_model_info import UpdateInfoBaseAdmin22 23 21 from redirect.models import RedirectModel 24 22 25 23 #------------------------------------------------------------------------------ 26 24 27 class RedirectModelAdmin( UpdateInfoBaseAdmin):25 class RedirectModelAdmin(admin.ModelAdmin): 28 26 pass 29 27 #prepopulated_fields = {"slug": ("title",)} -
branches/0.9/pylucid_project/tests/test_tools/basetest.py
r2010 r2040 96 96 97 97 #------------------------------------------------------------------------- 98 99 def login(self, usertype): 100 """ 101 Login test user. 102 Add him to the site, otherwise he can't login ;) 103 """ 104 site = Site.objects.get_current() 105 user = self._get_user(usertype="normal") 106 userprofile = user.get_profile() 107 108 if not site in userprofile.site.all(): 109 print "Info: Add user to site %s" % site 110 userprofile.site.add(site) 111 112 ok = self.client.login(username=self.TEST_USERS[usertype]["username"], 113 password=self.TEST_USERS[usertype]["password"]) 114 self.failUnless(ok, "Can't login test user '%s'!" % usertype) 115 return user 98 116 -
branches/0.9/pylucid_project/tests/test_tools/pylucid_test_data.py
r2026 r2040 7 7 os.environ['DJANGO_SETTINGS_MODULE'] = "pylucid_project.settings" 8 8 9 from django.http import HttpRequest9 #from django.http import HttpRequest 10 10 from django.contrib.auth.models import User#, AnonymousUser 11 11 from django.contrib.sites.models import Site# … … 15 15 16 16 from pylucid.models import PageTree, PageMeta, PageContent, PluginPage, Design, \ 17 EditableHtmlHeadFile, Language 17 EditableHtmlHeadFile, Language, UserProfile 18 18 19 19 SITEINFO_TAG = "***unittest siteinfo tag***" … … 200 200 def create_testusers(verbosity): 201 201 """ 202 Create all available testusers .202 Create all available testusers and UserProfiles 203 203 """ 204 204 def create_user(verbosity, username, password, email, is_staff, is_superuser): … … 218 218 if verbosity>=2: 219 219 print "Test user %r created." % user 220 return user 220 221 221 222 for usertype, userdata in TEST_USERS.iteritems(): 222 create_user(verbosity, **userdata)223 user = create_user(verbosity, **userdata) 223 224 224 225 … … 246 247 247 248 248 def create_headfiles(verbosity, headfile_dict, site , request):249 def create_headfiles(verbosity, headfile_dict, site): 249 250 headfile_map = {} 250 251 for filepath, data in headfile_dict.iteritems(): … … 254 255 content = data["content"], 255 256 ) 256 headfile.save( request)257 headfile.save() 257 258 headfile.site.add(site) 258 259 if verbosity>=2: … … 263 264 264 265 265 def create_design(verbosity, design_dict, request,site, template_map, headfile_map):266 def create_design(verbosity, design_dict, site, template_map, headfile_map): 266 267 design_map = {} 267 268 for design_name, data in design_dict.iteritems(): 268 269 template_name = data["template_name"] 269 270 assert template_name in template_map 270 design, created = Design.objects.get_or_create( request,271 design, created = Design.objects.get_or_create( 271 272 name = design_name, defaults = {"template": template_name,} 272 273 ) 273 274 if created: 274 design.save( request)275 design.save() 275 276 design.site.add(site) 276 277 if verbosity>=2: … … 282 283 if verbosity>=2: 283 284 print("Add headfile '%s'." % headfile) 284 design.save( request)285 design.save() 285 286 elif verbosity>=2: 286 287 print("Design '%s' exist." % design_name) … … 298 299 299 300 300 def create_pages(verbosity, request,design_map, site, pages, parent=None):301 def create_pages(verbosity, design_map, site, pages, parent=None): 301 302 design = design_map["unittest_design"] 302 303 for page_data in pages: … … 309 310 page_type = PageTree.PAGE_TYPE 310 311 311 tree_entry, created = PageTree.objects.get_or_create( request,312 tree_entry, created = PageTree.objects.get_or_create( 312 313 site=site, slug=slug, parent=parent, 313 314 defaults={ … … 319 320 if verbosity>=2: 320 321 if created: 321 #tree_entry.save( request)322 #tree_entry.save() 322 323 print("PageTree '%s' created." % url) 323 324 else: … … 330 331 keys = ("title", "description", "keywords") 331 332 ) 332 pagemeta_entry, created = PageMeta.objects.get_or_create( request,333 pagemeta_entry, created = PageMeta.objects.get_or_create( 333 334 page = tree_entry, lang = language, 334 335 defaults = default_dict … … 336 337 if verbosity>=2: 337 338 if created: 338 #pagemeta_entry.save( request)339 #pagemeta_entry.save() 339 340 print("PageMeta '%s' - '%s' created." % (language, tree_entry.slug)) 340 341 else: … … 343 344 if tree_entry.type == PageTree.PLUGIN_TYPE: 344 345 # It's a plugin page 345 pluginpage, created = PluginPage.objects.get_or_create( request,346 pluginpage, created = PluginPage.objects.get_or_create( 346 347 page = tree_entry, 347 348 lang = language, … … 359 360 ) 360 361 default_dict["markup"] = PageContent.MARKUP_CREOLE 361 content_entry, created = PageContent.objects.get_or_create( request,362 content_entry, created = PageContent.objects.get_or_create( 362 363 page = tree_entry, 363 364 lang = language, … … 366 367 ) 367 368 content_entry.content = content_entry.content.replace(SITEINFO_TAG, site.name) 368 content_entry.save( request)369 content_entry.save() 369 370 if verbosity>=2: 370 371 if created: … … 376 377 if verbosity>=2: 377 378 print "--- create sub pages ---" 378 create_pages(verbosity, request,design_map, site,379 create_pages(verbosity, design_map, site, 379 380 pages=page_data["sub-pages"], parent=tree_entry 380 381 ) … … 386 387 387 388 388 def create_test_data( request,site, verbosity):389 def create_test_data(site, verbosity): 389 390 template_map = create_templates(verbosity, TEST_TEMPLATES, site) 390 headfile_map = create_headfiles(verbosity, TEST_HEADFILES, site , request)391 design_map = create_design(verbosity, TEST_DESIGNS, request,site, template_map, headfile_map)391 headfile_map = create_headfiles(verbosity, TEST_HEADFILES, site) 392 design_map = create_design(verbosity, TEST_DESIGNS, site, template_map, headfile_map) 392 393 393 394 # Create PageTree, PageMeta and PageContent in every test language 394 create_pages(verbosity, request,design_map, site, pages=TEST_PAGES)395 396 397 def get_fake_request(usertype):398 """ Create a fake HttpRequest instance. Needed in some UpdateInfoBaseModel save() methods """399 request = HttpRequest()400 request.user = get_user(usertype=usertype)401 return request395 create_pages(verbosity, design_map, site, pages=TEST_PAGES) 396 397 398 #def get_fake_request(usertype): 399 # """ Create a fake HttpRequest instance. Needed in some UpdateInfoBaseModel save() methods """ 400 # request = HttpRequest() 401 # request.user = get_user(usertype=usertype) 402 # return request 402 403 403 404 … … 406 407 if verbosity>=2: 407 408 print "\nCreate complete test data for 'running' PyLucid" 408 409 409 410 create_testusers(verbosity) 410 411 411 request = get_fake_request(usertype="superuser")412 # request = get_fake_request(usertype="superuser") 412 413 413 414 for site in TestSites(verbosity): … … 416 417 print("create test data for site: %r" % site) 417 418 418 create_test_data( request,site, verbosity)419 create_test_data(site, verbosity) 419 420 420 421 if verbosity: