Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 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
f2e3beb
move files
milov-dmitriy Mar 5, 2026
2edacc4
fix
milov-dmitriy Mar 5, 2026
0ae946b
fixes
milov-dmitriy Mar 6, 2026
f992a00
rename
milov-dmitriy Mar 6, 2026
aa58052
tests: fix
milov-dmitriy Mar 6, 2026
52f1541
fix: linter
milov-dmitriy Mar 10, 2026
0ac5fe3
Merge remote-tracking branch 'origin/dev' into feature/1258_ldap_sche…
milov-dmitriy Mar 10, 2026
bad1d29
smfix
milov-dmitriy Mar 10, 2026
fc3a288
many fixes
milov-dmitriy Mar 10, 2026
3a16b37
add: test and delete legacy BL task_1258
milov-dmitriy Mar 10, 2026
2a79895
fix: linters
milov-dmitriy Mar 10, 2026
e903e26
smfixes
milov-dmitriy Mar 11, 2026
0113d41
refactor
milov-dmitriy Mar 11, 2026
956f712
todo
milov-dmitriy Mar 11, 2026
f29baee
delete: tables; refactor: naming
milov-dmitriy Mar 12, 2026
d07f652
refactor
milov-dmitriy Mar 12, 2026
b9c11c1
finally
milov-dmitriy Mar 12, 2026
11f2e3c
Merge remote-tracking branch 'origin/dev' into feature/1258_ldap_sche…
milov-dmitriy Mar 12, 2026
4a2ede1
fix: ruff
milov-dmitriy Mar 12, 2026
c86c14b
fix: migrations alembic head after merge dev
milov-dmitriy Mar 12, 2026
ba8d70f
add: copilot instructions
milov-dmitriy Mar 12, 2026
09f257a
refactor
milov-dmitriy Mar 13, 2026
0d78e5a
fix: convertation obj cls dto task_1258
milov-dmitriy Mar 16, 2026
993cf56
fix: pr comments task_1258
milov-dmitriy Mar 20, 2026
7ac0db5
fix: migration downgrade case task_1258
milov-dmitriy Mar 23, 2026
fd6004d
Add: AttributeType ldap_display_name (#974)
milov-dmitriy Apr 2, 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: 7 additions & 0 deletions .github/instructions/*.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Instructions for Large PR Reviews

## General Approach for Big Changesets
- Prioritize high-impact issues: security, performance, errors.
- Review files individually; skip minor style if >1000 lines total diff.
- Group feedback by file; limit to 5-10 key comments per file.
- If diff too large, comment on architecture/summary + top 3 files.
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,12 @@ launch: ## run standalone app without tty container
docker compose down
docker compose run sh -c "python multidirectory.py --migrate && python ."

rerun_last_migration: ## re-run migration
rerun_last_migration:
docker exec -it multidirectory_api sh -c "alembic downgrade -1; python multidirectory.py --migrate;"

rerun_all_migrations:
docker exec -it multidirectory_api sh -c "alembic downgrade base; python multidirectory.py --migrate;"

down: ## shutdown services
docker compose -f docker-compose.test.yml down --remove-orphans
docker compose down --remove-orphans
Expand Down
15 changes: 11 additions & 4 deletions app/alembic/versions/01f3f05a5b11_add_primary_group_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@
from ldap_protocol.ldap_schema.attribute_value_validator import (
AttributeValueValidator,
)
from ldap_protocol.ldap_schema.entity_type_dao import EntityTypeDAO
from ldap_protocol.ldap_schema.entity_type.entity_type_dao import EntityTypeDAO
from ldap_protocol.ldap_schema.entity_type.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 @@ -38,14 +41,15 @@
depends_on: None = None


@temporary_stub_column("is_system", sa.Boolean())
@temporary_stub_column("Directory", "is_system", sa.Boolean())
def upgrade(container: AsyncContainer) -> None:
"""Upgrade."""

async def _add_domain_computers_group(connection: AsyncConnection) -> None: # noqa: ARG001
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 +108,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 Expand Up @@ -169,7 +176,7 @@ async def _add_primary_group_id(connection: AsyncConnection) -> None: # noqa: A
op.run_async(_add_primary_group_id)


@temporary_stub_column("is_system", sa.Boolean())
@temporary_stub_column("Directory", "is_system", sa.Boolean())
def downgrade(container: AsyncContainer) -> None:
"""Downgrade."""
bind = op.get_bind()
Expand Down
2 changes: 1 addition & 1 deletion app/alembic/versions/05ddc0bd562a_add_roles.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
depends_on: None = None


@temporary_stub_column("is_system", sa.Boolean())
@temporary_stub_column("Directory", "is_system", sa.Boolean())
def upgrade(container: AsyncContainer) -> None:
"""Upgrade."""
op.create_table(
Expand Down
4 changes: 2 additions & 2 deletions app/alembic/versions/16a9fa2c1f1e_rename_readonly_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
depends_on: None | list[str] = None


@temporary_stub_column("is_system", sa.Boolean())
@temporary_stub_column("Directory", "is_system", sa.Boolean())
def upgrade(container: AsyncContainer) -> None: # noqa: ARG001
"""Upgrade."""
bind = op.get_bind()
Expand Down Expand Up @@ -72,7 +72,7 @@ def upgrade(container: AsyncContainer) -> None: # noqa: ARG001
session.close()


@temporary_stub_column("is_system", sa.Boolean())
@temporary_stub_column("Directory", "is_system", sa.Boolean())
def downgrade(container: AsyncContainer) -> None: # noqa: ARG001
"""Downgrade."""
bind = op.get_bind()
Expand Down
7 changes: 7 additions & 0 deletions app/alembic/versions/19d86e660cf2_fix_krbadmin_access.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@

"""

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

from enums import RoleConstants
from extra.alembic_utils import temporary_stub_column
from ldap_protocol.roles.exceptions import RoleNotFoundError
from ldap_protocol.roles.role_dao import RoleDAO
from ldap_protocol.roles.role_use_case import RoleUseCase
Expand All @@ -23,6 +25,11 @@
depends_on: None | list[str] = None


@temporary_stub_column(
"AccessControlEntries",
"attribute_type_name",
sa.String(),
)
def upgrade(container: AsyncContainer) -> None:
"""Upgrade."""

Expand Down
101 changes: 101 additions & 0 deletions app/alembic/versions/1b71cafba681_replace_attributeTypeId.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
"""Delete attributeTypeId add attribute_type_name from AccessControlEntries.

Revision ID: 1b71cafba681
Revises: 708b01eaf025
Create Date: 2026-03-24 16:28:49.116712

"""

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

from ldap_protocol.roles.migrations_ace_dao import (
AccessControlEntryDirectoryMappingDAO,
)
from ldap_protocol.utils.queries import get_base_directories

# revision identifiers, used by Alembic.
revision: None | str = "1b71cafba681"
down_revision: None | str = "708b01eaf025"
branch_labels: None | list[str] = None
depends_on: None | list[str] = None


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

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

if not await get_base_directories(session):
return

await ace_dao.upgrade()
await session.commit()

op.add_column(
"AccessControlEntries",
sa.Column("attribute_type_name", sa.String(), nullable=True),
)

op.run_async(_map_ace_to_directory_name)

op.drop_index(
op.f("idx_ace_attribute_type_id"),
table_name="AccessControlEntries",
postgresql_using="hash",
)
op.drop_constraint(
op.f("AccessControlEntries_directoryAttributeTypeId_fkey"),
"AccessControlEntries",
type_="foreignkey",
)
op.drop_column("AccessControlEntries", "attributeTypeId")


def downgrade(container: AsyncContainer) -> None:
"""Downgrade."""

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

if not await get_base_directories(session):
return

await ace_dao.downgrade()
await session.commit()

op.add_column(
"AccessControlEntries",
sa.Column(
"attributeTypeId",
sa.INTEGER(),
autoincrement=False,
nullable=True,
),
)

op.run_async(_map_ace_to_directory_id)

op.create_foreign_key(
op.f("AccessControlEntries_directoryAttributeTypeId_fkey"),
"AccessControlEntries",
"Directory",
["attributeTypeId"],
["id"],
ondelete="CASCADE",
)
op.create_index(
op.f("idx_ace_attribute_type_id"),
"AccessControlEntries",
["attributeTypeId"],
unique=False,
postgresql_using="hash",
)
op.drop_column("AccessControlEntries", "attribute_type_name")
Loading
Loading