From b2b6b3ff32c1c395efe681f58c01b0b031ffe066 Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Mon, 12 Jan 2026 14:55:07 +0300 Subject: [PATCH 1/8] Refactor: optimize object class and attribute type retrieval in LDAP schema upgrade --- .../275222846605_initial_ldap_schema.py | 33 ++++++++++++------- interface | 2 +- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/app/alembic/versions/275222846605_initial_ldap_schema.py b/app/alembic/versions/275222846605_initial_ldap_schema.py index 2c8ed7d3d..9906153ad 100644 --- a/app/alembic/versions/275222846605_initial_ldap_schema.py +++ b/app/alembic/versions/275222846605_initial_ldap_schema.py @@ -12,15 +12,14 @@ from alembic import op from dishka import AsyncContainer, Scope from ldap3.protocol.schemas.ad2012R2 import ad_2012_r2_schema -from sqlalchemy import delete, or_ +from sqlalchemy import delete, or_, select from sqlalchemy.ext.asyncio import AsyncConnection, AsyncSession -from sqlalchemy.orm import Session +from sqlalchemy.orm import Session, selectinload -from entities import Attribute +from entities import Attribute, AttributeType, ObjectClass from extra.alembic_utils import temporary_stub_entity_type_name from ldap_protocol.ldap_schema.attribute_type_dao import AttributeTypeDAO from ldap_protocol.ldap_schema.dto import AttributeTypeDTO -from ldap_protocol.ldap_schema.object_class_dao import ObjectClassDAO from ldap_protocol.utils.raw_definition_parser import ( RawDefinitionParser as RDParser, ) @@ -368,11 +367,8 @@ async def _create_attribute_types(connection: AsyncConnection) -> None: # noqa: op.run_async(_create_attribute_types) - async def _modify_object_classes(connection: AsyncConnection) -> None: # noqa: ARG001 - async with container(scope=Scope.REQUEST) as cnt: - session = await cnt.get(AsyncSession) - at_dao = await cnt.get(AttributeTypeDAO) - oc_dao = await cnt.get(ObjectClassDAO) + async def _modify_object_classes(connection: AsyncConnection) -> None: + session = AsyncSession(bind=connection) for oc_name, at_names in ( ("user", ["nsAccountLock", "shadowExpire"]), @@ -380,9 +376,22 @@ async def _modify_object_classes(connection: AsyncConnection) -> None: # noqa: ("posixAccount", ["posixEmail"]), ("organizationalUnit", ["title", "jpegPhoto"]), ): - object_class = await oc_dao.get(oc_name) - attribute_types_may = await at_dao.get_all_by_names(at_names) - object_class.attribute_types_may.extend(attribute_types_may) + object_class = await session.scalar( + select(ObjectClass) + .filter_by(name=oc_name) + .options(selectinload(qa(ObjectClass.attribute_types_may))), + ) + + if not object_class: + continue + + attribute_types = await session.scalars( + select(AttributeType).where( + qa(AttributeType.name).in_(at_names), + ), + ) + + object_class.attribute_types_may.extend(attribute_types.all()) await session.commit() diff --git a/interface b/interface index a4bb0dc38..f31962020 160000 --- a/interface +++ b/interface @@ -1 +1 @@ -Subproject commit a4bb0dc386398d1edfd251b6498c6e7c3aeda283 +Subproject commit f31962020a6689e6a4c61fb3349db5b5c7895f92 From f19b2a959a3686c9574e26e6a3f70143cb4d51ca Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Mon, 12 Jan 2026 14:55:37 +0300 Subject: [PATCH 2/8] Fix: add noqa comment to upgrade function in initial LDAP schema --- app/alembic/versions/275222846605_initial_ldap_schema.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/alembic/versions/275222846605_initial_ldap_schema.py b/app/alembic/versions/275222846605_initial_ldap_schema.py index 9906153ad..3e9593088 100644 --- a/app/alembic/versions/275222846605_initial_ldap_schema.py +++ b/app/alembic/versions/275222846605_initial_ldap_schema.py @@ -36,7 +36,7 @@ @temporary_stub_entity_type_name -def upgrade(container: AsyncContainer) -> None: +def upgrade(container: AsyncContainer) -> None: # noqa: ARG001 """Upgrade.""" bind = op.get_bind() session = Session(bind=bind) From 6719875b7e0c46734cafab2b8e4b61f8cea04bd0 Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Tue, 13 Jan 2026 16:28:45 +0300 Subject: [PATCH 3/8] Fix: remove unnecessary noqa comment from upgrade function in initial LDAP schema --- app/alembic/versions/275222846605_initial_ldap_schema.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/alembic/versions/275222846605_initial_ldap_schema.py b/app/alembic/versions/275222846605_initial_ldap_schema.py index 3e9593088..9906153ad 100644 --- a/app/alembic/versions/275222846605_initial_ldap_schema.py +++ b/app/alembic/versions/275222846605_initial_ldap_schema.py @@ -36,7 +36,7 @@ @temporary_stub_entity_type_name -def upgrade(container: AsyncContainer) -> None: # noqa: ARG001 +def upgrade(container: AsyncContainer) -> None: """Upgrade.""" bind = op.get_bind() session = Session(bind=bind) From fb832cbf1dd605e3658f0d5a8ff33ba340af69c9 Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Tue, 13 Jan 2026 16:32:22 +0300 Subject: [PATCH 4/8] Fix: update hash assertion in kadmin setup test --- tests/test_api/test_main/test_kadmin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api/test_main/test_kadmin.py b/tests/test_api/test_main/test_kadmin.py index b5b06d096..dced6e83b 100644 --- a/tests/test_api/test_main/test_kadmin.py +++ b/tests/test_api/test_main/test_kadmin.py @@ -157,7 +157,7 @@ async def test_setup_call( kdc_doc = kadmin.setup.call_args.kwargs.pop("kdc_config").encode() # NOTE: Asserting documents integrity, tests template rendering - assert blake2b(krb_doc, digest_size=8).hexdigest() == "f433bbc7df5a236b" + assert blake2b(krb_doc, digest_size=8).hexdigest() == "0567ec28b8ccca51" assert blake2b(kdc_doc, digest_size=8).hexdigest() == "79e43649d34fe577" assert kadmin.setup.call_args.kwargs == { From ab33ed56a81837286312b1a7cd19fedd80ba4248 Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Tue, 13 Jan 2026 17:40:36 +0300 Subject: [PATCH 5/8] Fix: update hash assertion in kadmin setup test --- tests/test_api/test_main/test_kadmin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_api/test_main/test_kadmin.py b/tests/test_api/test_main/test_kadmin.py index dced6e83b..b5b06d096 100644 --- a/tests/test_api/test_main/test_kadmin.py +++ b/tests/test_api/test_main/test_kadmin.py @@ -157,7 +157,7 @@ async def test_setup_call( kdc_doc = kadmin.setup.call_args.kwargs.pop("kdc_config").encode() # NOTE: Asserting documents integrity, tests template rendering - assert blake2b(krb_doc, digest_size=8).hexdigest() == "0567ec28b8ccca51" + assert blake2b(krb_doc, digest_size=8).hexdigest() == "f433bbc7df5a236b" assert blake2b(kdc_doc, digest_size=8).hexdigest() == "79e43649d34fe577" assert kadmin.setup.call_args.kwargs == { From 6ad95b83cd036b31db78347904f97975c1d3c873 Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Thu, 15 Jan 2026 11:09:23 +0300 Subject: [PATCH 6/8] Fix: update object class modification to use async context in LDAP schema upgrade --- app/alembic/versions/275222846605_initial_ldap_schema.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/alembic/versions/275222846605_initial_ldap_schema.py b/app/alembic/versions/275222846605_initial_ldap_schema.py index 9906153ad..459e7b79f 100644 --- a/app/alembic/versions/275222846605_initial_ldap_schema.py +++ b/app/alembic/versions/275222846605_initial_ldap_schema.py @@ -367,8 +367,9 @@ async def _create_attribute_types(connection: AsyncConnection) -> None: # noqa: op.run_async(_create_attribute_types) - async def _modify_object_classes(connection: AsyncConnection) -> None: - session = AsyncSession(bind=connection) + async def _modify_object_classes(connection: AsyncConnection) -> None: # noqa: ARG001 + async with container(scope=Scope.REQUEST) as cnt: + session = await cnt.get(AsyncSession) for oc_name, at_names in ( ("user", ["nsAccountLock", "shadowExpire"]), From 092d5ffa65469674ce07712e5af65ab59470f823 Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Thu, 15 Jan 2026 11:38:10 +0300 Subject: [PATCH 7/8] Fix: format query for attribute types retrieval in LDAP schema upgrade --- app/alembic/versions/275222846605_initial_ldap_schema.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/alembic/versions/275222846605_initial_ldap_schema.py b/app/alembic/versions/275222846605_initial_ldap_schema.py index 459e7b79f..a63cab4fe 100644 --- a/app/alembic/versions/275222846605_initial_ldap_schema.py +++ b/app/alembic/versions/275222846605_initial_ldap_schema.py @@ -388,9 +388,10 @@ async def _modify_object_classes(connection: AsyncConnection) -> None: # noqa: attribute_types = await session.scalars( select(AttributeType).where( - qa(AttributeType.name).in_(at_names), + qa(AttributeType.name) + .in_(at_names), ), - ) + ) # fmt: skip object_class.attribute_types_may.extend(attribute_types.all()) From 7614a13fade38840a89df56b8af9a0ea01a58af1 Mon Sep 17 00:00:00 2001 From: "m.shvets" Date: Thu, 15 Jan 2026 11:39:46 +0300 Subject: [PATCH 8/8] Fix: correct query formatting for attribute types in LDAP schema upgrade --- app/alembic/versions/275222846605_initial_ldap_schema.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/alembic/versions/275222846605_initial_ldap_schema.py b/app/alembic/versions/275222846605_initial_ldap_schema.py index a63cab4fe..27efc5e94 100644 --- a/app/alembic/versions/275222846605_initial_ldap_schema.py +++ b/app/alembic/versions/275222846605_initial_ldap_schema.py @@ -387,9 +387,8 @@ async def _modify_object_classes(connection: AsyncConnection) -> None: # noqa: continue attribute_types = await session.scalars( - select(AttributeType).where( - qa(AttributeType.name) - .in_(at_names), + select(AttributeType) + .where(qa(AttributeType.name).in_(at_names), ), ) # fmt: skip