Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
b534f21
refactor: attrTypeDao.create method 1258
milov-dmitriy Feb 12, 2026
6c0ab42
Merge remote-tracking branch 'origin/dev' into feature/1258_ldap_sche…
milov-dmitriy Feb 13, 2026
99a2fd7
fix: merge alembic heads task_1258
milov-dmitriy Feb 13, 2026
e347e84
add: attrType like as LDAP schema draft task_1258
milov-dmitriy Feb 19, 2026
75f148a
tests: off task_1258
milov-dmitriy Feb 19, 2026
15691b9
tests: fix draft task_1258
milov-dmitriy Feb 20, 2026
f1bd853
fix: tests draft task_1258
milov-dmitriy Feb 20, 2026
590df66
preparation: objectClass refactoring task_1258
milov-dmitriy Feb 24, 2026
9146424
refactor: objectClass draft task_1258
milov-dmitriy Feb 24, 2026
448eb59
Merge remote-tracking branch 'origin/dev' into feature/1258_ldap_sche…
milov-dmitriy Feb 24, 2026
d7b5169
refactor: at task_1258
milov-dmitriy Feb 24, 2026
e2de5da
task_1258
milov-dmitriy Feb 24, 2026
81abcd1
draft task_1258
milov-dmitriy Mar 2, 2026
d5167f5
draft task_1258
milov-dmitriy Mar 2, 2026
979d716
draft task_1258
milov-dmitriy Mar 3, 2026
0f6e2aa
fix: tests task_1258
milov-dmitriy Mar 3, 2026
0bd0dd4
fix: tests task_1258
milov-dmitriy Mar 3, 2026
6b77d50
sm fix
milov-dmitriy Mar 3, 2026
f5f09a0
tests: fix task_1258
milov-dmitriy Mar 4, 2026
416448f
smfix
milov-dmitriy Mar 5, 2026
b69991a
refactor: migrations task_1258
milov-dmitriy Mar 5, 2026
fab9940
fixes
milov-dmitriy Mar 5, 2026
10a224f
Merge remote-tracking branch 'origin/dev' into feature/1258_ldap_sche…
milov-dmitriy Mar 5, 2026
11c4c14
fixes: task_1258
milov-dmitriy Mar 5, 2026
0b852bc
fix: task_1258
milov-dmitriy Mar 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion app/alembic/versions/01f3f05a5b11_add_primary_group_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
AttributeValueValidator,
)
from ldap_protocol.ldap_schema.entity_type_dao import EntityTypeDAO
from ldap_protocol.ldap_schema.entity_type_use_case import EntityTypeUseCase
from ldap_protocol.roles.role_use_case import RoleUseCase
from ldap_protocol.utils.queries import (
create_group,
Expand All @@ -46,6 +47,7 @@ async def _add_domain_computers_group(connection: AsyncConnection) -> None: # n
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
entity_type_dao = await cnt.get(EntityTypeDAO)
entity_type_use_case = await cnt.get(EntityTypeUseCase)
role_use_case = await cnt.get(RoleUseCase)

base_dn_list = await get_base_directories(session)
Expand Down Expand Up @@ -104,7 +106,10 @@ async def _add_domain_computers_group(connection: AsyncConnection) -> None: # n
attribute_names=["attributes"],
with_for_update=None,
)
await entity_type_dao.attach_entity_type_to_directory(dir_, False)
await entity_type_use_case.attach_entity_type_to_directory(
dir_,
False,
)
await role_use_case.inherit_parent_aces(
parent_directory=parent,
directory=dir_,
Expand Down
278 changes: 159 additions & 119 deletions app/alembic/versions/275222846605_initial_ldap_schema.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,15 @@

"""

import contextlib

import sqlalchemy as sa
from alembic import op
from dishka import AsyncContainer, Scope
from sqlalchemy.ext.asyncio import AsyncConnection, AsyncSession
from sqlalchemy.orm import Session

from entities import AttributeType
from ldap_protocol.ldap_schema.attribute_type_use_case import (
AttributeTypeUseCase,
from ldap_protocol.ldap_schema.appendix.attribute_type_appendix.attribute_type_appendix_use_case import ( # noqa: E501
AttributeTypeUseCaseDeprecated,
)
from ldap_protocol.ldap_schema.exceptions import AttributeTypeNotFoundError

# revision identifiers, used by Alembic.
revision: None | str = "2dadf40c026a"
Expand All @@ -27,7 +23,7 @@
depends_on: None | list[str] = None


_NON_REPLICATED_ATTRIBUTES_TYPE_NAMES = (
_NON_REPLICATED_ATTRIBUTES_TYPE_NAMES: tuple[str, ...] = (
"badPasswordTime",
"badPwdCount",
"bridgeheadServerListBL",
Expand Down Expand Up @@ -144,19 +140,25 @@ def upgrade(container: AsyncContainer) -> None:
),
)

session.execute(sa.update(AttributeType).values({"system_flags": 0}))
async def _zero_all_replicated_flags(connection: AsyncConnection) -> None: # noqa: ARG001
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
at_type_use_case = await cnt.get(AttributeTypeUseCaseDeprecated)

await at_type_use_case.zero_all_replicated_flags_deprecated()
await session.commit()

op.run_async(_zero_all_replicated_flags)

async def _set_attr_replication_flag(connection: AsyncConnection) -> None: # noqa: ARG001
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
at_type_use_case = await cnt.get(AttributeTypeUseCase)

for name in _NON_REPLICATED_ATTRIBUTES_TYPE_NAMES:
with contextlib.suppress(AttributeTypeNotFoundError):
await at_type_use_case.set_attr_replication_flag(
name,
need_to_replicate=False,
)
at_type_use_case = await cnt.get(AttributeTypeUseCaseDeprecated)

await at_type_use_case.set_attrs_replication_flag_deprecated(
_NON_REPLICATED_ATTRIBUTES_TYPE_NAMES,
need_to_replicate=False,
)

await session.commit()

Expand Down
110 changes: 110 additions & 0 deletions app/alembic/versions/759d196145ae_.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
"""empty message.

Revision ID: 759d196145ae
Revises: 19d86e660cf2
Create Date: 2026-02-24 13:18:06.715730

"""

from alembic import op
from dishka import AsyncContainer, Scope
from sqlalchemy.ext.asyncio import AsyncConnection, AsyncSession

from constants import ENTITY_TYPE_DATAS
from enums import EntityTypeNames
from ldap_protocol.ldap_schema.appendix.attribute_type_appendix.attribute_type_appendix_use_case import ( # noqa: E501
AttributeTypeUseCaseDeprecated,
)
from ldap_protocol.ldap_schema.appendix.object_class_appendix.object_class_appendix_use_case import ( # noqa: E501
ObjectClassUseCaseDeprecated,
)
from ldap_protocol.ldap_schema.attribute_type_use_case import (
AttributeTypeUseCase,
)
from ldap_protocol.ldap_schema.dto import EntityTypeDTO
from ldap_protocol.ldap_schema.entity_type_use_case import EntityTypeUseCase
from ldap_protocol.ldap_schema.object_class_use_case import ObjectClassUseCase
from ldap_protocol.utils.queries import get_base_directories

# revision identifiers, used by Alembic.
revision: None | str = "759d196145ae"
down_revision: None | str = "19d86e660cf2"
branch_labels: None | list[str] = None
depends_on: None | list[str] = None


def upgrade(container: AsyncContainer) -> None:
"""Upgrade."""

async def _update_entity_types(connection: AsyncConnection) -> None: # noqa: ARG001
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
entity_type_use_case = await cnt.get(EntityTypeUseCase)

if not await get_base_directories(session):
return

for entity_type_data in ENTITY_TYPE_DATAS:
if entity_type_data["name"] in (
EntityTypeNames.CONFIGURATION,
EntityTypeNames.ATTRIBUTE_TYPE,
EntityTypeNames.OBJECT_CLASS,
):
await entity_type_use_case.create(
EntityTypeDTO[None](
name=entity_type_data["name"],
object_class_names=entity_type_data[
"object_class_names"
],
is_system=True,
),
)

await session.commit()

async def _create_ldap_attributes(connection: AsyncConnection) -> None: # noqa: ARG001
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
attribute_type_use_case = await cnt.get(AttributeTypeUseCase)
attribute_type_use_case_deprecated = await cnt.get(
AttributeTypeUseCaseDeprecated,
)

if not await get_base_directories(session):
return

ats = await attribute_type_use_case_deprecated.get_all_deprecated()
for _at in ats:
await attribute_type_use_case.create(_at)

await session.commit()

async def _create_ldap_object_classes(connection: AsyncConnection) -> None: # noqa: ARG001
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
object_class_use_case_deprecated = await cnt.get(
ObjectClassUseCaseDeprecated,
)
object_class_use_case = await cnt.get(ObjectClassUseCase)

if not await get_base_directories(session):
return

ocs = await object_class_use_case_deprecated.get_all()
for _oc in ocs:
_oc.attribute_types_may = [x.name for x in _oc.attribute_types_may] # type: ignore
_oc.attribute_types_must = [
x.name # type: ignore
for x in _oc.attribute_types_must
]
await object_class_use_case.create(_oc) # type: ignore

await session.commit()

op.run_async(_update_entity_types)
op.run_async(_create_ldap_attributes)
op.run_async(_create_ldap_object_classes)


def downgrade(container: AsyncContainer) -> None:
"""Downgrade."""
27 changes: 17 additions & 10 deletions app/alembic/versions/ba78cef9700a_initial_entity_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@

from constants import ENTITY_TYPE_DATAS
from entities import Attribute, Directory, User
from enums import EntityTypeNames
from extra.alembic_utils import temporary_stub_column
from ldap_protocol.ldap_schema.dto import EntityTypeDTO
from ldap_protocol.ldap_schema.entity_type_dao import EntityTypeDAO
from ldap_protocol.ldap_schema.entity_type_use_case import EntityTypeUseCase
from ldap_protocol.utils.queries import get_base_directories
from repo.pg.tables import queryable_attr as qa
Expand Down Expand Up @@ -106,13 +106,20 @@ async def _create_entity_types(connection: AsyncConnection) -> None: # noqa: AR
return

for entity_type_data in ENTITY_TYPE_DATAS:
await entity_type_use_case.create(
EntityTypeDTO(
name=entity_type_data["name"],
object_class_names=entity_type_data["object_class_names"],
is_system=True,
),
)
if entity_type_data["name"] not in (
EntityTypeNames.CONFIGURATION,
EntityTypeNames.ATTRIBUTE_TYPE,
EntityTypeNames.OBJECT_CLASS,
):
await entity_type_use_case.create(
EntityTypeDTO(
name=entity_type_data["name"],
object_class_names=entity_type_data[
"object_class_names"
],
is_system=True,
),
)

await session.commit()

Expand Down Expand Up @@ -159,12 +166,12 @@ async def _attach_entity_type_to_directories(
) -> None:
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
entity_type_dao = await cnt.get(EntityTypeDAO)
entity_type_use_case = await cnt.get(EntityTypeUseCase)

if not await get_base_directories(session):
return

await entity_type_dao.attach_entity_type_to_directories()
await entity_type_use_case.attach_entity_type_to_directories()

await session.commit()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

from entities import Attribute, Directory, NetworkPolicy
from extra.alembic_utils import temporary_stub_column
from ldap_protocol.ldap_schema.entity_type_dao import EntityTypeDAO
from ldap_protocol.ldap_schema.entity_type_use_case import EntityTypeUseCase
from ldap_protocol.utils.helpers import create_integer_hash
from ldap_protocol.utils.queries import get_base_directories
from repo.pg.tables import queryable_attr as qa
Expand All @@ -35,12 +35,12 @@ async def _attach_entity_type_to_directories(
) -> None:
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
entity_type_dao = await cnt.get(EntityTypeDAO)
entity_type_use_case = await cnt.get(EntityTypeUseCase)

if not await get_base_directories(session):
return

await entity_type_dao.attach_entity_type_to_directories()
await entity_type_use_case.attach_entity_type_to_directories()
await session.commit()

async def _change_uid_admin(connection: AsyncConnection) -> None: # noqa: ARG001
Expand Down
56 changes: 41 additions & 15 deletions app/alembic/versions/f24ed0e49df2_add_filter_anr.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,15 @@

import sqlalchemy as sa
from alembic import op
from dishka import AsyncContainer
from dishka import AsyncContainer, Scope
from sqlalchemy.dialects import postgresql
from sqlalchemy.ext.asyncio import AsyncConnection, AsyncSession
from sqlalchemy.orm import Session

from entities import AttributeType
from repo.pg.tables import queryable_attr as qa
from extra.alembic_utils import temporary_stub_column2
from ldap_protocol.ldap_schema.appendix.attribute_type_appendix.attribute_type_appendix_use_case import ( # noqa: E501
AttributeTypeUseCaseDeprecated,
)

# revision identifiers, used by Alembic.
revision: None | str = "f24ed0e49df2"
Expand All @@ -35,7 +38,8 @@
)


def upgrade(container: AsyncContainer) -> None: # noqa: ARG001
@temporary_stub_column2("AttributeTypes", "system_flags", sa.Integer())
def upgrade(container: AsyncContainer) -> None:
"""Upgrade."""
bind = op.get_bind()
session = Session(bind=bind)
Expand All @@ -44,9 +48,19 @@ def upgrade(container: AsyncContainer) -> None: # noqa: ARG001
"AttributeTypes",
sa.Column("is_included_anr", sa.Boolean(), nullable=True),
)
session.execute(
sa.update(AttributeType).values({"is_included_anr": False}),
)

async def _false_all_is_included_anr_deprecated(
connection: AsyncConnection, # noqa: ARG001
) -> None:
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
at_type_use_case = await cnt.get(AttributeTypeUseCaseDeprecated)

await at_type_use_case.false_all_is_included_anr_deprecated()
await session.flush()

op.run_async(_false_all_is_included_anr_deprecated)

op.alter_column("AttributeTypes", "is_included_anr", nullable=False)

op.alter_column(
Expand All @@ -56,14 +70,26 @@ def upgrade(container: AsyncContainer) -> None: # noqa: ARG001
nullable=True,
)

updated_attrs = session.execute(
sa.update(AttributeType)
.where(qa(AttributeType.name).in_(_DEFAULT_ANR_ATTRIBUTE_TYPE_NAMES))
.values({"is_included_anr": True})
.returning(qa(AttributeType.name)),
)
if len(updated_attrs.all()) != len(_DEFAULT_ANR_ATTRIBUTE_TYPE_NAMES):
raise ValueError("Not all expected attributes were found in the DB.")
async def _update_and_get_migration_f24ed_deprecated(
connection: AsyncConnection, # noqa: ARG001
) -> None:
async with container(scope=Scope.REQUEST) as cnt:
session = await cnt.get(AsyncSession)
at_type_use_case = await cnt.get(AttributeTypeUseCaseDeprecated)

len_updated_attrs = len(
await at_type_use_case.update_and_get_migration_f24ed_deprecated(
_DEFAULT_ANR_ATTRIBUTE_TYPE_NAMES,
),
)
if len_updated_attrs != len(_DEFAULT_ANR_ATTRIBUTE_TYPE_NAMES):
raise ValueError(
"Not all expected attributes were found in the DB.",
)

await session.flush()

op.run_async(_update_and_get_migration_f24ed_deprecated)

session.commit()

Expand Down
10 changes: 5 additions & 5 deletions app/api/ldap_schema/adapters/attribute_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
from api.ldap_schema.adapters.base_ldap_schema_adapter import (
BaseLDAPSchemaAdapter,
)
from api.ldap_schema.constants import (
DEFAULT_ATTRIBUTE_TYPE_IS_SYSTEM,
DEFAULT_ATTRIBUTE_TYPE_NO_USER_MOD,
DEFAULT_ATTRIBUTE_TYPE_SYNTAX,
)
from api.ldap_schema.schema import (
AttributeTypePaginationSchema,
AttributeTypeSchema,
Expand All @@ -25,11 +30,6 @@
from ldap_protocol.ldap_schema.attribute_type_use_case import (
AttributeTypeUseCase,
)
from ldap_protocol.ldap_schema.constants import (
DEFAULT_ATTRIBUTE_TYPE_IS_SYSTEM,
DEFAULT_ATTRIBUTE_TYPE_NO_USER_MOD,
DEFAULT_ATTRIBUTE_TYPE_SYNTAX,
)
from ldap_protocol.ldap_schema.dto import AttributeTypeDTO


Expand Down
Loading