#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (C) 2010-2011 Étienne Loks # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # See the file COPYING for details. """ Menus """ from django.utils.translation import ugettext_lazy as _ import models class SectionItem: def __init__(self, idx, label, childs=[]): self.idx = idx 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=[]): self.idx = idx self.label = label self.model = model self.access_controls = access_controls self.available = False def can_be_available(self, user): if not self.access_controls: return True for access_control in self.access_controls: if user.has_perm('furnitures.' + access_control, self.model): return True return False def is_available(self, user, obj=None): if not self.access_controls: return True for access_control in self.access_controls: if user.has_perm('furnitures.' + access_control, self.model, obj): 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=[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"Archaelogical file"), childs=[ MenuItem('file_search', _(u"Search"), model=models.File, access_controls=['view_file', 'view_own_file']), 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_administrativeactfile', _(u"Add"), model=models.Operation, access_controls=['change_file', 'change_own_file']), MenuItem('file_administrativeactfile_modification', _(u"Modification"), model=models.AdministrativeAct, access_controls=['change_file', 'change_own_file']), MenuItem('file_administrativeactfile_deletion', _(u"Deletion"), model=models.AdministrativeAct, access_controls=['delete_file', 'delete_own_file']), ],), ]), SectionItem('operation_management', _(u"Operation"), childs=[ MenuItem('operation_search', _(u"Search"), model=models.Operation, access_controls=['view_operation', 'view_own_operation']), 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_administrativeactop', _(u"Add"), model=models.Operation, access_controls=['change_operation', 'change_own_operation']), MenuItem('operation_administrativeactop_modification', _(u"Modification"), model=models.AdministrativeAct, access_controls=['change_operation', 'change_own_operation']), MenuItem('operation_administrativeactop_deletion', _(u"Deletion"), model=models.AdministrativeAct, access_controls=['operation_deletion', 'delete_own_operation']), ],), ]), SectionItem('record_management', _(u"Context record"), childs=[ MenuItem('record_search', _(u"Search"), model=models.ContextRecord, access_controls=['view_contextrecord', 'view_own_contextrecord']), MenuItem('record_creation', _(u"Creation"), model=models.ContextRecord, access_controls=['add_contextrecord', 'add_own_contextrecord']), MenuItem('record_modification', _(u"Modification"), model=models.ContextRecord, access_controls=['change_contextrecord', 'change_own_contextrecord']), MenuItem('record_deletion', _(u"Deletion"), model=models.ContextRecord, access_controls=['delete_contextrecord', 'delete_own_contextrecord']), ]), SectionItem('item_management', _(u"Item"), childs=[ MenuItem('item_search', _(u"Search"), model=models.Item, access_controls=['view_item', 'view_own_item']), MenuItem('item_creation', _(u"Creation"), model=models.Item, access_controls=['add_item', 'add_own_item']), MenuItem('item_modification', _(u"Modification"), model=models.Item, access_controls=['change_item', 'change_own_item']), MenuItem('treatment_creation', _(u"Add a treatment"), model=models.Treatment, access_controls=['add_treatment', 'add_own_treatment']), ]), SectionItem('warehouse', _(u"Warehouse"), childs=[ MenuItem('warehouse_inventory', _(u"Inventory"), model=models.Warehouse, access_controls=['change_warehouse',]), MenuItem('warehouse_recording', _(u"Recording"), model=models.Treatment, access_controls=['add_treatment', 'add_own_treatment']), MenuItem('warehouse_packaging', _(u"Packaging"), model=models.Treatment, access_controls=['add_treatment', 'add_own_treatment']), MenuItem('warehouse_lend', _(u"Lending"), model=models.Treatment, access_controls=['add_treatment', 'add_own_treatment']), ]), SectionItem('dashboard', _(u"Dashboard"), childs=[ MenuItem('dashboard_file', _(u"Files"), model=models.File, access_controls=['change_file',]), MenuItem('dashboard_operation', _(u"Operations"), model=models.Operation, access_controls=['change_operation',]), MenuItem('dashboard_treatment', _(u"Treatments"), model=models.Treatment, access_controls=['change_treatment',]), MenuItem('dashboard_warehouse', _(u"Warehouses"), model=models.Warehouse, access_controls=['change_warehouse',]), ]), ] self.items = {} def init(self): if self.initialized: return self.items = {} for main_menu in self.childs: main_menu.set_items(self.user, self.items) self.initialized = True menu = Menu(None) menu.init()