2024-08-02 23:36:12 +02:00
from django . shortcuts import get_object_or_404
2021-10-08 18:58:00 +02:00
from django . http import HttpResponse
from django . views import generic
2022-11-14 23:16:24 +01:00
from django . contrib . staticfiles . finders import find
2024-11-12 18:37:21 +01:00
from django . http import Http404
2024-11-12 20:15:09 +01:00
from django . core . exceptions import PermissionDenied
2024-08-02 19:01:50 +02:00
2021-10-08 18:58:00 +02:00
import csv
2024-08-04 17:51:26 +02:00
import various . views . generic
2024-10-24 11:51:28 +02:00
from personalni . views import obalkyView
2021-10-08 18:58:00 +02:00
2024-08-02 19:01:50 +02:00
from . models import Soustredeni , Soustredeni_Ucastnici
from various . models import Nastaveni
2021-10-08 18:58:00 +02:00
class SoustredeniListView ( generic . ListView ) :
model = Soustredeni
template_name = ' soustredeni/seznam_soustredeni.html '
2024-01-30 00:02:27 +01:00
def get_queryset ( self ) :
2024-01-30 00:11:13 +01:00
if not self . request . user . je_org :
return super ( ) . get_queryset ( )
2024-01-30 00:02:27 +01:00
return (
2024-08-02 20:32:07 +02:00
super ( ) . get_queryset ( )
2024-01-30 00:02:27 +01:00
. prefetch_related (
" ucastnici " , " ucastnici__osoba " ,
" organizatori " , " organizatori__osoba " ,
2024-01-30 00:11:13 +01:00
" galerie_set " ,
2024-01-30 00:02:27 +01:00
)
. select_related ( " rocnik " )
)
2021-10-08 18:58:00 +02:00
2024-08-02 23:36:12 +02:00
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 )
2021-10-08 18:58:00 +02:00
2024-08-04 17:51:26 +02:00
class SoustredeniUcastniciBaseView (
KonkretniSoustredeniMixin ,
various . views . generic . NeprazdnyListView ,
) :
2024-08-02 23:36:12 +02:00
"""
Slouží jako ListView účastníků soustředění
+ háže inteligentní chybu při soustředění bez účastníků
"""
2021-10-08 18:58:00 +02:00
model = Soustredeni_Ucastnici
2024-08-02 23:36:12 +02:00
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řů :-) "
2021-10-08 18:58:00 +02:00
def get_queryset ( self ) :
return Soustredeni_Ucastnici . objects . filter (
2024-08-02 23:36:12 +02:00
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 ( ) )
2021-10-08 18:58:00 +02:00
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 '
2024-08-02 23:36:12 +02:00
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
2024-08-04 17:51:26 +02:00
class SoustredeniStvrzenkyView (
various . views . generic . TeXResponseMixin ,
SoustredeniUcastniciBaseView ,
) :
2024-08-02 23:36:12 +02:00
template_name = ' soustredeni/stvrzenky.tex '
2024-10-24 11:44:04 +02:00
dalsi_potrebne_soubory = [ find ( ' soustredeni/logomm.pdf ' ) ]
2022-04-01 18:52:12 +02:00
2024-08-02 23:36:12 +02:00
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řů :-) "
2022-11-14 23:16:24 +01:00
2024-08-02 23:36:12 +02:00
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
2022-11-14 23:16:24 +01:00
2024-08-02 23:36:12 +02:00
context [ " castka " ] = Nastaveni . get_solo ( ) . cena_sous
context [ " soustredeni " ] = self . soustredeni
context [ " ucastnici " ] = self . object_list
return context
2024-10-02 21:20:44 +02:00
class SoustredeniAbstraktyView ( generic . DetailView ) :
model = Soustredeni
template_name = ' soustredeni/export_do_abstraktu.html '
2024-10-22 22:11:59 +02:00
pk_url_kwarg = ' soustredeni ' # v url bude <int:soustredeni> místo defaultně požadovaného <int:pk>
2024-11-05 22:47:18 +01:00
2024-11-12 20:15:09 +01:00
# Kontaktníčky
2024-11-05 22:47:18 +01:00
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 )
2024-11-12 20:15:09 +01:00
# 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 ( )
2024-11-05 22:47:18 +01:00
2024-11-12 20:15:09 +01:00
kontaktnicky = {
' pdf ' : ( soustredeni . kontaktnicek_pdf , ' applcation/pdf ' , ' rb ' ) ,
2024-11-12 20:37:50 +01:00
' vcf ' : ( soustredeni . kontaktnicek_vcf , ' text/vcard ' , ' rb ' ) ,
2024-11-12 20:15:09 +01:00
}
try :
field , mime , otevreni = kontaktnicky [ typ ]
except KeyError as e :
raise ValueError ( " Neznámý typ kontaktníčku " ) from e
2024-11-12 20:37:14 +01:00
# není k dispozici
if not field :
raise Http404 ( )
2024-11-12 20:15:09 +01:00
with open ( field . path , otevreni ) as kontaktnicek :
response = HttpResponse ( kontaktnicek . read ( ) , content_type = mime )
response [ ' Content-Disposition ' ] = ' attachment; filename= " kontaktnicek. {} " ' . format ( typ )
return response