import uuid import enum from sqlalchemy import Column, String, Text, Boolean, DateTime, ForeignKey, Enum, JSON, Integer from sqlalchemy.sql import func from sqlalchemy.orm import relationship from app.core.database import Base class FieldType(str, enum.Enum): TEXT = "text" NUMBER = "number" DROPDOWN = "dropdown" DATE = "date" PERSON = "person" FORMULA = "formula" class CustomField(Base): __tablename__ = "pjctrl_custom_fields" id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) project_id = Column(String(36), ForeignKey("pjctrl_projects.id", ondelete="CASCADE"), nullable=False) name = Column(String(100), nullable=False) field_type = Column( Enum("text", "number", "dropdown", "date", "person", "formula", name="field_type_enum"), nullable=False ) options = Column(JSON, nullable=True) # For dropdown: list of options formula = Column(Text, nullable=True) # For formula: formula expression is_required = Column(Boolean, default=False, nullable=False) position = Column(Integer, default=0, nullable=False) # For ordering fields created_at = Column(DateTime, server_default=func.now(), nullable=False) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), nullable=False) # Relationships project = relationship("Project", back_populates="custom_fields") values = relationship("TaskCustomValue", back_populates="field", cascade="all, delete-orphan")