Changeset 2072
- Timestamp:
- 07/03/09 13:33:20 (9 months ago)
- Location:
- branches/0.9/pylucid_project
- Files:
-
- 5 added
- 1 removed
- 12 modified
- 1 moved
-
apps/pylucid/admin.py (modified) (7 diffs)
-
apps/pylucid/models.py (modified) (3 diffs)
-
apps/pylucid/preference_forms.py (modified) (2 diffs)
-
apps/pylucid/system/pylucid_plugin.py (modified) (14 diffs)
-
apps/pylucid/templates/admin/base_site.html (modified) (1 diff)
-
apps/pylucid_admin/app_settings.py (added)
-
apps/pylucid_admin/templates/pylucid_admin/base_site.html (added)
-
apps/pylucid_admin/templates/pylucid_admin/install.html (added)
-
apps/pylucid_admin/urls.py (modified) (1 diff)
-
apps/pylucid_admin/views.py (modified) (2 diffs)
-
pylucid_plugins/extrahead/admin_url.py (deleted)
-
pylucid_plugins/extrahead/__init__.py (modified) (1 diff)
-
pylucid_plugins/page_admin/admin_urls.py (added)
-
pylucid_plugins/page_admin/admin_views.py (moved) (moved from branches/0.9/pylucid_project/pylucid_plugins/extrahead/admin_views.py) (1 diff)
-
pylucid_plugins/redirect/urls.py (modified) (1 diff)
-
pylucid_plugins/__init__.py (modified) (1 diff)
-
settings.py (modified) (1 diff)
-
tests/test_Design.py (modified) (1 diff)
-
utils/pylucid_plugins.py (added)
Legend:
- Unmodified
- Added
- Removed
-
branches/0.9/pylucid_project/apps/pylucid/admin.py
r2059 r2072 19 19 from django.contrib import admin 20 20 from django.conf import settings 21 from django.contrib.auth.models import User 21 from django.contrib.auth.models import User, Permission 22 22 from django.contrib.auth.admin import UserAdmin 23 23 … … 46 46 47 47 UserAdmin.add_view = ugly_patched_add_view 48 48 49 49 50 50 #------------------------------------------------------------------------------ 51 52 class PermissionAdmin(admin.ModelAdmin): 53 """ django auth Permission """ 54 list_display = ("id", "name", "content_type", "codename") 55 list_display_links = ("name", "codename") 56 list_filter = ("content_type",) 57 admin.site.register(Permission, PermissionAdmin) 58 59 #------------------------------------------------------------------------------ 60 61 class PyLucidAdminPageAdmin(VersionAdmin): 62 list_display = ( 63 "id", "get_absolute_url", "slug", "name", "title", "plugin_name", "view_name", 64 ) 65 list_display_links = ("slug", "get_absolute_url") 66 list_filter = ("createby", "lastupdateby",) 67 date_hierarchy = 'lastupdatetime' 68 search_fields = ("slug", "name", "title") 69 70 admin.site.register(models.PyLucidAdminPage, PyLucidAdminPageAdmin) 51 71 52 72 … … 59 79 ) 60 80 list_display_links = ("slug", "get_absolute_url") 61 list_filter = ("site", "type", "design", "createby", "lastupdateby", )81 list_filter = ("site", "type", "design", "createby", "lastupdateby",) 62 82 date_hierarchy = 'lastupdatetime' 63 83 search_fields = ("slug", "description") … … 78 98 date_hierarchy = 'lastupdatetime' 79 99 search_fields = ("description", "keywords") 80 100 81 101 82 102 admin.site.register(models.PageMeta, PageMetaAdmin) … … 116 136 model = models.Color 117 137 118 class ColorSchemeAdmin(VersionAdmin): 138 class ColorSchemeAdmin(VersionAdmin): 119 139 list_display = ("id", "name", "preview", "lastupdatetime", "lastupdateby") 120 140 list_display_links = ("name",) 121 141 search_fields = ("name",) 122 inlines = [ColorInline, ]123 142 inlines = [ColorInline, ] 143 124 144 def preview(self, obj): 125 145 colors = models.Color.objects.all().filter(colorscheme=obj) … … 132 152 preview.short_description = 'color preview' 133 153 preview.allow_tags = True 134 154 135 155 admin.site.register(models.ColorScheme, ColorSchemeAdmin) 136 156 137 157 138 class DesignAdmin(VersionAdmin): 158 class DesignAdmin(VersionAdmin): 139 159 list_display = ("id", "name", "template", "colorscheme", "lastupdatetime", "lastupdateby") 140 160 list_display_links = ("name",) … … 148 168 list_display = ("id", "filepath", "render", "description", "lastupdatetime", "lastupdateby") 149 169 list_display_links = ("filepath", "description") 150 list_filter = ("site", "render")170 list_filter = ("site", "render") 151 171 152 172 admin.site.register(models.EditableHtmlHeadFile, EditableHtmlHeadFileAdmin) -
branches/0.9/pylucid_project/apps/pylucid/models.py
r2071 r2072 47 47 from pylucid.fields import ColorValueField 48 48 from pylucid.system import headfile 49 50 51 52 class TreeBaseModel(models.Model): 53 """ Base tree model used in PyLucidAdminPage and PageTree """ 54 parent = models.ForeignKey("self", null=True, blank=True, help_text="the higher-ranking father page") 55 position = models.SmallIntegerField(default=0, 56 help_text="ordering weight for sorting the pages in the menu.") 57 slug = models.SlugField(unique=False, help_text="(for building URLs)") 58 59 def get_absolute_url(self): 60 """ absolute url *without* language code (without domain/host part) """ 61 if self.parent: 62 parent_shortcut = self.parent.get_absolute_url() 63 return parent_shortcut + self.slug + "/" 64 else: 65 return "/" + self.slug + "/" 66 67 def __unicode__(self): 68 return u"%r tree object (%r)" % (self.slug, self.get_absolute_url()) 69 70 class Meta: 71 abstract = True 72 unique_together = (("slug", "parent"),) 73 74 # FIXME: It would be great if we can order by get_absolute_url() 75 ordering = ("id", "position") 76 77 78 79 class PyLucidAdminPage(TreeBaseModel, UpdateInfoBaseModel): 80 """ 81 PyLucid Admin page tree 82 83 inherited attributes from TreeBaseModel: 84 parent 85 position 86 slug 87 88 inherited attributes from UpdateInfoBaseModel: 89 createtime -> datetime of creation 90 lastupdatetime -> datetime of the last change 91 createby -> ForeignKey to user who creaded this entry 92 lastupdateby -> ForeignKey to user who has edited this entry 93 """ 94 name = models.CharField(blank=True, max_length=150, 95 help_text="Sort page name (for link text in e.g. menu)" 96 ) 97 title = models.CharField(blank=True, max_length=256, 98 help_text="A long page title (for e.g. page title or link title text)" 99 ) 100 plugin_name = models.CharField(max_length=150, help_text="Name of the plugin") 101 view_name = models.CharField(max_length=150, help_text="The view name") 102 103 104 105 49 106 50 107 … … 156 213 157 214 158 class PageTree( UpdateInfoBaseModel):215 class PageTree(TreeBaseModel, UpdateInfoBaseModel): 159 216 """ 160 217 The CMS page tree 218 219 inherited attributes from TreeBaseModel: 220 parent 221 position 222 slug 161 223 162 224 inherited attributes from UpdateInfoBaseModel: … … 182 244 on_site = CurrentSiteManager() 183 245 184 parent = models.ForeignKey("self", null=True, blank=True, help_text="the higher-ranking father page") 185 position = models.SmallIntegerField(default=0, 186 help_text="ordering weight for sorting the pages in the menu.") 187 slug = models.SlugField(unique=False, help_text="(for building URLs)") 246 188 247 description = models.CharField(blank=True, max_length=150, help_text="For internal use") 189 248 -
branches/0.9/pylucid_project/apps/pylucid/preference_forms.py
r1950 r2072 1 1 # coding: utf-8 2 3 import warnings 2 4 3 5 from django import forms … … 5 7 from dbpreferences.forms import DBPreferencesBaseForm 6 8 7 from pylucid.models import Language9 from pylucid.models import PageTree, Design, Language 8 10 9 11 if Language.objects.count() == 0: 10 12 # FIXME: Insert first language 11 13 Language(code="en", description="english").save() 14 warnings.warn("First language 'en' created.") 12 15 13 16 14 17 class SystemPreferencesForm(DBPreferencesBaseForm): 15 18 """ test preferences form """ 19 pylucid_admin_design = forms.ChoiceField( 20 choices=Design.objects.values_list('id', 'name'), 21 required=False, initial=None, 22 help_text="ID of the PyLucid Admin Design.") 23 16 24 lang_code = forms.ChoiceField( 17 25 choices=Language.objects.values_list('code', 'description'), -
branches/0.9/pylucid_project/apps/pylucid/system/pylucid_plugin.py
r2028 r2072 16 16 """ 17 17 18 __version__ = "$Rev:$"18 __version__ = "$Rev:$" 19 19 20 20 import re 21 21 import sys 22 import warnings 22 23 23 24 from django import http … … 36 37 """ 37 38 """ 39 warnings.warn("TODO: Move into utils.pylucid_plugins!") 40 38 41 # callback is either a string like 'foo.views.news.stories.story_detail' 39 42 callback = "pylucid_plugins.%s.views.%s" % (plugin_name, method_name) … … 42 45 except (ImportError, AttributeError), err: 43 46 raise GetCallableError(err) 44 47 45 48 # Add info for pylucid_project.apps.pylucid.context_processors.pylucid 46 49 request.plugin_name = plugin_name 47 50 request.method_name = method_name 48 51 49 52 # call the plugin view method 50 53 response = callable(request, **method_kwargs) 51 54 52 55 return response 53 56 … … 74 77 evalue = etype('Error rendering plugin view "%s.%s": %s' % (plugin_name, method_name, evalue)) 75 78 raise etype, evalue, etb 76 79 77 80 return response 78 81 … … 92 95 """ Call a plugin and return the response. """ 93 96 lang_entry = request.PYLUCID.lang_entry 94 97 95 98 # Get the information witch django app would be used 96 99 pluginpage = PluginPage.objects.get(page=request.PYLUCID.pagetree, lang=lang_entry) 97 100 app_label = pluginpage.app_label 98 101 plugin_urlconf_name = app_label + ".urls" 99 102 100 103 # Get the urlpatterns from the plugin urls.py 101 104 plugin_urlpatterns = import_module(plugin_urlconf_name).urlpatterns 102 105 103 106 # build the url prefix 104 107 prefix = "^%s/%s" % (lang_entry.code, prefix_url) … … 109 112 urlpatterns2 = patterns('', url(prefix, [plugin_urlpatterns])) 110 113 #print urlpatterns2 111 114 112 115 # Append projects own url patterns, so the plugin can reverse url from them, too. 113 116 current_urlpatterns = import_module(settings.ROOT_URLCONF).urlpatterns 114 117 urlpatterns2 += current_urlpatterns 115 118 116 119 # Make a own url resolver 117 120 resolver = urlresolvers.RegexURLResolver(r'^/', urlpatterns2) 118 121 119 122 #for key in resolver.reverse_dict: 120 123 # print key, resolver.reverse_dict[key] … … 125 128 if result == None: 126 129 _raise_resolve_error(prefix, plugin_urlpatterns, rest_url) 127 130 128 131 view_func, view_args, view_kwargs = result 129 132 … … 132 135 # FIXME: How can we better check, if the view is from the plugin and not from PyLucid??? 133 136 _raise_resolve_error(prefix, plugin_urlpatterns, rest_url) 134 137 135 138 # Patch urlresolvers.get_resolver() function, so only our own resolver with urlpatterns2 136 139 # is active in the plugin. So the plugin can build urls with normal django function and … … 138 141 old_get_resolver = urlresolvers.get_resolver 139 142 urlresolvers.get_resolver = PluginGetResolver(resolver) 140 143 141 144 #FIXME: Some plugins needs a "current pagecontent" object! 142 145 #request.PYLUCID.pagecontent = 143 146 144 147 # Call the view 145 148 response = view_func(request, *view_args, **view_kwargs) 146 149 147 150 # restore the patched function 148 151 urlresolvers.get_resolver = old_get_resolver 149 152 150 153 return response 151 154 … … 162 165 def _get_middleware_class(plugin_name): 163 166 plugin_name = plugin_name.encode('ascii') # check non-ASCII strings 164 167 165 168 mod_name = "pylucid_plugins.%s.context_middleware" % plugin_name 166 169 module = import_module(mod_name) … … 176 179 context = request.PYLUCID.context 177 180 page_template = request.PYLUCID.page_template 178 181 179 182 context["context_middlewares"] = {} 180 183 181 184 plugin_names = TAG_RE.findall(page_template) 182 185 for plugin_name in plugin_names: … … 187 190 request.page_msg.error("Can't import context middleware '%s': %s" % (plugin_name, err)) 188 191 continue 189 192 190 193 # make a instance 191 194 instance = middleware_class(request, context) … … 205 208 except KeyError, err: 206 209 return "[Error: context middleware %r doesn't exist!]" % plugin_name 207 210 208 211 response = middleware_class_instance.render() 209 212 if response == None: … … 220 223 " http.HttpResponse instance or a basestring or None!" 221 224 ) 222 225 223 226 # FIXME: A HttpResponse allways convert unicode into string. So we need to do that here: 224 227 # Or we say, context render should not return a HttpResponse? 225 228 # from django.utils.encoding import smart_str 226 229 # complete_page = smart_str(complete_page) 227 230 228 231 source_content = response.content 229 232 230 233 new_content = TAG_RE.sub(replace, source_content) 231 234 response.content = new_content 232 235 return response 233 236 234 -
branches/0.9/pylucid_project/apps/pylucid/templates/admin/base_site.html
r2070 r2072 95 95 <ul> 96 96 <li> 97 <a>{% trans 'PyLucid install' %}</a> 98 <ul> 99 <li> 100 <a href="{% url PyLucidAdmin-install_pylucid %}">{% trans 'PyLucid install' %}</a> 101 </li> 102 <li> 103 <a href="{% url PyLucidAdmin-install_plugins %}">{% trans 'install PyLucid plugins' %}</a> 104 </li> 105 </ul> 106 </li> 107 <li> 97 108 <a href="{% url PyLucidUpdate-menu %}">{% trans 'update section' %}</a> 98 109 </li> -
branches/0.9/pylucid_project/apps/pylucid_admin/urls.py
r2070 r2072 20 20 21 21 urlpatterns = patterns('', 22 url(r'^menu$', views.menu, name='PyLucidAdmin-menu'), 22 url(r'^menu/$', views.menu, name='PyLucidAdmin-menu'), 23 24 url(r'^install/pylucid/$', views.install_pylucid, name='PyLucidAdmin-install_pylucid'), 25 url(r'^install/plugins/$', views.install_plugins, name='PyLucidAdmin-install_plugins'), 23 26 ) -
branches/0.9/pylucid_project/apps/pylucid_admin/views.py
r2070 r2072 1 1 # coding: utf-8 2 3 import os 2 4 3 5 from django.conf import settings 4 6 from django.template import RequestContext 5 7 from django.core.urlresolvers import reverse 8 from django.contrib.sites.models import Site 6 9 from django.shortcuts import render_to_response 10 from django.utils.translation import ugettext_lazy as _ 11 from django.contrib.auth.models import User, Group 12 13 from pylucid.models import PageTree, PageMeta, PageContent, PluginPage, Design 14 from pylucid.preference_forms import SystemPreferencesForm 15 from pylucid.system import pylucid_plugin, pylucid_objects 16 17 from pylucid_project.utils import pylucid_plugins 18 7 19 8 20 … … 14 26 context_instance=RequestContext(request) 15 27 ) 28 29 30 31 def install_pylucid(request): 32 output = [] 33 output.append("*** PyLucid install:") 34 35 sys_pref_form = SystemPreferencesForm() 36 37 # ------------------------------------------------------------------------ 38 pylucid_admin_group, created = Group.objects.get_or_create(name=settings.ADMIN.USER_GROUP) 39 if created: 40 output.append("User group '%s' created." % settings.ADMIN.USER_GROUP) 41 else: 42 output.append("User group '%s' exist." % settings.ADMIN.USER_GROUP) 43 44 # ------------------------------------------------------------------------ 45 pylucid_admin_design, created = Design.objects.get_or_create( 46 name=settings.ADMIN.DESIGN_NAME, defaults={"template": "pylucid_admin/menu.html"} 47 ) 48 # TODO: Add to all sites? 49 #design.site.add(site) 50 if created: 51 output.append("Design '%s' created." % settings.ADMIN.DESIGN_NAME) 52 else: 53 output.append("Design '%s' exist." % settings.ADMIN.DESIGN_NAME) 54 55 # Add the Design id into the preferences 56 sys_pref_form["pylucid_admin_design"] = pylucid_admin_design.id 57 # 58 # # ------------------------------------------------------------------------ 59 # pylucid_admin_pagetree, created = PageTree.objects.get_or_create( 60 # slug="PyLucidAdmin", parent=None, site=Site.objects.get_current(), 61 # defaults={ 62 # "design": pylucid_admin_design, 63 # "type": PageTree.PAGE_TYPE, 64 # } 65 # ) 66 # pylucid_admin_pagetree.permitViewGroup = pylucid_admin_group 67 # 68 # url = pylucid_admin_pagetree.get_absolute_url() 69 # if created: 70 # #tree_entry.save() 71 # output.append("PageTree '%s' created." % url) 72 # else: 73 # output.append("PageTree '%s' exist." % url) 74 # 75 # # Add the PageTree id into the preferences 76 # sys_pref_form["pylucid_admin_pagetree"] = pylucid_admin_pagetree.id 77 # 78 # # ------------------------------------------------------------------------ 79 # pylucid_admin_pagemeta, created = PageMeta.objects.get_or_create( 80 # page=pylucid_admin_pagetree, 81 # lang=request.PYLUCID.lang_entry, # FIXME: Create in all existing languages? 82 # defaults={"name": "PyLucid Admin", "robots":"noindex,nofollow"} 83 # ) 84 # if created: 85 # output.append("PageMeta %r created." % pylucid_admin_pagemeta) 86 # else: 87 # output.append("PageMeta %r exist." % pylucid_admin_pagemeta) 88 # 89 # # ------------------------------------------------------------------------ 90 # pylucid_admin_pagecontent, created = PageContent.objects.get_or_create( 91 # page=pylucid_admin_pagetree, 92 # lang=request.PYLUCID.lang_entry, # FIXME: Create in all existing languages? 93 # pagemeta=pylucid_admin_pagemeta, 94 # defaults={ 95 # "content":"PyLucid Admin section. Please seletect a menu item.", 96 # "markup": PageContent.MARKUP_CREOLE, 97 # } 98 # ) 99 # if created: 100 # output.append("PageContent %r created." % pylucid_admin_pagecontent) 101 # else: 102 # output.append("PageContent %r exist." % pylucid_admin_pagecontent) 103 104 # Save new preferences 105 sys_pref_form.save() 106 output.append("System preferences saved.") 107 108 context = { 109 "title": "PyLucid - install", 110 "output": output, 111 } 112 return render_to_response('pylucid_admin/install.html', context, 113 context_instance=RequestContext(request) 114 ) 115 116 117 def install_plugins(request): 118 """ Simple call all plugin install view, if exist. """ 119 output = [] 120 121 output.append("*** Install Plugins:") 122 123 for plugin_name, plugin_instance in pylucid_plugins.PLUGINS.iteritems(): 124 try: 125 response = plugin_instance.call_plugin_view( 126 request, settings.ADMIN.VIEW_FILENAME, settings.ADMIN.PLUGIN_INSTALL_VIEW_NAME, method_kwargs={} 127 ) 128 except plugin_instance.GetCallableError, err: 129 if settings.DEBUG: 130 output.append("Skip plugin %r, because it has no install view (%s)" % (plugin_name, err)) 131 else: 132 output.append("_" * 79) 133 output.append(" *** install plugin %r ***" % plugin_name) 134 assert isinstance(response, basestring) == True, "Plugin install view must return a basestring!" 135 output.append(response) 136 137 output.append("") 138 139 context = { 140 "title": "PyLucid - Plugin install", 141 "output": output, 142 } 143 return render_to_response('pylucid_admin/install.html', context, 144 context_instance=RequestContext(request) 145 ) -
branches/0.9/pylucid_project/pylucid_plugins/extrahead/__init__.py
r1926 r2072 1 -
branches/0.9/pylucid_project/pylucid_plugins/page_admin/admin_views.py
r2070 r2072 1 2 from django.utils.translation import ugettext_lazy as _ 3 from django.contrib.auth.models import User, Group 4 5 from pylucid.models import PyLucidAdminPage, Design 6 from pylucid.preference_forms import SystemPreferencesForm 7 from django.contrib.sites.models import Site 8 9 ADMIN_SECTIONS = { 10 "create content": "Create new content." 11 } 1 12 2 13 3 def test1(request): 4 return "Test view 1 content!" 14 class AdminMenu(object): 15 def __init__(self, request, output): 16 self.request = request 17 self.output = output 5 18 6 def test2(request): 7 return "Test view 2 content!" 19 sys_preferences = SystemPreferencesForm().get_preferences() 20 admin_design_id = sys_preferences["pylucid_admin_design"] 21 self.admin_design = Design.objects.get(id=admin_design_id) 22 23 def add_menu_entry(self, **kwargs): 24 if "slug" not in kwargs: 25 kwargs["slug"] = kwargs["name"].replace(" ", "_") 26 27 adminpage_entry, created = PyLucidAdminPage.objects.get_or_create(**kwargs) 28 if created: 29 self.output.append("PyLucidAdminPage %r created." % adminpage_entry) 30 else: 31 self.output.append("PyLucidAdminPage %r exist." % adminpage_entry) 32 33 return adminpage_entry 34 35 36 def get_or_create_section(self, section_name): 37 title = ADMIN_SECTIONS[section_name] 38 adminpage_entry = self.add_menu_entry(name=section_name, title=title, parent=None) 39 return adminpage_entry 40 41 42 def install(request): 43 """ insert PyLucid admin views into PageTree """ 44 output = [] 45 46 admin_menu = AdminMenu(request, output) 47 menu_section_entry = admin_menu.get_or_create_section("create content") 48 49 admin_menu.add_menu_entry( 50 parent=menu_section_entry, 51 name="new content page", title="Create a new content page.", 52 plugin_name=request.plugin_name, 53 view_name="new_content_page", 54 ) 55 admin_menu.add_menu_entry( 56 parent=menu_section_entry, 57 name="new plugin page", title="Create a new plugin page.", 58 plugin_name=request.plugin_name, 59 view_name="new_plugin_page", 60 ) 61 62 return "\n".join(output) 63 64 65 def new_content_page(request): 66 return """ Create a new page """ 67 68 def new_plugin_page(request): 69 return """ Create a new plugin page """ 70 -
branches/0.9/pylucid_project/pylucid_plugins/redirect/urls.py
r1965 r2072 6 6 7 7 urlpatterns = patterns('', 8 url(r'^$', views.redirect ,name='PluginRedirect-redirect'),8 url(r'^$', views.redirect, name='PluginRedirect-redirect'), 9 9 ) 10 11 -
branches/0.9/pylucid_project/pylucid_plugins/__init__.py
r2070 r2072 1 """2 Here should be stored all PyLucid plugins.3 These plugins are normal django apps.4 """5 1 6 import os7 2 8 class PluginList(object): 9 """ 10 needed in settings.py 11 """ 12 _CACHE = None 13 14 def __init__(self, fs_path, pkg_prefix): 15 installed_apps = () 16 template_dirs = () 17 for dir_item in os.listdir(fs_path): 18 if dir_item.startswith("."): 19 continue 20 item_path = os.path.join(fs_path, dir_item) 21 if not os.path.isdir(item_path): 22 continue 23 24 pkg_string = ".".join([pkg_prefix, dir_item]) 25 installed_apps += (pkg_string,) 26 27 template_path = os.path.join(item_path, "templates") 28 if os.path.isdir(template_path): 29 template_dirs += (template_path,) 30 31 # admin_url_file = os.path.join(item_path, "admin_url.py") 32 # if os.path.isfile(admin_url_file): 33 # admin_urls.append(pkg_string + ".admin_url") 34 35 self._CACHE = { 36 "installed_apps": installed_apps, 37 "template_dirs": template_dirs, 38 } 39 40 def get_installed_apps(self): 41 return self._CACHE["installed_apps"] 42 def get_template_dirs(self): 43 return self._CACHE["template_dirs"] 3 # -
branches/0.9/pylucid_project/settings.py
r2071 r2072 174 174 # PyLucid own settings 175 175 176 # from pylucid_project.apps.pylucid.app_settings import PYLUCID176 # Add app settings 177 177 from pylucid_project.apps.pylucid import app_settings as PYLUCID 178 from pylucid_project.apps.pylucid_admin import app_settings as ADMIN 179 178 180 179 181 # http://www.djangoproject.com/documentation/authentication/#other-authentication-sources -
branches/0.9/pylucid_project/tests/test_Design.py
r2068 r2072 90 90 ) 91 91 92 # def test_colorscheme(self): 93 94 92 95 93 96