diff options
-rw-r--r-- | archaeological_files/ishtar_menu.py | 5 | ||||
-rw-r--r-- | archaeological_operations/ishtar_menu.py | 5 | ||||
-rw-r--r-- | example_project/settings.py | 2 | ||||
-rw-r--r-- | ishtar_common/admin.py | 2 | ||||
-rw-r--r-- | ishtar_common/backend.py | 26 | ||||
-rw-r--r-- | ishtar_common/fixtures/groups_person_types-SRA-fr.json | 361 | ||||
-rw-r--r-- | ishtar_common/migrations/0004_auto.py | 210 | ||||
-rw-r--r-- | ishtar_common/models.py | 22 | ||||
-rw-r--r-- | ishtar_common/wizards.py | 2 |
9 files changed, 613 insertions, 22 deletions
diff --git a/archaeological_files/ishtar_menu.py b/archaeological_files/ishtar_menu.py index 236c47776..6655a381c 100644 --- a/archaeological_files/ishtar_menu.py +++ b/archaeological_files/ishtar_menu.py @@ -40,8 +40,9 @@ MENU_SECTIONS = [ access_controls=['change_file', 'change_own_file']), MenuItem('file_closing', _(u"Closing"), model=models.File, - access_controls=['change_file', - 'change_own_file']), + access_controls=['sra_agent']), + #'change_file', + #'change_own_file']), MenuItem('file_deletion', _(u"Deletion"), model=models.File, access_controls=['delete_file', 'delete_own_file']), diff --git a/archaeological_operations/ishtar_menu.py b/archaeological_operations/ishtar_menu.py index 7790087d9..cd8ebc2d2 100644 --- a/archaeological_operations/ishtar_menu.py +++ b/archaeological_operations/ishtar_menu.py @@ -40,8 +40,9 @@ MENU_SECTIONS = [ 'change_own_operation']), MenuItem('operation_closing', _(u"Closing"), model=models.Operation, - access_controls=['change_operation', - 'change_own_operation']), + access_controls=['sra_agent']), + #'change_operation', + #'change_own_operation']), MenuItem('operation_deletion', _(u"Deletion"), model=models.Operation, access_controls=['change_operation', diff --git a/example_project/settings.py b/example_project/settings.py index d45770277..e7a2d5643 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -102,7 +102,7 @@ TEMPLATE_DIRS = ( AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', - 'ishtar_common.backend.ObjectOwnPermBackend', + 'ishtar_common.backend.ObjectPermBackend', ) INSTALLED_APPS = [ diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index fdff516f9..093d137ae 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -77,7 +77,7 @@ admin.site.register(models.Author, AuthorAdmin) class PersonTypeAdmin(admin.ModelAdmin): model = models.PersonType - filter_vertical = ('rights',) + filter_vertical = ('groups',) admin.site.register(models.PersonType, PersonTypeAdmin) diff --git a/ishtar_common/backend.py b/ishtar_common/backend.py index 297c96180..7ebdab221 100644 --- a/ishtar_common/backend.py +++ b/ishtar_common/backend.py @@ -24,10 +24,11 @@ Permission backend to manage "own" objects from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist +from django.db.models.loading import cache import models -class ObjectOwnPermBackend(object): +class ObjectPermBackend(object): supports_object_permissions = True supports_anonymous_user = True @@ -46,16 +47,23 @@ class ObjectOwnPermBackend(object): except ObjectDoesNotExist: return False try: - # only manage "own" permissions - assert perm.split('.')[-1].split('_')[1] == 'own' - except (IndexError, AssertionError): - return False + is_ownperm = perm.split('.')[-1].split('_')[1] == 'own' + except IndexError: + is_ownperm = False if ishtar_user.has_right('administrator'): return True + main_right = ishtar_user.person.has_right(perm) \ + or user_obj.has_perm(perm) + if not main_right or not is_ownperm: + return main_right if obj is None: model_name = perm.split('_')[-1].capitalize() - if not hasattr(models, model_name): + model = None + for app in cache.get_apps(): + for modl in cache.get_models(app): + if modl.__name__ == model_name: + model = modl + if not model: return False - model = getattr(models, model_name) - return user_obj.has_perm(perm) and model.has_item_of(ishtar_user) - return user_obj.has_perm(perm) and obj.is_own(user_obj) + return not is_ownperm or model.has_item_of(ishtar_user) + return not is_ownperm or obj.is_own(user_obj) diff --git a/ishtar_common/fixtures/groups_person_types-SRA-fr.json b/ishtar_common/fixtures/groups_person_types-SRA-fr.json new file mode 100644 index 000000000..e758bd645 --- /dev/null +++ b/ishtar_common/fixtures/groups_person_types-SRA-fr.json @@ -0,0 +1,361 @@ +[ + { + "pk": 2, + "model": "auth.group", + "fields": { + "name": "Dossiers : voir", + "permissions": [ + 241 + ] + } + }, + { + "pk": 1, + "model": "auth.group", + "fields": { + "name": "Op\u00e9rations : voir", + "permissions": [ + 245 + ] + } + }, + { + "pk": 4, + "model": "auth.group", + "fields": { + "name": "UEs : voir", + "permissions": [ + 243 + ] + } + }, + { + "pk": 3, + "model": "auth.group", + "fields": { + "name": "Utilisateurs : voir", + "permissions": [ + 56 + ] + } + }, + { + "pk": 5, + "model": "auth.group", + "fields": { + "name": "D\u00e9p\u00f4ts : voir", + "permissions": [ + 248 + ] + } + }, + { + "pk": 7, + "model": "auth.group", + "fields": { + "name": "Traitements : voir", + "permissions": [ + 247 + ] + } + }, + { + "pk": 6, + "model": "auth.group", + "fields": { + "name": "Mobilier : voir", + "permissions": [ + 242, + 244 + ] + } + }, + { + "pk": 8, + "model": "auth.group", + "fields": { + "name": "Actes administratifs : voir", + "permissions": [ + 240 + ] + } + }, + { + "pk": 9, + "model": "auth.group", + "fields": { + "name": "Actes administratifs : ajout", + "permissions": [ + 135 + ] + } + }, + { + "pk": 10, + "model": "auth.group", + "fields": { + "name": "Actes administratifs : modification/suppression", + "permissions": [ + 136, + 137 + ] + } + }, + { + "pk": 11, + "model": "auth.group", + "fields": { + "name": "D\u00e9p\u00f4ts : ajout", + "permissions": [ + 182 + ] + } + }, + { + "pk": 12, + "model": "auth.group", + "fields": { + "name": "D\u00e9p\u00f4ts : modification/suppression", + "permissions": [ + 183, + 184 + ] + } + }, + { + "pk": 13, + "model": "auth.group", + "fields": { + "name": "Dossiers : ajout", + "permissions": [ + 94 + ] + } + }, + { + "pk": 14, + "model": "auth.group", + "fields": { + "name": "Dossiers : modification/suppression", + "permissions": [ + 95, + 96 + ] + } + }, + { + "pk": 15, + "model": "auth.group", + "fields": { + "name": "Mobilier : ajout", + "permissions": [ + 201, + 211 + ] + } + }, + { + "pk": 16, + "model": "auth.group", + "fields": { + "name": "Mobilier : modification/suppression", + "permissions": [ + 202, + 203, + 212, + 213 + ] + } + }, + { + "pk": 17, + "model": "auth.group", + "fields": { + "name": "Op\u00e9rations : ajout", + "permissions": [ + 116 + ] + } + }, + { + "pk": 18, + "model": "auth.group", + "fields": { + "name": "Op\u00e9rations : modification/suppression", + "permissions": [ + 117, + 118 + ] + } + }, + { + "pk": 19, + "model": "auth.group", + "fields": { + "name": "Traitements : ajout", + "permissions": [ + 227 + ] + } + }, + { + "pk": 20, + "model": "auth.group", + "fields": { + "name": "Traitements : modification/suppression", + "permissions": [ + 228, + 229 + ] + } + }, + { + "pk": 21, + "model": "auth.group", + "fields": { + "name": "UEs : ajout", + "permissions": [ + 169 + ] + } + }, + { + "pk": 22, + "model": "auth.group", + "fields": { + "name": "UEs : modification/suppression", + "permissions": [ + 170, + 171 + ] + } + }, + { + "pk": 23, + "model": "auth.group", + "fields": { + "name": "Utilisateurs : ajout", + "permissions": [ + 53 + ] + } + }, + { + "pk": 24, + "model": "auth.group", + "fields": { + "name": "Utilisateurs : modification/suppression", + "permissions": [ + 54, + 55 + ] + } + }, + { + "pk": 7, + "model": "ishtar_common.persontype", + "fields": { + "comment": "Un acc\u00e8s limit\u00e9 \u00e0 la base, uniquement en lecture. Apr\u00e8s enregistrement.", + "available": true, + "txt_idx": "public_access", + "groups": [], + "label": "Acc\u00e8s public" + } + }, + { + "pk": 1, + "model": "ishtar_common.persontype", + "fields": { + "comment": "", + "available": true, + "txt_idx": "administrator", + "groups": [], + "label": "Administrateur" + } + }, + { + "pk": 3, + "model": "ishtar_common.persontype", + "fields": { + "comment": "Responsables de dossiers d'arch\u00e9ologie", + "available": true, + "txt_idx": "sra_agent", + "groups": [ + 1, + 2, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 13, + 14, + 15, + 16, + 17, + 18, + 21, + 22 + ], + "label": "Agent SRA (prescripteur)" + } + }, + { + "pk": 6, + "model": "ishtar_common.persontype", + "fields": { + "comment": "Responsable de l'am\u00e9nagement", + "available": true, + "txt_idx": "general_contractor", + "groups": [], + "label": "Am\u00e9nageur" + } + }, + { + "pk": 5, + "model": "ishtar_common.persontype", + "fields": { + "comment": "Cette personne peut g\u00e9rer du mobilier qu'il n'a pas cr\u00e9\u00e9\r\n\r\n", + "available": true, + "txt_idx": "warehouse_manager", + "groups": [], + "label": "Gestionnaire de d\u00e9p\u00f4t" + } + }, + { + "pk": 2, + "model": "ishtar_common.persontype", + "fields": { + "comment": "Article 13 D\u00e9cret 2004\r\n\r\nLe pr\u00e9fet de r\u00e9gion \u00e9dicte les prescriptions arch\u00e9ologiques, d\u00e9livre l'autorisation de fouille et d\u00e9signe le responsable scientifique de toute op\u00e9ration d'arch\u00e9ologie pr\u00e9ventive.\r\n\r\nLe responsable scientifique est l'interlocuteur du pr\u00e9fet de r\u00e9gion et le garant de la qualit\u00e9 scientifique de l'op\u00e9ration arch\u00e9ologique. A ce titre, il prend, dans le cadre de la mise en oeuvre du projet d'intervention de l'op\u00e9rateur, les d\u00e9cisions relatives \u00e0 la conduite scientifique de l'op\u00e9ration et \u00e0 l'\u00e9laboration du rapport dont il dirige la r\u00e9daction. Il peut \u00eatre diff\u00e9rent pour la r\u00e9alisation du diagnostic et pour la r\u00e9alisation de la fouille.", + "available": true, + "txt_idx": "head_scientist", + "groups": [], + "label": "Responsable scientifique" + } + }, + { + "pk": 4, + "model": "ishtar_common.persontype", + "fields": { + "comment": "Acc\u00e8s pour les secr\u00e9taires d'un SRA", + "available": true, + "txt_idx": "secretarial_dept", + "groups": [ + 1, + 2, + 6, + 7, + 8, + 9, + 10, + 13, + 14, + 17, + 18 + ], + "label": "Secr\u00e9tariat SRA" + } + } +]
\ No newline at end of file diff --git a/ishtar_common/migrations/0004_auto.py b/ishtar_common/migrations/0004_auto.py new file mode 100644 index 000000000..074080757 --- /dev/null +++ b/ishtar_common/migrations/0004_auto.py @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Removing M2M table for field rights on 'PersonType' + db.delete_table('ishtar_common_persontype_rights') + + # Adding M2M table for field groups on 'PersonType' + db.create_table('ishtar_common_persontype_groups', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('persontype', models.ForeignKey(orm['ishtar_common.persontype'], null=False)), + ('group', models.ForeignKey(orm['auth.group'], null=False)) + )) + db.create_unique('ishtar_common_persontype_groups', ['persontype_id', 'group_id']) + + + def backwards(self, orm): + # Adding M2M table for field rights on 'PersonType' + db.create_table('ishtar_common_persontype_rights', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('persontype', models.ForeignKey(orm['ishtar_common.persontype'], null=False)), + ('wizardstep', models.ForeignKey(orm['ishtar_common.wizardstep'], null=False)) + )) + db.create_unique('ishtar_common_persontype_rights', ['persontype_id', 'wizardstep_id']) + + # Removing M2M table for field groups on 'PersonType' + db.delete_table('ishtar_common_persontype_groups') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'ishtar_common.arrondissement': { + 'Meta': {'object_name': 'Arrondissement'}, + 'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) + }, + 'ishtar_common.author': { + 'Meta': {'object_name': 'Author'}, + 'author_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.AuthorType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'author'", 'to': "orm['ishtar_common.Person']"}) + }, + 'ishtar_common.authortype': { + 'Meta': {'object_name': 'AuthorType'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'ishtar_common.canton': { + 'Meta': {'object_name': 'Canton'}, + 'arrondissement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Arrondissement']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) + }, + 'ishtar_common.department': { + 'Meta': {'ordering': "['number']", 'object_name': 'Department'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}) + }, + 'ishtar_common.historicalorganization': { + 'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalOrganization'}, + 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), + 'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), + 'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'organization_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.ishtaruser': { + 'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, + 'person': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Person']", 'unique': 'True'}), + 'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}) + }, + 'ishtar_common.organization': { + 'Meta': {'object_name': 'Organization'}, + 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'organization_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.OrganizationType']"}), + 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.organizationtype': { + 'Meta': {'ordering': "('label',)", 'object_name': 'OrganizationType'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'ishtar_common.person': { + 'Meta': {'object_name': 'Person'}, + 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'attached_to': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Organization']", 'null': 'True', 'blank': 'True'}), + 'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['auth.User']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}), + 'person_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.PersonType']", 'symmetrical': 'False'}), + 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'surname': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '2'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.persontype': { + 'Meta': {'ordering': "('label',)", 'object_name': 'PersonType'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'ishtar_common.sourcetype': { + 'Meta': {'object_name': 'SourceType'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'ishtar_common.town': { + 'Meta': {'ordering': "['numero_insee']", 'object_name': 'Town'}, + 'canton': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Canton']", 'null': 'True', 'blank': 'True'}), + 'center': ('django.contrib.gis.db.models.fields.PointField', [], {'srid': '27572', 'null': 'True', 'blank': 'True'}), + 'departement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'numero_insee': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '6'}), + 'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.wizard': { + 'Meta': {'ordering': "['url_name']", 'object_name': 'Wizard'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'url_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '128'}) + }, + 'ishtar_common.wizardstep': { + 'Meta': {'ordering': "['wizard', 'order']", 'object_name': 'WizardStep'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'url_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'wizard': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Wizard']"}) + } + } + + complete_apps = ['ishtar_common']
\ No newline at end of file diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 456368d6e..ee5ad0c8d 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -37,7 +37,7 @@ from django.utils.translation import ugettext_lazy as _, ugettext from django.utils.safestring import SafeUnicode, mark_safe from django.template.defaultfilters import slugify -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group from django.contrib.gis.db import models from django.contrib import admin @@ -641,7 +641,8 @@ class Organization(Address, OwnPerms): return self.name class PersonType(GeneralType): - rights = models.ManyToManyField(WizardStep, verbose_name=_(u"Rights")) + #rights = models.ManyToManyField(WizardStep, verbose_name=_(u"Rights")) + groups = models.ManyToManyField(Group, verbose_name=_(u"Groups")) class Meta: verbose_name = _(u"Person type") verbose_name_plural = _(u"Person types") @@ -687,11 +688,17 @@ class Person(Address, OwnPerms) : return u", ".join([unicode(pt) for pt in self.person_types.all()]) def has_right(self, right_name): + if '.' in right_name: + right_name = right_name.split('.')[-1] if type(right_name) in (list, tuple): - return bool( - self.person_types.filter(txt_idx__in=right_name).count()) + return bool(self.person_types.filter( + txt_idx__in=right_name).count()) or \ + bool(self.person_types.filter( + groups__permissions__codename__in=right_name).count()) # or self.person_types.filter(wizard__url_name__in=right_name).count()) - return bool(self.person_types.filter(txt_idx=right_name).count()) + return bool(self.person_types.filter(txt_idx=right_name).count()) or \ + bool(self.person_types.filter( + groups__permissions__codename=right_name).count()) # or self.person_types.filter(wizard__url_name=right_name).count()) def full_label(self): @@ -711,7 +718,8 @@ class Person(Address, OwnPerms) : return slugify(u"-".join(values)) class IshtarUser(User): - person = models.ForeignKey(Person, verbose_name=_(u"Person"), unique=True) + person = models.ForeignKey(Person, verbose_name=_(u"Person"), unique=True, + related_name='ishtaruser') class Meta: verbose_name = _(u"Ishtar user") @@ -735,7 +743,7 @@ class IshtarUser(User): return IshtarUser.objects.create(user_ptr=user, person=person) def has_right(self, right_name): - return self.person.has_right('administrator') + return self.person.has_right(right_name) class AuthorType(GeneralType): class Meta: diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index df415ce34..534671972 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -46,6 +46,8 @@ class Wizard(NamedUrlWizardView): cond = condition(self) if not cond: return False + return True + #TODO: to be check if not hasattr(self.request.user, 'ishtaruser'): return False return self.request.user.ishtaruser.has_right(('administrator', |