GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

CollaboratorsPermissionLogic.has_perm()   F
last analyzed

Complexity

Conditions 16

Size

Total Lines 66

Duplication

Lines 66
Ratio 100 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 16
c 2
b 0
f 0
dl 66
loc 66
rs 2.7057

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like CollaboratorsPermissionLogic.has_perm() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
# coding=utf-8
2
"""
3
Permission logic module for collaborators based permission system
4
"""
5
from permission.conf import settings
6
from permission.logics.base import PermissionLogic
7
from permission.utils.field_lookup import field_lookup
8
from permission.compat import is_authenticated
9
10
11 View Code Duplication
class CollaboratorsPermissionLogic(PermissionLogic):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
12
    """
13
    Permission logic class for collaborators based permission system
14
    """
15
    def __init__(self,
16
                 field_name=None,
17
                 any_permission=None,
18
                 change_permission=None,
19
                 delete_permission=None):
20
        """
21
        Constructor
22
23
        Parameters
24
        ----------
25
        field_name : string
26
            A field name of object which store the collaborators as django
27
            relational fields for django user model.
28
            You can specify the related object with '__' like django queryset
29
            filter.
30
            Default value will be taken from
31
            ``PERMISSION_DEFAULT_COLLABORATORS_PERMISSION_LOGIC_FIELD_NAME`` in
32
            settings.
33
        any_permission : boolean
34
            True for give any permission of the specified object to the
35
            collaborators.
36
            Default value will be taken from
37
            ``PERMISSION_DEFAULT_COLLABORATORS_PERMISSION_LOGIC_ANY_PERMISSION``
38
            in settings.
39
        change_permission : boolean
40
            True for give change permission of the specified object to the
41
            collaborators.
42
            It will be ignored if :attr:`any_permission` is True.
43
            Default value will be taken from
44
            ``PERMISSION_DEFAULT_COLLABORATORS_PERMISSION_LOGIC_CHANGE_PERMISSION``
45
            in settings.
46
        delete_permission : boolean
47
            True for give delete permission of the specified object to the
48
            collaborators.
49
            It will be ignored if :attr:`any_permission` is True.
50
            Default value will be taken from
51
            ``PERMISSION_DEFAULT_COLLABORATORS_PERMISSION_LOGIC_DELETE_PERMISSION``
52
            in settings.
53
        """
54
        self.field_name = field_name
55
        self.any_permission = any_permission
56
        self.change_permission = change_permission
57
        self.delete_permission = delete_permission
58
59
        if self.field_name is None:
60
            self.field_name = \
61
                settings.PERMISSION_DEFAULT_CPL_FIELD_NAME
62
        if self.any_permission is None:
63
            self.any_permission = \
64
                settings.PERMISSION_DEFAULT_CPL_ANY_PERMISSION
65
        if self.change_permission is None:
66
            self.change_permission = \
67
                settings.PERMISSION_DEFAULT_CPL_CHANGE_PERMISSION
68
        if self.delete_permission is None:
69
            self.delete_permission = \
70
                settings.PERMISSION_DEFAULT_CPL_DELETE_PERMISSION
71
72
    def has_perm(self, user_obj, perm, obj=None):
73
        """
74
        Check if user have permission (of object)
75
76
        If the user_obj is not authenticated, it return ``False``.
77
78
        If no object is specified, it return ``True`` when the corresponding
79
        permission was specified to ``True`` (changed from v0.7.0).
80
        This behavior is based on the django system.
81
        https://code.djangoproject.com/wiki/RowLevelPermissions
82
83
84
        If an object is specified, it will return ``True`` if the user is
85
        found in ``field_name`` of the object (e.g. ``obj.collaborators``).
86
        So once the object store the user as a collaborator in
87
        ``field_name`` attribute (default: ``collaborators``), the collaborator
88
        can change or delete the object (you can change this behavior to set
89
        ``any_permission``, ``change_permission`` or ``delete_permission``
90
        attributes of this instance).
91
92
        Parameters
93
        ----------
94
        user_obj : django user model instance
95
            A django user model instance which be checked
96
        perm : string
97
            `app_label.codename` formatted permission string
98
        obj : None or django model instance
99
            None or django model instance for object permission
100
101
        Returns
102
        -------
103
        boolean
104
            Whether the specified user have specified permission (of specified
105
            object).
106
        """
107
        if not is_authenticated(user_obj):
108
            return False
109
        # construct the permission full name
110
        change_permission = self.get_full_permission_string('change')
111
        delete_permission = self.get_full_permission_string('delete')
112
        if obj is None:
113
            # object permission without obj should return True
114
            # Ref: https://code.djangoproject.com/wiki/RowLevelPermissions
115
            if self.any_permission:
116
                return True
117
            if self.change_permission and perm == change_permission:
118
                return True
119
            if self.delete_permission and perm == delete_permission:
120
                return True
121
            return False
122
        elif user_obj.is_active:
123
            # get collaborator queryset
124
            collaborators = field_lookup(obj, self.field_name)
125
            if hasattr(collaborators, 'all'):
126
                collaborators = collaborators.all()
127
            if user_obj in collaborators:
128
                if self.any_permission:
129
                    # have any kind of permissions to the obj
130
                    return True
131
                if (self.change_permission and
132
                        perm == change_permission):
133
                    return True
134
                if (self.delete_permission and
135
                        perm == delete_permission):
136
                    return True
137
        return False
138