shiftregister/shiftregister/team/forms.py

85 lines
2.6 KiB
Python

from django import forms
from django.db.models import Case, Count, ExpressionWrapper, F, When
from django.db.models.fields import DateTimeField, IntegerField
from django.utils import timezone
from .models import Helper, ShiftRegistration
# placeholder form for simple submit button use cases so we get csrf protection
class EmptyForm(forms.Form):
pass
class NameField(forms.ModelChoiceField):
def label_from_instance(self, user):
return f"{user.name} ({(str(user.phone))[-3:]})"
class HelperShift(forms.Form):
helper = NameField(label="Helfi", queryset=Helper.objects.order_by("name"))
HELPER_FILTERS = {
"all": {"label": "Alle Helfis", "query": lambda base_query: base_query},
"checked_in": {
"label": "Helfis mit mindestens einem Check-in",
"query": lambda base_query: base_query.annotate(
shift_count=Count(
Case(
When(
shiftregistration__state__in=[
ShiftRegistration.RegState.CHECKED_IN,
],
then=1,
),
output_field=IntegerField(),
)
)
)
.filter(shift_count__gte=1)
.distinct(),
},
"current": {
"label": "Aktuell aktive Helfis",
"query": lambda base_query: base_query.annotate(
shift_end=ExpressionWrapper(
F("shiftregistration__shift__start_at")
+ F("shiftregistration__shift__duration"),
output_field=DateTimeField(),
)
)
.filter(
shiftregistration__shift__start_at__lte=timezone.now(),
shiftregistration__state=ShiftRegistration.RegState.CHECKED_IN,
shift_end__gte=timezone.now(),
)
.distinct(),
},
"no_shifts": {
"label": "Helfis ohne Schichtanmeldungen",
"query": lambda base_query: base_query.annotate(
reg_count=Count("shiftregistration")
).filter(reg_count=0),
},
}
class BulkMessage(forms.Form):
message = forms.CharField(
label="Nachricht", widget=forms.Textarea(attrs={"class": "textarea"})
)
helper_filter = forms.ChoiceField(
label="Empfänger auswählen",
choices=[(k, v["label"]) for k, v in HELPER_FILTERS.items()],
initial="all",
widget=forms.Select(attrs={"class": "select"}),
)
class HelperMessage(forms.Form):
message = forms.CharField(
max_length=160,
widget=forms.Textarea(attrs={"class": "textarea", "placeholder": "Nachricht"}),
)