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 various . views . generic
from personalni . views import obalkyView
from . models import Soustredeni , Soustredeni_Ucastnici
from various . models import Nastaveni
class SoustredeniListView ( generic . ListView ) :
model = Soustredeni
template_name = ' soustredeni/seznam_soustredeni.html '
def get_queryset ( self ) :
if not self . request . user . je_org :
return super ( ) . get_queryset ( )
return (
super ( ) . get_queryset ( )
. prefetch_related (
" ucastnici " , " ucastnici__osoba " ,
" organizatori " , " organizatori__osoba " ,
" galerie_set " ,
)
. select_related ( " rocnik " )
)
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 (
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 ) :
return Soustredeni_Ucastnici . objects . filter (
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. """
template_name = ' soustredeni/maily_ucastniku.txt '
class SoustredeniUcastniciView ( SoustredeniUcastniciBaseView ) :
""" HTML tabulka účastníků pro tisk. """
template_name = ' soustredeni/seznam_ucastniku.html '
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 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
class SoustredeniStvrzenkyView (
various . views . generic . TeXResponseMixin ,
SoustredeniUcastniciBaseView ,
) :
template_name = ' soustredeni/stvrzenky.tex '
dalsi_potrebne_soubory = [ find ( ' soustredeni/logomm.pdf ' ) ]
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řů :-) "
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
template_name = ' soustredeni/export_do_abstraktu.html '
pk_url_kwarg = ' soustredeni ' # v url bude <int:soustredeni> místo defaultně požadovaného <int:pk>