@ -1,16 +1,12 @@
from django . shortcuts import get_object_or_404 , render
from django . shortcuts import get_object_or_404
from django . http import HttpResponse
from django . views import generic
from django . contrib . staticfiles . finders import find
import csv
import tempfile
import shutil
import subprocess
from pathlib import Path
import http
import personalni . views
import various . views . generic
from personalni . views import obalkyView
from . models import Soustredeni , Soustredeni_Ucastnici
from various . models import Nastaveni
@ -34,73 +30,78 @@ class SoustredeniListView(generic.ListView):
)
def soustredeniObalkyView ( request , soustredeni ) :
soustredeni = get_object_or_404 ( Soustredeni , id = soustredeni )
return personalni . views . obalkyView ( request , soustredeni . ucastnici . all ( ) )
class KonkretniSoustredeniMixin :
""" Přidá k View s parametrem `soustredeni` atribut `self.soustredeni` """
def setup ( self , request , * args , * * kwargs ) :
super ( ) . setup ( request , * args , * * kwargs )
soustredeni_id = self . kwargs [ " soustredeni " ]
self . soustredeni = get_object_or_404 ( Soustredeni , id = soustredeni_id )
class SoustredeniUcastniciBaseView ( generic . ListView ) :
class SoustredeniUcastniciBaseView (
KonkretniSoustredeniMixin ,
various . views . generic . NeprazdnyListView ,
) :
"""
Slouží jako ListView účastníků soustředění
+ háže inteligentní chybu při soustředění bez účastníků
"""
model = Soustredeni_Ucastnici
if_prazdny_title = " K soustředění nejsou přidaní žádní účastníci "
if_prazdny_text = " K tebou zvolenému soustředění nejsou přidaní žádní účastníci, tedy není co zobrazit. Můžeš to zkusit změnit v adminu, případně se zeptej webařů :-) "
def get_queryset ( self ) :
soustredeni = get_object_or_404 (
Soustredeni ,
pk = self . kwargs [ " soustredeni " ]
)
return Soustredeni_Ucastnici . objects . filter (
soustredeni = soustredeni ) . select_related ( ' resitel ' )
soustredeni = self . soustredeni ) . select_related ( ' resitel ' , ' resitel__osoba ' )
# FIXME předělat jako ostatní (vyžaduje předělání `obalkyView`)
def soustredeniObalkyView ( request , soustredeni ) :
soustredeni = get_object_or_404 ( Soustredeni , id = soustredeni )
return obalkyView ( request , soustredeni . ucastnici . all ( ) )
class SoustredeniMailyUcastnikuView ( SoustredeniUcastniciBaseView ) :
""" Seznam e-mailů řešitelů oddělených čárkami. """
model = Soustredeni_Ucastnici
template_name = ' soustredeni/maily_ucastniku.txt '
class SoustredeniUcastniciView ( SoustredeniUcastniciBaseView ) :
""" HTML tabulka účastníků pro tisk. """
model = Soustredeni_Ucastnici
template_name = ' soustredeni/seznam_ucastniku.html '
def soustredeniUcastniciExportView ( request , soustredeni ) :
soustredeni = get_object_or_404 ( Soustredeni , id = soustredeni )
ucastnici = soustredeni . ucastnici . all ( )
class SoustredeniUcastniciExportView ( SoustredeniUcastniciBaseView ) :
""" CSV tabulka účastníků. """
def render ( self , request , * args , * * kwargs ) :
response = HttpResponse ( content_type = ' text/csv ' )
response [ ' Content-Disposition ' ] = ' attachment; filename= " ucastnici.csv " '
writer = csv . writer ( response )
writer . writerow ( [ " jmeno " , " prijmeni " , " rok_maturity " , " telefon " , " email " , " ulice " , " mesto " , " psc " , " stat " ] )
for u in ucastnici :
o = u . osoba
writer . writerow ( [ o . jmeno , o . prijmeni , str ( u . rok_maturity ) , o . telefon , o . email , o . ulice , o . mesto , o . psc , o . stat . name ] )
for u in self . object_list :
o = u . resitel . osoba
writer . writerow ( [ o . jmeno , o . prijmeni , str ( u . resitel . rok_maturity ) , o . telefon , o . email , o . ulice , o . mesto , o . psc , o . stat . name ] )
return response
def soustredeniStvrzenkyView ( request , soustredeni ) :
soustredeni = get_object_or_404 ( Soustredeni , id = soustredeni )
ucastnici = soustredeni . ucastnici . all ( )
if ucastnici . count ( ) == 0 :
return HttpResponse (
render ( request , ' universal.html ' , {
' title ' : ' Není pro koho vyrobit stvrzenky. ' ,
' text ' : ' Právě ses pokusil/a vygenerovat stvrzenky pro prázdnou množinu lidí. Můžeš to zkusit změnit, případně se zeptej webařů :-) ' ,
} ) ,
status = http . HTTPStatus . NOT_FOUND ,
)
castka = Nastaveni . get_solo ( ) . cena_sous
tex = render ( request , ' soustredeni/stvrzenky.tex ' , { ' ucastnici ' : ucastnici , ' soustredeni ' : soustredeni , ' castka ' : castka } ) . content
with tempfile . TemporaryDirectory ( ) as tempdirfn :
tempdir = Path ( tempdirfn )
with open ( tempdir / " stvrzenky.tex " , " w " ) as texfile :
texfile . write ( tex . decode ( ) )
class SoustredeniStvrzenkyView (
various . views . generic . TeXResponseMixin ,
SoustredeniUcastniciBaseView ,
) :
template_name = ' soustredeni/stvrzenky.tex '
dalsi_potrebne_soubory = [ find ( ' soustredeni/logomm.pdf ' ) ]
shutil . copy ( find ( ' soustredeni/logomm.pdf ' ) , tempdir )
subprocess . call ( [ " pdflatex " , " stvrzenky.tex " ] , cwd = tempdir , stdout = subprocess . DEVNULL )
if_prazdny_title = " Není pro koho vyrobit stvrzenky. "
if_prazdny_text = " Právě ses pokusil/a vygenerovat stvrzenky pro prázdnou množinu lidí. Můžeš to zkusit změnit, případně se zeptej webařů :-) "
with open ( tempdir / " stvrzenky.pdf " , " rb " ) as pdffile :
response = HttpResponse ( pdffile . read ( ) , content_type = ' application/pdf ' )
return response
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
context [ " castka " ] = Nastaveni . get_solo ( ) . cena_sous
context [ " soustredeni " ] = self . soustredeni
context [ " ucastnici " ] = self . object_list
return context
class SoustredeniAbstraktyView ( generic . DetailView ) :
model = Soustredeni
Nemám to teď nacachované, ale pročže nepoužijeme generický export řešitelů, který máme už u výsledkovek?
Protože to takhle už bylo (tj. není to předmětem tohodle pullrequestu). Teď bych to nechal a můžem upravit časem.