Common enemy rework
This commit is contained in:
@@ -4,7 +4,7 @@ from sqlalchemy.orm import selectinload
|
||||
from sqlalchemy.orm.attributes import flag_modified
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models import Event, EventType, Marathon, Challenge, Difficulty
|
||||
from app.models import Event, EventType, Marathon, Challenge, Difficulty, Participant, Assignment, AssignmentStatus
|
||||
from app.schemas.event import EventEffects, EVENT_INFO, COMMON_ENEMY_BONUSES
|
||||
|
||||
|
||||
@@ -76,6 +76,12 @@ class EventService:
|
||||
data=data if data else None,
|
||||
)
|
||||
db.add(event)
|
||||
await db.flush() # Get event.id before committing
|
||||
|
||||
# Auto-assign challenge to all participants for Common Enemy
|
||||
if event_type == EventType.COMMON_ENEMY.value and challenge_id:
|
||||
await self._assign_common_enemy_to_all(db, marathon_id, event.id, challenge_id)
|
||||
|
||||
await db.commit()
|
||||
await db.refresh(event)
|
||||
|
||||
@@ -85,14 +91,58 @@ class EventService:
|
||||
|
||||
return event
|
||||
|
||||
async def _assign_common_enemy_to_all(
|
||||
self,
|
||||
db: AsyncSession,
|
||||
marathon_id: int,
|
||||
event_id: int,
|
||||
challenge_id: int,
|
||||
) -> None:
|
||||
"""Create event assignments for all participants in the marathon"""
|
||||
# Get all participants
|
||||
result = await db.execute(
|
||||
select(Participant).where(Participant.marathon_id == marathon_id)
|
||||
)
|
||||
participants = result.scalars().all()
|
||||
|
||||
# Create event assignment for each participant
|
||||
for participant in participants:
|
||||
assignment = Assignment(
|
||||
participant_id=participant.id,
|
||||
challenge_id=challenge_id,
|
||||
status=AssignmentStatus.ACTIVE.value,
|
||||
event_type=EventType.COMMON_ENEMY.value,
|
||||
is_event_assignment=True,
|
||||
event_id=event_id,
|
||||
)
|
||||
db.add(assignment)
|
||||
|
||||
async def end_event(self, db: AsyncSession, event_id: int) -> None:
|
||||
"""End an event"""
|
||||
"""End an event and mark incomplete event assignments as expired"""
|
||||
from sqlalchemy import update
|
||||
|
||||
result = await db.execute(select(Event).where(Event.id == event_id))
|
||||
event = result.scalar_one_or_none()
|
||||
if event:
|
||||
event.is_active = False
|
||||
if not event.end_time:
|
||||
event.end_time = datetime.utcnow()
|
||||
|
||||
# Mark all incomplete event assignments for this event as dropped
|
||||
if event.type == EventType.COMMON_ENEMY.value:
|
||||
await db.execute(
|
||||
update(Assignment)
|
||||
.where(
|
||||
Assignment.event_id == event_id,
|
||||
Assignment.is_event_assignment == True,
|
||||
Assignment.status == AssignmentStatus.ACTIVE.value,
|
||||
)
|
||||
.values(
|
||||
status=AssignmentStatus.DROPPED.value,
|
||||
completed_at=datetime.utcnow(),
|
||||
)
|
||||
)
|
||||
|
||||
await db.commit()
|
||||
|
||||
async def consume_jackpot(self, db: AsyncSession, event_id: int) -> None:
|
||||
|
||||
Reference in New Issue
Block a user