This commit is contained in:
2026-04-09 19:28:41 +03:00
commit 9fa723bb4c
43 changed files with 2804 additions and 0 deletions

79
app/models/form.py Normal file
View File

@@ -0,0 +1,79 @@
from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text, ForeignKey, Index
from sqlalchemy.orm import relationship
from sqlalchemy.dialects.postgresql import JSONB, UUID
from datetime import datetime
import uuid
from app.models.base import BaseModel
class Form(BaseModel):
__tablename__ = "forms"
uuid = Column(UUID(as_uuid=True), default=uuid.uuid4, unique=True, nullable=False, index=True)
name = Column(String(200), nullable=False)
description = Column(Text)
version = Column(Integer, default=1)
is_active = Column(Boolean, default=True)
is_published = Column(Boolean, default=False)
form_settings = Column(JSONB, default={}) # переименовано с settings
created_by = Column(Integer, nullable=True)
# Relationships
fields = relationship("FormField", back_populates="form", cascade="all, delete-orphan")
submissions = relationship("Submission", back_populates="form", cascade="all, delete-orphan")
__table_args__ = (
Index('ix_forms_name_active', 'name', 'is_active'),
Index('ix_forms_created_at', 'created_at'),
)
@property
def fields_count(self) -> int:
return len(self.fields)
@property
def submissions_count(self) -> int:
return len(self.submissions)
class FormField(BaseModel):
__tablename__ = "form_fields"
form_id = Column(Integer, ForeignKey("forms.id", ondelete="CASCADE"))
field_id = Column(Integer, ForeignKey("fields.id", ondelete="CASCADE"))
order = Column(Integer, default=0)
is_required = Column(Boolean, default=False)
default_value = Column(JSONB, nullable=True)
visibility_conditions = Column(JSONB, default={})
validation_rules_override = Column(JSONB, nullable=True)
# Relationships
form = relationship("Form", back_populates="fields")
field = relationship("Field", back_populates="form_fields")
__table_args__ = (
Index('ix_form_fields_order', 'form_id', 'order'),
Index('ix_form_fields_unique', 'form_id', 'field_id', unique=True),
)
class Field(BaseModel):
__tablename__ = "fields"
name = Column(String(100), unique=True, nullable=False, index=True)
label = Column(String(200), nullable=False)
field_type = Column(String(50), nullable=False)
placeholder = Column(String(200))
help_text = Column(Text)
field_options = Column(JSONB, default={}) # переименовано с options
validation_rules = Column(JSONB, default={})
field_metadata = Column(JSONB, default={}) # переименовано с metadata
created_at = Column(DateTime, default=datetime.utcnow)
# Relationships
form_fields = relationship("FormField", back_populates="field")
__table_args__ = (
Index('ix_fields_type', 'field_type'),
Index('ix_fields_name_type', 'name', 'field_type'),
)