m3-users 2.2.14__tar.gz → 2.3.0__tar.gz
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.
- {m3-users-2.2.14/src/m3_users.egg-info → m3_users-2.3.0}/PKG-INFO +11 -10
- {m3-users-2.2.14 → m3_users-2.3.0}/changelog.md +7 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/setup.py +9 -16
- m3_users-2.3.0/src/m3_users/app_meta.py +77 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/roles.py +24 -9
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/templates/m3-users/edit-role-window.js +28 -11
- {m3-users-2.2.14 → m3_users-2.3.0/src/m3_users.egg-info}/PKG-INFO +11 -10
- m3_users-2.3.0/src/tests/manage.py +33 -0
- m3_users-2.3.0/src/tests/urls.py +24 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/version.conf +5 -5
- m3-users-2.2.14/src/m3_users/app_meta.py +0 -65
- m3-users-2.2.14/src/tests/manage.py +0 -20
- m3-users-2.2.14/src/tests/urls.py +0 -22
- {m3-users-2.2.14 → m3_users-2.3.0}/LICENSE +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/MANIFEST.in +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/README.txt +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/REQUIREMENTS +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/setup.cfg +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/__init__.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/api.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/constants.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/helpers.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/metaroles.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/migrations/0001_initial.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/migrations/0002_assignedrole_user.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/migrations/__init__.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/models.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/permissions.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/south_migrations/0001_initial.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/south_migrations/__init__.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/templates/m3-users/roles-list-window.js +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/templates/m3-users/select-users-window.js +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/ui.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/users.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users/version.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users.egg-info/SOURCES.txt +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users.egg-info/dependency_links.txt +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users.egg-info/requires.txt +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/m3_users.egg-info/top_level.txt +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/tests/__init__.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/tests/core/__init__.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/tests/core/tests.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/tests/prepare_env.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/tests/settings.py +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/tests/shell.sh +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/tests/test.sh +0 -0
- {m3-users-2.2.14 → m3_users-2.3.0}/src/tests/version.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: m3-users
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Пользователи и роли
|
|
5
5
|
Home-page: https://github.com/barsgroup/m3-users
|
|
6
6
|
Author: BARS Group
|
|
@@ -11,17 +11,10 @@ Classifier: Environment :: Web Environment
|
|
|
11
11
|
Classifier: Natural Language :: Russian
|
|
12
12
|
Classifier: Natural Language :: English
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
14
|
-
Classifier: Framework :: Django :: 1.5
|
|
15
|
-
Classifier: Framework :: Django :: 1.6
|
|
16
|
-
Classifier: Framework :: Django :: 1.7
|
|
17
|
-
Classifier: Framework :: Django :: 1.8
|
|
18
|
-
Classifier: Framework :: Django :: 1.9
|
|
19
|
-
Classifier: Framework :: Django :: 1.10
|
|
20
14
|
Classifier: Framework :: Django :: 1.11
|
|
21
15
|
Classifier: Framework :: Django :: 2.0
|
|
16
|
+
Classifier: Framework :: Django :: 4.0
|
|
22
17
|
Classifier: Programming Language :: Python
|
|
23
|
-
Classifier: Programming Language :: Python :: 2
|
|
24
|
-
Classifier: Programming Language :: Python :: 2.7
|
|
25
18
|
Classifier: Programming Language :: Python :: 3.6
|
|
26
19
|
Classifier: License :: OSI Approved :: MIT License
|
|
27
20
|
Classifier: Development Status :: 5 - Production/Stable
|
|
@@ -29,3 +22,11 @@ License-File: LICENSE
|
|
|
29
22
|
Requires-Dist: m3-builder>=1.0.1
|
|
30
23
|
Requires-Dist: m3-django-compat>=1.7.1
|
|
31
24
|
Requires-Dist: m3-ui
|
|
25
|
+
Dynamic: author
|
|
26
|
+
Dynamic: author-email
|
|
27
|
+
Dynamic: classifier
|
|
28
|
+
Dynamic: home-page
|
|
29
|
+
Dynamic: license
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
Dynamic: requires-dist
|
|
32
|
+
Dynamic: summary
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
## История изменений
|
|
2
|
+
**2.3.0**
|
|
3
|
+
- Добавлена поддержка django 4.0
|
|
4
|
+
|
|
5
|
+
**2.2.15**
|
|
6
|
+
- Добавлена активация чекбокса выбранных прав доступа для роли в `SelectPermissionWindow`.
|
|
7
|
+
- Добавлена возможность удалить право доступа для роли деактивацией чекбокса.
|
|
8
|
+
|
|
2
9
|
**2.2.14**
|
|
3
10
|
- Добавлена обязательная проверка прав доступа для паков `UsersActions`, `RolesActions` и `Roles_DictPack`:
|
|
4
11
|
по-умолчанию доступ к экшенам данных паков имеет только супер-администратор.
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
import os
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
from setuptools import (
|
|
5
|
+
find_packages,
|
|
6
|
+
setup,
|
|
7
|
+
)
|
|
4
8
|
|
|
5
9
|
|
|
6
10
|
setup(
|
|
@@ -11,7 +15,7 @@ setup(
|
|
|
11
15
|
author_email='bars@bars-open.ru',
|
|
12
16
|
package_dir={'': 'src'},
|
|
13
17
|
packages=find_packages('src'),
|
|
14
|
-
description=
|
|
18
|
+
description='Пользователи и роли',
|
|
15
19
|
install_requires=(
|
|
16
20
|
'm3-builder>=1.0.1',
|
|
17
21
|
'm3-django-compat>=1.7.1',
|
|
@@ -24,26 +28,15 @@ setup(
|
|
|
24
28
|
'Natural Language :: Russian',
|
|
25
29
|
'Natural Language :: English',
|
|
26
30
|
'Operating System :: OS Independent',
|
|
27
|
-
'Framework :: Django :: 1.5',
|
|
28
|
-
'Framework :: Django :: 1.6',
|
|
29
|
-
'Framework :: Django :: 1.7',
|
|
30
|
-
'Framework :: Django :: 1.8',
|
|
31
|
-
'Framework :: Django :: 1.9',
|
|
32
|
-
'Framework :: Django :: 1.10',
|
|
33
31
|
'Framework :: Django :: 1.11',
|
|
34
32
|
'Framework :: Django :: 2.0',
|
|
33
|
+
'Framework :: Django :: 4.0',
|
|
35
34
|
'Programming Language :: Python',
|
|
36
|
-
'Programming Language :: Python :: 2',
|
|
37
|
-
'Programming Language :: Python :: 2.7',
|
|
38
35
|
'Programming Language :: Python :: 3.6',
|
|
39
36
|
'License :: OSI Approved :: MIT License',
|
|
40
37
|
'Development Status :: 5 - Production/Stable',
|
|
41
38
|
],
|
|
42
|
-
dependency_links=(
|
|
43
|
-
|
|
44
|
-
),
|
|
45
|
-
setup_requires=(
|
|
46
|
-
'm3-builder>=1.0.1',
|
|
47
|
-
),
|
|
39
|
+
dependency_links=('http://pypi.bars-open.ru/simple/m3-builder',),
|
|
40
|
+
setup_requires=('m3-builder>=1.0.1',),
|
|
48
41
|
set_build_info=os.path.dirname(__file__),
|
|
49
42
|
)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
from django.urls import (
|
|
4
|
+
re_path,
|
|
5
|
+
)
|
|
6
|
+
from m3 import (
|
|
7
|
+
authenticated_user_required,
|
|
8
|
+
)
|
|
9
|
+
from m3.actions import (
|
|
10
|
+
ActionController,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
from .constants import (
|
|
14
|
+
ADMIN,
|
|
15
|
+
GENERIC_USER,
|
|
16
|
+
SUPER_ADMIN,
|
|
17
|
+
)
|
|
18
|
+
from .metaroles import (
|
|
19
|
+
Metaroles_DictPack,
|
|
20
|
+
UserMetarole,
|
|
21
|
+
)
|
|
22
|
+
from .roles import (
|
|
23
|
+
Roles_DictPack,
|
|
24
|
+
RolesActions,
|
|
25
|
+
)
|
|
26
|
+
from .users import (
|
|
27
|
+
UsersActions,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# контроллер
|
|
32
|
+
users_controller = ActionController(url='/m3-users', name='Пользователи М3')
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def register_actions():
|
|
36
|
+
users_controller.packs.extend(
|
|
37
|
+
[
|
|
38
|
+
RolesActions(),
|
|
39
|
+
UsersActions(),
|
|
40
|
+
Roles_DictPack(),
|
|
41
|
+
Metaroles_DictPack(), # метароли пользователей
|
|
42
|
+
]
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@authenticated_user_required
|
|
47
|
+
def users_view(request):
|
|
48
|
+
return users_controller.process_request(request)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def register_urlpatterns():
|
|
52
|
+
return [
|
|
53
|
+
re_path(r'^m3-users', users_view),
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def register_metaroles(manager):
|
|
58
|
+
"""
|
|
59
|
+
Функция возвращает список метаролей, которые регистрируются
|
|
60
|
+
по умолчанию на уровне Платформы М3.
|
|
61
|
+
|
|
62
|
+
:param manager: менеджер, отвечающий за управление метаролями.
|
|
63
|
+
:type manager: :py:class:`m3_users.metaroles.MetaroleManager`
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
# метароль обычного пользователя системы
|
|
67
|
+
manager.GENERIC_USER_METAROLE = UserMetarole(GENERIC_USER, 'Обобщенный пользователь')
|
|
68
|
+
|
|
69
|
+
# метароль администратора системы
|
|
70
|
+
manager.ADMIN_METAROLE = UserMetarole(ADMIN, 'Администратор')
|
|
71
|
+
manager.ADMIN_METAROLE.included_metaroles.extend([manager.GENERIC_USER_METAROLE])
|
|
72
|
+
|
|
73
|
+
# метароль супер-администратора системы
|
|
74
|
+
manager.SUPER_ADMIN_METAROLE = UserMetarole(SUPER_ADMIN, 'Супер-администратор')
|
|
75
|
+
manager.SUPER_ADMIN_METAROLE.included_metaroles.extend([manager.GENERIC_USER_METAROLE, manager.ADMIN_METAROLE])
|
|
76
|
+
|
|
77
|
+
return [manager.GENERIC_USER_METAROLE, manager.ADMIN_METAROLE, manager.SUPER_ADMIN_METAROLE]
|
|
@@ -248,8 +248,16 @@ class AddRolePermission(Action):
|
|
|
248
248
|
need_check_permission = True
|
|
249
249
|
verbose_name = u'Добавление прав'
|
|
250
250
|
|
|
251
|
+
def context_declaration(self):
|
|
252
|
+
return {
|
|
253
|
+
'perms': {
|
|
254
|
+
'type': 'str_list',
|
|
255
|
+
'default': [],
|
|
256
|
+
},
|
|
257
|
+
}
|
|
258
|
+
|
|
251
259
|
def run(self, request, context):
|
|
252
|
-
window = SelectPermissionWindow()
|
|
260
|
+
window = SelectPermissionWindow(action_context=context,)
|
|
253
261
|
return ExtUIScriptResult(window)
|
|
254
262
|
|
|
255
263
|
|
|
@@ -378,9 +386,8 @@ class GetRolePermissionAction(Action):
|
|
|
378
386
|
return ExtGridDataQueryResult(res)
|
|
379
387
|
|
|
380
388
|
|
|
381
|
-
def get_all_permission_tree():
|
|
382
|
-
"""
|
|
383
|
-
Общий подход к формированию дерева прав доступа (алгоритм):
|
|
389
|
+
def get_all_permission_tree(permission_codes):
|
|
390
|
+
"""Общий подход к формированию дерева прав доступа (алгоритм):
|
|
384
391
|
собирается список прав доступа исходя из наборов действий, действий,
|
|
385
392
|
субправ наборов действий, субправ действий
|
|
386
393
|
у каждого элемента списка прав должен быть путь в дереве (пока строкой),
|
|
@@ -389,11 +396,15 @@ def get_all_permission_tree():
|
|
|
389
396
|
то по иерархии этого элемента в фактической структуре действий
|
|
390
397
|
и набора действий.
|
|
391
398
|
|
|
399
|
+
Args:
|
|
400
|
+
permission_codes: Список активных кодов прав доступа (для активации чекбокса).
|
|
401
|
+
Returns:
|
|
402
|
+
Список прав доступа.
|
|
392
403
|
"""
|
|
393
404
|
|
|
394
405
|
class PermProxy(ExtTreeNode):
|
|
395
406
|
def __init__(self, id, parent=None, name='', url='', can_select=True,
|
|
396
|
-
fullname=None, path=''):
|
|
407
|
+
fullname=None, path='', checked=False,):
|
|
397
408
|
super(PermProxy, self).__init__()
|
|
398
409
|
self.parent = parent
|
|
399
410
|
if parent:
|
|
@@ -404,6 +415,7 @@ def get_all_permission_tree():
|
|
|
404
415
|
self.items['name'] = name
|
|
405
416
|
self.items['url'] = url
|
|
406
417
|
self.items['fullname'] = fullname if fullname else name
|
|
418
|
+
self.checked = checked
|
|
407
419
|
self.can_check = can_select
|
|
408
420
|
|
|
409
421
|
def find_node(node_name, parent_node, res):
|
|
@@ -523,10 +535,11 @@ def get_all_permission_tree():
|
|
|
523
535
|
fullname = '%s - %s' % (pack_name, value)
|
|
524
536
|
path = get_actionpack_sub_perm_path(action_set, key)
|
|
525
537
|
url = action_set.get_sub_permission_code(key)
|
|
538
|
+
checked = url in permission_codes
|
|
526
539
|
if url not in res_urls.keys():
|
|
527
540
|
child4 = PermProxy(
|
|
528
541
|
len(res) + 1, None, value, url, True,
|
|
529
|
-
fullname, path)
|
|
542
|
+
fullname, path, checked,)
|
|
530
543
|
res.append(child4)
|
|
531
544
|
res_urls[url] = child4
|
|
532
545
|
# обработаем подчиненные Наборы
|
|
@@ -549,10 +562,11 @@ def get_all_permission_tree():
|
|
|
549
562
|
if action_set.need_check_permission:
|
|
550
563
|
path = get_action_perm_path(action_set)
|
|
551
564
|
url = action_set.get_permission_code()
|
|
565
|
+
checked = url in permission_codes
|
|
552
566
|
if url not in res_urls.keys():
|
|
553
567
|
item = PermProxy(
|
|
554
568
|
len(res) + 1, None, name, url, True,
|
|
555
|
-
fullname, path)
|
|
569
|
+
fullname, path, checked,)
|
|
556
570
|
res.append(item)
|
|
557
571
|
res_urls[url] = item
|
|
558
572
|
# у действия берем подчиненные права
|
|
@@ -568,10 +582,11 @@ def get_all_permission_tree():
|
|
|
568
582
|
fullname = '%s - %s' % (pack_name, name)
|
|
569
583
|
path = get_action_sub_perm_path(action_set, key)
|
|
570
584
|
url = action_set.get_sub_permission_code(key)
|
|
585
|
+
checked = url in permission_codes
|
|
571
586
|
if not url in res_urls.keys():
|
|
572
587
|
child3 = PermProxy(
|
|
573
588
|
len(res) + 1, None, name, url,
|
|
574
|
-
True, fullname, path)
|
|
589
|
+
True, fullname, path, checked,)
|
|
575
590
|
res.append(child3)
|
|
576
591
|
res_urls[url] = item
|
|
577
592
|
|
|
@@ -934,7 +949,7 @@ class SelectPermissionWindow(windows.ExtEditWindow):
|
|
|
934
949
|
self.tree = ExtTree()
|
|
935
950
|
self.tree.add_column(header=u'Имя', data_index='name', width=140)
|
|
936
951
|
self.tree.master_column_id = 'name'
|
|
937
|
-
self.tree.nodes = get_all_permission_tree()
|
|
952
|
+
self.tree.nodes = get_all_permission_tree(self.action_context.perms)
|
|
938
953
|
self.items.append(self.tree)
|
|
939
954
|
self.buttons.append(controls.ExtButton(
|
|
940
955
|
text=u'Выбрать', handler='''function select(btn, e, baseParams) {
|
|
@@ -7,6 +7,23 @@ function getJsonOfStore(store){
|
|
|
7
7
|
return Ext.util.JSON.encode(datar);
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
function getPermissionCodes(store){
|
|
11
|
+
{# Получение выбранных кодов прав доступа из store #}
|
|
12
|
+
var permissionCodes = [],
|
|
13
|
+
records = store.getRange();
|
|
14
|
+
|
|
15
|
+
for (var i = 0; i < records.length; i++) {
|
|
16
|
+
permissionCodes.push(records[i].data.permission_code);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return Ext.util.JSON.encode(permissionCodes);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function addPermissionCodesInParams(grid, req){
|
|
23
|
+
{# Добавление в контекст выбранных кодов прав доступа #}
|
|
24
|
+
req.params.perms = getPermissionCodes(grid.getStore());
|
|
25
|
+
}
|
|
26
|
+
|
|
10
27
|
function beforeSubmit(submit){
|
|
11
28
|
{# сохранение роли #}
|
|
12
29
|
var store = Ext.getCmp('{{ component.grid.client_id }}').getStore(),
|
|
@@ -21,19 +38,18 @@ function addPermission(grid, res, opt) {
|
|
|
21
38
|
win.on('closed_ok', function (sels) {
|
|
22
39
|
var store = this.getStore(),
|
|
23
40
|
count = store.getCount();
|
|
41
|
+
store.removeAll();
|
|
24
42
|
for(var i = 0, len = sels.length; i < len; i++){
|
|
25
43
|
var record = sels[i];
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
store.add(rec);
|
|
36
|
-
}
|
|
44
|
+
var rec = new store.recordType(
|
|
45
|
+
{
|
|
46
|
+
id: null,
|
|
47
|
+
"permission_code":record.attributes.url,
|
|
48
|
+
"verbose_name": record.attributes.fullname,
|
|
49
|
+
"disabled": false
|
|
50
|
+
},
|
|
51
|
+
record.attributes.url);
|
|
52
|
+
store.add(rec);
|
|
37
53
|
}
|
|
38
54
|
}, scope = grid);
|
|
39
55
|
win.show();
|
|
@@ -44,6 +60,7 @@ var form = Ext.getCmp('{{ component.client_id }}'),
|
|
|
44
60
|
grid = Ext.getCmp('{{ component.grid.client_id }}');
|
|
45
61
|
form.on('beforesubmit', beforeSubmit);
|
|
46
62
|
grid.on('afternewrequest', addPermission);
|
|
63
|
+
grid.on('beforenewrequest', addPermissionCodesInParams);
|
|
47
64
|
|
|
48
65
|
function deletePermission() {
|
|
49
66
|
{# обработчик удаления роли #}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: m3-users
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Пользователи и роли
|
|
5
5
|
Home-page: https://github.com/barsgroup/m3-users
|
|
6
6
|
Author: BARS Group
|
|
@@ -11,17 +11,10 @@ Classifier: Environment :: Web Environment
|
|
|
11
11
|
Classifier: Natural Language :: Russian
|
|
12
12
|
Classifier: Natural Language :: English
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
14
|
-
Classifier: Framework :: Django :: 1.5
|
|
15
|
-
Classifier: Framework :: Django :: 1.6
|
|
16
|
-
Classifier: Framework :: Django :: 1.7
|
|
17
|
-
Classifier: Framework :: Django :: 1.8
|
|
18
|
-
Classifier: Framework :: Django :: 1.9
|
|
19
|
-
Classifier: Framework :: Django :: 1.10
|
|
20
14
|
Classifier: Framework :: Django :: 1.11
|
|
21
15
|
Classifier: Framework :: Django :: 2.0
|
|
16
|
+
Classifier: Framework :: Django :: 4.0
|
|
22
17
|
Classifier: Programming Language :: Python
|
|
23
|
-
Classifier: Programming Language :: Python :: 2
|
|
24
|
-
Classifier: Programming Language :: Python :: 2.7
|
|
25
18
|
Classifier: Programming Language :: Python :: 3.6
|
|
26
19
|
Classifier: License :: OSI Approved :: MIT License
|
|
27
20
|
Classifier: Development Status :: 5 - Production/Stable
|
|
@@ -29,3 +22,11 @@ License-File: LICENSE
|
|
|
29
22
|
Requires-Dist: m3-builder>=1.0.1
|
|
30
23
|
Requires-Dist: m3-django-compat>=1.7.1
|
|
31
24
|
Requires-Dist: m3-ui
|
|
25
|
+
Dynamic: author
|
|
26
|
+
Dynamic: author-email
|
|
27
|
+
Dynamic: classifier
|
|
28
|
+
Dynamic: home-page
|
|
29
|
+
Dynamic: license
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
Dynamic: requires-dist
|
|
32
|
+
Dynamic: summary
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
import importlib
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
from django.core.management import (
|
|
7
|
+
execute_from_command_line,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
project_path = os.path.dirname(__file__)
|
|
12
|
+
sys.path.insert(0, os.path.join(project_path, '../'))
|
|
13
|
+
sys.path.insert(0, os.path.join(project_path, '../env'))
|
|
14
|
+
sys.path.insert(0, os.path.join(project_path, '../env/m3/vendor'))
|
|
15
|
+
|
|
16
|
+
settings_module = 'settings'
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
importlib.import_module(settings_module)
|
|
20
|
+
except ImportError:
|
|
21
|
+
import sys
|
|
22
|
+
|
|
23
|
+
sys.stderr.write(
|
|
24
|
+
"Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things."
|
|
25
|
+
"\nYou'll have to run django-admin, passing it your settings module."
|
|
26
|
+
"\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__
|
|
27
|
+
)
|
|
28
|
+
sys.exit(1)
|
|
29
|
+
|
|
30
|
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', settings_module)
|
|
31
|
+
|
|
32
|
+
if __name__ == '__main__':
|
|
33
|
+
execute_from_command_line(sys.argv)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from django.urls import (
|
|
2
|
+
include,
|
|
3
|
+
path,
|
|
4
|
+
)
|
|
5
|
+
from m3.helpers import (
|
|
6
|
+
urls,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Uncomment the next two lines to enable the admin:
|
|
11
|
+
# from django.contrib import admin
|
|
12
|
+
# admin.autodiscover()
|
|
13
|
+
|
|
14
|
+
urlpatterns = [
|
|
15
|
+
# Example:
|
|
16
|
+
# path('', your_view_function),
|
|
17
|
+
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
|
|
18
|
+
# to INSTALLED_APPS to enable admin documentation:
|
|
19
|
+
# path('admin/doc/', include('django.contrib.admindocs.urls')),
|
|
20
|
+
# Uncomment the next line to enable the admin:
|
|
21
|
+
# path('admin/', admin.site.urls),
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
urlpatterns += urls.get_app_urlpatterns()
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
# нормальной установки обновлений.
|
|
5
5
|
|
|
6
6
|
[version]
|
|
7
|
-
BRANCH = tags/2.
|
|
8
|
-
VERSION = 2.
|
|
9
|
-
REVISION =
|
|
10
|
-
VERSION_DATE =
|
|
11
|
-
REVISION_DATE =
|
|
7
|
+
BRANCH = tags/2.3.0
|
|
8
|
+
VERSION = 2.3.0
|
|
9
|
+
REVISION = c746d57f02bb8fde5bf095b9d36415b5332beb01
|
|
10
|
+
VERSION_DATE = 17.07.2025
|
|
11
|
+
REVISION_DATE = 17.07.2025
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# coding: utf-8
|
|
2
|
-
|
|
3
|
-
from django.conf.urls import url
|
|
4
|
-
from m3 import authenticated_user_required
|
|
5
|
-
from m3.actions import ActionController
|
|
6
|
-
|
|
7
|
-
from .constants import ADMIN, GENERIC_USER, SUPER_ADMIN
|
|
8
|
-
from .metaroles import UserMetarole, Metaroles_DictPack
|
|
9
|
-
from .roles import RolesActions, Roles_DictPack
|
|
10
|
-
from .users import UsersActions
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
# контроллер
|
|
14
|
-
users_controller = ActionController(url='/m3-users', name=u'Пользователи М3')
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def register_actions():
|
|
18
|
-
|
|
19
|
-
users_controller.packs.extend([
|
|
20
|
-
RolesActions(),
|
|
21
|
-
UsersActions(),
|
|
22
|
-
Roles_DictPack(),
|
|
23
|
-
Metaroles_DictPack(), # метароли пользователей
|
|
24
|
-
])
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@authenticated_user_required
|
|
28
|
-
def users_view(request):
|
|
29
|
-
return users_controller.process_request(request)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def register_urlpatterns():
|
|
33
|
-
return [
|
|
34
|
-
url(r'^m3-users', users_view),
|
|
35
|
-
]
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def register_metaroles(manager):
|
|
39
|
-
"""
|
|
40
|
-
Функция возвращает список метаролей, которые регистрируются
|
|
41
|
-
по умолчанию на уровне Платформы М3.
|
|
42
|
-
|
|
43
|
-
:param manager: менеджер, отвечающий за управление метаролями.
|
|
44
|
-
:type manager: :py:class:`m3_users.metaroles.MetaroleManager`
|
|
45
|
-
"""
|
|
46
|
-
|
|
47
|
-
# метароль обычного пользователя системы
|
|
48
|
-
manager.GENERIC_USER_METAROLE = UserMetarole(
|
|
49
|
-
GENERIC_USER, u'Обобщенный пользователь')
|
|
50
|
-
|
|
51
|
-
# метароль администратора системы
|
|
52
|
-
manager.ADMIN_METAROLE = UserMetarole(ADMIN, u'Администратор')
|
|
53
|
-
manager.ADMIN_METAROLE.included_metaroles.extend(
|
|
54
|
-
[manager.GENERIC_USER_METAROLE])
|
|
55
|
-
|
|
56
|
-
# метароль супер-администратора системы
|
|
57
|
-
manager.SUPER_ADMIN_METAROLE = UserMetarole(
|
|
58
|
-
SUPER_ADMIN, u'Супер-администратор')
|
|
59
|
-
manager.SUPER_ADMIN_METAROLE.included_metaroles.extend(
|
|
60
|
-
[manager.GENERIC_USER_METAROLE, manager.ADMIN_METAROLE])
|
|
61
|
-
|
|
62
|
-
return [
|
|
63
|
-
manager.GENERIC_USER_METAROLE,
|
|
64
|
-
manager.ADMIN_METAROLE,
|
|
65
|
-
manager.SUPER_ADMIN_METAROLE]
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/python
|
|
2
|
-
import os,sys
|
|
3
|
-
project_path = os.path.dirname(__file__)
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
sys.path.insert(0, os.path.join(project_path, '../'))
|
|
7
|
-
sys.path.insert(0, os.path.join(project_path, '../env'))
|
|
8
|
-
sys.path.insert(0, os.path.join(project_path, '../env/m3/vendor'))
|
|
9
|
-
|
|
10
|
-
from django.core.management import execute_manager
|
|
11
|
-
|
|
12
|
-
try:
|
|
13
|
-
import settings # Assumed to be in the same directory.
|
|
14
|
-
except ImportError:
|
|
15
|
-
import sys
|
|
16
|
-
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
|
|
17
|
-
sys.exit(1)
|
|
18
|
-
|
|
19
|
-
if __name__ == "__main__":
|
|
20
|
-
execute_manager(settings)
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
from django.conf.urls.defaults import *
|
|
2
|
-
|
|
3
|
-
from m3.helpers import urls
|
|
4
|
-
|
|
5
|
-
# Uncomment the next two lines to enable the admin:
|
|
6
|
-
# from django.contrib import admin
|
|
7
|
-
# admin.autodiscover()
|
|
8
|
-
|
|
9
|
-
urlpatterns = patterns('',
|
|
10
|
-
# Example:
|
|
11
|
-
# (r'^m3project/', include('m3project.foo.urls')),
|
|
12
|
-
|
|
13
|
-
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
|
|
14
|
-
# to INSTALLED_APPS to enable admin documentation:
|
|
15
|
-
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
|
16
|
-
|
|
17
|
-
# Uncomment the next line to enable the admin:
|
|
18
|
-
# (r'^admin/', include(admin.site.urls)),
|
|
19
|
-
#(r'^$', ),
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
urlpatterns += urls.get_app_urlpatterns()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|