feat: added tags for cards, aligned status headers

This commit is contained in:
2025-03-09 19:30:52 +04:00
parent 487174c4ff
commit 6030591e3c
17 changed files with 375 additions and 23 deletions

View File

@@ -6,6 +6,7 @@ from .board import *
from .status import *
from .attribute import *
from .card import *
from .card_tag import *
from .auth import *
from .card import *
from .client import *

View File

@@ -10,8 +10,10 @@ from .shipping import Pallet, Box
from .shipping_warehouse import ShippingWarehouse
if TYPE_CHECKING:
from . import CardBillRequest, User, BaseModel, Board, CardStatus, CardGroup, CardAttribute, CardService as CardServiceModel, \
CardProduct, Client
from . import (
CardBillRequest, User, BaseModel, Board, CardStatus, CardGroup, CardAttribute, Client, CardTag,
CardService as CardServiceModel, CardProduct,
)
class Card(BaseModel):
@@ -56,6 +58,13 @@ class Card(BaseModel):
lazy='joined',
back_populates='cards'
)
tags: Mapped[list['CardTag']] = relationship(
'CardTag',
secondary='cards_card_tags',
back_populates='cards',
lazy='selectin',
)
# endregion
# region Attributes handled by modules
@@ -107,6 +116,7 @@ class Card(BaseModel):
# endregion
class CardEmployees(BaseModel):
__tablename__ = 'card_employees'
user_id: Mapped[int] = mapped_column(ForeignKey('users.id'), primary_key=True)
@@ -116,4 +126,3 @@ class CardEmployees(BaseModel):
card: Mapped[Card] = relationship('Card', back_populates='employees', lazy='selectin')
created_at: Mapped[datetime] = mapped_column()

45
models/card_tag.py Normal file
View File

@@ -0,0 +1,45 @@
from typing import TYPE_CHECKING
from sqlalchemy import ForeignKey, Column, Table, UniqueConstraint, Index
from sqlalchemy.orm import mapped_column, Mapped, relationship
from models import BaseModel
if TYPE_CHECKING:
from models import Project, Card
cards_card_tags = Table(
'cards_card_tags',
BaseModel.metadata,
Column('card_id', ForeignKey('cards.id'), primary_key=True),
Column('card_tag_id', ForeignKey('card_tags.id'), primary_key=True),
)
class CardTag(BaseModel):
__tablename__ = 'card_tags'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(nullable=False)
is_deleted: Mapped[bool] = mapped_column(default=False, server_default='0')
project_id: Mapped[int] = mapped_column(
ForeignKey('projects.id'),
nullable=False,
)
project: Mapped['Project'] = relationship(
'Project',
back_populates='tags',
lazy='noload',
)
cards: Mapped[list['Card']] = relationship(
secondary='cards_card_tags',
lazy='noload',
back_populates='tags',
)
__table_args__ = (
Index('idx_card_name_project_id', 'name', 'project_id', 'is_deleted'),
)

View File

@@ -9,6 +9,7 @@ if TYPE_CHECKING:
from board import Board
from attribute import Attribute
from module import Module
from card_tag import CardTag
class Project(BaseModel):
@@ -27,7 +28,6 @@ class Project(BaseModel):
attributes: Mapped[list['Attribute']] = relationship(
'Attribute',
uselist=True,
secondary='project_attribute',
back_populates='projects',
lazy='selectin',
@@ -35,10 +35,16 @@ class Project(BaseModel):
modules: Mapped[list['Module']] = relationship(
'Module',
uselist=True,
secondary='project_module',
back_populates='projects',
lazy='selectin',
order_by='asc(Module.id)',
)
tags: Mapped[list['CardTag']] = relationship(
'CardTag',
back_populates='project',
primaryjoin="and_(Project.id == CardTag.project_id, CardTag.is_deleted == False)",
order_by='asc(CardTag.id)',
lazy='selectin',
)