import http 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 various.views.pomocne import formularOKView from various.models import Nastaveni from prednasky.models import Prednaska, Hlasovani, Seznam, STAV_NAVRH from soustredeni.models import Soustredeni from personalni.models import Osoba def newPrednaska(request): # hlasovani se vztahuje k nejnovejsimu soustredeni sous = Nastaveni.get_solo().aktualni_sous seznam = Seznam.objects.filter(soustredeni = sous, stav = STAV_NAVRH).first() if sous is None or seznam is None: return render(request, 'universal.html', { 'title': "Nelze hlasovat", 'text': "Není žádný seznam přednášek, o kterém by se dalo hlasovat.", }, status=http.HTTPStatus.NOT_FOUND) 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 formularOKView(request, "Děkujeme za vyplnění hlasování o přednáškách a těšíme se na soustředění.") 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__osoba__user__first_name', 'org__osoba__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" )