1
0
mirror of https://gitlab.crans.org/bde/nk20 synced 2024-11-27 02:43:01 +00:00
nk20/apps/activity/forms.py

88 lines
3.1 KiB
Python
Raw Normal View History

2020-03-27 00:31:54 +00:00
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
2020-08-06 12:11:55 +00:00
from datetime import timedelta
2020-03-27 00:31:54 +00:00
from django import forms
2020-03-27 17:02:22 +00:00
from django.contrib.contenttypes.models import ContentType
2020-08-06 12:11:55 +00:00
from django.utils import timezone
2020-04-19 23:26:53 +00:00
from django.utils.translation import gettext_lazy as _
from member.models import Club
from note.models import Note, NoteUser
from note_kfet.inputs import Autocomplete, DateTimePickerInput
2020-03-27 00:31:54 +00:00
2020-03-27 17:02:22 +00:00
from .models import Activity, Guest
2020-03-27 00:31:54 +00:00
class ActivityForm(forms.ModelForm):
class Meta:
model = Activity
exclude = ('creater', 'valid', 'open', )
widgets = {
"organizer": Autocomplete(
model=Club,
attrs={"api_url": "/api/members/club/"},
),
"note": Autocomplete(
2020-03-27 21:48:20 +00:00
model=Note,
attrs={
"api_url": "/api/note/note/",
'placeholder': 'Note de l\'événement sur laquelle envoyer les crédits d\'invitation ...'
},
),
"attendees_club": Autocomplete(
model=Club,
attrs={"api_url": "/api/members/club/"},
),
"date_start": DateTimePickerInput(),
"date_end": DateTimePickerInput(),
}
2020-03-27 17:02:22 +00:00
class GuestForm(forms.ModelForm):
def clean(self):
cleaned_data = super().clean()
2020-08-06 15:41:30 +00:00
if timezone.now() > timezone.localtime(self.activity.date_start):
self.add_error("inviter", _("You can't invite someone once the activity is started."))
if not self.activity.valid:
self.add_error("inviter", _("This activity is not validated yet."))
one_year = timedelta(days=365)
qs = Guest.objects.filter(
2020-08-06 15:41:30 +00:00
first_name__iexact=cleaned_data["first_name"],
last_name__iexact=cleaned_data["last_name"],
activity__date_start__gte=self.activity.date_start - one_year,
2020-08-06 15:41:30 +00:00
entry__isnull=False,
)
2020-08-06 15:41:30 +00:00
if qs.count() >= 5:
self.add_error("last_name", _("This person has been already invited 5 times this year."))
qs = qs.filter(activity=self.activity)
if qs.exists():
self.add_error("last_name", _("This person is already invited."))
2020-08-06 15:41:30 +00:00
if "inviter" in cleaned_data:
if Guest.objects.filter(inviter=cleaned_data["inviter"], activity=self.activity).count() >= 3:
self.add_error("inviter", _("You can't invite more than 3 people to this activity."))
return cleaned_data
2020-03-27 17:02:22 +00:00
class Meta:
model = Guest
fields = ('last_name', 'first_name', 'inviter', )
widgets = {
"inviter": Autocomplete(
2020-03-27 17:02:22 +00:00
NoteUser,
attrs={
'api_url': '/api/note/note/',
# We don't evaluate the content type at launch because the DB might be not initialized
'api_url_suffix':
2020-03-27 21:48:20 +00:00
lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteUser).pk),
2020-03-27 17:02:22 +00:00
'placeholder': 'Note ...',
},
),
}