summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit5fd75eebf1df98236747ee7d61675dde0b4b588b (patch)
tree5e8a976bbe4a7c85100bfd545b2433877c284d2d
parente3501ee756de6819a285b87871294751c6bb4cf1 (diff)
downloadIshtar-5fd75eebf1df98236747ee7d61675dde0b4b588b.tar.bz2
Ishtar-5fd75eebf1df98236747ee7d61675dde0b4b588b.zip
Simplify the menu by introducing a third level (closes #226)
-rw-r--r--ishtar/furnitures/menus.py163
-rw-r--r--ishtar/furnitures/urls.py6
-rw-r--r--ishtar/templates/base.html8
-rw-r--r--static/js/ishtar.js4
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/',