From dcf568ead59dee1cf72d902a40e95c2308e03082 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 16 Mar 2012 21:07:53 -0400 Subject: [PATCH] Start top menu refactor, added elementtree to requirements --- apps/common/__init__.py | 18 +++--- apps/document_indexing/__init__.py | 2 +- apps/documents/__init__.py | 2 +- apps/folders/__init__.py | 2 +- apps/main/__init__.py | 17 +++--- apps/navigation/__init__.py | 5 ++ apps/navigation/api.py | 59 +++++++++++-------- .../templates/generic_link_instance.html | 4 +- .../templatetags/navigation_tags.py | 35 ++++++----- apps/navigation/utils.py | 4 ++ apps/navigation/widgets.py | 4 +- apps/project_setup/__init__.py | 4 +- apps/project_setup/api.py | 9 ++- apps/project_setup/views.py | 6 +- apps/project_tools/__init__.py | 4 +- apps/project_tools/api.py | 11 ++-- apps/project_tools/views.py | 6 +- apps/smart_settings/__init__.py | 3 +- apps/tags/__init__.py | 2 +- requirements/production.txt | 1 + 20 files changed, 113 insertions(+), 85 deletions(-) diff --git a/apps/common/__init__.py b/apps/common/__init__.py index dfcd4066cd..7ec60b2d04 100644 --- a/apps/common/__init__.py +++ b/apps/common/__init__.py @@ -8,7 +8,7 @@ from django.contrib.auth.management import create_superuser from django.dispatch import receiver from django.db.models.signals import post_syncdb -from navigation.api import bind_links, register_top_menu +from navigation.api import bind_links, register_top_menu, Link from .conf import settings as common_settings from .utils import validate_path @@ -17,18 +17,16 @@ from .utils import validate_path def has_usable_password(context): return context['request'].user.has_usable_password -password_change_view = {'text': _(u'change password'), 'view': 'password_change_view', 'famfam': 'computer_key', 'condition': has_usable_password} -current_user_details = {'text': _(u'user details'), 'view': 'current_user_details', 'famfam': 'vcard'} -current_user_edit = {'text': _(u'edit details'), 'view': 'current_user_edit', 'famfam': 'vcard_edit'} - -bind_links(['current_user_details', 'current_user_edit', 'password_change_view'], [current_user_details, current_user_edit, password_change_view], menu_name='secondary_menu') - -about_view = {'text': _('about'), 'view': 'about_view', 'famfam': 'information'} -license_view = {'text': _('license'), 'view': 'license_view', 'famfam': 'script'} +password_change_view = Link(text=_(u'change password'), view='password_change_view', sprite='computer_key', condition=has_usable_password) +current_user_details = Link(text=_(u'user details'), view='current_user_details', sprite='vcard') +current_user_edit = Link(text=_(u'edit details'), view='current_user_edit', sprite='vcard_edit') +about_view = Link(text=_('about'), view='about_view', sprite='information') +license_view = Link(text=_('license'), view='license_view', sprite='script') bind_links(['about_view', 'license_view'], [about_view, license_view], menu_name='secondary_menu') +bind_links(['current_user_details', 'current_user_edit', 'password_change_view'], [current_user_details, current_user_edit, password_change_view], menu_name='secondary_menu') -register_top_menu('about', link={'text': _(u'about'), 'view': 'about_view', 'famfam': 'information'}, position=-1) +register_top_menu('about', link=Link(text=_(u'about'), view='about_view', sprite='information'), position=-1) @receiver(post_syncdb, dispatch_uid='create_superuser', sender=auth_models) diff --git a/apps/document_indexing/__init__.py b/apps/document_indexing/__init__.py index b27687c221..579facc80d 100644 --- a/apps/document_indexing/__init__.py +++ b/apps/document_indexing/__init__.py @@ -52,7 +52,7 @@ document_index_list = Link(text= _(u'indexes'), view='document_index_list', args rebuild_index_instances = Link(text=_('rebuild indexes'), view='rebuild_index_instances', sprite='folder_page', permissions=[PERMISSION_DOCUMENT_INDEXING_REBUILD_INDEXES], description=_(u'Deletes and creates from scratch all the document indexes.')) -register_top_menu('indexes', link={'text': _('indexes'), 'sprite': 'tab', 'view': 'index_list', 'children_view_regex': [r'^index_[i,l]']}) +register_top_menu('indexes', link=Link(text=_('indexes'), sprite='tab', view='index_list', children_view_regex=[r'^index_[i,l]'])) register_maintenance_links([rebuild_index_instances], namespace='document_indexing', title=_(u'Indexes')) register_sidebar_template(['index_instance_list'], 'indexing_help.html') diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 75701f5623..39530783aa 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -177,7 +177,7 @@ register_model_list_columns(Document, [ register_top_menu( 'documents', - link={'famfam': 'page', 'text': _(u'documents'), 'view': 'document_list_recent'}, + link=Link(sprite='page', text=_(u'documents'), view='document_list_recent'), children_path_regex=[ r'^documents/[^t]', r'^metadata/[^s]', r'comments', r'tags/document', r'grouping/[^s]', r'history/list/for_object/documents', ], diff --git a/apps/folders/__init__.py b/apps/folders/__init__.py index 06699a5265..e52dbe3359 100644 --- a/apps/folders/__init__.py +++ b/apps/folders/__init__.py @@ -32,7 +32,7 @@ bind_links([Folder], [folder_view, folder_edit, folder_delete, folder_acl_list]) bind_links([Folder, 'folder_list', 'folder_create'], [folder_list, folder_create], menu_name='secondary_menu') -register_top_menu(name='folders', link={'text': _('folders'), 'famfam': 'folder_user', 'view': 'folder_list'}, children_views=['folder_list', 'folder_create', 'folder_edit', 'folder_delete', 'folder_view', 'folder_document_multiple_remove']) +register_top_menu(name='folders', link=Link(text=_('folders'), sprite='folder_user', view='folder_list'), children_views=['folder_list', 'folder_create', 'folder_edit', 'folder_delete', 'folder_view', 'folder_document_multiple_remove']) bind_links([Document], [document_folder_list], menu_name='form_header') diff --git a/apps/main/__init__.py b/apps/main/__init__.py index 34ab61d3e9..ba92093567 100644 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -3,8 +3,7 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ from django.conf import settings -from navigation.api import register_top_menu -from navigation.api import bind_links +from navigation.api import bind_links, Link, register_top_menu from project_setup.api import register_setup from project_tools.api import register_tool @@ -30,16 +29,16 @@ __version_info__ = { def is_superuser(context): return context['request'].user.is_staff or context['request'].user.is_superuser -maintenance_menu = {'text': _(u'maintenance'), 'view': 'maintenance_menu', 'famfam': 'wrench', 'icon': 'wrench.png'} -statistics = {'text': _(u'statistics'), 'view': 'statistics', 'famfam': 'table', 'icon': 'blackboard_sum.png', 'condition': is_superuser, 'children_view_regex': [r'statistics']} -diagnostics = {'text': _(u'diagnostics'), 'view': 'diagnostics', 'famfam': 'pill', 'icon': 'pill.png'} -sentry = {'text': _(u'sentry'), 'view': 'sentry', 'famfam': 'bug', 'icon': 'bug.png', 'condition': is_superuser} -admin_site = {'text': _(u'admin site'), 'view': 'admin:index', 'famfam': 'keyboard', 'icon': 'keyboard.png', 'condition': is_superuser} +maintenance_menu = Link(text=_(u'maintenance'), view='maintenance_menu', sprite='wrench', icon='wrench.png') +statistics = Link(text=_(u'statistics'), view='statistics', sprite='table', icon='blackboard_sum.png', condition=is_superuser, children_view_regex=[r'statistics']) +diagnostics = Link(text=_(u'diagnostics'), view='diagnostics', sprite='pill', icon='pill.png') +sentry = Link(text=_(u'sentry'), view='sentry', sprite='bug', icon='bug.png', condition=is_superuser) +admin_site = Link(text=_(u'admin site'), view='admin:index', sprite='keyboard', icon='keyboard.png', condition=is_superuser) if not DISABLE_HOME_VIEW: - register_top_menu('home', link={'text': _(u'home'), 'view': 'home', 'famfam': 'house'}, position=0) + register_top_menu('home', link=Link(text=_(u'home'), view='home', sprite='house'), position=0) if not SIDE_BAR_SEARCH: - register_top_menu('search', link={'text': _(u'search'), 'view': 'search', 'famfam': 'zoom'}, children_path_regex=[r'^search/']) + register_top_menu('search', link=Link(text=_(u'search'), view='search', sprite='zoom'), children_path_regex=[r'^search/']) def get_version(): diff --git a/apps/navigation/__init__.py b/apps/navigation/__init__.py index e69de29bb2..928ceef82a 100644 --- a/apps/navigation/__init__.py +++ b/apps/navigation/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from elementtree.ElementTree import Element + +main_menu = Element('root') diff --git a/apps/navigation/api.py b/apps/navigation/api.py index aaab05c45b..4b851f7401 100644 --- a/apps/navigation/api.py +++ b/apps/navigation/api.py @@ -7,11 +7,15 @@ import logging from django.template import (TemplateSyntaxError, Library, VariableDoesNotExist, Node, Variable) from django.utils.encoding import smart_str, force_unicode, smart_unicode +from django.core.urlresolvers import reverse, NoReverseMatch + +from elementtree.ElementTree import Element, SubElement #from common.utils import urlquote from .utils import (resolve_to_name, resolve_arguments, resolve_template_variable, get_navigation_objects) +from . import main_menu object_navigation = {} multi_object_navigation = {} @@ -26,6 +30,7 @@ logger = logging.getLogger(__name__) class ResolvedLink(object): active = False + class Link(object): def __init__(self, text, view, klass=None, args=None, sprite=None, icon=None, permissions=None, condition=None, conditional_disable=None, description=None, dont_mark_active=False, children_view_regex=None, keep_query=False): @@ -43,6 +48,11 @@ class Link(object): self.children_view_regex = children_view_regex self.klass = klass self.keep_query = keep_query + + # + self.conditional_highlight = None + self.children_views = [] + self.children_classes = [] def resolve(self, context): request = Variable('request').resolve(context) @@ -63,6 +73,8 @@ class Link(object): if condition_result: #new_link = {}#copy.copy(link) resolved_link = ResolvedLink() + resolved_link.text = self.text + resolved_link.sprite = self.sprite try: #args, kwargs = resolve_arguments(context, self.get('args', {})) args, kwargs = resolve_arguments(context, self.args) @@ -171,37 +183,36 @@ def register_multi_item_links(src, links, menu_name=None): multi_object_navigation[menu_name][src]['links'].extend(links) -def register_top_menu(name, link, children_views=None, - children_path_regex=None, children_view_regex=None, - position=None): +def register_top_menu(name, link, children_views=None, children_path_regex=None, children_view_regex=None, position=None): """ Register a new menu entry for the main menu displayed at the top of the page """ + menu = SubElement(main_menu, name, link=link) + #entry = {'link': link, 'name': name} + #if children_views: + # entry['children_views'] = children_views + #if children_path_regex: + # entry['children_path_regex'] = children_path_regex + #if children_view_regex: + # entry['children_view_regex'] = children_view_regex + #if position is not None: + # entry['position'] = position + # top_menu_entries.insert(position, entry) + #else: + # length = len(top_menu_entries) + # entry['position'] = length + # top_menu_entries.append(entry) - entry = {'link': link, 'name': name} - if children_views: - entry['children_views'] = children_views - if children_path_regex: - entry['children_path_regex'] = children_path_regex - if children_view_regex: - entry['children_view_regex'] = children_view_regex - if position is not None: - entry['position'] = position - top_menu_entries.insert(position, entry) - else: - length = len(top_menu_entries) - entry['position'] = length - top_menu_entries.append(entry) - - sort_menu_entries() - - return entry + #sort_menu_entries() + # + #return entry + return menu -def sort_menu_entries(): - global top_menu_entries - top_menu_entries = sorted(top_menu_entries, key=lambda k: (k['position'] < 0, k['position'])) +#def sort_menu_entries(): +# global top_menu_entries +# top_menu_entries = sorted(top_menu_entries, key=lambda k: (k['position'] < 0, k['position'])) def register_model_list_columns(model, columns): diff --git a/apps/navigation/templates/generic_link_instance.html b/apps/navigation/templates/generic_link_instance.html index 098810ee13..a1f18baf8b 100644 --- a/apps/navigation/templates/generic_link_instance.html +++ b/apps/navigation/templates/generic_link_instance.html @@ -3,7 +3,7 @@ {% get_main_setting "DISABLE_ICONS" as disable_icons %} {% if link.disabled %} - {% if link.famfam and not disable_icons %}{% endif %}{{ link.text|capfirst }}{% if link.error %} - {{ link.error }}{% endif %}{% if link.active and not hide_active_anchor %}{% endif %}{% if horizontal %}{% if not forloop.last %} | {% endif %}{% endif %} + {% if link.sprite and not disable_icons %}{% endif %}{{ link.text|capfirst }}{% if link.error %} - {{ link.error }}{% endif %}{% if link.active and not hide_active_anchor %}{% endif %}{% if horizontal %}{% if not forloop.last %} | {% endif %}{% endif %} {% else %} - {% if link.famfam and not disable_icons %}{% endif %}{{ link.text|capfirst }}{% if link.error %} - {{ link.error }}{% endif %}{% if link.active and not hide_active_anchor %}{% endif %}{% if horizontal %}{% if not forloop.last %} | {% endif %}{% endif %} + {% if link.sprite and not disable_icons %}{% endif %}{{ link.text|capfirst }}{% if link.error %} - {{ link.error }}{% endif %}{% if link.active and not hide_active_anchor %}{% endif %}{% if horizontal %}{% if not forloop.last %} | {% endif %}{% endif %} {% endif %} diff --git a/apps/navigation/templatetags/navigation_tags.py b/apps/navigation/templatetags/navigation_tags.py index ebd55723fa..49df4df77a 100644 --- a/apps/navigation/templatetags/navigation_tags.py +++ b/apps/navigation/templatetags/navigation_tags.py @@ -19,6 +19,7 @@ from ..api import (object_navigation, multi_object_navigation, from ..forms import MultiItemForm from ..utils import (resolve_to_name, resolve_arguments, resolve_template_variable, get_navigation_objects) +from .. import main_menu register = Library() logger = logging.getLogger(__name__) @@ -26,27 +27,25 @@ logger = logging.getLogger(__name__) class TopMenuNavigationNode(Node): def render(self, context): - request = Variable('request').resolve(context) - current_path = request.META['PATH_INFO'] - current_view = resolve_to_name(current_path) - + #request = Variable('request').resolve(context) + #current_path = request.META['PATH_INFO'] + #current_view = resolve_to_name(current_path) + #all_menu_links = []#[entry.get('link', {}) for entry in top_menu_entries] #menu_links = resolve_links(context, all_menu_links, current_view, current_path) - for index, link in enumerate(top_menu_entries): - #if current_view in link.get('children_views', []): - # menu_links[index]['active'] = True - - #for child_path_regex in link.get('children_path_regex', []): - # if re.compile(child_path_regex).match(current_path.lstrip('/')): - # menu_links[index]['active'] = True - - #for children_view_regex in link.get('children_view_regex', []): - # if re.compile(children_view_regex).match(current_view): - # menu_links[index]['active'] = True - pass - - context['menu_links'] = []#menu_links + #for index, link in enumerate(top_menu_entries): + # #if current_view in link.get('children_views', []): + # # menu_links[index]['active'] = True + # #for child_path_regex in link.get('children_path_regex', []): + # # if re.compile(child_path_regex).match(current_path.lstrip('/')): + # # menu_links[index]['active'] = True + # #for children_view_regex in link.get('children_view_regex', []): + # # if re.compile(children_view_regex).match(current_view): + # # menu_links[index]['active'] = True + # pass + #context['menu_links'] = []#menu_links + context['menu_links'] = [menu.get('link').resolve(context) for menu in main_menu.getchildren()] return '' diff --git a/apps/navigation/utils.py b/apps/navigation/utils.py index 1f72cebd85..923af8112e 100644 --- a/apps/navigation/utils.py +++ b/apps/navigation/utils.py @@ -1,5 +1,7 @@ from __future__ import absolute_import +import logging + from django.core.urlresolvers import RegexURLResolver, RegexURLPattern, Resolver404, get_resolver from django.template import (TemplateSyntaxError, Library, @@ -7,6 +9,8 @@ from django.template import (TemplateSyntaxError, Library, from django.utils.text import unescape_string_literal #__all__ = ('resolve_to_name',) +logger = logging.getLogger(__name__) + def get_navigation_objects(context): object_list = [] diff --git a/apps/navigation/widgets.py b/apps/navigation/widgets.py index 6695f16f70..d17cd6574e 100644 --- a/apps/navigation/widgets.py +++ b/apps/navigation/widgets.py @@ -17,9 +17,9 @@ from .utils import resolve_to_name def button_navigation_widget(request, link): - if 'permissions' in link: + if link.permissions: try: - Permission.objects.check_permissions(request.user, link['permissions']) + Permission.objects.check_permissions(request.user, link.permissions) return render_widget(request, link) except PermissionDenied: return u'' diff --git a/apps/project_setup/__init__.py b/apps/project_setup/__init__.py index c8eca31d1f..fd543290ed 100644 --- a/apps/project_setup/__init__.py +++ b/apps/project_setup/__init__.py @@ -1,5 +1,5 @@ from django.utils.translation import ugettext_lazy as _ -from navigation.api import register_top_menu +from navigation.api import register_top_menu, Link -setup_link = register_top_menu('setup_menu', link={'text': _(u'setup'), 'view': 'setup_list', 'famfam': 'cog'}, position=-2) +setup_menu = register_top_menu('setup_menu', link=Link(text=_(u'setup'), view='setup_list', sprite='cog'), position=-2) diff --git a/apps/project_setup/api.py b/apps/project_setup/api.py index a03c89cb3e..7b356f84cb 100644 --- a/apps/project_setup/api.py +++ b/apps/project_setup/api.py @@ -1,12 +1,15 @@ from __future__ import absolute_import -from . import setup_link +from elementtree.ElementTree import Element, SubElement -setup_items = [] +from . import setup_menu + +#setup_items = [] def register_setup(link): - setup_items.append(link) + #setup_items.append(link) + SubElement(setup_menu, 'a', link=link) # Append the link's children_view_regex to the setup main menu children view regex #setup_link.setdefault('children_view_regex', []) diff --git a/apps/project_setup/views.py b/apps/project_setup/views.py index 8ab0426572..c30809375f 100644 --- a/apps/project_setup/views.py +++ b/apps/project_setup/views.py @@ -6,12 +6,14 @@ from django.utils.translation import ugettext_lazy as _ from navigation.widgets import button_navigation_widget -from .api import setup_items +#from .api import setup_items +from . import setup_menu def setup_list(request): context = { - 'object_list': [button_navigation_widget(request, item) for item in setup_items], + #'object_list': [button_navigation_widget(request, item) for item in setup_items], + 'object_list': [button_navigation_widget(request, item.get('link')) for item in setup_menu.getchildren()], 'title': _(u'setup items'), } diff --git a/apps/project_tools/__init__.py b/apps/project_tools/__init__.py index 3fc34151c1..f5bc1dd0e3 100644 --- a/apps/project_tools/__init__.py +++ b/apps/project_tools/__init__.py @@ -1,5 +1,5 @@ from django.utils.translation import ugettext_lazy as _ -from navigation.api import register_top_menu +from navigation.api import register_top_menu, Link -tool_link = register_top_menu('tools', link={'text': _(u'tools'), 'view': 'tools_list', 'famfam': 'wrench'}, position=-3) +tool_menu = register_top_menu('tools', link=Link(text=_(u'tools'), view='tools_list', sprite='wrench'), position=-3) diff --git a/apps/project_tools/api.py b/apps/project_tools/api.py index a8a20d92ec..c38486c374 100644 --- a/apps/project_tools/api.py +++ b/apps/project_tools/api.py @@ -1,12 +1,15 @@ from __future__ import absolute_import -from . import tool_link +from elementtree.ElementTree import Element, SubElement -tool_items = [] +from . import tool_menu + +#tool_items = [] def register_tool(link): - tool_items.append(link) - + #tool_items.append(link) + SubElement(tool_menu, 'a', link=link) + # Append the link's children_view_regex to the tool main menu children view regex #tool_link.setdefault('children_view_regex', []) #tool_link['children_view_regex'].extend(link.get('children_view_regex', [])) diff --git a/apps/project_tools/views.py b/apps/project_tools/views.py index 61693a100c..b3f0fa3e2d 100644 --- a/apps/project_tools/views.py +++ b/apps/project_tools/views.py @@ -6,12 +6,14 @@ from django.utils.translation import ugettext_lazy as _ from navigation.widgets import button_navigation_widget -from .api import tool_items +#from .api import tool_items +from . import tool_menu def tools_list(request): context = { - 'object_list': [button_navigation_widget(request, item) for item in tool_items], + #'object_list': [button_navigation_widget(request, item) for item in tool_items], + 'object_list': [button_navigation_widget(request, item) for item in tool_menu.getchildren()], 'title': _(u'tools'), } diff --git a/apps/smart_settings/__init__.py b/apps/smart_settings/__init__.py index bfc495e54d..1f1f71071e 100644 --- a/apps/smart_settings/__init__.py +++ b/apps/smart_settings/__init__.py @@ -1,11 +1,12 @@ from django.utils.translation import ugettext_lazy as _ from project_setup.api import register_setup +from navigation.api import Link def is_superuser(context): return context['request'].user.is_staff or context['request'].user.is_superuser -check_settings = {'text': _(u'settings'), 'view': 'setting_list', 'famfam': 'cog', 'icon': 'cog.png', 'condition': is_superuser, 'children_view_regex': [r'^setting_']} +check_settings = Link(text=_(u'settings'), view='setting_list', sprite='cog', icon='cog.png', condition=is_superuser, children_view_regex=[r'^setting_']) register_setup(check_settings) diff --git a/apps/tags/__init__.py b/apps/tags/__init__.py index 0592046566..e024a7ad3f 100644 --- a/apps/tags/__init__.py +++ b/apps/tags/__init__.py @@ -49,7 +49,7 @@ register_model_list_columns(Document, [ bind_links([Tag], [tag_tagged_item_list, tag_edit, tag_delete, tag_acl_list]) register_multi_item_links(['tag_list'], [tag_multiple_delete]) bind_links([Tag, 'tag_list', 'tag_create'], [tag_list, tag_create], menu_name='secondary_menu') -register_top_menu('tags', link={'text': _(u'tags'), 'view': 'tag_list', 'famfam': 'tag_blue'}, children_view_regex=[r'^tag_(list|create|delete|edit|tagged|acl)']) +register_top_menu('tags', link=Link(text=_(u'tags'), view='tag_list', sprite='tag_blue'), children_view_regex=[r'^tag_(list|create|delete|edit|tagged|acl)']) bind_links([Document], [tag_document_list], menu_name='form_header') bind_links(['document_tags', 'tag_remove', 'tag_multiple_remove', 'tag_attach'], [tag_attach], menu_name='sidebar') diff --git a/requirements/production.txt b/requirements/production.txt index 41ab10ed77..998045debd 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -17,3 +17,4 @@ South==0.7.3 python-gnupg==0.2.8 python-hkp==0.1.3 requests==0.10.1 +elementtree==1.2.7-20070827-preview