85 lines
2.6 KiB
Python
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"}),
|
|
)
|