Big refactor of gift categories model
All checks were successful
Build and Push Docker Images / changes (push) Successful in 5s
Build and Push Docker Images / build-backend (push) Successful in 52s
Build and Push Docker Images / build-frontend (push) Has been skipped

This commit is contained in:
2025-03-16 14:51:04 +01:00
parent ed017a42ed
commit 4ef202cc5a
7 changed files with 643 additions and 97 deletions

View File

@@ -6,12 +6,16 @@ from sqlalchemy import asc, desc
from sqlalchemy.orm import Session
from app.crud.base import CRUDBase
from app.models.gift import GiftItem, GiftCategory, GiftPurchase, GiftStatus
from app.models import gift as gift_models
from app.models.gift import GiftItem, GiftCategory, GiftPurchase, GiftStatus, EventGiftCategory
from app.models.guest import Guest
from app.models.event import Event
from app.schemas import gifts as gift_schemas
from app.schemas.gifts import (
GiftItemCreate, GiftItemUpdate,
GiftCategoryCreate, GiftCategoryUpdate,
GiftPurchaseCreate, GiftPurchaseUpdate
GiftPurchaseCreate, GiftPurchaseUpdate,
EventGiftCategoryCreate, EventGiftCategoryUpdate
)
@@ -130,13 +134,110 @@ class CRUDGiftItem(CRUDBase[GiftItem, GiftItemCreate, GiftItemUpdate]):
return gift
class CRUDEventGiftCategory:
def create(self, db: Session, *, obj_in: EventGiftCategoryCreate) -> EventGiftCategory:
"""Create a new event-category association"""
obj_data = obj_in.model_dump(exclude_unset=True)
# Ensure UUID fields are properly converted if they're strings
for field in ["event_id", "category_id"]:
if field in obj_data and obj_data[field] is not None:
if isinstance(obj_data[field], str):
obj_data[field] = UUID(obj_data[field])
db_obj = EventGiftCategory(**obj_data)
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
def get(self, db: Session, *, event_id: UUID, category_id: UUID) -> Optional[EventGiftCategory]:
"""Get a specific event-category association"""
return db.query(EventGiftCategory).filter(
EventGiftCategory.event_id == event_id,
EventGiftCategory.category_id == category_id
).first()
def update(
self, db: Session, *, db_obj: EventGiftCategory, obj_in: Union[EventGiftCategoryUpdate, Dict[str, Any]]
) -> EventGiftCategory:
"""Update an event-category association"""
if isinstance(obj_in, dict):
update_data = obj_in
else:
update_data = obj_in.model_dump(exclude_unset=True)
for field in update_data:
setattr(db_obj, field, update_data[field])
db.add(db_obj)
db.commit()
db.refresh(db_obj)
return db_obj
def remove(self, db: Session, *, event_id: UUID, category_id: UUID) -> Optional[EventGiftCategory]:
"""Remove an event-category association"""
obj = self.get(db, event_id=event_id, category_id=category_id)
if obj:
db.delete(obj)
db.commit()
return obj
def get_categories_by_event(
self, db: Session, *, event_id: UUID, skip: int = 0, limit: int = 100,
include_hidden: bool = False
) -> List[GiftCategory]:
"""Get categories for a specific event with filtering options"""
query = db.query(GiftCategory).join(
EventGiftCategory,
GiftCategory.id == EventGiftCategory.category_id
).filter(EventGiftCategory.event_id == event_id)
if not include_hidden:
query = query.filter(EventGiftCategory.is_visible == True)
# Order by display_order then name
query = query.order_by(
asc(EventGiftCategory.display_order),
asc(GiftCategory.name)
)
return query.offset(skip).limit(limit).all()
def get_events_by_category(
self, db: Session, *, category_id: UUID, skip: int = 0, limit: int = 100
) -> List[Event]:
"""Get events for a specific category"""
query = db.query(Event).join(
EventGiftCategory,
Event.id == EventGiftCategory.event_id
).filter(EventGiftCategory.category_id == category_id)
return query.offset(skip).limit(limit).all()
def reorder_categories(
self, db: Session, *, event_id: UUID, category_orders: Dict[UUID, int]
) -> List[EventGiftCategory]:
"""Update display order of multiple categories for an event"""
associations = db.query(EventGiftCategory).filter(
EventGiftCategory.event_id == event_id
).all()
for assoc in associations:
if assoc.category_id in category_orders:
assoc.display_order = category_orders[assoc.category_id]
db.commit()
return associations
class CRUDGiftCategory(CRUDBase[GiftCategory, GiftCategoryCreate, GiftCategoryUpdate]):
def create(self, db: Session, *, obj_in: GiftCategoryCreate) -> GiftCategory:
"""Create a new gift category with appropriate type conversions"""
obj_data = obj_in.model_dump(exclude_unset=True)
# Ensure UUID fields are properly converted if they're strings
for field in ["event_id", "created_by"]:
for field in ["created_by"]:
if field in obj_data and obj_data[field] is not None:
if isinstance(obj_data[field], str):
obj_data[field] = UUID(obj_data[field])
@@ -147,34 +248,6 @@ class CRUDGiftCategory(CRUDBase[GiftCategory, GiftCategoryCreate, GiftCategoryUp
db.refresh(db_obj)
return db_obj
def get_multi_by_event(
self, db: Session, event_id: UUID, skip: int = 0, limit: int = 100,
include_hidden: bool = False
) -> List[GiftCategory]:
"""Get categories for a specific event with filtering options"""
query = db.query(self.model).filter(GiftCategory.event_id == event_id)
if not include_hidden:
query = query.filter(GiftCategory.is_visible == True)
# Order by display_order then name
query = query.order_by(asc(GiftCategory.display_order), asc(GiftCategory.name))
return query.offset(skip).limit(limit).all()
def reorder_categories(
self, db: Session, *, event_id: UUID, category_orders: Dict[UUID, int]
) -> List[GiftCategory]:
"""Update display order of multiple categories at once"""
categories = self.get_multi_by_event(db, event_id, include_hidden=True)
for category in categories:
if category.id in category_orders:
category.display_order = category_orders[category.id]
db.commit()
return categories
def reorder_gifts(
self, db: Session, *, category_id: UUID, gift_orders: Dict[UUID, int]
) -> GiftCategory:
@@ -241,4 +314,5 @@ class CRUDGiftPurchase(CRUDBase[GiftPurchase, GiftPurchaseCreate, GiftPurchaseUp
# Create CRUD instances
gift_item_crud = CRUDGiftItem(GiftItem)
gift_category_crud = CRUDGiftCategory(GiftCategory)
gift_purchase_crud = CRUDGiftPurchase(GiftPurchase)
gift_purchase_crud = CRUDGiftPurchase(GiftPurchase)
event_gift_category_crud = CRUDEventGiftCategory()