Add EventMedia and GiftCategory models
Introduce EventMedia for managing media files linked to events, including file metadata, purpose, and relationships. Add GiftCategory to categorize gifts, featuring unique constraints, display options, and utility methods for handling related gifts.
This commit is contained in:
68
backend/app/models/event_media.py
Normal file
68
backend/app/models/event_media.py
Normal file
@@ -0,0 +1,68 @@
|
||||
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
|
||||
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
|
||||
metadata = Column(JSON, default=dict)
|
||||
|
||||
# Relationships
|
||||
event = relationship("Event", back_populates="media")
|
||||
uploader = relationship("User", foreign_keys=[uploaded_by])
|
||||
|
||||
def __repr__(self):
|
||||
return f"<EventMedia {self.original_filename} ({self.media_type}) for event={self.event_id}>"
|
||||
|
||||
@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
|
||||
Reference in New Issue
Block a user