# Generated by Django 5.2.4 on 2026-03-19 19:53 import ldapdb.models.fields from django.db import migrations, models import employees.ldap.mixins class Migration(migrations.Migration): dependencies = [ ("employees", "0041_alter_departmentpermission_code"), ] operations = [ migrations.CreateModel( name="LdapGroup", fields=[ ( "dn", ldapdb.models.fields.CharField( max_length=200, primary_key=True, serialize=False ), ), ("cn", ldapdb.models.fields.CharField(db_column="cn", max_length=200)), ( "object_guid", ldapdb.models.fields.CharField( db_column="objectGUID", max_length=200 ), ), ( "sam_account_name", ldapdb.models.fields.CharField( db_column="sAMAccountName", max_length=200 ), ), ( "description", ldapdb.models.fields.CharField( blank=True, db_column="description", max_length=200 ), ), ( "member", ldapdb.models.fields.ListField(blank=True, db_column="member"), ), ( "member_of", ldapdb.models.fields.ListField(blank=True, db_column="memberOf"), ), ( "when_created", ldapdb.models.fields.DateTimeField(db_column="whenCreated"), ), ( "when_changed", ldapdb.models.fields.DateTimeField(db_column="whenChanged"), ), ], options={ "managed": False, }, bases=(employees.ldap.mixins.ModifyDnMixin, models.Model), ), migrations.CreateModel( name="LdapOrganizationalUnit", fields=[ ( "dn", ldapdb.models.fields.CharField( max_length=200, primary_key=True, serialize=False ), ), ("ou", ldapdb.models.fields.CharField(db_column="ou", max_length=200)), ( "object_guid", ldapdb.models.fields.CharField( db_column="objectGUID", max_length=200 ), ), ( "description", ldapdb.models.fields.CharField( blank=True, db_column="description", max_length=200 ), ), ( "managed_by", ldapdb.models.fields.CharField( blank=True, db_column="managedBy", max_length=200 ), ), ( "when_created", ldapdb.models.fields.DateTimeField(db_column="whenCreated"), ), ( "when_changed", ldapdb.models.fields.DateTimeField(db_column="whenChanged"), ), ], options={ "managed": False, }, bases=(employees.ldap.mixins.ModifyDnMixin, models.Model), ), migrations.CreateModel( name="LdapUser", fields=[ ( "dn", ldapdb.models.fields.CharField( max_length=200, primary_key=True, serialize=False ), ), ("cn", ldapdb.models.fields.CharField(db_column="cn", max_length=200)), ( "object_guid", ldapdb.models.fields.CharField( db_column="objectGUID", max_length=200 ), ), ( "sam_account_name", ldapdb.models.fields.CharField( db_column="sAMAccountName", max_length=200 ), ), ( "user_principal_name", ldapdb.models.fields.CharField( db_column="userPrincipalName", max_length=200 ), ), ( "given_name", ldapdb.models.fields.CharField( db_column="givenName", max_length=200 ), ), ("sn", ldapdb.models.fields.CharField(db_column="sn", max_length=200)), ( "display_name", ldapdb.models.fields.CharField( db_column="displayName", max_length=200 ), ), ( "mail", ldapdb.models.fields.CharField(db_column="mail", max_length=200), ), ( "telephone_number", ldapdb.models.fields.CharField( blank=True, db_column="telephoneNumber", max_length=200 ), ), ( "mobile", ldapdb.models.fields.CharField( blank=True, db_column="mobile", max_length=200 ), ), ( "user_account_control", ldapdb.models.fields.IntegerField(db_column="userAccountControl"), ), ( "description", ldapdb.models.fields.CharField( blank=True, db_column="description", max_length=200 ), ), ( "thumbnail_photo", ldapdb.models.fields.ImageField( blank=True, db_column="thumbnailPhoto" ), ), ( "employee_number", ldapdb.models.fields.CharField( blank=True, db_column="employeeNumber", max_length=200 ), ), ( "member_of", ldapdb.models.fields.ListField(blank=True, db_column="memberOf"), ), ( "when_created", ldapdb.models.fields.DateTimeField(db_column="whenCreated"), ), ( "when_changed", ldapdb.models.fields.DateTimeField(db_column="whenChanged"), ), ], options={ "managed": False, }, bases=( employees.ldap.mixins.LdapSyncStateMixin, employees.ldap.mixins.ModifyDnMixin, models.Model, ), ), migrations.CreateModel( name="LdapSyncQueue", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "operation", models.CharField( db_index=True, help_text="Имя операции (employee_save, department_delete, group_m2m и т.д.)", max_length=64, ), ), ("model_name", models.CharField(db_index=True, max_length=32)), ("object_pk", models.CharField(db_index=True, max_length=64)), ( "payload", models.JSONField( default=dict, help_text="JSON с аргументами для повтора операции", ), ), ( "status", models.CharField( choices=[ ("pending", "Ожидает"), ("in_progress", "Выполняется"), ("completed", "Завершено"), ("failed", "Ошибка (исчерпаны попытки)"), ], db_index=True, default="pending", max_length=16, ), ), ("attempts", models.PositiveIntegerField(default=0)), ("max_attempts", models.PositiveIntegerField(default=5)), ( "next_retry_at", models.DateTimeField(blank=True, db_index=True, null=True), ), ("last_error", models.TextField(blank=True, default="")), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ], options={ "verbose_name": "Очередь LDAP синхронизации", "verbose_name_plural": "Очередь LDAP синхронизации", "ordering": ["created_at"], "indexes": [ models.Index( fields=["status", "next_retry_at"], name="ldap_queue_retry_idx" ) ], }, ), ]