- Fristen-Widget-Format: DateInput/DateTimeInput mit ISO-Format-Attribut, damit Browser date/datetime-local korrekt vorausfüllen (Feedback #4) - Phase 2 Teilnahmeentscheidung: URL in build_phase_nav von /teilnahmeentscheidung/ → /entscheidung/ korrigiert (Feedback #6) - Phase 3 Detaillierte Durchsicht: URL in build_phase_nav von /anforderungen/ → /lose/anforderungen/ korrigiert (Feedback #7) - Phase 7 Abgabe: order_by('bezeichnung') → order_by('beschreibung') in abgabe_views.py (Dokument hat kein Feld 'bezeichnung') (Feedback #8) - Ausschreibungen-Liste: Ausschreiber zuerst, Titel zweite Spalte, neues geschätztes Volumen (Feedback #5) - Feedback-Backlog Leerstand: bereits durch vorherigen URL-Fix abgedeckt (Feedback #1) - Rechtsgrundlage (VgV/UVgO/VOB/A/SektVO/GWB) als neues Formularfeld incl. Migration (Feedback #2) - Bindefrist in Tagen + berechnetes Enddatum als Modell-Property bindefrist_berechnet, Formular und Detailansicht erweitert (Feedback #3) 68/68 Tests grün. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
42 lines
2.6 KiB
Python
42 lines
2.6 KiB
Python
from django import forms
|
|
|
|
from .models import Ausschreibung
|
|
|
|
|
|
class AusschreibungForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Ausschreibung
|
|
fields = [
|
|
'titel', 'ausschreiber', 'vergabeplattform', 'vergabenummer', 'vergabeart', 'rechtsgrundlage',
|
|
'fundstelle_url', 'bid_manager', 'leistungsbeschreibung',
|
|
'branche', 'schlagwoerter', 'geschaetztes_volumen',
|
|
'veroeffentlichungsdatum', 'bieterfragen_bis', 'abgabe_bis', 'bindefrist', 'bindefrist_tage',
|
|
'unterlagen_erhalten', 'unterlagen_erhalten_am',
|
|
'teilnahmeentscheidung', 'entscheidungsbegruendung',
|
|
]
|
|
widgets = {
|
|
'titel': forms.TextInput(attrs={'class': 'form-input', 'autofocus': True}),
|
|
'ausschreiber': forms.TextInput(attrs={'class': 'form-input'}),
|
|
'vergabeplattform': forms.TextInput(attrs={'class': 'form-input'}),
|
|
'vergabenummer': forms.TextInput(attrs={'class': 'form-input'}),
|
|
'vergabeart': forms.Select(attrs={'class': 'form-input'}),
|
|
'rechtsgrundlage': forms.Select(attrs={'class': 'form-input'}),
|
|
'fundstelle_url': forms.URLInput(attrs={'class': 'form-input'}),
|
|
'bid_manager': forms.Select(attrs={'class': 'form-input'}),
|
|
'leistungsbeschreibung': forms.Textarea(attrs={'class': 'form-input', 'rows': 4}),
|
|
'branche': forms.TextInput(attrs={'class': 'form-input'}),
|
|
'schlagwoerter': forms.TextInput(attrs={'class': 'form-input'}),
|
|
'geschaetztes_volumen': forms.NumberInput(attrs={'class': 'form-input'}),
|
|
'veroeffentlichungsdatum': forms.DateInput(attrs={'class': 'form-input', 'type': 'date'}, format='%Y-%m-%d'),
|
|
'bieterfragen_bis': forms.DateInput(attrs={'class': 'form-input', 'type': 'date'}, format='%Y-%m-%d'),
|
|
'abgabe_bis': forms.DateTimeInput(attrs={'class': 'form-input', 'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M'),
|
|
'bindefrist': forms.DateInput(attrs={'class': 'form-input', 'type': 'date'}, format='%Y-%m-%d'),
|
|
'bindefrist_tage': forms.NumberInput(attrs={'class': 'form-input', 'min': '1', 'placeholder': 'Tage'}),
|
|
'unterlagen_erhalten_am': forms.DateInput(attrs={'class': 'form-input', 'type': 'date'}, format='%Y-%m-%d'),
|
|
'teilnahmeentscheidung': forms.Select(attrs={'class': 'form-input'}),
|
|
'entscheidungsbegruendung': forms.Textarea(attrs={'class': 'form-input', 'rows': 3}),
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.fields['teilnahmeentscheidung'].required = False
|