mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-30 23:39:54 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			204 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
 | |
| # SPDX-License-Identifier: GPL-3.0-or-later
 | |
| 
 | |
| from bootstrap_datepicker_plus.widgets import DatePickerInput
 | |
| from django import forms
 | |
| from django.contrib.auth.models import User
 | |
| from django.db.models import Q
 | |
| from django.forms import CheckboxSelectMultiple, RadioSelect
 | |
| from django.utils.translation import gettext_lazy as _
 | |
| from note.models import NoteSpecial, NoteUser
 | |
| from note_kfet.inputs import AmountInput, Autocomplete, ColorWidget
 | |
| 
 | |
| from ..models import WEIClub, WEIRegistration, Bus, BusTeam, WEIMembership, WEIRole
 | |
| 
 | |
| 
 | |
| class WEIForm(forms.ModelForm):
 | |
|     class Meta:
 | |
|         model = WEIClub
 | |
|         exclude = ('parent_club', 'require_memberships', 'membership_duration', )
 | |
|         widgets = {
 | |
|             "membership_fee_paid": AmountInput(),
 | |
|             "membership_fee_unpaid": AmountInput(),
 | |
|             "membership_start": DatePickerInput(),
 | |
|             "membership_end": DatePickerInput(),
 | |
|             "date_start": DatePickerInput(),
 | |
|             "date_end": DatePickerInput(),
 | |
|             "deposit_amount": AmountInput(),
 | |
|             "fee_soge_credit": AmountInput(),
 | |
|         }
 | |
| 
 | |
| 
 | |
| class WEIRegistrationForm(forms.ModelForm):
 | |
|     def clean(self):
 | |
|         cleaned_data = super().clean()
 | |
| 
 | |
|         if 'user' in cleaned_data:
 | |
|             if not NoteUser.objects.filter(user=cleaned_data['user']).exists():
 | |
|                 self.add_error('user', _("The selected user is not validated. Please validate its account first"))
 | |
| 
 | |
|         return cleaned_data
 | |
| 
 | |
|     class Meta:
 | |
|         model = WEIRegistration
 | |
|         fields = [
 | |
|             'user', 'soge_credit', 'birth_date', 'gender', 'clothing_size',
 | |
|             'health_issues', 'emergency_contact_name', 'emergency_contact_phone',
 | |
|             'first_year', 'information_json', 'deposit_given', 'deposit_type'
 | |
|         ]
 | |
|         widgets = {
 | |
|             "user": Autocomplete(
 | |
|                 User,
 | |
|                 attrs={
 | |
|                     'api_url': '/api/user/',
 | |
|                     'name_field': 'username',
 | |
|                     'placeholder': 'Nom ...',
 | |
|                 },
 | |
|             ),
 | |
|             "birth_date": DatePickerInput(options={
 | |
|                 'minDate': '1900-01-01',
 | |
|                 'maxDate': '2100-01-01'
 | |
|             }),
 | |
|             "deposit_given": forms.CheckboxInput(
 | |
|                 attrs={'class': 'form-check-input'},
 | |
|             ),
 | |
|             "deposit_type": forms.RadioSelect(),
 | |
|         }
 | |
| 
 | |
| 
 | |
| class WEIChooseBusForm(forms.Form):
 | |
|     bus = forms.ModelMultipleChoiceField(
 | |
|         queryset=Bus.objects,
 | |
|         label=_("Bus"),
 | |
|         help_text=_("This choice is not definitive. The WEI organizers are free to attribute for you a bus and a team,"
 | |
|                     + " in particular if you are a free eletron."),
 | |
|         widget=CheckboxSelectMultiple(),
 | |
|     )
 | |
| 
 | |
|     team = forms.ModelMultipleChoiceField(
 | |
|         queryset=BusTeam.objects,
 | |
|         label=_("Team"),
 | |
|         required=False,
 | |
|         help_text=_("Leave this field empty if you won't be in a team (staff, bus chief, free electron)"),
 | |
|         widget=CheckboxSelectMultiple(),
 | |
|     )
 | |
| 
 | |
|     roles = forms.ModelMultipleChoiceField(
 | |
|         queryset=WEIRole.objects.filter(~Q(name="1A") & ~Q(name="GC WEI")),
 | |
|         label=_("WEI Roles"),
 | |
|         help_text=_("Select the roles that you are interested in."),
 | |
|         initial=WEIRole.objects.filter(Q(name="Adhérent⋅e WEI") | Q(name="\u00c9lectron libre")).all(),
 | |
|         widget=CheckboxSelectMultiple(),
 | |
|     )
 | |
