Validate uniqueness of invitation codes during guest creation to prevent duplicates. Automatically generate an 8-character code if none is provided, ensuring consistent data handling. Updated tests and schemas to support these changes.
50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
from app.crud.base import CRUDBase
|
|
from app.models.guest import Guest
|
|
from app.schemas.guests import GuestCreate, GuestUpdate
|
|
from sqlalchemy.orm import Session
|
|
from typing import Optional
|
|
from app.models.guest import GuestStatus
|
|
from datetime import datetime, timezone
|
|
import uuid
|
|
|
|
|
|
class CRUDGuest(CRUDBase[Guest, GuestCreate, GuestUpdate]):
|
|
|
|
def create(self, db, obj_in: GuestCreate):
|
|
|
|
if obj_in.invitation_code is None:
|
|
obj_in.invitation_code = str(uuid.uuid4())[:8]
|
|
|
|
db_guest = Guest(
|
|
event_id=uuid.UUID(obj_in.event_id) if isinstance(obj_in.event_id, str) else obj_in.event_id, # explicit casting
|
|
invited_by=uuid.UUID(obj_in.invited_by) if isinstance(obj_in.invited_by, str) else obj_in.invited_by,
|
|
full_name=obj_in.full_name,
|
|
email=obj_in.email,
|
|
invitation_code=obj_in.invitation_code
|
|
)
|
|
db.add(db_guest)
|
|
db.commit()
|
|
db.refresh(db_guest)
|
|
return db_guest
|
|
|
|
|
|
def get_by_invitation_code(self, db: Session, invitation_code: str) -> Optional[Guest]:
|
|
return db.query(Guest).filter(Guest.invitation_code == invitation_code).first()
|
|
|
|
def update_status(self, db: Session, guest_id: uuid.UUID, status: GuestStatus):
|
|
guest = self.get(db, guest_id)
|
|
if guest:
|
|
guest.status = status
|
|
guest.response_date = datetime.now(timezone.utc)
|
|
db.commit()
|
|
db.refresh(guest)
|
|
return guest
|
|
|
|
def remove(self, db: Session, *, guest_id: str) -> Guest:
|
|
guest_id = uuid.UUID(guest_id) if isinstance(guest_id, str) else guest_id
|
|
obj = db.query(self.model).get(guest_id)
|
|
db.delete(obj)
|
|
db.commit()
|
|
return obj
|
|
|
|
guest_crud = CRUDGuest(Guest) |