|
1
|
|
|
# coding=utf-8 |
|
2
|
|
|
""" |
|
3
|
|
|
Permission logic utilities |
|
4
|
|
|
""" |
|
5
|
|
|
from __future__ import unicode_literals |
|
6
|
|
|
from permission.logics import PermissionLogic |
|
7
|
|
|
|
|
8
|
|
|
|
|
9
|
|
|
def add_permission_logic(model, permission_logic): |
|
10
|
|
|
""" |
|
11
|
|
|
Add permission logic to the model |
|
12
|
|
|
|
|
13
|
|
|
Parameters |
|
14
|
|
|
---------- |
|
15
|
|
|
model : django model class |
|
16
|
|
|
A django model class which will be treated by the specified permission |
|
17
|
|
|
logic |
|
18
|
|
|
permission_logic : permission logic instance |
|
19
|
|
|
A permission logic instance which will be used to determine permission |
|
20
|
|
|
of the model |
|
21
|
|
|
|
|
22
|
|
|
Examples |
|
23
|
|
|
-------- |
|
24
|
|
|
>>> from django.db import models |
|
25
|
|
|
>>> from permission.logics import PermissionLogic |
|
26
|
|
|
>>> class Mock(models.Model): |
|
27
|
|
|
... name = models.CharField('name', max_length=120) |
|
28
|
|
|
>>> add_permission_logic(Mock, PermissionLogic()) |
|
29
|
|
|
""" |
|
30
|
|
|
if not isinstance(permission_logic, PermissionLogic): |
|
31
|
|
|
raise AttributeError( |
|
32
|
|
|
'`permission_logic` must be an instance of PermissionLogic') |
|
33
|
|
|
if not hasattr(model, '_permission_logics'): |
|
34
|
|
|
model._permission_logics = set() |
|
35
|
|
|
if not hasattr(model, '_permission_handler'): |
|
36
|
|
|
from permission.utils.handlers import registry |
|
37
|
|
|
# register default permission handler |
|
38
|
|
|
registry.register(model, handler=None) |
|
39
|
|
|
model._permission_logics.add(permission_logic) |
|
40
|
|
|
# store target model to the permission_logic instance |
|
41
|
|
|
permission_logic.model = model |
|
42
|
|
|
|
|
43
|
|
|
|
|
44
|
|
|
def remove_permission_logic(model, permission_logic, fail_silently=True): |
|
45
|
|
|
""" |
|
46
|
|
|
Remove permission logic to the model |
|
47
|
|
|
|
|
48
|
|
|
Parameters |
|
49
|
|
|
---------- |
|
50
|
|
|
model : django model class |
|
51
|
|
|
A django model class which will be treated by the specified permission |
|
52
|
|
|
logic |
|
53
|
|
|
permission_logic : permission logic class or instance |
|
54
|
|
|
A permission logic class or instance which will be used to determine |
|
55
|
|
|
permission of the model |
|
56
|
|
|
fail_silently : boolean |
|
57
|
|
|
If `True` then do not raise KeyError even the specified permission logic |
|
58
|
|
|
have not registered. |
|
59
|
|
|
|
|
60
|
|
|
Examples |
|
61
|
|
|
-------- |
|
62
|
|
|
>>> from django.db import models |
|
63
|
|
|
>>> from permission.logics import PermissionLogic |
|
64
|
|
|
>>> class Mock(models.Model): |
|
65
|
|
|
... name = models.CharField('name', max_length=120) |
|
66
|
|
|
>>> logic = PermissionLogic() |
|
67
|
|
|
>>> add_permission_logic(Mock, logic) |
|
68
|
|
|
>>> remove_permission_logic(Mock, logic) |
|
69
|
|
|
""" |
|
70
|
|
|
if not hasattr(model, '_permission_logics'): |
|
71
|
|
|
model._permission_logics = set() |
|
72
|
|
|
if not isinstance(permission_logic, PermissionLogic): |
|
73
|
|
|
# remove all permission logic of related |
|
74
|
|
|
remove_set = set() |
|
75
|
|
|
for _permission_logic in model._permission_logics: |
|
76
|
|
|
if _permission_logic.__class__ == permission_logic: |
|
77
|
|
|
remove_set.add(_permission_logic) |
|
78
|
|
|
# difference |
|
79
|
|
|
model._permission_logics = model._permission_logics.difference(remove_set) |
|
80
|
|
|
else: |
|
81
|
|
|
if fail_silently and permission_logic not in model._permission_logics: |
|
82
|
|
|
pass |
|
83
|
|
|
else: |
|
84
|
|
|
model._permission_logics.remove(permission_logic) |
|
85
|
|
|
|
|
86
|
|
|
|