Sith/counter/forms.py

216 lines
6.2 KiB
Python
Raw Permalink Normal View History

from django import forms
from django.utils.translation import gettext_lazy as _
from phonenumber_field.widgets import RegionalPhoneNumberWidget
2024-10-20 18:55:05 +00:00
from club.widgets.select import AutoCompleteSelectClub
from core.views.forms import NFCTextInput, SelectDate, SelectDateTime
2024-10-20 18:55:05 +00:00
from core.views.widgets.select import (
AutoCompleteSelect,
AutoCompleteSelectMultipleGroup,
AutoCompleteSelectMultipleUser,
AutoCompleteSelectUser,
)
from counter.models import (
BillingInfo,
Counter,
2024-06-24 11:07:36 +00:00
Customer,
Eticket,
2024-06-24 11:07:36 +00:00
Product,
Refilling,
StudentCard,
)
2024-10-20 18:55:05 +00:00
from counter.widgets.select import (
AutoCompleteSelectMultipleCounter,
AutoCompleteSelectMultipleProduct,
AutoCompleteSelectProduct,
)
class BillingInfoForm(forms.ModelForm):
class Meta:
model = BillingInfo
fields = [
"first_name",
"last_name",
"address_1",
"address_2",
"zip_code",
"city",
"country",
2024-09-26 15:55:53 +00:00
"phone_number",
]
widgets = {
"phone_number": RegionalPhoneNumberWidget,
}
class StudentCardForm(forms.ModelForm):
2024-07-12 07:34:16 +00:00
"""Form for adding student cards
Only used for user profile since CounterClick is to complicated.
"""
class Meta:
model = StudentCard
fields = ["uid"]
2024-11-15 14:19:30 +00:00
widgets = {"uid": NFCTextInput}
def clean(self):
2024-06-27 12:46:43 +00:00
cleaned_data = super().clean()
uid = cleaned_data.get("uid", None)
if not uid or not StudentCard.is_valid(uid):
raise forms.ValidationError(_("This UID is invalid"), code="invalid")
return cleaned_data
class GetUserForm(forms.Form):
2024-07-12 07:34:16 +00:00
"""The Form class aims at providing a valid user_id field in its cleaned data, in order to pass it to some view,
reverse function, or any other use.
The Form implements a nice JS widget allowing the user to type a customer account id, or search the database with
some nickname, first name, or last name (TODO)
"""
code = forms.CharField(
label="Code",
max_length=StudentCard.UID_SIZE,
required=False,
widget=NFCTextInput,
)
2024-10-20 18:55:05 +00:00
id = forms.CharField(
label=_("Select user"),
help_text=None,
widget=AutoCompleteSelectUser,
required=False,
)
def as_p(self):
self.fields["code"].widget.attrs["autofocus"] = True
2024-06-27 12:46:43 +00:00
return super().as_p()
def clean(self):
2024-06-27 12:46:43 +00:00
cleaned_data = super().clean()
cus = None
if cleaned_data["code"] != "":
if len(cleaned_data["code"]) == StudentCard.UID_SIZE:
card = (
StudentCard.objects.filter(uid=cleaned_data["code"])
.select_related("customer")
.first()
)
if card is not None:
cus = card.customer
if cus is None:
cus = Customer.objects.filter(
account_id__iexact=cleaned_data["code"]
).first()
elif cleaned_data["id"] is not None:
cus = Customer.objects.filter(user=cleaned_data["id"]).first()
if cus is None or not cus.can_buy:
raise forms.ValidationError(_("User not found"))
cleaned_data["user_id"] = cus.user.id
cleaned_data["user"] = cus.user
return cleaned_data
class NFCCardForm(forms.Form):
student_card_uid = forms.CharField(
max_length=StudentCard.UID_SIZE,
required=False,
widget=NFCTextInput,
)
class RefillForm(forms.ModelForm):
error_css_class = "error"
required_css_class = "required"
amount = forms.FloatField(
min_value=0, widget=forms.NumberInput(attrs={"class": "focus"})
)
class Meta:
model = Refilling
fields = ["amount", "payment_method", "bank"]
class CounterEditForm(forms.ModelForm):
class Meta:
model = Counter
fields = ["sellers", "products"]
2024-10-20 18:55:05 +00:00
widgets = {
"sellers": AutoCompleteSelectMultipleUser,
"products": AutoCompleteSelectMultipleProduct,
}
class ProductEditForm(forms.ModelForm):
class Meta:
model = Product
fields = [
"name",
"description",
"product_type",
"code",
"parent_product",
"buying_groups",
"purchase_price",
"selling_price",
"special_selling_price",
"icon",
"club",
"limit_age",
"tray",
"archived",
]
2024-10-20 18:55:05 +00:00
widgets = {
"parent_product": AutoCompleteSelectMultipleProduct,
"product_type": AutoCompleteSelect,
"buying_groups": AutoCompleteSelectMultipleGroup,
"club": AutoCompleteSelectClub,
}
2024-10-20 18:55:05 +00:00
counters = forms.ModelMultipleChoiceField(
help_text=None,
label=_("Counters"),
required=False,
2024-10-20 18:55:05 +00:00
widget=AutoCompleteSelectMultipleCounter,
queryset=Counter.objects.all(),
)
def __init__(self, *args, **kwargs):
2024-06-27 12:46:43 +00:00
super().__init__(*args, **kwargs)
if self.instance.id:
2024-10-20 18:55:05 +00:00
self.fields["counters"].initial = self.instance.counters.all()
def save(self, *args, **kwargs):
2024-06-27 12:46:43 +00:00
ret = super().save(*args, **kwargs)
if self.fields["counters"].initial:
2024-10-20 18:55:05 +00:00
# Remove the product from all counter it was added to
# It will then only be added to selected counters
for counter in self.fields["counters"].initial:
counter.products.remove(self.instance)
counter.save()
for counter in self.cleaned_data["counters"]:
counter.products.add(self.instance)
counter.save()
return ret
class CashSummaryFormBase(forms.Form):
2024-07-21 14:16:40 +00:00
begin_date = forms.DateTimeField(
label=_("Begin date"), widget=SelectDateTime, required=False
)
end_date = forms.DateTimeField(
label=_("End date"), widget=SelectDateTime, required=False
)
class EticketForm(forms.ModelForm):
class Meta:
model = Eticket
fields = ["product", "banner", "event_title", "event_date"]
2024-10-20 18:55:05 +00:00
widgets = {
"product": AutoCompleteSelectProduct,
"event_date": SelectDate,
}