from django import forms from django.contrib.auth import get_user_model, password_validation from django.core.exceptions import ValidationError from .models import Claim, Project User = get_user_model() class ClaimantForm(forms.Form): full_name = forms.CharField(max_length=255, label="Namn") email = forms.EmailField(label="E-post") account_number = forms.CharField(max_length=50, label="Kontonummer") class ClaimLineForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if not self.is_bound: self.fields["currency"].initial = Claim.Currency.SEK self.fields["project"].queryset = Project.objects.filter(is_active=True).order_by("name") self.fields["project"].required = False class Meta: model = Claim fields = ["description", "amount", "currency", "project", "receipt"] labels = { "description": "Beskrivning", "amount": "Belopp", "currency": "Valuta", "project": "Evenemang/Projekt", "receipt": "Kvitto", } widgets = { "description": forms.Textarea(attrs={"rows": 3}), } class ClaimDecisionForm(forms.Form): ACTION_APPROVE = "approve" ACTION_REJECT = "reject" ACTION_CHOICES = ( (ACTION_APPROVE, "Godkänn"), (ACTION_REJECT, "Neka"), ) claim_id = forms.IntegerField(widget=forms.HiddenInput) action = forms.ChoiceField(choices=ACTION_CHOICES) decision_note = forms.CharField( required=False, widget=forms.Textarea(attrs={"rows": 2, "placeholder": "Kommentar"}), ) def clean(self): cleaned = super().clean() action = cleaned.get("action") note = cleaned.get("decision_note", "").strip() if action == self.ACTION_REJECT and not note: self.add_error("decision_note", "Kommentar krävs när du nekar ett utlägg.") return cleaned class UserManagementForm(forms.Form): username = forms.CharField(max_length=150, label="Användarnamn") email = forms.EmailField(required=False, label="E-post") first_name = forms.CharField(max_length=150, required=False, label="Förnamn") last_name = forms.CharField(max_length=150, required=False, label="Efternamn") password1 = forms.CharField(widget=forms.PasswordInput, label="Lösenord") password2 = forms.CharField(widget=forms.PasswordInput, label="Bekräfta lösenord") is_staff = forms.BooleanField(required=False, initial=True, label="Administratör (staff)") grant_view = forms.BooleanField(required=False, initial=True, label="Ge behörighet att se utlägg") grant_change = forms.BooleanField(required=False, initial=True, label="Ge behörighet att besluta utlägg") def clean_username(self): username = self.cleaned_data["username"] if User.objects.filter(username=username).exists(): raise forms.ValidationError("Användarnamnet är upptaget.") return username def clean(self): cleaned = super().clean() if cleaned.get("password1") != cleaned.get("password2"): self.add_error("password2", "Lösenorden matchar inte.") password = cleaned.get("password1") if password: temp_user = User( username=cleaned.get("username", ""), email=cleaned.get("email", ""), first_name=cleaned.get("first_name", ""), last_name=cleaned.get("last_name", ""), ) try: password_validation.validate_password(password, temp_user) except ValidationError as exc: self.add_error("password1", exc) return cleaned class UserPermissionForm(forms.Form): user_id = forms.IntegerField(widget=forms.HiddenInput) is_staff = forms.BooleanField(required=False, label="Admin/staff") grant_view = forms.BooleanField(required=False, label="Får se utlägg") grant_change = forms.BooleanField(required=False, label="Får besluta utlägg") class DeleteUserForm(forms.Form): user_id = forms.IntegerField(widget=forms.HiddenInput)