diff --git a/vergabe_teilnahme/apps/ausschreibungen/forms.py b/vergabe_teilnahme/apps/ausschreibungen/forms.py index f5f73f7..b9a95da 100644 --- a/vergabe_teilnahme/apps/ausschreibungen/forms.py +++ b/vergabe_teilnahme/apps/ausschreibungen/forms.py @@ -7,7 +7,7 @@ class AusschreibungForm(forms.ModelForm): class Meta: model = Ausschreibung fields = [ - 'titel', 'ausschreiber', 'vergabeplattform', 'vergabenummer', 'vergabeart', 'rechtsgrundlage', + 'titel', 'ausschreiber', 'vergabeplattform', 'vergabenummer', 'vergabeart', 'rechtsgrundlage', 'rechtsgrundlage_details', 'fundstelle_url', 'bid_manager', 'leistungsbeschreibung', 'branche', 'schlagwoerter', 'geschaetztes_volumen', 'veroeffentlichungsdatum', 'bieterfragen_bis', 'abgabe_bis', 'bindefrist', 'bindefrist_tage', @@ -21,6 +21,7 @@ class AusschreibungForm(forms.ModelForm): 'vergabenummer': forms.TextInput(attrs={'class': 'form-input'}), 'vergabeart': forms.Select(attrs={'class': 'form-input'}), 'rechtsgrundlage': forms.Select(attrs={'class': 'form-input'}), + 'rechtsgrundlage_details': forms.Textarea(attrs={'class': 'form-input', 'rows': 2, 'placeholder': 'z.B. Verfahrensart, Schwellenwert, Besonderheiten…'}), '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}), diff --git a/vergabe_teilnahme/apps/ausschreibungen/migrations/0006_rechtsgrundlage_details.py b/vergabe_teilnahme/apps/ausschreibungen/migrations/0006_rechtsgrundlage_details.py new file mode 100644 index 0000000..dc556e7 --- /dev/null +++ b/vergabe_teilnahme/apps/ausschreibungen/migrations/0006_rechtsgrundlage_details.py @@ -0,0 +1,18 @@ +# Generated by Django 6.0.5 on 2026-05-13 22:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ausschreibungen', '0005_bindefrist_tage'), + ] + + operations = [ + migrations.AddField( + model_name='ausschreibung', + name='rechtsgrundlage_details', + field=models.TextField(blank=True), + ), + ] diff --git a/vergabe_teilnahme/apps/ausschreibungen/models.py b/vergabe_teilnahme/apps/ausschreibungen/models.py index aaab1e4..7040618 100644 --- a/vergabe_teilnahme/apps/ausschreibungen/models.py +++ b/vergabe_teilnahme/apps/ausschreibungen/models.py @@ -49,6 +49,7 @@ class Ausschreibung(FlexibleModel): vergabenummer = models.CharField(max_length=100, blank=True) vergabeart = models.CharField(max_length=30, choices=VERGABEART_CHOICES, blank=True) rechtsgrundlage = models.CharField(max_length=20, choices=RECHTSGRUNDLAGE_CHOICES, blank=True) + rechtsgrundlage_details = models.TextField(blank=True) status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, default=1) teilnahmeentscheidung = models.CharField( max_length=20, choices=TEILNAHME_CHOICES, default='offen' diff --git a/vergabe_teilnahme/apps/ausschreibungen/views.py b/vergabe_teilnahme/apps/ausschreibungen/views.py index 064d3cd..28e2f85 100644 --- a/vergabe_teilnahme/apps/ausschreibungen/views.py +++ b/vergabe_teilnahme/apps/ausschreibungen/views.py @@ -108,13 +108,25 @@ def ausschreibung_neu(request): def ausschreibung_detail(request, pk): + from django.db.models import Count, Q + from vergabe_teilnahme.apps.aufgaben.models import Aufgabe from vergabe_teilnahme.apps.core.services import aufgaben_score, build_phase_nav, get_deadline_warnings + from vergabe_teilnahme.apps.lose.models import Los a = get_object_or_404(Ausschreibung, pk=pk) + lose = Los.objects.filter(ausschreibung=a).annotate( + aufgaben_total=Count('aufgaben', distinct=True), + aufgaben_erledigt=Count( + 'aufgaben', + filter=Q(aufgaben__status__in=['erledigt', 'verworfen']), + distinct=True, + ), + ).order_by('losnummer') ctx = { 'ausschreibung': a, 'ausschreibung_id': pk, + 'lose': lose, 'phases': build_phase_nav(a), 'warnungen': get_deadline_warnings(a), 'aufgaben_score': aufgaben_score(Aufgabe.objects.filter(ausschreibung=a)), diff --git a/vergabe_teilnahme/apps/lose/views.py b/vergabe_teilnahme/apps/lose/views.py index 925afcf..64cb308 100644 --- a/vergabe_teilnahme/apps/lose/views.py +++ b/vergabe_teilnahme/apps/lose/views.py @@ -54,6 +54,12 @@ def los_neu(request, ausschreibung_id): return redirect('ausschreibungen:lose:liste', ausschreibung_id=ausschreibung_id) else: form = LosForm(ausschreibung=ausschreibung) + + if _is_htmx(request): + return render(request, 'lose/partials/los_form_inline.html', { + 'form': form, + 'ausschreibung': ausschreibung, + }) return render(request, 'lose/form.html', { 'form': form, 'ausschreibung': ausschreibung, diff --git a/vergabe_teilnahme/templates/ausschreibungen/detail.html b/vergabe_teilnahme/templates/ausschreibungen/detail.html index d8d995d..910e95b 100644 --- a/vergabe_teilnahme/templates/ausschreibungen/detail.html +++ b/vergabe_teilnahme/templates/ausschreibungen/detail.html @@ -100,6 +100,41 @@ {% endif %} + +
| Nr. | +Titel | +Aufgaben | +Teilnahme | ++ |
|---|
Noch keine Lose angelegt.
+ {% endif %} +