feat(place): final end time + destruction wave
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
from events.models import Event
|
||||
from events.scoping import EventScopedManager
|
||||
@@ -47,13 +48,22 @@ class PlaceSettings(models.Model):
|
||||
)
|
||||
width = models.PositiveSmallIntegerField(default=DEFAULT_GRID_WIDTH)
|
||||
height = models.PositiveSmallIntegerField(default=DEFAULT_GRID_HEIGHT)
|
||||
# Freezes the board without taking the game down: clients can still
|
||||
# connect and watch, but every placement is rejected.
|
||||
placement_enabled = models.BooleanField(default=True)
|
||||
# Past this, the game is over without taking it down: every placement
|
||||
# is rejected and the board is shown wiped (see tasks.py). Only visual -
|
||||
# the PixelPlacement history and the Redis canvas are kept as-is, so
|
||||
# admin stats/heatmaps still see the final board. Empty = no end.
|
||||
placement_ends_at = models.DateTimeField(null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return f"PlaceSettings({self.event}, size={self.width}x{self.height})"
|
||||
|
||||
@property
|
||||
def placement_ended(self) -> bool:
|
||||
return (
|
||||
self.placement_ends_at is not None
|
||||
and self.placement_ends_at <= timezone.now()
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def current(cls, event: Event) -> "PlaceSettings":
|
||||
obj, _ = cls.objects.get_or_create(event=event)
|
||||
|
||||
Reference in New Issue
Block a user