la-chariotte/la_chariotte/order/forms.py

157 lines
5.1 KiB
Python

import datetime
from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.auth import get_user_model
from django.forms.utils import to_current_timezone
from django.utils import timezone
from la_chariotte.order.models import GroupedOrder, Item, Place
class GroupedOrderForm(forms.ModelForm):
deadline_date = forms.DateField(
label="Date limite de commande",
widget=forms.DateInput(attrs={"type": "date"}, format=("%Y-%m-%d")),
)
deadline_time = forms.TimeField(
label="Heure limite de commande",
widget=forms.TimeInput(attrs={"type": "time"}),
initial=datetime.time(hour=23, minute=59, second=59),
)
is_phone_mandatory = forms.BooleanField(
label="Numéro de téléphone obligatoire pour les participants",
required=False,
)
places = forms.ModelMultipleChoiceField(
label="Lieux de distribution",
# TODO: filter own places
queryset=Place.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=False,
)
class Meta:
model = GroupedOrder
fields = [
"name",
"deadline_date",
"deadline_time",
"delivery_date",
"delivery_slot",
"places",
"description",
"is_phone_mandatory",
]
widgets = {
"name": forms.TextInput(
attrs={"placeholder": "ex : Des oranges pour Noël"}
),
"delivery_date": forms.DateInput(
attrs={"type": "date"},
format=("%Y-%m-%d"),
),
"delivery_slot": forms.TextInput(
attrs={"placeholder": "14h - 17h (facultatif)"}
),
"description": forms.Textarea(
attrs={
"placeholder": "Plus d'infos sur la commande groupée ? (facultatif)"
}
),
}
def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user")
super().__init__(*args, **kwargs)
# When updating an existing order, reuse existing values
if kwargs["instance"]:
self.instance.deadline = to_current_timezone(self.instance.deadline)
self.initial["deadline_date"] = self.instance.deadline.date()
self.initial["deadline_time"] = self.instance.deadline.time()
def save(self, commit=True):
self.instance.orga = get_user_model().objects.get(id=self.user.pk)
return super().save(commit=commit)
def clean(self):
cleaned_data = self.cleaned_data
self.instance.deadline = timezone.make_aware(
datetime.datetime.combine(
self.cleaned_data["deadline_date"],
self.cleaned_data["deadline_time"],
)
)
return cleaned_data
class ItemCreateForm(forms.ModelForm):
class Meta:
model = Item
fields = ["name", "price", "max_limit"]
def __init__(self, *args, **kwargs):
self.grouped_order = kwargs.pop("grouped_order")
super().__init__(*args, **kwargs)
def save(self, commit=True):
self.instance.grouped_order = GroupedOrder.objects.get(id=self.grouped_order.pk)
return super().save(commit=commit)
class JoinGroupedOrderForm(forms.Form):
order_code = forms.CharField(
label="Code pour rejoindre la commande", max_length=6, required=False
)
place_code = forms.CharField(
label="Code pour rejoindre le lieu", max_length=20, required=False
)
def clean_place_code(self):
form_place_code = self.cleaned_data["place_code"]
if form_place_code and not Place.objects.filter(code=form_place_code).exists():
raise forms.ValidationError(
"Désolé, nous ne trouvons aucun lieu avec ce code"
)
return form_place_code
def clean_order_code(self):
form_order_code = self.cleaned_data["order_code"]
if (
form_order_code
and not GroupedOrder.objects.filter(code=form_order_code).exists()
):
raise forms.ValidationError(
"Désolé, nous ne trouvons aucune commande avec ce code"
)
return form_order_code
class PlaceForm(forms.ModelForm):
class Meta:
model = Place
fields = [
"name",
"description",
"code",
]
widgets = {
"name": forms.TextInput(
attrs={"placeholder": "ex : Centre social Kropotkine"}
),
"description": forms.Textarea(
attrs={"placeholder": "Plus d'infos sur le lieu ? (facultatif)"}
),
"code": forms.TextInput(
attrs={"placeholder": "Identifiant unique du lieu (raccourci)"}
),
}
def __init__(self, *args, **kwargs):
self.user = kwargs.pop("user")
super().__init__(*args, **kwargs)
def save(self, commit=True):
self.instance.orga = get_user_model().objects.get(id=self.user.pk)
return super().save(commit=commit)