79 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import Optional
 | 
						|
 | 
						|
from sqlalchemy import select, and_
 | 
						|
from sqlalchemy.ext.asyncio import AsyncResult
 | 
						|
from sqlalchemy.orm import selectinload
 | 
						|
 | 
						|
from card_attributes.handlers.base_handler import BaseHandler
 | 
						|
from models import Attribute, project_attribute, card_relations, Card, Project, Board
 | 
						|
 | 
						|
 | 
						|
class CardAttributesQueryHandler(BaseHandler):
 | 
						|
    async def get_attributes_for_project(self, project_id: int) -> list[Attribute]:
 | 
						|
        stmt = (
 | 
						|
            select(Attribute)
 | 
						|
            .join(project_attribute, project_attribute.c.attribute_id == Attribute.id)
 | 
						|
            .where(
 | 
						|
                project_attribute.c.project_id == project_id,
 | 
						|
                Attribute.is_deleted == False,
 | 
						|
            )
 | 
						|
        )
 | 
						|
        attributes = (await self.session.scalars(stmt)).all()
 | 
						|
        return list(attributes)
 | 
						|
 | 
						|
    async def get_attr_by_name(self, attr_name: str) -> Optional[Attribute]:
 | 
						|
        stmt = (
 | 
						|
            select(Attribute)
 | 
						|
            .options(
 | 
						|
                selectinload(Attribute.projects),
 | 
						|
            )
 | 
						|
            .where(
 | 
						|
                Attribute.name == attr_name,
 | 
						|
                Attribute.is_deleted == False,
 | 
						|
            )
 | 
						|
        )
 | 
						|
        attribute = (await self.session.scalars(stmt)).first()
 | 
						|
        return attribute
 | 
						|
 | 
						|
    async def get_card_ids_by_group_id(self, group_id: int) -> list[int]:
 | 
						|
        stmt = (
 | 
						|
            select(card_relations.c.card_id)
 | 
						|
            .where(card_relations.c.group_id == group_id)
 | 
						|
        )
 | 
						|
        ids = await self.session.scalars(stmt)
 | 
						|
        return list(ids)
 | 
						|
 | 
						|
    async def get_all_cards_for_project(self, project_id: int) -> AsyncResult[Card]:
 | 
						|
        stmt = (
 | 
						|
            select(Card)
 | 
						|
            .join(Board)
 | 
						|
            .join(Project)
 | 
						|
            .where(Project.id == project_id)
 | 
						|
            .options(selectinload(Card.attributes))
 | 
						|
            .execution_options(yield_per=100)
 | 
						|
        )
 | 
						|
        rows: AsyncResult[tuple[Card]] = await self.session.stream(stmt)
 | 
						|
        async for row in rows:
 | 
						|
            yield row[0]
 | 
						|
 | 
						|
    async def get_project_attr(self, project_id: int, attribute_id: int) -> project_attribute:
 | 
						|
        stmt_is_attribute_already_added = (
 | 
						|
            select(project_attribute)
 | 
						|
            .where(
 | 
						|
                and_(
 | 
						|
                    project_attribute.c.project_id == project_id,
 | 
						|
                    project_attribute.c.attribute_id == attribute_id,
 | 
						|
                )
 | 
						|
            )
 | 
						|
        )
 | 
						|
        project_attribute_inst = await self.session.execute(stmt_is_attribute_already_added)
 | 
						|
        return project_attribute_inst.first()
 | 
						|
 | 
						|
    async def get_attributes_by_ids(self, attribute_ids: list[int]) -> list[Attribute]:
 | 
						|
        stmt = (
 | 
						|
            select(Attribute)
 | 
						|
            .where(Attribute.id.in_(attribute_ids))
 | 
						|
        )
 | 
						|
        attributes = (await self.session.scalars(stmt)).all()
 | 
						|
        return list(attributes)
 |