Files
ACORE/core/migrations/0026_access_projects_perm.py
T
lokses 030bbc98fd projects: модуль проектов с шагами по отделам и Task.
Шаблоны/ручное создание, access_projects, сид «Открытие аптеки». Плюс SILO/S3 для Django media.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-23 16:26:45 +03:00

99 lines
4.2 KiB
Python

"""Право доступа к разделу «Проекты» портала."""
from django.db import migrations
NEW_PERMS = [
('access_projects', 'Доступ к разделу: Проекты'),
]
GROUP_ADDITIONS = {
'Офисный сотрудник': ['access_projects'],
'IT': ['access_projects'],
}
def forwards(apps, schema_editor):
Group = apps.get_model('auth', 'Group')
Permission = apps.get_model('auth', 'Permission')
ContentType = apps.get_model('contenttypes', 'ContentType')
ct, _ = ContentType.objects.get_or_create(app_label='core', model='portalaccess')
perms_by_code = {}
for codename, name in NEW_PERMS:
perm, _ = Permission.objects.get_or_create(
content_type=ct, codename=codename,
defaults={'name': name},
)
if perm.name != name:
perm.name = name
perm.save(update_fields=['name'])
perms_by_code[codename] = perm
admin_group = Group.objects.filter(name='Администратор сети').first()
if admin_group:
admin_group.permissions.add(*perms_by_code.values())
for group_name, codes in GROUP_ADDITIONS.items():
group = Group.objects.filter(name=group_name).first()
if not group:
continue
to_add = [perms_by_code[c] for c in codes if c in perms_by_code]
if to_add:
group.permissions.add(*to_add)
def backwards(apps, schema_editor):
Group = apps.get_model('auth', 'Group')
Permission = apps.get_model('auth', 'Permission')
ContentType = apps.get_model('contenttypes', 'ContentType')
ct = ContentType.objects.filter(app_label='core', model='portalaccess').first()
if ct is None:
return
perms = list(
Permission.objects.filter(content_type=ct, codename__in=[c for c, _ in NEW_PERMS])
)
if not perms:
return
for group in Group.objects.filter(
name__in=['Администратор сети', *GROUP_ADDITIONS.keys()],
):
group.permissions.remove(*perms)
Permission.objects.filter(pk__in=[p.pk for p in perms]).delete()
class Migration(migrations.Migration):
dependencies = [
('core', '0025_internal_line_type_and_asterisk_ami'),
]
operations = [
migrations.AlterModelOptions(
name='portalaccess',
options={
'default_permissions': (),
'managed': False,
'permissions': [
('access_hr_portal', 'Доступ к разделу: HR-портал'),
('access_recruiting', 'Доступ к разделу: Рекрутинг'),
('access_structure', 'Доступ к разделу: Структура'),
('access_timetrack', 'Доступ к разделу: Учёт рабочего времени'),
('access_databases', 'Доступ к разделу: Системные справочники'),
('access_reports', 'Доступ к разделу: Отчёты'),
('access_purchases', 'Доступ к разделу: Закупки'),
('access_email', 'Доступ к разделу: Электронная почта'),
('access_pharmacies', 'Доступ к разделу: Аптеки'),
('access_rro', 'Доступ к разделу: РРО / ПРРО'),
('access_utilities', 'Доступ к разделу: Коммунальные услуги'),
('access_internet_billing', 'Доступ к разделу: Оплата провайдеров'),
('access_it_manager', 'Доступ к разделу: IT-отдел'),
('access_ad_mapping', 'Доступ к разделу: Active Directory'),
('access_projects', 'Доступ к разделу: Проекты'),
],
'verbose_name': 'Доступ к разделу портала',
'verbose_name_plural': 'Доступы к разделам портала',
},
),
migrations.RunPython(forwards, backwards),
]