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
from django . http import Http404
from django . core . exceptions import PermissionDenied
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>
# Kontaktníčky
def soustredeniKontaktnicekPdfView ( request , soustredeni ) :
return soustredeniKontaktnicekView ( request , soustredeni , " pdf " )
def soustredeniKontaktnicekVcfView ( request , soustredeni ) :
return soustredeniKontaktnicekView ( request , soustredeni , " vcf " )
def soustredeniKontaktnicekView ( request , soustredeni , typ ) :
soustredeni = get_object_or_404 ( Soustredeni , id = soustredeni )
# nebyl jsi tam, nebo nejsi org
if ( not request . user in [ u . osoba . user for u in soustredeni . ucastnici . all ( ) ] ) and not request . user . je_org :
raise PermissionDenied ( )
kontaktnicky = {
' pdf ' : ( soustredeni . kontaktnicek_pdf , ' applcation/pdf ' , ' rb ' ) ,
' vcf ' : ( soustredeni . kontaktnicek_vcf , ' text/vcard ' , ' rb ' ) ,
}
try :
field , mime , otevreni = kontaktnicky [ typ ]
except KeyError as e :
raise ValueError ( " Neznámý typ kontaktníčku " ) from e
# není k dispozici
if not field :
raise Http404 ( )
with open ( field . path , otevreni ) as kontaktnicek :
response = HttpResponse ( kontaktnicek . read ( ) , content_type = mime )
response [ ' Content-Disposition ' ] = ' attachment; filename= " kontaktnicek. {} " ' . format ( typ )
return response