Skip to content
Snippets Groups Projects
forms.py 5.21 KiB
Newer Older
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
# SPDX-License-Identifier: GPL-3.0-or-later
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

ynerant's avatar
ynerant committed
from django import forms
from django.contrib.auth.forms import AuthenticationForm
Pierre-antoine Comby's avatar
Pierre-antoine Comby committed
from django.contrib.auth.models import User
ynerant's avatar
ynerant committed
from django.forms import CheckboxSelectMultiple
from django.utils.translation import gettext_lazy as _
from note.models import NoteSpecial, Alias
from note_kfet.inputs import Autocomplete, AmountInput, DatePickerInput
ynerant's avatar
ynerant committed
from permission.models import PermissionMask, Role
ynerant's avatar
ynerant committed

ynerant's avatar
ynerant committed
from .models import Profile, Club, Membership
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

ynerant's avatar
ynerant committed
class CustomAuthenticationForm(AuthenticationForm):
    permission_mask = forms.ModelChoiceField(
        label="Masque de permissions",
        queryset=PermissionMask.objects.order_by("rank"),
        empty_label=None,
    )


class UserForm(forms.ModelForm):
    def _get_validation_exclusions(self):
        # Django usernames can only contain letters, numbers, @, ., +, - and _.
        # We want to allow users to have uncommon and unpractical usernames:
        # That is their problem, and we have normalized aliases for us.
        return super()._get_validation_exclusions() + ["username"]

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'username', 'email',)


Pierre-antoine Comby's avatar
Pierre-antoine Comby committed
class ProfileForm(forms.ModelForm):
    A form for the extras field provided by the :model:`member.Profile` model.
ynerant's avatar
ynerant committed
    report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency"))

    last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date"))
ynerant's avatar
ynerant committed

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['address'].widget.attrs.update({"placeholder": "4 avenue des Sciences, 91190 GIF-SUR-YVETTE"})

    def save(self, commit=True):
        if not self.instance.section or (("department" in self.changed_data
                                         or "promotion" in self.changed_data) and "section" not in self.changed_data):
            self.instance.section = self.instance.section_generated
        return super().save(commit)

Pierre-antoine Comby's avatar
Pierre-antoine Comby committed
    class Meta:
        model = Profile
        fields = '__all__'
        exclude = ('user', 'email_confirmed', 'registration_valid', )
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed

class ClubForm(forms.ModelForm):
    def clean(self):
        cleaned_data = super().clean()

        if not self.instance.pk:    # Creating a club
            if Alias.objects.filter(normalized_name=Alias.normalize(self.cleaned_data["name"])).exists():
                self.add_error('name', _("An alias with a similar name already exists."))

        return cleaned_data

    class Meta:
        model = Club
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
        fields = '__all__'
        widgets = {
            "membership_fee_paid": AmountInput(),
            "membership_fee_unpaid": AmountInput(),
            "parent_club": Autocomplete(
                Club,
                attrs={
                    'api_url': '/api/members/club/',
                }
            ),
            "membership_start": DatePickerInput(),
            "membership_end": DatePickerInput(),
class MembershipForm(forms.ModelForm):
    soge = forms.BooleanField(
        label=_("Inscription paid by Société Générale"),
        required=False,
        help_text=_("Check this case is the Société Générale paid the inscription."),
    )

    credit_type = forms.ModelChoiceField(
        queryset=NoteSpecial.objects,
        label=_("Credit type"),
        empty_label=_("No credit"),
        required=False,
        help_text=_("You can credit the note of the user."),
    )

    credit_amount = forms.IntegerField(
        label=_("Credit amount"),
        required=False,
        initial=0,
        widget=AmountInput(),
    )

    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,
    )

    class Meta:
        model = Membership
ynerant's avatar
ynerant committed
        # Le champ d'utilisateur est remplacé par un champ d'auto-complétion.
        # Quand des lettres sont tapées, une requête est envoyée sur l'API d'auto-complétion
        # et récupère les noms d'utilisateur valides
ynerant's avatar
ynerant committed
        widgets = {
me5na7qbjqbrp's avatar
me5na7qbjqbrp committed
            'user':
ynerant's avatar
ynerant committed
                    attrs={
                        'api_url': '/api/user/',
                        'name_field': 'username',
                        'placeholder': 'Nom ...',
ynerant's avatar
ynerant committed
                    },
                ),
            'date_start': DatePickerInput(),
ynerant's avatar
ynerant committed
        }
class MembershipRolesForm(forms.ModelForm):
    user = forms.ModelChoiceField(
        queryset=User.objects,
        label=_("User"),
        disabled=True,
        widget=Autocomplete(
ynerant's avatar
ynerant committed
            User,
            attrs={
                'api_url': '/api/user/',
                'name_field': 'username',
                'placeholder': 'Nom ...',
            },
        ),
    )

    roles = forms.ModelMultipleChoiceField(
        queryset=Role.objects.filter(weirole=None).all(),
        label=_("Roles"),
ynerant's avatar
ynerant committed
        widget=CheckboxSelectMultiple(),
ynerant's avatar
ynerant committed
        fields = ('user', 'roles')