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
|
|
|
|