Add EventMedia and GiftCategory models
All checks were successful
Build and Push Docker Images / changes (push) Successful in 4s
Build and Push Docker Images / build-backend (push) Successful in 48s
Build and Push Docker Images / build-frontend (push) Has been skipped

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:
2025-02-27 19:08:48 +01:00
parent e60a016ab1
commit 46fabc38a4
2 changed files with 127 additions and 1 deletions

View 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

View File

@@ -119,3 +119,61 @@ class GiftPurchase(Base, UUIDMixin):
def __repr__(self):
return f"<GiftPurchase gift_id={self.gift_id} guest_id={self.guest_id}>"
class GiftCategory(Base, UUIDMixin, TimestampMixin):
__tablename__ = 'gift_categories'
# Foreign Keys
event_id = Column(UUID(as_uuid=True), ForeignKey('events.id'), nullable=False)
created_by = Column(UUID(as_uuid=True), ForeignKey('users.id'), nullable=False)
# Category Details
name = Column(String, nullable=False)
description = Column(String)
# Display
icon = Column(String) # Icon identifier or URL
color = Column(String) # Color code (hex/rgb)
display_order = Column(Integer, default=0)
is_visible = Column(Boolean, default=True)
# Additional Settings
custom_fields = Column(JSONB)
# Relationships
event = relationship("Event", back_populates="gift_categories")
gifts = relationship("GiftItem",
back_populates="category",
order_by="GiftItem.display_order")
created_by_user = relationship("User", foreign_keys=[created_by])
# Ensure unique category names within an event
__table_args__ = (
UniqueConstraint('event_id', 'name', name='uq_event_category_name'),
)
def __repr__(self):
return f"<GiftCategory {self.name}>"
@property
def total_gifts(self) -> int:
"""Get total number of gifts in category"""
return len(self.gifts)
@property
def available_gifts(self) -> int:
"""Get number of available gifts in category"""
return sum(1 for gift in self.gifts
if gift.status == 'available' and gift.is_visible)
def reorder_gifts(self, gift_ids: list[UUID]) -> None:
"""
Reorder gifts within the category
Args:
gift_ids: List of gift IDs in desired order
"""
gift_order = {gift_id: idx for idx, gift_id in enumerate(gift_ids)}
for gift in self.gifts:
if gift.id in gift_order:
gift.display_order = gift_order[gift.id]