diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-10-11 20:40:01 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2011-10-11 20:40:01 +0200 |
commit | cbbaaedc6fb3552081c30ff304ab9f97798426f7 (patch) | |
tree | 5b6673e61cd00871718cc6e1d4859d75b7433484 | |
parent | 9708c9524c1534c283701fb2af524aa2446eec09 (diff) | |
download | Ishtar-cbbaaedc6fb3552081c30ff304ab9f97798426f7.tar.bz2 Ishtar-cbbaaedc6fb3552081c30ff304ab9f97798426f7.zip |
More precise right managements (closes #644)
- wizard filtered with right managements
- better admin for rights related to person types
-rw-r--r-- | ishtar/ishtar_base/admin.py | 19 | ||||
-rw-r--r-- | ishtar/ishtar_base/forms.py | 26 | ||||
-rw-r--r-- | ishtar/ishtar_base/forms_common.py | 7 | ||||
-rw-r--r-- | ishtar/ishtar_base/menus.py | 10 | ||||
-rw-r--r-- | ishtar/ishtar_base/views.py | 28 |
5 files changed, 74 insertions, 16 deletions
diff --git a/ishtar/ishtar_base/admin.py b/ishtar/ishtar_base/admin.py index c1bcd9766..ac110e9e5 100644 --- a/ishtar/ishtar_base/admin.py +++ b/ishtar/ishtar_base/admin.py @@ -221,13 +221,18 @@ class TreatmentSourceAdmin(admin.ModelAdmin): admin.site.register(models.TreatmentSource, TreatmentSourceAdmin) -basic_models = [models.PersonType, models.IshtarUser, models.FileType, - models.OperationType, models.DatingType, models.DatingQuality, - models.SourceType, models.MaterialType, models.ParcelOwner, - models.WarehouseType, models.ActType, models.AuthorType, - models.OrganizationType, models.TreatmentType, - models.RemainType, models.PermitType, models.Unit, - models.ActivityType, models.IdentificationType] +class PersonTypeAdmin(admin.ModelAdmin): + model = models.PersonType + filter_vertical = ('rights',) + +admin.site.register(models.PersonType, PersonTypeAdmin) + +basic_models = [models.IshtarUser, models.FileType, models.OperationType, + models.DatingType, models.DatingQuality, models.SourceType, + models.MaterialType, models.ParcelOwner, models.WarehouseType, + models.ActType, models.AuthorType, models.OrganizationType, + models.TreatmentType, models.RemainType, models.PermitType, + models.Unit, models.ActivityType, models.IdentificationType] if settings.COUNTRY == 'fr': basic_models += [models.Arrondissement, models.Canton, models.SaisineType] diff --git a/ishtar/ishtar_base/forms.py b/ishtar/ishtar_base/forms.py index 608e54739..d947b43ae 100644 --- a/ishtar/ishtar_base/forms.py +++ b/ishtar/ishtar_base/forms.py @@ -107,6 +107,32 @@ class Wizard(NamedUrlSessionFormWizard): model = None modification = None # True when the wizard modify an item + @staticmethod + def _check_right(step, condition=True): + '''Return a method to check the right for a specific step''' + def check_right(self, request, storage): + cond = condition + if callable(condition): + cond = condition(self, request, storage) + if not cond: + return False + person_type = request.user.ishtaruser.person.person_type + if person_type.txt_idx == 'administrator': + return True + if person_type.rights.filter(url_name=step).count(): + return True + return check_right + + def __init__(self, *args, **kwargs): + """Check right for each step of the wizard""" + super(Wizard, self).__init__(*args, **kwargs) + for form_key in self.form_list.keys()[:-1]: + condition = True + if form_key in self.condition_list: + condition = self.condition_list.get(form_key, True) + cond = self._check_right(form_key, condition) + self.condition_list[form_key] = cond + def get_wizard_name(self): """As the class name can interfere when reused, use the url_name""" return self.url_name diff --git a/ishtar/ishtar_base/forms_common.py b/ishtar/ishtar_base/forms_common.py index d6a95aa75..68ab9be5f 100644 --- a/ishtar/ishtar_base/forms_common.py +++ b/ishtar/ishtar_base/forms_common.py @@ -38,7 +38,8 @@ from ishtar import settings import models import widgets -from forms import Wizard, FinalForm, FormSet, reverse_lazy, name_validator +from forms import Wizard, SearchWizard, FinalForm, FormSet, reverse_lazy, \ + name_validator def get_town_field(label=_(u"Town"), required=True): help_text = _(u"<p>Type name, department code and/or postal code of the " @@ -198,6 +199,10 @@ class PersonForm(forms.Form): new_item.save() return new_item +person_search_wizard = SearchWizard([ + ('general-person_search', PersonFormSelection)], + url_name='person_search',) + person_creation_wizard = PersonWizard([ ('identity-person_creation', PersonForm), ('final-person_creation', FinalForm)], diff --git a/ishtar/ishtar_base/menus.py b/ishtar/ishtar_base/menus.py index 877f8aeab..79355a6be 100644 --- a/ishtar/ishtar_base/menus.py +++ b/ishtar/ishtar_base/menus.py @@ -67,6 +67,11 @@ class MenuItem: access_control = self.model._meta.app_label + '.' + access_control if user.has_perm(access_control, self.model): return True + # manage by person type + if hasattr(user, 'ishtaruser'): + person_type = user.ishtaruser.person.person_type + if person_type.rights.filter(wizard__url_name=self.idx).count(): + return True return False def is_available(self, user, obj=None): @@ -76,6 +81,11 @@ class MenuItem: access_control = self.model._meta.app_label + '.' + access_control if user.has_perm(access_control, self.model, obj): return True + # manage by person type + if hasattr(user, 'ishtaruser'): + person_type = user.ishtaruser.person.person_type + if person_type.rights.filter(wizard__url_name=self.idx).count(): + return True return False def set_items(self, user, items): diff --git a/ishtar/ishtar_base/views.py b/ishtar/ishtar_base/views.py index c00dd8bc9..94a37d46e 100644 --- a/ishtar/ishtar_base/views.py +++ b/ishtar/ishtar_base/views.py @@ -74,8 +74,11 @@ def check_permission(request, action_slug, obj_id=None): return menu.items[action_slug].can_be_available(request.user) def autocomplete_person(request, person_type=None): - if not request.user.has_perm('ishtar_base.view_person', models.Person) and \ - not request.user.has_perm('ishtar_base.view_own_person', models.Person) : + person_types = request.user.ishtaruser.person.person_type + if (not request.user.has_perm('ishtar_base.view_person', models.Person) and + not request.user.has_perm('ishtar_base.view_own_person', models.Person) + and not person_types.rights.filter(wizard__url_name='person_search' + ).count()): return HttpResponse(mimetype='text/plain') if not request.GET.get('term'): return HttpResponse(mimetype='text/plain') @@ -120,8 +123,11 @@ def autocomplete_town(request): return HttpResponse(data, mimetype='text/plain') def autocomplete_file(request): - if not request.user.has_perm('ishtar_base.view_file', models.File) and \ - not request.user.has_perm('ishtar_base.view_own_file', models.File) : + person_types = request.user.ishtaruser.person.person_type + if (not request.user.has_perm('ishtar_base.view_file', models.File) and \ + not request.user.has_perm('ishtar_base.view_own_file', models.File) + and not person_types.rights.filter(wizard__url_name='file_search' + ).count()): return HttpResponse(mimetype='text/plain') if not request.GET.get('term'): return HttpResponse(mimetype='text/plain') @@ -434,9 +440,12 @@ show_file = show_item(models.File, 'file') revert_file = revert_item(models.File) def autocomplete_operation(request, non_closed=True): - if not request.user.has_perm('ishtar_base.view_operation', models.Operation)\ + person_types = request.user.ishtaruser.person.person_type + if (not request.user.has_perm('ishtar_base.view_operation', models.Operation)\ and not request.user.has_perm('ishtar_base.view_own_operation', - models.Operation): + models.Operation) + and not person_types.rights.filter(wizard__url_name='operation_search' + ).count()): return HttpResponse(mimetype='text/plain') if not request.GET.get('term'): return HttpResponse(mimetype='text/plain') @@ -492,10 +501,13 @@ get_administrativeactop = get_item(models.AdministrativeAct, 'act_type__intented_to':'act_type__intented_to'}) def autocomplete_organization(request, orga_type=None): - if not request.user.has_perm('ishtar_base.view_organization', + person_types = request.user.ishtaruser.person.person_type + if (not request.user.has_perm('ishtar_base.view_organization', models.Organization) and \ not request.user.has_perm('ishtar_base.view_own_organization', - models.Organization): + models.Organization) + and not person_types.rights.filter(wizard__url_name='person_search' + ).count()): return HttpResponse(mimetype='text/plain') if not request.GET.get('term'): return HttpResponse(mimetype='text/plain') |