"""Models for prompt template system.""" from sqlalchemy import Column, String, Text, Float, DateTime, Boolean, Integer, JSON, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.types import TypeDecorator, CHAR from sqlalchemy.dialects.postgresql import UUID import uuid from datetime import datetime from backend.models.base import Model class GUID(TypeDecorator): """Platform-independent GUID type for SQLite and PostgreSQL compatibility.""" impl = CHAR cache_ok = True def load_dialect_impl(self, dialect): if dialect.name == 'postgresql': return dialect.type_descriptor(UUID()) else: return dialect.type_descriptor(CHAR(32)) def process_bind_param(self, value, dialect): if value is None: return value elif dialect.name == 'postgresql': return str(value) else: if not isinstance(value, uuid.UUID): return "%.32x" % uuid.UUID(value).int else: return "%.32x" % value.int def process_result_value(self, value, dialect): if value is None: return value else: if not isinstance(value, uuid.UUID): return uuid.UUID(value) return value class PromptTemplate(Model): """Custom prompt templates for AI models.""" __tablename__ = "prompt_templates" __table_args__ = {'extend_existing': True} id = Column(GUID, primary_key=True, default=uuid.uuid4) user_id = Column(String(36), ForeignKey("users.id"), nullable=True) name = Column(String(200), nullable=False) description = Column(Text, nullable=True) prompt_text = Column(Text, nullable=False) domain_category = Column(String(50), nullable=True) model_config = Column(JSON, nullable=True) is_public = Column(Boolean, default=False) usage_count = Column(Integer, default=0) rating = Column(Float, default=0.0) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Relationships user = relationship("backend.models.user.User", back_populates="prompt_templates") export_metadata = relationship("backend.models.enhanced_export.ExportMetadata") def __repr__(self): return f""