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'