diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-02-18 01:44:46 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-02-18 01:44:46 +0100 |
commit | 5fd75eebf1df98236747ee7d61675dde0b4b588b (patch) | |
tree | 5e8a976bbe4a7c85100bfd545b2433877c284d2d | |
parent | e3501ee756de6819a285b87871294751c6bb4cf1 (diff) | |
download | Ishtar-5fd75eebf1df98236747ee7d61675dde0b4b588b.tar.bz2 Ishtar-5fd75eebf1df98236747ee7d61675dde0b4b588b.zip |
Simplify the menu by introducing a third level (closes #226)
-rw-r--r-- | ishtar/furnitures/menus.py | 163 | ||||
-rw-r--r-- | ishtar/furnitures/urls.py | 6 | ||||
-rw-r--r-- | ishtar/templates/base.html | 8 | ||||
-rw-r--r-- | static/js/ishtar.js | 4 |
4 files changed, 115 insertions, 66 deletions
diff --git a/ishtar/furnitures/menus.py b/ishtar/furnitures/menus.py index ab7715903..12c81ced3 100644 --- a/ishtar/furnitures/menus.py +++ b/ishtar/furnitures/menus.py @@ -31,6 +31,26 @@ class SectionItem: self.label = label self.childs = childs self.available = False + self.items = {} + + def can_be_available(self, user): + for child in self.childs: + if child.can_be_available(user): + return True + return False + + def is_available(self, user, obj=None): + for child in self.childs: + if child.is_available(user, obj): + return True + return False + + def set_items(self, user, items): + if user: + self.available = self.can_be_available(user) + for child in self.childs: + child.set_items(user, items) + items[child.idx] = child class MenuItem: def __init__(self, idx, label, model=None, access_controls=[]): @@ -56,73 +76,97 @@ class MenuItem: return True return False + def set_items(self, user, items): + if user: + self.available = self.can_be_available(user) + class Menu: def __init__(self, user): self.user = user self.initialized = False self.childs = [ SectionItem('administration', _(u"Administration"), - childs=[ - MenuItem('person_creation', _(u"Person creation"), - model=models.Person, - access_controls=['add_person', 'add_own_person']), - MenuItem('person_modification', _(u"Person modification"), - model=models.Person, - access_controls=['change_person', 'change_own_person']), + childs=[SectionItem('person', _(u"Person"), + childs=[ + MenuItem('person_creation', _(u"Creation"), + model=models.Person, + access_controls=['add_person', 'add_own_person']), + MenuItem('person_modification', _(u"Modification"), + model=models.Person, + access_controls=['change_person', 'change_own_person']), + ]), MenuItem('account_management', _(u"Account management"), model=models.IshtarUser, access_controls=['add_ishtaruser',]), ]), - SectionItem('file_management', _(u"File management"), - childs=[ - MenuItem('file_creation', _(u"File creation"), - model=models.File, - access_controls=['add_file', 'add_own_file']), - MenuItem('file_modification', _(u"File modification"), - model=models.File, - access_controls=['change_file', 'change_own_file']), - MenuItem('file_deletion', _(u"File deletion"), - model=models.File, - access_controls=['delete_file', 'delete_own_file']), - MenuItem('file_administrativeact', - _(u"Add an administrative act"), - model=models.Operation, - access_controls=['change_file', 'change_own_file']), - MenuItem('file_administrativeact_modification', - _(u"Modify an administrative act"), - model=models.AdministrativeAct, - access_controls=['change_file', 'change_own_file']), - MenuItem('file_administrativeact_deletion', - _(u"Delete an administrative act"), - model=models.AdministrativeAct, - access_controls=['delete_file', 'delete_own_file']), + SectionItem('file_management', _(u"Archaelogical file management"), + childs=[SectionItem('files', _(u"Archaelogical file"), + childs=[ + MenuItem('file_creation', _(u"Creation"), + model=models.File, + access_controls=['add_file', 'add_own_file']), + MenuItem('file_modification', _(u"Modification"), + model=models.File, + access_controls=['change_file', 'change_own_file']), + MenuItem('file_deletion', _(u"Deletion"), + model=models.File, + access_controls=['delete_file', 'delete_own_file']), + ],), + SectionItem('admin_act_files', _(u"Administrative act"), + childs=[ + MenuItem('file_administrativeact', + _(u"Add"), + model=models.Operation, + access_controls=['change_file', 'change_own_file']), + MenuItem('file_administrativeact_modification', + _(u"Modification"), + model=models.AdministrativeAct, + access_controls=['change_file', 'change_own_file']), + MenuItem('file_administrativeact_deletion', + _(u"Deletion"), + model=models.AdministrativeAct, + access_controls=['delete_file', 'delete_own_file']), + ],), ]), SectionItem('operation_management', _(u"Operation management"), - childs=[ - MenuItem('operation_creation', _(u"Operation creation"), - model=models.Operation, - access_controls=['add_operation', 'add_own_operation']), - MenuItem('operation_modification', _(u"Operation modification"), - model=models.Operation, - access_controls=['change_operation', 'change_own_operation']), - MenuItem('operation_closing', _(u"Operation closing"), - model=models.Operation, - access_controls=['change_operation', 'change_own_operation']), - MenuItem('operation_deletion', _(u"Operation deletion"), - model=models.Operation, - access_controls=['change_operation', 'change_own_operation']), - MenuItem('operation_administrativeact', - _(u"Add an administrative act"), - model=models.Operation, - access_controls=['change_operation', 'change_own_operation']), - MenuItem('operation_administrativeact_modification', - _(u"Modify an administrative act"), - model=models.AdministrativeAct, - access_controls=['change_operation', 'change_own_operation']), - MenuItem('operation_administrativeact_deletion', - _(u"Delete an administrative act"), - model=models.AdministrativeAct, - access_controls=['operation_deletion', 'delete_own_operation']), + childs=[SectionItem('operation', _(u"Operation"), + childs=[ + MenuItem('operation_creation', _(u"Creation"), + model=models.Operation, + access_controls=['add_operation', + 'add_own_operation']), + MenuItem('operation_modification', _(u"Modification"), + model=models.Operation, + access_controls=['change_operation', + 'change_own_operation']), + MenuItem('operation_closing', _(u"Closing"), + model=models.Operation, + access_controls=['change_operation', + 'change_own_operation']), + MenuItem('operation_deletion', _(u"Deletion"), + model=models.Operation, + access_controls=['change_operation', + 'change_own_operation']), + ],), + SectionItem('admin_act_operations', + _(u"Administrative act"), + childs=[ + MenuItem('operation_administrativeact', + _(u"Add"), + model=models.Operation, + access_controls=['change_operation', + 'change_own_operation']), + MenuItem('operation_administrativeact_modification', + _(u"Modification"), + model=models.AdministrativeAct, + access_controls=['change_operation', + 'change_own_operation']), + MenuItem('operation_administrativeact_deletion', + _(u"Deletion"), + model=models.AdministrativeAct, + access_controls=['operation_deletion', + 'delete_own_operation']), + ],), ]), ] self.items = {} @@ -130,14 +174,9 @@ class Menu: def init(self): if self.initialized: return + self.items = {} for main_menu in self.childs: - main_menu.available = False - for child in main_menu.childs: - if self.user: - child.available = child.can_be_available(self.user) - if child.available: - main_menu.available = True - self.items[child.idx] = child + main_menu.set_items(self.user, self.items) self.initialized = True menu = Menu(None) diff --git a/ishtar/furnitures/urls.py b/ishtar/furnitures/urls.py index 09ff7efa2..7d223df58 100644 --- a/ishtar/furnitures/urls.py +++ b/ishtar/furnitures/urls.py @@ -66,7 +66,11 @@ urlpatterns = patterns('', ) for section in menu.childs: for menu_item in section.childs: - actions.append(menu_item.idx) + if hasattr(menu_item, 'childs'): + for menu_subitem in menu_item.childs: + actions.append(menu_subitem.idx) + else: + actions.append(menu_item.idx) actions = r"|".join(actions) urlpatterns += patterns('ishtar.furnitures.views', diff --git a/ishtar/templates/base.html b/ishtar/templates/base.html index 4d9502d39..e7570e6c3 100644 --- a/ishtar/templates/base.html +++ b/ishtar/templates/base.html @@ -62,8 +62,14 @@ {% if section.available %}<li>{{section.label}} <ul> {% for menu_item in section.childs %}{%if menu_item.available%} + {% if menu_item.childs %}<li>{{menu_item.label}} + <ul> + {% for menu_subitem in menu_item.childs %}{%if menu_subitem.available%} + <li{%ifequal menu_subitem.idx CURRENT_ACTION%} class='selected'{%endifequal%}><a href='{% url action menu_subitem.idx%}'>{{menu_subitem.label}}</a></li> + {%endif%}{% endfor %}</ul></li> + {%else%} <li{%ifequal menu_item.idx CURRENT_ACTION%} class='selected'{%endifequal%}><a href='{% url action menu_item.idx%}'>{{menu_item.label}}</a></li> - {%endif%}{% endfor %} + {%endif%}{% endif %}{% endfor %} </ul> </li>{%endif%} {% endfor %} diff --git a/static/js/ishtar.js b/static/js/ishtar.js index 174e56f0b..131a220c9 100644 --- a/static/js/ishtar.js +++ b/static/js/ishtar.js @@ -25,8 +25,8 @@ beforeSend: function(xhr, settings) { $(document).ready(function(){ - $("#main_menu ul ul").hide(); - $("#main_menu ul ul .selected").parent().show(); + $("#main_menu > ul > li > ul").hide(); + $("#main_menu ul ul .selected").parents().show(); var items = new Array('file', 'operation'); $("#current_file").change(function(){ $.post('/' + url_path + 'update-current-item/', |