bazis-permit 2.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. bazis/contrib/permit/__init__.py +35 -0
  2. bazis/contrib/permit/_version.py +34 -0
  3. bazis/contrib/permit/admin.py +33 -0
  4. bazis/contrib/permit/admin_abstract.py +198 -0
  5. bazis/contrib/permit/apps.py +40 -0
  6. bazis/contrib/permit/conf.py +33 -0
  7. bazis/contrib/permit/locale/en/LC_MESSAGES/django.mo +0 -0
  8. bazis/contrib/permit/locale/en/LC_MESSAGES/django.po +93 -0
  9. bazis/contrib/permit/locale/messages.pot +97 -0
  10. bazis/contrib/permit/locale/ru/LC_MESSAGES/django.mo +0 -0
  11. bazis/contrib/permit/locale/ru/LC_MESSAGES/django.po +93 -0
  12. bazis/contrib/permit/migrations/0001_initial.py +81 -0
  13. bazis/contrib/permit/migrations/0002_alter_grouppermission_permissions.py +32 -0
  14. bazis/contrib/permit/migrations/0003_alter_grouppermission_slug_alter_permission_slug_and_more.py +42 -0
  15. bazis/contrib/permit/migrations/0004_alter_grouppermission_slug_alter_permission_slug_and_more.py +42 -0
  16. bazis/contrib/permit/migrations/0005_alter_grouppermission_slug_alter_permission_slug_and_more.py +42 -0
  17. bazis/contrib/permit/migrations/0006_remove_grouppermission_name_remove_role_name_and_more.py +47 -0
  18. bazis/contrib/permit/migrations/__init__.py +14 -0
  19. bazis/contrib/permit/models.py +31 -0
  20. bazis/contrib/permit/models_abstract.py +431 -0
  21. bazis/contrib/permit/router.py +23 -0
  22. bazis/contrib/permit/routes.py +28 -0
  23. bazis/contrib/permit/routes_abstract.py +625 -0
  24. bazis/contrib/permit/schemas.py +172 -0
  25. bazis/contrib/permit/services.py +265 -0
  26. bazis/contrib/permit/signals.py +54 -0
  27. bazis/contrib/permit/utils.py +97 -0
  28. bazis_permit-2.2.0.dist-info/METADATA +801 -0
  29. bazis_permit-2.2.0.dist-info/RECORD +31 -0
  30. bazis_permit-2.2.0.dist-info/WHEEL +5 -0
  31. bazis_permit-2.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,35 @@
