Files
vergabe-teilnahme/vergabe_teilnahme/apps/dokumente/forms.py
2026-05-08 18:33:04 +02:00

83 lines
3.2 KiB
Python

import os
from django import forms
from django.conf import settings
from vergabe_teilnahme.apps.lose.models import Los
from .models import ALLOWED_EXTENSIONS, Dokument
class DokumentForm(forms.ModelForm):
class Meta:
model = Dokument
fields = ['datei', 'kategorie', 'version', 'quelle', 'verantwortlicher', 'pruefer', 'los', 'beschreibung']
widgets = {
'datei': forms.FileInput(attrs={'class': 'form-input'}),
'kategorie': forms.Select(attrs={'class': 'form-input'}),
'version': forms.TextInput(attrs={'class': 'form-input'}),
'quelle': forms.TextInput(attrs={'class': 'form-input'}),
'verantwortlicher': forms.Select(attrs={'class': 'form-input'}),
'pruefer': forms.Select(attrs={'class': 'form-input'}),
'los': forms.Select(attrs={'class': 'form-input'}),
'beschreibung': forms.Textarea(attrs={'class': 'form-input', 'rows': 3}),
}
def __init__(self, *args, ausschreibung=None, **kwargs):
super().__init__(*args, **kwargs)
if ausschreibung is not None:
self.fields['los'].queryset = Los.objects.filter(ausschreibung=ausschreibung)
self.fields['quelle'].required = False
self.fields['verantwortlicher'].required = False
self.fields['pruefer'].required = False
self.fields['los'].required = False
self.fields['beschreibung'].required = False
def clean_datei(self):
datei = self.cleaned_data.get('datei')
if datei:
ext = os.path.splitext(datei.name)[1].lower()
if ext not in ALLOWED_EXTENSIONS:
raise forms.ValidationError(
f'Dateityp "{ext}" nicht erlaubt. Erlaubt: {", ".join(sorted(ALLOWED_EXTENSIONS))}'
)
max_size = getattr(settings, 'MAX_UPLOAD_SIZE', 52428800)
if hasattr(datei, 'size') and datei.size > max_size:
raise forms.ValidationError(
f'Datei zu groß. Maximum: {max_size // 1024 // 1024} MB'
)
return datei
class DokumentVersionForm(forms.ModelForm):
class Meta:
model = Dokument
fields = ['datei', 'version']
widgets = {
'datei': forms.FileInput(attrs={'class': 'form-input'}),
'version': forms.TextInput(attrs={'class': 'form-input'}),
}
def clean_datei(self):
datei = self.cleaned_data.get('datei')
if datei:
ext = os.path.splitext(datei.name)[1].lower()
if ext not in ALLOWED_EXTENSIONS:
raise forms.ValidationError(
f'Dateityp "{ext}" nicht erlaubt. Erlaubt: {", ".join(sorted(ALLOWED_EXTENSIONS))}'
)
max_size = getattr(settings, 'MAX_UPLOAD_SIZE', 52428800)
if hasattr(datei, 'size') and datei.size > max_size:
raise forms.ValidationError(
f'Datei zu groß. Maximum: {max_size // 1024 // 1024} MB'
)
return datei
def naechste_version(alte_version: str) -> str:
try:
major = int(alte_version.split('.')[0])
return f'{major + 1}.0'
except (ValueError, IndexError):
return '2.0'