feat: cards, attributes and modules
This commit is contained in:
100
models/attribute.py
Normal file
100
models/attribute.py
Normal file
@@ -0,0 +1,100 @@
|
||||
import pickle
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from sqlalchemy import ForeignKey, Table, Column, UniqueConstraint, Index
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from models.base import BaseModel
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from models import Project, BaseModel, Card
|
||||
|
||||
project_attribute = Table(
|
||||
'project_attribute',
|
||||
BaseModel.metadata,
|
||||
Column('project_id', ForeignKey('projects.id')),
|
||||
Column('attribute_id', ForeignKey('attributes.id')),
|
||||
)
|
||||
|
||||
|
||||
class AttributeType(BaseModel):
|
||||
__tablename__ = 'attribute_types'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
type: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||
name: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||
is_deleted: Mapped[bool] = mapped_column(default=False)
|
||||
|
||||
attributes: Mapped['Attribute'] = relationship(
|
||||
'Attribute',
|
||||
back_populates='type',
|
||||
lazy='noload',
|
||||
)
|
||||
|
||||
|
||||
class Attribute(BaseModel):
|
||||
__tablename__ = 'attributes'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
label: Mapped[str] = mapped_column(nullable=False)
|
||||
name: Mapped[str] = mapped_column(nullable=False, unique=True)
|
||||
is_applicable_to_group: Mapped[bool] = mapped_column(
|
||||
default=False,
|
||||
comment='Применять ли изменения атрибута карточки ко всем карточкам в группе',
|
||||
)
|
||||
is_nullable: Mapped[bool] = mapped_column(default=False, nullable=False)
|
||||
default_value: Mapped[bytes] = mapped_column(nullable=True)
|
||||
|
||||
projects: Mapped[list['Project']] = relationship(
|
||||
'Project',
|
||||
uselist=True,
|
||||
secondary='project_attribute',
|
||||
back_populates='attributes',
|
||||
lazy='noload',
|
||||
)
|
||||
|
||||
type_id: Mapped[int] = mapped_column(ForeignKey('attribute_types.id'), nullable=False)
|
||||
type: Mapped[AttributeType] = relationship(
|
||||
'AttributeType',
|
||||
back_populates='attributes',
|
||||
lazy='joined',
|
||||
)
|
||||
|
||||
card_attributes: Mapped[list['CardAttribute']] = relationship(
|
||||
'CardAttribute',
|
||||
uselist=True,
|
||||
lazy='noload',
|
||||
back_populates='attribute',
|
||||
)
|
||||
|
||||
|
||||
class CardAttribute(BaseModel):
|
||||
__tablename__ = 'card_attributes'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
value: Mapped[bytes] = mapped_column(nullable=True)
|
||||
|
||||
card_id: Mapped[int] = mapped_column(ForeignKey('cards.id'), nullable=False)
|
||||
card: Mapped['Card'] = relationship(
|
||||
'Card',
|
||||
back_populates='attributes',
|
||||
lazy='noload',
|
||||
)
|
||||
|
||||
attribute_id: Mapped[int] = mapped_column(ForeignKey('attributes.id'), nullable=False)
|
||||
attribute: Mapped[Attribute] = relationship(
|
||||
'Attribute',
|
||||
back_populates='card_attributes',
|
||||
lazy='joined',
|
||||
)
|
||||
|
||||
__table_args__ = (
|
||||
UniqueConstraint('card_id', 'attribute_id', name='uix_card_service'),
|
||||
Index('idx_card_id_attribute_id', 'card_id', 'attribute_id', unique=True)
|
||||
)
|
||||
|
||||
def set_value(self, value):
|
||||
self.value = pickle.dumps(value)
|
||||
|
||||
def get_value(self):
|
||||
return pickle.loads(self.value)
|
||||
Reference in New Issue
Block a user