1
+ # Copyright 2026 EcoFuture Technology Services LLC and contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ try:
16
+ from importlib.metadata import PackageNotFoundError, version
17
+ __version__ = version('bazis-permit')
18
+ except PackageNotFoundError:
19
+ __version__ = 'dev'
20
+
21
+
22
+ """
23
+ TODO: there is a problem now:
24
+ if the add action is available for an object, it can be added with a reference to
25
+ an external object that the user does not have access to.
26
+ this happens because the object does not have filled selectors at the addition stage.
27
+
28
+ we need a solution that will allow checking the availability of related objects
29
+ at the stage of adding or editing the main object.
30
+
31
+ that is, we need a solution that will make such a permission work:
32
+ 'entity.extended_entity.item.add.author_parent', # only those who are the author of the
33
+ parent record can add entries
34
+
35
+ """
@@ -0,0 +1,34 @@
1
+ # file generated by setuptools-scm
2
+ # don't change, don't track in version control
3
+
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
12
+
13
+ TYPE_CHECKING = False
14
+ if TYPE_CHECKING:
15
+ from typing import Tuple
16
+ from typing import Union
17
+
18
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
20
+ else:
21
+ VERSION_TUPLE = object
22
+ COMMIT_ID = object
23
+
24
+ version: str
25
+ __version__: str
26
+ __version_tuple__: VERSION_TUPLE
27
+ version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
30
+
31
+ __version__ = version = '2.2.0'
32
+ __version_tuple__ = version_tuple = (2, 2, 0)
33
+
34
+ __commit_id__ = commit_id = None
@@ -0,0 +1,33 @@
1
+ # Copyright 2026 EcoFuture Technology Services LLC and contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from django.contrib import admin
16
+
17
+ from . import models
18
+ from .admin_abstract import GroupPermissionAdminBase, PermissionAdminBase, RoleAdminBase
19
+
20
+
21
+ @admin.register(models.Role)
22
+ class RoleAdmin(RoleAdminBase):
23
+ pass
24
+
25
+
26
+ @admin.register(models.GroupPermission)
27
+ class GroupPermissionAdmin(GroupPermissionAdminBase):
28
+ pass
29
+
30
+
31
+ @admin.register(models.Permission)
32
+ class PermissionAdmin(PermissionAdminBase):
33
+ pass
@@ -0,0 +1,198 @@
1
+ # Copyright 2026 EcoFuture Technology Services LLC and contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import re
16
+
17
+ from django import forms
18
+ from django.contrib import admin
19
+ from django.contrib.admin.views.autocomplete import AutocompleteJsonView
20
+ from django.contrib.admin.widgets import AutocompleteMixin as AutocompleteMixinDjango
21
+ from django.urls import re_path, reverse
22
+ from django.utils.html import mark_safe
23
+ from django.utils.text import capfirst
24
+ from django.utils.translation import gettext_lazy as _
25
+
26
+ from translated_fields import TranslatedFieldAdmin
27
+
28
+ from bazis.contrib.permit.schemas import PATTERN_SELECTORS
29
+ from bazis.contrib.users import get_user_model
30
+ from bazis.core.admin_abstract import AutocompleteMixin, DtAdminMixin, M2mThroughMixin
31
+ from bazis.core.utils.sets_order import OrderedSet
32
+
33
+
34
+ User = get_user_model()
35
+
36
+
37
+ class UserPermitAdminMixin:
38
+ """
39
+ A mixin class for customizing the Django admin interface for user permits,
40
+ adding additional fields and display options related to user roles.
41
+ """
42
+
43
+ def get_fields_permissions(self, request, obj=None):
44
+ """
45
+ Extends the parent method to include 'roles' and 'role_current' in the fields
46
+ permissions for the admin interface.
47
+ """
48
+ return super().get_fields_permissions(request, obj) + ('roles', 'role_current')
49
+
50
+ def get_list_display(self, request):
51
+ """
52
+ Extends the parent method to include 'get_roles_name' and 'role_current' in the
53
+ list display for the admin interface, ensuring unique display fields using
54
+ OrderedSet.
55
+ """
56
+ return tuple(
57
+ OrderedSet(
58
+ ('id',) + super().get_list_display(request) + ('get_roles_name', 'role_current')
59
+ )
60
+ )
61
+
62
+ @admin.display(description=_('Roles'))
63
+ def get_roles_name(self, user):
64
+ """
65
+ Returns a safe HTML string that displays the names of all roles associated with
66
+ a user, separated by line breaks. This method is used in the admin interface to
67
+ show user roles.
68
+ """
69
+ return mark_safe('<br/>'.join([role.name for role in user.roles.all()]))
70
+
71
+
72
+ class RoleAdminBase(M2mThroughMixin, DtAdminMixin, TranslatedFieldAdmin, admin.ModelAdmin):
73
+ """
74
+ Admin configuration for the Role model, including list display, editable fields,
75
+ and horizontal filters.
76
+ """
77
+
78
+ list_display = (
79
+ '__str__',
80
+ 'slug',
81
+ 'is_system',
82
+ )
83
+ list_editable = ('is_system',)
84
+ filter_horizontal = ('groups_permission',)
85
+
86
+
87
+ class GroupPermissionAdminBase(DtAdminMixin, TranslatedFieldAdmin, admin.ModelAdmin):
88
+ """
89
+ Admin configuration for the GroupPermission model, including list display,
90
+ editable fields, and horizontal filters.
91
+ """
92
+
93
+ filter_horizontal = ('permissions',)
94
+ list_display = (
95
+ 'pk',
96
+ 'name',
97
+ 'slug',
98
+ )
99
+ list_editable = (
100
+ 'slug',
101
+ )
102
+
103
+
104
+ class PermissionAdminBase(DtAdminMixin, TranslatedFieldAdmin, admin.ModelAdmin):
105
+ """
106
+ Admin configuration for the Permission model, including list display, editable
107
+ fields, and search fields.
108
+ """
109
+
110
+ list_display = (
111
+ '__str__',
112
+ 'slug',
113
+ )
114
+ search_fields = ('slug',)
115
+ list_editable = ('slug',)
116
+
117
+
118
+ class PermitAutocompleteJsonView(AutocompleteJsonView):
119
+ def process_request(self, request):
120
+ if match := re.match(PATTERN_SELECTORS, request.GET['field_name']):
121
+ target_field = match.group(1)
122
+ request_GET = request.GET.copy() # noqa: N806
123
+ request_GET['field_name'] = target_field
124
+ request.GET = request_GET
125
+ return super().process_request(request)
126
+
127
+
128
+ class PermitAutocompleteSelectMultiple(AutocompleteMixinDjango, forms.SelectMultiple):
129
+ def __init__(self, origin_field, ref_field, admin_site, using, url_autocomplete, **kwargs):
130
+ self.url_autocomplete = url_autocomplete
131
+ self.origin_field = origin_field
132
+ super().__init__(ref_field, admin_site, using=using, **kwargs)
133
+
134
+ def build_attrs(self, base_attrs, extra_attrs=None):
135
+ attrs = super().build_attrs(base_attrs, extra_attrs=extra_attrs)
136
+ attrs['data-field-name'] = self.origin_field.name
137
+ return attrs
138
+
139
+ def get_url(self):
140
+ return reverse(f'{self.admin_site.name}:{self.url_autocomplete}')
141
+
142
+
143
+ class PermitAutocompleteMultipleChoiceField(forms.ModelMultipleChoiceField):
144
+ def prepare_value(self, value):
145
+ if isinstance(value, list):
146
+ return value
147
+ return super().prepare_value(value)
148
+
149
+ def clean(self, value):
150
+ if value:
151
+ return [str(user.pk) for user in super().clean(value)]
152
+ return []
153
+
154
+
155
+ class PermitAutocompleteMixin(AutocompleteMixin):
156
+ """
157
+ Admin configuration for the ParentEntity model, including display, filter,
158
+ search options, and related inlines.
159
+ """
160
+
161
+ class Media:
162
+ js = ('admin/js/autocomplete.js',)
163
+
164
+ def formfield_for_dbfield(self, db_field, **kwargs):
165
+ if match := re.match(PATTERN_SELECTORS, db_field.name):
166
+ target_field_name = match.group(1)
167
+ origin_field = db_field
168
+ db_field = self.model.get_fields_info().relations.get(target_field_name).model_field
169
+
170
+ kwargs['widget'] = PermitAutocompleteSelectMultiple(
171
+ origin_field,
172
+ db_field,
173
+ self.admin_site,
174
+ using=kwargs.get("using"),
175
+ url_autocomplete=self.get_url_autocomplete()
176
+ )
177
+ kwargs['label'] = capfirst(origin_field.verbose_name.strip())
178
+ kwargs['form_class'] = PermitAutocompleteMultipleChoiceField
179
+
180
+ formfield = super().formfield_for_dbfield(db_field, **kwargs)
181
+
182
+ return formfield
183
+
184
+ def get_url_autocomplete(self):
185
+ return f'{self.opts.app_label}_{self.opts.model_name}_changelist-autocomplete'
186
+
187
+ def get_urls(self):
188
+ urls = super().get_urls()
189
+
190
+ urls = [
191
+ re_path(
192
+ r'^autocomplete/$', self.autocomplete_view, name=self.get_url_autocomplete()
193
+ ),
194
+ ] + urls
195
+ return urls
196
+
197
+ def autocomplete_view(self, request):
198
+ return PermitAutocompleteJsonView.as_view(admin_site=self.admin_site)(request)
@@ -0,0 +1,40 @@
1
+ # Copyright 2026 EcoFuture Technology Services LLC and contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from django.utils.translation import gettext_lazy as _
16
+
17
+ from bazis.core.utils.apps import BaseConfig
18
+
19
+
20
+ class PermitConfig(BaseConfig):
21
+ """
22
+ Configuration class for the 'permit' application within the Bazis project. It
23
+ sets the application name and provides a human-readable name for the application
24
+ using Django's translation utilities.
25
+ """
26
+
27
+ name = 'bazis.contrib.permit'
28
+ verbose_name = _('Permit')
29
+
30
+ def ready(self):
31
+ """
32
+ Method to perform actions when the application is ready, such as importing
33
+ signals.
34
+ """
35
+ super().ready()
36
+
37
+ from . import signals # noqa: F401
38
+ from .models_abstract import PermitModelMixin
39
+
40
+ PermitModelMixin.setup_selectors_fields()
@@ -0,0 +1,33 @@
1
+ # Copyright 2026 EcoFuture Technology Services LLC and contributors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from django.utils.translation import gettext_lazy as _
16
+
17
+ from pydantic import Field
18
+
19
+ from bazis.core.utils.schemas import BazisSettings
20
+
21
+
22
+ class Settings(BazisSettings):
23
+ """
24
+ Represents the settings configuration for the application, extending
25
+ BazisSettings to include a specific permission cache expiry time.
26
+ """
27
+
28
+ BAZIS_PERMISSION_CACHE_EXPIRE: int = Field(
29
+ 7, title=_('Time to store user permissions, sec'), dynamic=True
30
+ )
31
+
32
+
33
+ settings = Settings()
@@ -0,0 +1,93 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2024-07-04 11:08+0000\n"
11
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "Language: \n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+
19
+ #: admin_abstract.py:32 models.py:89
20
+ msgid "Roles"
21
+ msgstr ""
22
+
23
+ #: apps.py:13
24
+ msgid "Permit"
25
+ msgstr ""
26
+
27
+ #: conf.py:13
28
+ msgid "Time to store user permissions, sec"
29
+ msgstr ""
30
+
31
+ #: models.py:28
32
+ msgid "Label"
33
+ msgstr ""
34
+
35
+ #: models.py:57
36
+ msgid "Name"
37
+ msgstr ""
38
+
39
+ #: models.py:78 models.py:104
40
+ msgid "Permission Groups"
41
+ msgstr ""
42
+
43
+ #: models.py:80
44
+ msgid "For Anonymous Users"
45
+ msgstr ""
46
+
47
+ #: models.py:81
48
+ msgid "System Role"
49
+ msgstr ""
50
+
51
+ #: models.py:88
52
+ msgid "Role"
53
+ msgstr ""
54
+
55
+ #: models.py:96 models.py:117
56
+ msgid "Permissions"
57
+ msgstr ""
58
+
59
+ #: models.py:103
60
+ msgid "Permission Group"
61
+ msgstr ""
62
+
63
+ #: models.py:116
64
+ msgid "Permission"
65
+ msgstr ""
66
+
67
+ #: models_abstract.py:128
68
+ msgid "User roles"
69
+ msgstr ""
70
+
71
+ #: models_abstract.py:131
72
+ msgid "Current user role"
73
+ msgstr ""
74
+
75
+ #: router.py:8
76
+ msgid "Role model"
77
+ msgstr ""
78
+
79
+ #: routes_abstract.py:449
80
+ msgid "Available for editing"
81
+ msgstr ""
82
+
83
+ #: routes_abstract.py:460
84
+ msgid "Available for deletion"
85
+ msgstr ""
86
+
87
+ #: routes_abstract.py:471
88
+ msgid "Available for creation"
89
+ msgstr ""
90
+
91
+ #: routes_abstract.py:483
92
+ msgid "Available actions"
93
+ msgstr ""
@@ -0,0 +1,97 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ #, fuzzy
7
+ msgid ""
8
+ msgstr ""
9
+ "Project-Id-Version: PACKAGE VERSION\n"
10
+ "Report-Msgid-Bugs-To: \n"
11
+ "POT-Creation-Date: 2024-06-06 00:19+0200\n"
12
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "Language: \n"
16
+ "MIME-Version: 1.0\n"
17
+ "Content-Type: text/plain; charset=CHARSET\n"
18
+ "Content-Transfer-Encoding: 8bit\n"
19
+
20
+ #: contrib/permit/routes_abstract.py:353
21
+ msgid "Available for editing"
22
+ msgstr ""
23
+
24
+ #: contrib/permit/routes_abstract.py:363
25
+ msgid "Available for deletion"
26
+ msgstr ""
27
+
28
+ #: contrib/permit/routes_abstract.py:373
29
+ msgid "Available for creation"
30
+ msgstr ""
31
+
32
+ #: contrib/permit/routes_abstract.py:385
33
+ msgid "Available actions"
34
+ msgstr ""
35
+
36
+ #: contrib/permit/models_abstract.py:96
37
+ msgid "User roles"
38
+ msgstr ""
39
+
40
+ #: contrib/permit/models_abstract.py:99
41
+ msgid "Current user role"
42
+ msgstr ""
43
+
44
+ #: contrib/permit/models.py:17
45
+ msgid "Label"
46
+ msgstr ""
47
+
48
+ #: contrib/permit/models.py:32
49
+ msgid "Name"
50
+ msgstr ""
51
+
52
+ #: contrib/permit/models.py:42
53
+ #: contrib/permit/models.py:56
54
+ msgid "Permission Groups"
55
+ msgstr ""
56
+
57
+ #: contrib/permit/models.py:43
58
+ msgid "For Anonymous Users"
59
+ msgstr ""
60
+
61
+ #: contrib/permit/models.py:44
62
+ msgid "System Role"
63
+ msgstr ""
64
+
65
+ #: contrib/permit/models.py:47
66
+ msgid "Role"
67
+ msgstr ""
68
+
69
+ #: contrib/permit/models.py:48
70
+ #: contrib/permit/admin_abstract.py:19
71
+ msgid "Roles"
72
+ msgstr ""
73
+
74
+ #: contrib/permit/models.py:52
75
+ #: contrib/permit/models.py:62
76
+ msgid "Permissions"
77
+ msgstr ""
78
+
79
+ #: contrib/permit/models.py:55
80
+ msgid "Permission Group"
81
+ msgstr ""
82
+
83
+ #: contrib/permit/models.py:61
84
+ msgid "Permission"
85
+ msgstr ""
86
+
87
+ #: contrib/permit/conf.py:8
88
+ msgid "Time to store user permissions, sec"
89
+ msgstr ""
90
+
91
+ #: contrib/permit/apps.py:7
92
+ msgid "Permit"
93
+ msgstr ""
94
+
95
+ #: contrib/permit/router.py:8
96
+ msgid "Role model"
97
+ msgstr ""
@@ -0,0 +1,93 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2024-07-04 11:08+0000\n"
11
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "Language: \n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+
19
+ #: admin_abstract.py:32 models.py:89
20
+ msgid "Roles"
21
+ msgstr "Роли"
22
+
23
+ #: apps.py:13
24
+ msgid "Permit"
25
+ msgstr "Разрешение"
26
+
27
+ #: conf.py:13
28
+ msgid "Time to store user permissions, sec"
29
+ msgstr "Время хранения разрешений пользователя, сек"
30
+
31
+ #: models.py:28
32
+ msgid "Label"
33
+ msgstr "Метка"
34
+
35
+ #: models.py:57
36
+ msgid "Name"
37
+ msgstr "Название"
38
+
39
+ #: models.py:78 models.py:104
40
+ msgid "Permission Groups"
41
+ msgstr "Группы разрешений"
42
+
43
+ #: models.py:80
44
+ msgid "For Anonymous Users"
45
+ msgstr "Для анонимных юзеров"
46
+
47
+ #: models.py:81
48
+ msgid "System Role"
49
+ msgstr "Системная роль"
50
+
51
+ #: models.py:88
52
+ msgid "Role"
53
+ msgstr "Роль"
54
+
55
+ #: models.py:96 models.py:117
56
+ msgid "Permissions"
57
+ msgstr "Разрешения"
58
+
59
+ #: models.py:103
60
+ msgid "Permission Group"
61
+ msgstr "Группа разрешений"
62
+
63
+ #: models.py:116
64
+ msgid "Permission"
65
+ msgstr "Разрешение"
66
+
67
+ #: models_abstract.py:128
68
+ msgid "User roles"
69
+ msgstr "Роли пользователя"
70
+
71
+ #: models_abstract.py:131
72
+ msgid "Current user role"
73
+ msgstr "Текущая роль пользователя"
74
+
75
+ #: router.py:8
76
+ msgid "Role model"
77
+ msgstr "Ролевая модель"
78
+
79
+ #: routes_abstract.py:449
80
+ msgid "Available for editing"
81
+ msgstr "Доступны для редактирования"
82
+
83
+ #: routes_abstract.py:460
84
+ msgid "Available for deletion"
85
+ msgstr "Доступны для удаления"
86
+
87
+ #: routes_abstract.py:471
88
+ msgid "Available for creation"
89
+ msgstr "Доступно для создания"
90
+
91
+ #: routes_abstract.py:483
92
+ msgid "Available actions"
93
+ msgstr "Доступные действия"