| 
 | |
| 
 | |
| class WEIMembershipForm(forms.ModelForm):
 | |
|     roles = forms.ModelMultipleChoiceField(
 | |
|         queryset=WEIRole.objects.filter(~Q(name="GC WEI")),
 | |
|         label=_("WEI Roles"),
 | |
|         widget=CheckboxSelectMultiple(),
 | |
|     )
 | |
| 
 | |
|     credit_type = forms.ModelChoiceField(
 | |
|         queryset=NoteSpecial.objects.all(),
 | |
|         label=_("Credit type"),
 | |
|         empty_label=_("No credit"),
 | |
|         required=False,
 | |
|     )
 | |
| 
 | |
|     credit_amount = forms.IntegerField(
 | |
|         label=_("Credit amount"),
 | |
|         widget=AmountInput(),
 | |
|         initial=0,
 | |
|         required=False,
 | |
|     )
 | |
| 
 | |
|     last_name = forms.CharField(
 | |
|         label=_("Last name"),
 | |
|         required=False,
 | |
|     )
 | |
| 
 | |
|     first_name = forms.CharField(
 | |
|         label=_("First name"),
 | |
|         required=False,
 | |
|     )
 | |
| 
 | |
|     bank = forms.CharField(
 | |
|         label=_("Bank"),
 | |
|         required=False,
 | |
|     )
 | |
| 
 | |
|     def __init__(self, *args, wei=None, **kwargs):
 | |
|         super().__init__(*args, **kwargs)
 | |
|         if 'bus' in self.fields:
 | |
|             if wei is not None:
 | |
|                 self.fields['bus'].queryset = Bus.objects.filter(wei=wei)
 | |
|             else:
 | |
|                 self.fields['bus'].queryset = Bus.objects.none()
 | |
|         if 'team' in self.fields:
 | |
|             if wei is not None:
 | |
|                 self.fields['team'].queryset = BusTeam.objects.filter(bus__wei=wei)
 | |
|             else:
 | |
|                 self.fields['team'].queryset = BusTeam.objects.none()
 | |
| 
 | |
|     def clean(self):
 | |
|         cleaned_data = super().clean()
 | |
|         if 'team' in cleaned_data and cleaned_data["team"] is not None \
 | |
|                 and cleaned_data["team"].bus != cleaned_data["bus"]:
 | |
|             self.add_error('bus', _("This team doesn't belong to the given bus."))
 | |
|         return cleaned_data
 | |
| 
 | |
|     class Meta:
 | |
|         model = WEIMembership
 | |
|         fields = ('roles', 'bus', 'team',)
 | |
|         widgets = {
 | |
|             "bus": RadioSelect(),
 | |
|             "team": RadioSelect(),
 | |
|         }
 | |
| 
 | |
| 
 | |
| class WEIMembership1AForm(WEIMembershipForm):
 | |
|     """
 | |
|     Used to confirm registrations of first year members without choosing a bus now.
 | |
|     """
 | |
|     deposit_given = None
 | |
|     roles = None
 | |
| 
 | |
|     def clean(self):
 | |
|         return super(forms.ModelForm, self).clean()
 | |
| 
 | |
|     class Meta:
 | |
|         model = WEIMembership
 | |
|         fields = ('credit_type', 'credit_amount', 'last_name', 'first_name', 'bank',)
 | |
| 
 | |
| 
 | |
| class BusForm(forms.ModelForm):
 | |
|     class Meta:
 | |
|         model = Bus
 | |
|         fields = '__all__'
 | |
|         widgets = {
 | |
|             "wei": Autocomplete(
 | |
|                 WEIClub,
 | |
|                 attrs={
 | |
|                     'api_url': '/api/wei/club/',
 | |
|                     'placeholder': 'WEI ...',
 | |
|                 },
 | |
|             ),
 | |
|         }
 | |
| 
 | |
| 
 | |
| class BusTeamForm(forms.ModelForm):
 | |
|     class Meta:
 | |
|         model = BusTeam
 | |
|         fields = '__all__'
 | |
|         widgets = {
 | |
|             "bus": Autocomplete(
 | |
|                 Bus,
 | |
|                 attrs={
 | |
|                     'api_url': '/api/wei/bus/',
 | |
|                     'placeholder': 'Bus ...',
 | |
|                 },
 | |
|             ),
 | |
|             "color": ColorWidget(),
 | |
|         }
 |