2022-04-12 00:18:51 +02:00
|
|
|
from django.db import models
|
2022-04-12 16:09:17 +02:00
|
|
|
import secrets
|
|
|
|
from django.shortcuts import reverse
|
2022-04-12 20:00:19 +02:00
|
|
|
from datetime import timedelta
|
|
|
|
from django.utils import timezone
|
2022-04-20 18:39:33 +02:00
|
|
|
from django.db.models import F, Count, Q, ExpressionWrapper
|
2022-04-12 00:18:51 +02:00
|
|
|
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
class Room(models.Model):
|
|
|
|
name = models.CharField(max_length=200, primary_key=True)
|
|
|
|
required_helpers = models.IntegerField()
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
class Shift(models.Model):
|
|
|
|
room = models.ForeignKey(Room, on_delete=models.RESTRICT)
|
|
|
|
start_at = models.DateTimeField()
|
|
|
|
duration = models.DurationField()
|
|
|
|
# todo: add helper amount override field
|
|
|
|
def __str__(self):
|
|
|
|
return f"{self.room.name}: {self.start_at}"
|
2022-04-20 17:33:15 +02:00
|
|
|
def has_ended(self):
|
|
|
|
return (self.start_at + self.duration) < timezone.now()
|
2022-04-20 18:39:33 +02:00
|
|
|
def is_running(self):
|
|
|
|
return (self.start_at <=timezone.now()) and (not self.has_ended())
|
2022-04-12 14:41:01 +02:00
|
|
|
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
class Helper(models.Model):
|
|
|
|
# todo: add propper phone number validation, maybe even country code?
|
|
|
|
phone = models.CharField(max_length=200, primary_key=True)
|
|
|
|
name = models.CharField(max_length=200)
|
|
|
|
# change this to a generic state variable to allow for number blocking/account deactivation?
|
|
|
|
number_validated = models.BooleanField(default=False)
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 17:04:47 +02:00
|
|
|
def send_confirmation(self):
|
|
|
|
(token, created) = LoginToken.objects.get_or_create(helper=self)
|
|
|
|
text = f"Hallo {self.name}, hier ist dein Registrierungslink zum Kontaktfestival http://short.url{token.get_absolute_url()}"
|
|
|
|
msg = Message(to=self, text=text)
|
|
|
|
msg.save()
|
|
|
|
return token
|
2022-04-20 18:39:33 +02:00
|
|
|
|
|
|
|
# current or next shift
|
|
|
|
def important_shift(self):
|
|
|
|
ret = ShiftRegistration.objects.annotate(
|
|
|
|
shift_end=ExpressionWrapper(
|
|
|
|
F("shift__start_at") + F("shift__duration"),
|
|
|
|
output_field=models.DateTimeField(),
|
|
|
|
)).filter(helper=self, shift_end__gte=timezone.now()).order_by("shift__start_at").first()
|
|
|
|
if ret:
|
|
|
|
return ret.shift
|
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
class ShiftRegistration(models.Model):
|
|
|
|
class Meta:
|
2022-04-15 16:20:13 +02:00
|
|
|
unique_together = (("shift", "helper"),)
|
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
# use restrict for now as Model.delete is not called
|
|
|
|
shift = models.ForeignKey(Shift, on_delete=models.RESTRICT)
|
|
|
|
helper = models.ForeignKey(Helper, on_delete=models.CASCADE)
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 20:00:19 +02:00
|
|
|
def can_cancel(self):
|
2022-04-15 16:20:13 +02:00
|
|
|
return self.shift.start_at > (timezone.now() + timedelta(hours=4))
|
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
|
|
|
|
class Message(models.Model):
|
|
|
|
# remove limit and send long messages in multiple messages?
|
|
|
|
text = models.CharField(max_length=160)
|
|
|
|
to = models.ForeignKey(Helper, on_delete=models.CASCADE)
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
def __str__(self):
|
2022-04-12 17:04:47 +02:00
|
|
|
return f"{self.to.name}: {self.text}"
|
2022-04-12 14:41:01 +02:00
|
|
|
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
def gen_token():
|
|
|
|
return secrets.token_urlsafe(20)
|
|
|
|
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 14:41:01 +02:00
|
|
|
class LoginToken(models.Model):
|
2022-04-15 16:20:13 +02:00
|
|
|
id = models.CharField(
|
|
|
|
max_length=20, primary_key=True, default=gen_token, editable=False
|
|
|
|
)
|
2022-04-12 16:09:17 +02:00
|
|
|
helper = models.ForeignKey(Helper, on_delete=models.CASCADE)
|
2022-04-15 16:20:13 +02:00
|
|
|
|
2022-04-12 16:09:17 +02:00
|
|
|
def get_absolute_url(self):
|
2022-04-15 16:20:13 +02:00
|
|
|
return reverse("token_login", kwargs={"token": self.id})
|