summaryrefslogtreecommitdiff
path: root/ishtar_common/backend.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2013-10-17 20:53:11 +0200
committerÉtienne Loks <etienne.loks@peacefrogs.net>2013-10-17 20:53:11 +0200
commit0dfe2d08f84dd69fac50401b0af04e602d148242 (patch)
tree32d48af331dc356dcbb3510655942728be1390f4 /ishtar_common/backend.py
parentb6becbf6770dc30a88ef814effecd53b6c707da2 (diff)
downloadIshtar-0dfe2d08f84dd69fac50401b0af04e602d148242.tar.bz2
Ishtar-0dfe2d08f84dd69fac50401b0af04e602d148242.zip
Fix permission management
* improve ObjectPermBackend * change permission right from wizard to groups * remove default to administrator * add default data for french person_types
Diffstat (limited to 'ishtar_common/backend.py')
-rw-r--r--ishtar_common/backend.py26
1 files changed, 17 insertions, 9 deletions
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)