Web M&M
https://mam.matfyz.cz
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.5 KiB
149 lines
4.5 KiB
# -*- coding: utf-8 -*-
|
|
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"
|
|
)
|
|
|
|
def exportSeznamuPrednasekNeHodnoceni(req, seznam):
|
|
# UGLY CODE. Jen byla potřeba pro garanta přednášek tabulka, tak vznikla :-P
|
|
|
|
seznam = get_object_or_404(Seznam, id=seznam)
|
|
|
|
from django.http import HttpResponse
|
|
|
|
# Kód jsem zkopíroval přímo z tutoriálu
|
|
# https://docs.djangoproject.com/en/4.0/howto/outputting-csv/
|
|
# Jo, je to špatná verze djanga. whatever.
|
|
response = HttpResponse(
|
|
content_type='text/csv',
|
|
headers={'Content-Disposition': 'attachment; filename="seznam.csv"'},
|
|
)
|
|
|
|
writer = csv.writer(response)
|
|
|
|
attrs = (
|
|
'id',
|
|
'org',
|
|
'nazev',
|
|
'anotace',
|
|
'klicova',
|
|
'obor',
|
|
'obtiznost',
|
|
'popis',
|
|
)
|
|
for predn in Prednaska.objects.filter(seznamy=seznam):
|
|
row = [getattr(predn, attr) for attr in attrs]
|
|
writer.writerow(row)
|
|
|
|
return response
|
|
|
|
|