feat: modules dependencies
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import select, update, func, delete
|
||||
from sqlalchemy.orm import selectinload
|
||||
from sqlalchemy.orm import selectinload, immediateload
|
||||
|
||||
from card_attributes import CardAttributesCommandHandler
|
||||
from models import Project, Board, Module
|
||||
@@ -27,7 +27,8 @@ class ProjectService(BaseService):
|
||||
.outerjoin(board_count_sub, Project.id == board_count_sub.c.project_id)
|
||||
.options(
|
||||
selectinload(Project.attributes),
|
||||
selectinload(Project.modules),
|
||||
selectinload(Project.modules)
|
||||
.selectinload(Module.depends_on),
|
||||
)
|
||||
.where(Project.is_deleted == False)
|
||||
.order_by(Project.id)
|
||||
@@ -90,22 +91,48 @@ class ProjectService(BaseService):
|
||||
stmt = (
|
||||
select(Module)
|
||||
.where(Module.is_deleted == False)
|
||||
.options(
|
||||
selectinload(Module.depends_on),
|
||||
)
|
||||
)
|
||||
modules = await self.session.scalars(stmt)
|
||||
return GetAllModulesResponse(modules=modules.all())
|
||||
|
||||
def get_module_with_dependencies(self, module: Module, visited_ids: set[int]) -> set[Module]:
|
||||
result_modules = {module}
|
||||
|
||||
for dependency in module.depends_on:
|
||||
if dependency.id not in visited_ids:
|
||||
visited_ids.add(dependency.id)
|
||||
result_modules.update(
|
||||
self.get_module_with_dependencies(dependency, visited_ids)
|
||||
)
|
||||
|
||||
return result_modules
|
||||
|
||||
async def update_project_modules(self, request: UpdateModulesRequest) -> UpdateModulesResponse:
|
||||
project: Optional[Project] = await self.session.get(Project, request.project_id)
|
||||
if not project:
|
||||
return UpdateModulesResponse(ok=False, message=f"Проект с ID {request.project_id} не найден")
|
||||
|
||||
load_dependencies = immediateload(Module.depends_on)
|
||||
for i in range(5):
|
||||
load_dependencies = load_dependencies.immediateload(Module.depends_on)
|
||||
|
||||
modules_stmt = (
|
||||
select(Module)
|
||||
.where(Module.id.in_(request.module_ids))
|
||||
.options(load_dependencies)
|
||||
)
|
||||
modules = (await self.session.scalars(modules_stmt)).all()
|
||||
|
||||
project.modules = modules
|
||||
result_modules = set()
|
||||
visited_module_ids = set(request.module_ids)
|
||||
for module in modules:
|
||||
result_modules.update(
|
||||
self.get_module_with_dependencies(module, visited_module_ids)
|
||||
)
|
||||
project.modules = list(result_modules)
|
||||
await self.session.commit()
|
||||
|
||||
return UpdateModulesResponse(ok=True, message="Модули успешно обновлены")
|
||||
|
||||
Reference in New Issue
Block a user