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