shiftregister/shiftregister/team/forms.py

136 lines
4.3 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),
},
"good_helpers": {
"label": "Zuverlässige Helfis (Check-in ohne Fehlzeiten)",
"query": lambda base_query: base_query.annotate(
checked_in_count=Count(
Case(
When(
shiftregistration__state=ShiftRegistration.RegState.CHECKED_IN,
then=1,
),
output_field=IntegerField(),
)
),
failed_count=Count(
Case(
When(
shiftregistration__state=ShiftRegistration.RegState.FAILED,
then=1,
),
output_field=IntegerField(),
)
),
)
.filter(checked_in_count__gte=1, failed_count=0)
.distinct(),
},
"good_helpers_no_feedback": {
"label": "Zuverlässige Helfis ohne Feedback",
"query": lambda base_query: base_query.annotate(
checked_in_count=Count(
Case(
When(
shiftregistration__state=ShiftRegistration.RegState.CHECKED_IN,
then=1,
),
output_field=IntegerField(),
)
),
failed_count=Count(
Case(
When(
shiftregistration__state=ShiftRegistration.RegState.FAILED,
then=1,
),
output_field=IntegerField(),
)
),
)
.filter(checked_in_count__gte=1, failed_count=0)
.exclude(feedback__isnull=False)
.distinct(),
},
}
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"}),
)