feat: colors for card tags
This commit is contained in:
		@@ -1,6 +1,6 @@
 | 
				
			|||||||
from typing import TYPE_CHECKING
 | 
					from typing import TYPE_CHECKING
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from sqlalchemy import ForeignKey, Column, Table, UniqueConstraint, Index
 | 
					from sqlalchemy import ForeignKey, Column, Table, Index
 | 
				
			||||||
from sqlalchemy.orm import mapped_column, Mapped, relationship
 | 
					from sqlalchemy.orm import mapped_column, Mapped, relationship
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from models import BaseModel
 | 
					from models import BaseModel
 | 
				
			||||||
@@ -8,7 +8,6 @@ from models import BaseModel
 | 
				
			|||||||
if TYPE_CHECKING:
 | 
					if TYPE_CHECKING:
 | 
				
			||||||
    from models import Project, Card
 | 
					    from models import Project, Card
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
cards_card_tags = Table(
 | 
					cards_card_tags = Table(
 | 
				
			||||||
    'cards_card_tags',
 | 
					    'cards_card_tags',
 | 
				
			||||||
    BaseModel.metadata,
 | 
					    BaseModel.metadata,
 | 
				
			||||||
@@ -17,6 +16,16 @@ cards_card_tags = Table(
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CardTagColor(BaseModel):
 | 
				
			||||||
 | 
					    __tablename__ = "card_tag_colors"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    id: Mapped[int] = mapped_column(primary_key=True)
 | 
				
			||||||
 | 
					    label: Mapped[str] = mapped_column(unique=True)
 | 
				
			||||||
 | 
					    color: Mapped[str] = mapped_column(unique=True)
 | 
				
			||||||
 | 
					    background_color: Mapped[str] = mapped_column(unique=True)
 | 
				
			||||||
 | 
					    is_deleted: Mapped[bool] = mapped_column(default=False, nullable=False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CardTag(BaseModel):
 | 
					class CardTag(BaseModel):
 | 
				
			||||||
    __tablename__ = 'card_tags'
 | 
					    __tablename__ = 'card_tags'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -40,6 +49,15 @@ class CardTag(BaseModel):
 | 
				
			|||||||
        back_populates='tags',
 | 
					        back_populates='tags',
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    tag_color_id: Mapped[int] = mapped_column(
 | 
				
			||||||
 | 
					        ForeignKey('card_tag_colors.id'),
 | 
				
			||||||
 | 
					        nullable=False,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    tag_color: Mapped[CardTagColor] = relationship(
 | 
				
			||||||
 | 
					        'CardTagColor',
 | 
				
			||||||
 | 
					        lazy='selectin',
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    __table_args__ = (
 | 
					    __table_args__ = (
 | 
				
			||||||
        Index('idx_card_name_project_id', 'name', 'project_id', 'is_deleted'),
 | 
					        Index('idx_card_name_project_id', 'name', 'project_id', 'is_deleted'),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,3 +61,14 @@ async def switch_tag(
 | 
				
			|||||||
        request: SwitchTagRequest,
 | 
					        request: SwitchTagRequest,
 | 
				
			||||||
):
 | 
					):
 | 
				
			||||||
    return await CardTagService(session).switch_tag(request)
 | 
					    return await CardTagService(session).switch_tag(request)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@card_tag_router.get(
 | 
				
			||||||
 | 
					    '/colors',
 | 
				
			||||||
 | 
					    response_model=GetTagColorsResponse,
 | 
				
			||||||
 | 
					    operation_id='get_colors',
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					async def get_colors(
 | 
				
			||||||
 | 
					        session: Annotated[AsyncSession, Depends(get_session)],
 | 
				
			||||||
 | 
					):
 | 
				
			||||||
 | 
					    return await CardTagService(session).get_tag_colors()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,14 +5,22 @@ from schemas.base import BaseSchema, OkMessageSchema
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# region Entities
 | 
					# region Entities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CardTagColorSchema(BaseSchema):
 | 
				
			||||||
 | 
					    id: int
 | 
				
			||||||
 | 
					    color: str
 | 
				
			||||||
 | 
					    background_color: str
 | 
				
			||||||
 | 
					    label: str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BaseCardTagSchema(BaseSchema):
 | 
					class BaseCardTagSchema(BaseSchema):
 | 
				
			||||||
    name: str
 | 
					    name: str
 | 
				
			||||||
    project_id: int
 | 
					    project_id: int
 | 
				
			||||||
 | 
					    tag_color_id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CardTagSchema(BaseCardTagSchema):
 | 
					class CardTagSchema(BaseCardTagSchema):
 | 
				
			||||||
    id: int
 | 
					    id: int
 | 
				
			||||||
 | 
					    tag_color: CardTagColorSchema
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,4 +58,8 @@ class DeleteTagResponse(OkMessageSchema):
 | 
				
			|||||||
class SwitchTagResponse(OkMessageSchema):
 | 
					class SwitchTagResponse(OkMessageSchema):
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GetTagColorsResponse(BaseSchema):
 | 
				
			||||||
 | 
					    colors: list[CardTagColorSchema]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
from sqlalchemy import select
 | 
					from sqlalchemy import select
 | 
				
			||||||
from sqlalchemy.orm import selectinload
 | 
					from sqlalchemy.orm import selectinload
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from models import CardTag, Card, CardGroup
 | 
					from models import CardTag, Card, CardGroup, CardTagColor
 | 
				
			||||||
from schemas.card_tag import *
 | 
					from schemas.card_tag import *
 | 
				
			||||||
from services.base import BaseService
 | 
					from services.base import BaseService
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -24,7 +24,11 @@ class CardTagService(BaseService):
 | 
				
			|||||||
        if existing_tag:
 | 
					        if existing_tag:
 | 
				
			||||||
            return UpdateTagResponse(ok=False, message='Тег с таким названием уже существует')
 | 
					            return UpdateTagResponse(ok=False, message='Тег с таким названием уже существует')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        tag = CardTag(name=request.tag.name, project_id=request.tag.project_id)
 | 
					        tag = CardTag(
 | 
				
			||||||
 | 
					            name=request.tag.name,
 | 
				
			||||||
 | 
					            project_id=request.tag.project_id,
 | 
				
			||||||
 | 
					            tag_color_id=request.tag.tag_color_id,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        self.session.add(tag)
 | 
					        self.session.add(tag)
 | 
				
			||||||
        await self.session.commit()
 | 
					        await self.session.commit()
 | 
				
			||||||
        return CreateTagResponse(ok=True, message='Тег успешно создан')
 | 
					        return CreateTagResponse(ok=True, message='Тег успешно создан')
 | 
				
			||||||
@@ -41,6 +45,8 @@ class CardTagService(BaseService):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            card_tag.name = request.tag.name
 | 
					            card_tag.name = request.tag.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        card_tag.tag_color_id = request.tag.tag_color_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        await self.session.commit()
 | 
					        await self.session.commit()
 | 
				
			||||||
        return UpdateTagResponse(ok=True, message='Тег успешно обновлен')
 | 
					        return UpdateTagResponse(ok=True, message='Тег успешно обновлен')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -127,3 +133,11 @@ class CardTagService(BaseService):
 | 
				
			|||||||
            card.tags = tags
 | 
					            card.tags = tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        await self.session.flush()
 | 
					        await self.session.flush()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    async def get_tag_colors(self) -> GetTagColorsResponse:
 | 
				
			||||||
 | 
					        stmt = (
 | 
				
			||||||
 | 
					            select(CardTagColor)
 | 
				
			||||||
 | 
					            .where(CardTagColor.is_deleted==False)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        colors = (await self.session.scalars(stmt)).all()
 | 
				
			||||||
 | 
					        return GetTagColorsResponse(colors=colors)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user