from django.shortcuts import render, get_object_or_404 from django.views import generic from django.shortcuts import HttpResponseRedirect from django.core.exceptions import ObjectDoesNotExist from django.db.models import Sum from django.forms import Form from prednasky.models import Prednaska, Hlasovani, Seznam, STAV_NAVRH from seminar.models import Soustredeni, Osoba def newPrednaska(request): # hlasovani se vztahuje k nejnovejsimu soustredeni sous = Soustredeni.objects.first() seznam = Seznam.objects.filter(soustredeni = sous, stav = STAV_NAVRH).first() osoba = Osoba.objects.filter(user=request.user).first() ucastnik = osoba.plne_jmeno() + ' ' + str(osoba.id) # obsluha formulare if request.method == 'POST': form = Form(request.POST, request.FILES) if form.is_valid(): # id z důvodu duplicitních jmen (přechod z jména na objekt Osoby nějak kape na tom, # že všechna předchozí hlasování zde mají náhodný string…) # TODO Změnit to na Osobu # TODO v následujících řádcích je zbytečně mnoho dotazů na QuerySet (pokud účastník hlasoval, hlasoval u všech) for i in request.POST: if i[0] == 'q': prednaska = Prednaska.objects.filter(pk=int(i[1:]))[0] hlasovani = Hlasovani.objects.filter(ucastnik=ucastnik, prednaska=prednaska).first() if not hlasovani: hlasovani = Hlasovani() hlasovani.prednaska = prednaska hlasovani.ucastnik = ucastnik hlasovani.seznam = seznam hlasovani.body = int(request.POST[i]) hlasovani.save() # presmerovani na prave vzniklou galerii return HttpResponseRedirect('./hotovo') def prednaska_hodnoceni(prednaska): h = Hlasovani.objects.filter(ucastnik=ucastnik, prednaska=prednaska).first() if h: return prednaska, h.body else: return prednaska, 0 return render( request, 'prednasky/base.html', {'prednasky': map(prednaska_hodnoceni, seznam.prednaska_set.all())} ) def Prednaska_hotovo(request): return render(request, 'prednasky/hotovo.html') class MetaSeznamListView(generic.ListView): model = Seznam template_name = 'prednasky/metaseznam_prednasek.html' class SeznamListView(generic.ListView): template_name = 'prednasky/seznam_prednasek.html' def get_queryset(self): self.seznam = get_object_or_404(Seznam, id=self.kwargs["seznam"]) prednasky = Prednaska.objects.filter(seznamy=self.seznam).order_by( 'org__user__first_name', 'org__user__last_name' ) return prednasky # FIXME nahradit anotaci s filtrem po prechodu na Django 2.2 def get_context_data(self,**kwargs): context = super(SeznamListView, self).get_context_data(**kwargs) # hlasovani se vztahuje k nejnovejsimu soustredeni sous = Soustredeni.objects.first() seznam = Seznam.objects.filter(soustredeni = sous, stav = STAV_NAVRH).first() for obj in self.object_list: hlasovani_set = obj.hlasovani_set.filter(seznam=seznam).only('body') obj.body = sum(map(lambda x: x.body,hlasovani_set)) return context def SeznamExportView(request, seznam): """Vypíše výsledky hlasování ve formátu pro prologovský optimalizátor""" # TODO zřejmě se nepoužívá, časem vyřadit? nahradit tabulkou vhodnější pro # lidi? hlasovani = Hlasovani.objects.filter(seznam=seznam) prednasky = Prednaska.objects.filter(seznamy=seznam) orgove = set(p.org for p in prednasky) ucastnici = set(h.ucastnik for h in hlasovani) for p in prednasky: p.body = [] for u in ucastnici: try: p.body.append(hlasovani.get(ucastnik=u, prednaska=p).body) except ObjectDoesNotExist: # účastník nehlasoval p.body.append("?") for h in hlasovani: h.ucastnik = hash(h.ucastnik) return render( request, 'prednasky/seznam_prednasek_export.txt', {"hlasovani": hlasovani, "prednasky": prednasky, "orgove": orgove}, content_type="text/plain" )