from enum import Enum from sqlalchemy import Column, String, Integer, Boolean, ForeignKey, JSON, Enum as SQLEnum from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship, validates from .base import Base, TimestampMixin, UUIDMixin class MediaType(str, Enum): IMAGE = "image" VIDEO = "video" DOCUMENT = "document" class MediaPurpose(str, Enum): BANNER = "banner" GALLERY = "gallery" ATTACHMENT = "attachment" class EventMedia(Base, UUIDMixin, TimestampMixin): __tablename__ = 'event_media' # Foreign Keys event_id = Column(UUID(as_uuid=True), ForeignKey('events.id'), nullable=False) uploaded_by = Column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=False) # File Information file_path = Column(String, nullable=False) original_filename = Column(String, nullable=False) media_type = Column(SQLEnum(MediaType), nullable=False) content_type = Column(String, nullable=False) file_size = Column(Integer, nullable=False) # Organization purpose = Column(SQLEnum(MediaPurpose), nullable=False) is_public = Column(Boolean, default=True, nullable=False) display_order = Column(Integer, default=0) title = Column(String) description = Column(String) # Additional Metadata media_metadata = Column(JSON, default=dict) # Relationships event = relationship("Event", back_populates="media") uploader = relationship("User", foreign_keys=[uploaded_by]) def __repr__(self): return f"" @validates('display_order') def validate_display_order(self, key, value): return value if value is not None else 0 @property def is_image(self): return self.media_type == MediaType.IMAGE @property def is_video(self): return self.media_type == MediaType.VIDEO @property def is_document(self): return self.media_type == MediaType.DOCUMENT @property def url(self): """Generate the URL for the media file""" # This should be implemented based on your storage solution # Example: return f"/media/{self.file_path}" pass