import os from itertools import groupby from django.contrib.contenttypes.models import ContentType from django.shortcuts import get_object_or_404, redirect, render from vergabe_teilnahme.apps.ausschreibungen.models import Ausschreibung from vergabe_teilnahme.apps.bibliothek.models import Nachweis from vergabe_teilnahme.apps.core.models import Freigabe from .forms import DokumentForm, DokumentVersionForm, naechste_version from .models import Dokument STATUS_WORKFLOW = [ 'entwurf', 'in_pruefung', 'freigegeben', 'final_abgegeben', ] def _get_ausschreibung(ausschreibung_id): return get_object_or_404(Ausschreibung, pk=ausschreibung_id) def dokumente_liste(request, ausschreibung_id): ausschreibung = _get_ausschreibung(ausschreibung_id) qs = Dokument.objects.filter(ausschreibung=ausschreibung).select_related('verantwortlicher', 'pruefer', 'los') status_filter = request.GET.get('status', '') kategorie_filter = request.GET.get('kategorie', '') verantwortlicher_filter = request.GET.get('verantwortlicher', '') if status_filter: qs = qs.filter(status=status_filter) if kategorie_filter: qs = qs.filter(kategorie=kategorie_filter) if verantwortlicher_filter: qs = qs.filter(verantwortlicher_id=verantwortlicher_filter) grouped = {} for dok in qs: grouped.setdefault(dok.get_kategorie_display(), []).append(dok) return render(request, 'dokumente/liste.html', { 'ausschreibung': ausschreibung, 'grouped_dokumente': grouped, 'status_choices': Dokument.STATUS_CHOICES, 'kategorie_choices': Dokument.KATEGORIE_CHOICES, 'current_status': status_filter, 'current_kategorie': kategorie_filter, }) def dokument_upload(request, ausschreibung_id): ausschreibung = _get_ausschreibung(ausschreibung_id) if request.method == 'POST': form = DokumentForm(request.POST, request.FILES, ausschreibung=ausschreibung) if form.is_valid(): dok = form.save(commit=False) dok.ausschreibung = ausschreibung if dok.datei: dok.dateiname = os.path.basename(dok.datei.name) dok.save() return redirect('ausschreibungen:dokumente:liste', ausschreibung_id=ausschreibung_id) else: form = DokumentForm(ausschreibung=ausschreibung) return render(request, 'dokumente/form.html', { 'ausschreibung': ausschreibung, 'form': form, 'titel': 'Dokument hochladen', }) def dokument_detail(request, ausschreibung_id, pk): ausschreibung = _get_ausschreibung(ausschreibung_id) dok = get_object_or_404(Dokument, pk=pk, ausschreibung=ausschreibung) ct = ContentType.objects.get_for_model(Dokument) freigaben = Freigabe.objects.filter(content_type=ct, object_id=dok.pk) versionen = Dokument.objects.filter( ausschreibung=ausschreibung, kategorie=dok.kategorie, dateiname=dok.dateiname, ).order_by('version') return render(request, 'dokumente/detail.html', { 'ausschreibung': ausschreibung, 'dokument': dok, 'freigaben': freigaben, 'versionen': versionen, }) def dokument_neue_version(request, ausschreibung_id, pk): ausschreibung = _get_ausschreibung(ausschreibung_id) altes_dokument = get_object_or_404(Dokument, pk=pk, ausschreibung=ausschreibung) initial_version = naechste_version(altes_dokument.version) if request.method == 'POST': form = DokumentVersionForm(request.POST, request.FILES) if form.is_valid(): neues_dok = form.save(commit=False) neues_dok.ausschreibung = altes_dokument.ausschreibung neues_dok.los = altes_dokument.los neues_dok.kategorie = altes_dokument.kategorie neues_dok.verantwortlicher = altes_dokument.verantwortlicher if neues_dok.datei: neues_dok.dateiname = os.path.basename(neues_dok.datei.name) neues_dok.save() altes_dokument.status = 'ersetzt' altes_dokument.save(update_fields=['status']) return redirect('ausschreibungen:dokumente:detail', ausschreibung_id=ausschreibung_id, pk=neues_dok.pk) else: form = DokumentVersionForm(initial={'version': initial_version}) return render(request, 'dokumente/neue_version.html', { 'ausschreibung': ausschreibung, 'form': form, 'dokument': altes_dokument, }) def dokument_status(request, ausschreibung_id, pk): ausschreibung = _get_ausschreibung(ausschreibung_id) dok = get_object_or_404(Dokument, pk=pk, ausschreibung=ausschreibung) if request.method == 'POST' and dok.status != 'final_abgegeben': neuer_status = request.POST.get('status', '') valid = [s for s, _ in Dokument.STATUS_CHOICES if s not in ('ersetzt', 'archiviert')] if neuer_status in valid: dok.status = neuer_status if neuer_status == 'final_abgegeben': dok.finale_abgabeversion = True dok.save(update_fields=['status', 'finale_abgabeversion']) return render(request, 'dokumente/partials/status_widget.html', { 'ausschreibung': ausschreibung, 'dokument': dok, }) def dokument_finale_version(request, ausschreibung_id, pk): ausschreibung = _get_ausschreibung(ausschreibung_id) dok = get_object_or_404(Dokument, pk=pk, ausschreibung=ausschreibung) if request.method == 'POST': dok.finale_abgabeversion = True dok.status = 'final_abgegeben' dok.save(update_fields=['finale_abgabeversion', 'status']) return render(request, 'dokumente/partials/finaler_status_badge.html', { 'dokument': dok, }) def dokument_bibliothek_zuordnen(request, ausschreibung_id, pk): ausschreibung = _get_ausschreibung(ausschreibung_id) dok = get_object_or_404(Dokument, pk=pk, ausschreibung=ausschreibung) q = request.GET.get('q', '').strip() nachweise = [] if q: nachweise = Nachweis.objects.filter(titel__icontains=q) if request.method == 'POST': nachweis_id = request.POST.get('nachweis_id') nachweis = get_object_or_404(Nachweis, pk=nachweis_id) dok.bibliothek_nachweis = nachweis dok.quelle = f'Bibliothek: {nachweis.titel}' dok.dateiname = nachweis.titel dok.save(update_fields=['bibliothek_nachweis', 'quelle', 'dateiname']) return redirect('ausschreibungen:dokumente:detail', ausschreibung_id=ausschreibung_id, pk=dok.pk) return render(request, 'dokumente/bibliothek_modal.html', { 'ausschreibung': ausschreibung, 'dokument': dok, 'nachweise': nachweise, 'q': q, })