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.

AuthorPermissionLogic.__init__()   B
last analyzed

Complexity

Conditions 5

Size

Total Lines 54

Duplication

Lines 54
Ratio 100 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
c 1
b 0
f 0
dl 54
loc 54
rs 8.4156

How to fix   Long Method   

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:

1
# coding=utf-8
2
"""
3
Permission logic module for author 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 AuthorPermissionLogic(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 author 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 author as django user model.
27
            You can specify the related object with '__' like django queryset
28
            filter.
29
            Default value will be taken from
30
            ``PERMISSION_DEFAULT_APL_FIELD_NAME`` in
31
            settings.
32
        any_permission : boolean
33
            True for give any permission of the specified object to the author
34
            Default value will be taken from
35
            ``PERMISSION_DEFAULT_APL_ANY_PERMISSION`` in
36
            settings.
37
        change_permission : boolean
38
            True for give change permission of the specified object to the
39
            author.
40
            It will be ignored if :attr:`any_permission` is True.
41
            Default value will be taken from
42
            ``PERMISSION_DEFAULT_APL_CHANGE_PERMISSION`` in
43
            settings.
44
        delete_permission : boolean
45
            True for give delete permission of the specified object to the
46
            author.
47
            It will be ignored if :attr:`any_permission` is True.
48
            Default value will be taken from
49
            ``PERMISSION_DEFAULT_APL_DELETE_PERMISSION`` in
50
            settings.
51
        """
52
        self.field_name = field_name
53
        self.any_permission = any_permission
54
        self.change_permission = change_permission
55
        self.delete_permission = delete_permission
56
57
        if self.field_name is None:
58
            self.field_name = \
59
                settings.PERMISSION_DEFAULT_APL_FIELD_NAME
60
        if self.any_permission is None:
61
            self.any_permission = \
62
                settings.PERMISSION_DEFAULT_APL_ANY_PERMISSION
63
        if self.change_permission is None:
64
            self.change_permission = \
65
                settings.PERMISSION_DEFAULT_APL_CHANGE_PERMISSION
66
        if self.delete_permission is None:
67
            self.delete_permission = \
68
                settings.PERMISSION_DEFAULT_APL_DELETE_PERMISSION
69
70
    def has_perm(self, user_obj, perm, obj=None):
71
        """
72
        Check if user have permission (of object)
73
74
        If the user_obj is not authenticated, it return ``False``.
75
76
        If no object is specified, it return ``True`` when the corresponding
77
        permission was specified to ``True`` (changed from v0.7.0).
78
        This behavior is based on the django system.
79
        https://code.djangoproject.com/wiki/RowLevelPermissions
80
81
        If an object is specified, it will return ``True`` if the user is
82
        specified in ``field_name`` of the object (e.g. ``obj.author``).
83
        So once user create an object and the object store who is the author in
84
        ``field_name`` attribute (default: ``author``), the author can change
85
        or delete the object (you can change this behavior to set
86
        ``any_permission``, ``change_permissino`` or ``delete_permission``
87
        attributes of this instance).
88
89
        Parameters
90
        ----------
91
        user_obj : django user model instance
92
            A django user model instance which be checked
93
        perm : string
94
            `app_label.codename` formatted permission string
95
        obj : None or django model instance
96
            None or django model instance for object permission
97
98
        Returns
99
        -------
100
        boolean
101
            Whether the specified user have specified permission (of specified
102
            object).
103
        """
104
        if not is_authenticated(user_obj):
105
            return False
106
        # construct the permission full name
107
        change_permission = self.get_full_permission_string('change')
108
        delete_permission = self.get_full_permission_string('delete')
109
        # check if the user is authenticated
110
        if obj is None:
111
            # object permission without obj should return True
112
            # Ref: https://code.djangoproject.com/wiki/RowLevelPermissions
113
            if self.any_permission:
114
                return True
115
            if self.change_permission and perm == change_permission:
116
                return True
117
            if self.delete_permission and perm == delete_permission:
118
                return True
119
            return False
120
        elif user_obj.is_active:
121
            # get author instance
122
            author = field_lookup(obj, self.field_name)
123
            if author == user_obj:
124
                if self.any_permission:
125
                    # have any kind of permissions to the obj
126
                    return True
127
                if (self.change_permission and
128
                        perm == change_permission):
129
                    return True
130
                if (self.delete_permission and
131
                        perm == delete_permission):
132
                    return True
133
        return False
134