""" this model is new to iteration 2. It defines the structure of form fields that are linked using foreign key entity relationships to from templates, in order to render these fields and templates dynamically in the ticket submission form page. """ # import relevant sql libraries from enum import Enum from sqlalchemy import ( Column, Integer, String, Boolean, DateTime, ForeignKey, Index, ) from sqlalchemy.orm import relationship from sqlalchemy.sql import func # import the declarative base from db_connect module from ..db.db_connect import Base # define enumerations for field input types class FieldType(str, Enum): TEXT = "text" TEXTAREA = "textarea" NUMBER = "number" SELECT = "select" CHECKBOX = "checkbox" RADIO = "radio" EMAIL = "email" # define the from field model class FormField(Base): #define table name __tablename__ = "form_fields" # define attributes id = Column(Integer, primary_key=True, index=True) # apply a cascading delete function for when the parent template is deleted template_id = Column(Integer, ForeignKey("form_templates.id", ondelete="CASCADE"), nullable=False, index=True) question_text = Column(String(255), nullable=False) type = Column(String(32), nullable=False, default=FieldType.TEXT.value) required = Column(Boolean, nullable=False, default=False) position = Column(Integer, nullable=False, default=0) created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) __table_args__ = ( Index("ix_form_fields_template_pos", "template_id", "position"), ) template = relationship("FormTemplate", backref="fields", passive_deletes=True) def __repr__(self) -> str: return f""