Big refactor of gift categories model
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user