108 lines
4.1 KiB
Python
108 lines
4.1 KiB
Python
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)
|