"""Право доступа к разделу «Проекты» портала.""" 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), ]