IsOwnerOrWriter.has_object_permission()   A
last analyzed

Complexity

Conditions 5

Size

Total Lines 16
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 12
dl 0
loc 16
rs 9.3333
c 0
b 0
f 0
cc 5
nop 4
1
from rest_framework.permissions import SAFE_METHODS, IsAuthenticated
2
3
from goals.models import BoardParticipant, Category, Board, Goal, Comment
4
5
6
class BoardPermissions(IsAuthenticated):
7
    """Определяет доступ к запросу на эндпоинт /goals/board{/<id>}.
8
9
        - просмотр: авторизованные пользователи, добавленные в список участников
10
        - редактирование: только владелец
11
    """
12
    message = 'Delete or edit boards can owners only.'
13
14
    def has_object_permission(self, request, view, obj: Board) -> bool:
15
        _filters: dict = {'user_id': request.user.id}
16
17
        if request.method not in SAFE_METHODS:
18
            _filters['role'] = BoardParticipant.Role.owner
19
20
        return obj.participants.filter(**_filters).exists()
21
22
23
class IsOwnerOrWriter(IsAuthenticated):
24
    """Определяет доступ на редактирование объекта
25
26
        - просмотр: все авторизованные пользователи
27
        - редактирование: только владелец или редактор
28
    """
29
    message = 'Delete or edit object can owners or writers only.'
30
    board = None
31
32
    def has_object_permission(self, request, view, obj) -> bool:
33
        _filters: dict = {'user_id': request.user.id}
34
35
        if isinstance(obj, Category):
36
            self.board = obj.board
37
        elif isinstance(obj, Goal):
38
            self.board = obj.category.board
39
        elif isinstance(obj, Comment):
40
            self.board = obj.goal.category.board
41
        else:
42
            return False
43
44
        if request.method not in SAFE_METHODS:
45
            _filters['role__in'] = (BoardParticipant.Role.owner, BoardParticipant.Role.writer,)
46
47
        return self.board.participants.filter(**_filters).exists()
48
49
50
class IsCommentOwner(IsAuthenticated):
51
    """Определяет доступ на редактирование комментария
52
53
        - просмотр: все авторизованные пользователи
54
        - редактирование: только автор
55
    """
56
    message = 'Delete or edit comments can owners only.'
57
58
    def has_object_permission(self, request, view, obj: Comment) -> bool:
59
        return any((
60
            request.method in SAFE_METHODS,
61
            obj.user.id == request.user.id
62
        ))
63