generated from coulomb/repo-seed
170 lines
6.6 KiB
Python
170 lines
6.6 KiB
Python
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,
|
|
})
|