Merge branch 'master' into stable
This commit is contained in:
commit
fdae413a35
21 changed files with 401 additions and 19 deletions
|
@ -8,7 +8,10 @@ FLAKE8="`git rev-parse --show-toplevel`/bin/flake8"
|
|||
|
||||
status=0
|
||||
|
||||
git diff --unified=1 --cached HEAD -- '*py' > $TMPDIFF
|
||||
# select only changed python files which are not migrations
|
||||
changed=`git diff --cached --name-only | grep 'py$' | grep -v 'migrations/[0-9]'`
|
||||
|
||||
git diff --unified=1 --cached HEAD -- $changed > $TMPDIFF
|
||||
|
||||
# only do the check when there are some changes to be commited
|
||||
# otherwise flake8 would hang waiting for input
|
||||
|
|
|
@ -27,7 +27,15 @@ TMPDIFF=`tempfile`
|
|||
|
||||
[ $refname != "refs/heads/master" -a $refname != "refs/heads/stable" ] && exit 0
|
||||
|
||||
git diff --unified=1 $oldrev $newrev -- '*.py' >${TMPDIFF}
|
||||
# select only changed python files which are not migrations
|
||||
changed=`git diff --name-only $oldrev $newrev | grep 'py$' | grep -v 'migrations/[0-9]'`
|
||||
if [ -z $changed ] ; then
|
||||
# Nothing to check. Note the exit is necessary -- we would not pass any
|
||||
# paths to git diff below and it would output the diff unfiltered.
|
||||
exit 0
|
||||
fi
|
||||
|
||||
git diff --unified=1 $oldrev $newrev -- $changed >${TMPDIFF}
|
||||
|
||||
# there is no working tree in bare git repository, so we recreate it for flake8
|
||||
git archive $newrev | tar -x -C ${TMPDIR}
|
||||
|
|
|
@ -12,7 +12,7 @@ class KorekturovanePDFAdmin(VersionAdmin):
|
|||
['pdf', 'cas', 'org', 'stran', 'nazev', 'komentar']}),
|
||||
# (u'PDF', {'fields': ['pdf']}),
|
||||
]
|
||||
list_display = ['nazev', 'cas', 'stran']
|
||||
list_display = ['nazev', 'cas', 'stran', 'org']
|
||||
list_filter = []
|
||||
search_fields = []
|
||||
|
||||
|
|
19
mamweb/static/css/printtable.css
Normal file
19
mamweb/static/css/printtable.css
Normal file
|
@ -0,0 +1,19 @@
|
|||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%
|
||||
}
|
||||
|
||||
table, th, td {
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
td {
|
||||
width: 1%;
|
||||
height: 1cm;
|
||||
}
|
||||
|
||||
|
||||
.fill {
|
||||
width: 100%;
|
||||
max-width: 100%
|
||||
}
|
|
@ -18,6 +18,9 @@ urlpatterns = [
|
|||
|
||||
# Korekturovaci aplikace (ma vlastni podadresare)
|
||||
url(r'^', include('korektury.urls')),
|
||||
|
||||
# Prednaskova aplikace (ma vlastni podadresare)
|
||||
url(r'^', include('prednasky.urls')),
|
||||
|
||||
# Comments (interni i verejne)
|
||||
url(r'^comments_dj/', include('django_comments.urls')),
|
||||
|
|
26
prednasky/templates/prednasky/metaseznam_prednasek.html
Normal file
26
prednasky/templates/prednasky/metaseznam_prednasek.html
Normal file
|
@ -0,0 +1,26 @@
|
|||
{% extends "prednasky/Base.html" %}
|
||||
|
||||
|
||||
{% block header %}hlasovani{% endblock %}
|
||||
|
||||
{% block nadpis1a %}{% block nadpis1b %}
|
||||
Hlasování o přednáškách
|
||||
{% endblock %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{# Projdi vsechny seznamy #}
|
||||
<div class="mam-org-only">
|
||||
<ul>
|
||||
{% for seznam in object_list %}
|
||||
<li>
|
||||
{% if seznam.stav == 1 %} {# STAV_NAHRH = 1 #}
|
||||
<a href="/prednasky/seznam_prednasek/{{seznam.id}}">Návrh přednášek na soustředění {{seznam.soustredeni.misto}} </a>
|
||||
{% else %}
|
||||
<a href="/prednasky/seznam_prednasek/{{seznam.id}}">Seznam přednášek na soustředění {{seznam.soustredeni.misto}} </a>
|
||||
{% endif %}
|
||||
<a href="/prednasky/seznam_prednasek/{{seznam.id}}/export">Export</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
||||
|
21
prednasky/templates/prednasky/seznam_prednasek.html
Normal file
21
prednasky/templates/prednasky/seznam_prednasek.html
Normal file
|
@ -0,0 +1,21 @@
|
|||
{% extends "prednasky/Base.html" %}
|
||||
|
||||
|
||||
{% block header %}seznam_prednasek{% endblock %}
|
||||
|
||||
{% block nadpis1a %}{% block nadpis1b %}
|
||||
Seznam přednášek
|
||||
{% endblock %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="mam-org-only">
|
||||
<ul>
|
||||
{# Projdi vsechny prednasky #}
|
||||
{% for prednaska in object_list %}
|
||||
<li>
|
||||
<strong>{{prednaska.nazev}}</strong> (<i>{{prednaska.obor}},{{prednaska.obtiznost}}</i>) - {{prednaska.org}}
|
||||
</li>
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
||||
|
21
prednasky/templates/prednasky/seznam_prednasek_export.txt
Normal file
21
prednasky/templates/prednasky/seznam_prednasek_export.txt
Normal file
|
@ -0,0 +1,21 @@
|
|||
{% block content %}
|
||||
{% spaceless %}
|
||||
{% for hlas in hlasovani %}
|
||||
hlas({{hlas.ucastnik}},{{hlas.prednaska.id}},{{hlas.body}})
|
||||
{% endfor %}
|
||||
{% for prednaska in prednasky %}
|
||||
prednaska({{prednaska.id}},{{prednaska.org.id}},{{prednaska.obtiznost}},{{prednaska.obor}})
|
||||
{% endfor %}
|
||||
{% for org in orgove %}
|
||||
org({{org.id}},4,0,15)
|
||||
{% endfor %}
|
||||
{% for org in orgove %}
|
||||
{{org.id}};{{org}}
|
||||
{% endfor %}
|
||||
{% for prednaska in prednasky %}
|
||||
{{prednaska.id}};{{prednaska.nazev}};{{prednaska.org.id}}
|
||||
{{prednaska.body}}
|
||||
{% endfor %}
|
||||
{% endspaceless %}
|
||||
{% endblock %}
|
||||
|
15
prednasky/urls.py
Normal file
15
prednasky/urls.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
from django.conf.urls import * # NOQA
|
||||
from django.conf.urls import patterns, url
|
||||
from django.contrib.auth.decorators import user_passes_test
|
||||
from . import views
|
||||
|
||||
staff_member_required = user_passes_test(lambda u: u.is_staff)
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^prednasky/$', views.newPrednaska),
|
||||
url(r'^prednasky/hotovo$', views.Prednaska_hotovo),
|
||||
url(r'^prednasky/metaseznam_prednasek$', staff_member_required(views.MetaSeznamListView.as_view()), name='metaseznam-list'),
|
||||
url(r'^prednasky/seznam_prednasek/(?P<seznam>\d+)/$', staff_member_required(views.SeznamListView.as_view()), name='seznam-list'),
|
||||
url(r'^prednasky/seznam_prednasek/(?P<seznam>\d+)/export$', staff_member_required(views.SeznamExportView), name='seznam-export'),
|
||||
# url(r'^korektury/help/', staff_member_required(views.KorekturyHelpView.as_view()), name='korektury-help'),
|
||||
]
|
|
@ -1,4 +1,5 @@
|
|||
from django.shortcuts import render
|
||||
from django.shortcuts import render,get_object_or_404
|
||||
from django.views import generic
|
||||
from prednasky.forms import NewPrednaskyForm
|
||||
from prednasky.models import Seznam, Hlasovani, Prednaska
|
||||
from django.shortcuts import HttpResponseRedirect
|
||||
|
@ -24,7 +25,7 @@ def newPrednaska(request):
|
|||
hlasovani.prednaska = Prednaska.objects.filter(pk = int(i[1:]))[0]
|
||||
hlasovani.body = int(request.POST[i])
|
||||
hlasovani.ucastnik = jmeno
|
||||
hlasovani.seznam = seznam
|
||||
hlasovani.seznam = seznam
|
||||
hlasovani.save()
|
||||
|
||||
# presmerovani na prave vzniklou galerii
|
||||
|
@ -40,6 +41,36 @@ def newPrednaska(request):
|
|||
|
||||
def Prednaska_hotovo(request):
|
||||
return render(request, 'prednasky/hotovo.html')
|
||||
|
||||
|
||||
# Create your views here.
|
||||
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):
|
||||
print self.kwargs
|
||||
self.seznam = get_object_or_404(Seznam,id=self.kwargs["seznam"])
|
||||
return Prednaska.objects.filter(seznamy = self.seznam)
|
||||
|
||||
|
||||
def SeznamExportView(request,seznam):
|
||||
seznam_obj = Seznam.objects.get(id=seznam)
|
||||
hlasovani = Hlasovani.objects.filter(seznam=seznam)
|
||||
prednasky = Prednaska.objects.filter(seznamy=seznam)
|
||||
orgove = set(map(lambda x:x.org,prednasky))
|
||||
ucastnici = list(set(map(lambda x:x.ucastnik,hlasovani)))
|
||||
|
||||
for p in prednasky:
|
||||
p.body = []
|
||||
for u in ucastnici:
|
||||
p.body.append(hlasovani.get(ucastnik=u,prednaska=p).body)
|
||||
|
||||
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")
|
||||
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ from django.db import models
|
|||
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Novinky, Organizator, Prispevek, Pohadka
|
||||
from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, PrilohaReseni, Nastaveni, Soustredeni, Soustredeni_Ucastnici, Soustredeni_Organizatori, Novinky, Organizator, Prispevek, Pohadka, Konfera
|
||||
from autocomplete_light import shortcuts as autocomplete_light
|
||||
|
||||
|
||||
|
@ -181,6 +181,7 @@ class Soustredeni_UcastniciInline(admin.TabularInline):
|
|||
qs = super(Soustredeni_UcastniciInline, self).get_queryset(request)
|
||||
return qs.select_related('resitel', 'soustredeni')
|
||||
|
||||
|
||||
class Soustredeni_OrganizatoriInline(admin.TabularInline):
|
||||
form = autocomplete_light.modelform_factory(Soustredeni_Organizatori, autocomplete_fields=['organizator'], fields=['organizator'],)
|
||||
model = Soustredeni_Organizatori
|
||||
|
@ -468,6 +469,20 @@ class SoustredeniAdmin(VersionAdmin):
|
|||
|
||||
admin.site.register(Soustredeni, SoustredeniAdmin)
|
||||
|
||||
### Konfery
|
||||
class KonferaAdminForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model=Konfera
|
||||
exclude = []
|
||||
|
||||
class KonferaAdmin(VersionAdmin):
|
||||
form = KonferaAdminForm
|
||||
list_filter = ['soustredeni']
|
||||
list_display = ['nazev','soustredeni','organizator','typ_prezentace']
|
||||
# inlines = [Konfera_UcastniciInline]
|
||||
|
||||
admin.site.register(Konfera,KonferaAdmin)
|
||||
|
||||
### Novinky
|
||||
|
||||
class NovinkyAdminForm(forms.ModelForm):
|
||||
|
|
31
seminar/migrations/0042_auto_20161005_0847.py
Normal file
31
seminar/migrations/0042_auto_20161005_0847.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import seminar.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('seminar', '0041_konfery'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='konfera',
|
||||
name='materialy',
|
||||
field=models.FileField(help_text='Dal\u0161\xed materi\xe1ly ke konfe\u0159e zabalen\xe9 do jednoho souboru', upload_to=seminar.models.generate_filename_konfera, verbose_name='materialy', blank=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='konfera',
|
||||
name='prezentace',
|
||||
field=models.FileField(help_text='Prezentace nebo fotka posteru', upload_to=seminar.models.generate_filename_konfera, verbose_name='prezentace', blank=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='konfera',
|
||||
name='prispevek',
|
||||
field=models.ForeignKey(related_name='konfery', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='seminar.Problem', help_text='\xda\u010dastnick\xfd p\u0159\xedp\u011bvek o konfe\u0159e', null=True, verbose_name='p\u0159\xedsp\u011bvek do \u010d\xedsla'),
|
||||
),
|
||||
]
|
|
@ -859,7 +859,7 @@ class Konfera(models.Model):
|
|||
org_poznamka = models.TextField(u'neveřejná poznámka', blank=True,
|
||||
help_text=u'Neveřejná poznámka ke konfeře(plain text)')
|
||||
prispevek = models.ForeignKey(Problem, verbose_name=u'příspěvek do čísla', related_name='konfery',
|
||||
help_text=u'Účastnický přípěvek o konfeře',on_delete = models.SET_NULL, null=True)
|
||||
help_text=u'Účastnický přípěvek o konfeře',on_delete = models.SET_NULL, null=True, blank=True)
|
||||
TYP_VELETRH = 'veletrh'
|
||||
TYP_PREZENTACE = 'prezentace'
|
||||
TYP_CHOICES = [
|
||||
|
@ -868,9 +868,9 @@ class Konfera(models.Model):
|
|||
]
|
||||
typ_prezentace = models.CharField(u'typ prezentace', max_length=16, choices=TYP_CHOICES, blank=False, default=TYP_VELETRH)
|
||||
prezentace = models.FileField(u'prezentace',help_text = u'Prezentace nebo fotka posteru',
|
||||
upload_to = generate_filename_konfera)
|
||||
upload_to = generate_filename_konfera, blank=True)
|
||||
materialy = models.FileField(u'materialy',help_text = u'Další materiály ke konfeře zabalené do jednoho souboru',
|
||||
upload_to = generate_filename_konfera)
|
||||
upload_to = generate_filename_konfera, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return force_unicode(u"%s: (%s)" % (self.nazev, self.soustredeni))
|
||||
|
|
24
seminar/static/seminar/stvrzenka.sty
Normal file
24
seminar/static/seminar/stvrzenka.sty
Normal file
|
@ -0,0 +1,24 @@
|
|||
\newcommand{\stvrzenka}[6]{
|
||||
\removelastskip\bigskip
|
||||
\newpage
|
||||
|
||||
\noindent\textbf{Dodavatel:}\hfill\textbf{Stvrzenka č. {\Large #1}}
|
||||
|
||||
{Univerzita Karlova \\
|
||||
\indent Matematicko-fyzikální fakulta \\
|
||||
\indent OVVP, M\&M \\
|
||||
\indent Ke Karlovu 3, 120 00 Praha 2 \\
|
||||
\indent IČ: 00216208 DIČ: CZ00216208}
|
||||
|
||||
\parindent=0pt
|
||||
\parskip=0.2in
|
||||
|
||||
\textbf{Celkem Kč:} 700,- \\
|
||||
\textbf{Slovy:} sedmset korun českých
|
||||
|
||||
\textbf{Přijato od (firma, jméno, adresa):} #2 #3, #4, #5 #6
|
||||
|
||||
\textbf{Účel platby:} příspěvek na stravování
|
||||
|
||||
ze dne \datum \hfill Přijal:\hspace{3cm}
|
||||
}
|
13
seminar/static/seminar/stvrzenky.tex
Normal file
13
seminar/static/seminar/stvrzenky.tex
Normal file
|
@ -0,0 +1,13 @@
|
|||
\documentclass[12pt,a4paper]{article}
|
||||
\usepackage[czech]{babel}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[margin=1in]{geometry}
|
||||
|
||||
\usepackage{stvrzenka}
|
||||
|
||||
\pagestyle{empty}
|
||||
\begin{document}
|
||||
|
||||
\input{ucastnici}
|
||||
|
||||
\end{document}
|
|
@ -46,7 +46,11 @@
|
|||
{% if user.is_staff %}
|
||||
<div class="mam-org-only">
|
||||
<a href="../{{soustredeni.pk}}/fotogalerie/0/new/">Vytvořit novou fotogalerii</a><br>
|
||||
<a href="../{{soustredeni.pk}}/obalky.pdf">Vygenerovat obálky pro účastníky</a>
|
||||
<a href="../{{soustredeni.pk}}/obalky.pdf">Vygenerovat obálky pro účastníky</a><br>
|
||||
Seznam účastníků -
|
||||
<a href="../{{soustredeni.pk}}/seznam_ucastniku">HTML tabulka pro tisk</a>,
|
||||
<a href="../{{soustredeni.pk}}/export_ucastniku">CSV</a><br>
|
||||
<a href="../{{soustredeni.pk}}/stvrzenky/42">Stvrzenky <i>(42 v URL nahraďte prvním číslem z rozsahu)</i></a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
|
39
seminar/templates/seminar/soustredeni/seznam_ucastniku.html
Normal file
39
seminar/templates/seminar/soustredeni/seznam_ucastniku.html
Normal file
|
@ -0,0 +1,39 @@
|
|||
{% load static %}
|
||||
<html lang='cs'>
|
||||
<head>
|
||||
<title>Seznam účastníků</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" type="text/css" href="{% static 'css/printtable.css' %}" />
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>
|
||||
{% with object_list|first as afirst %}
|
||||
{{afirst.soustredeni.misto}}
|
||||
{% endwith %}
|
||||
- účastníci
|
||||
</h1>
|
||||
<table>
|
||||
<tr>
|
||||
<th nowrap>Jméno</th>
|
||||
<th nowrap>Maturita</th>
|
||||
<th nowrap>Mobil</th>
|
||||
<th class="fill"></th>
|
||||
</tr>
|
||||
{% for sous_ucast in object_list %}
|
||||
<tr>
|
||||
<td nowrap>{{sous_ucast.resitel}}</td>
|
||||
<td nowrap>{{sous_ucast.resitel.rok_maturity}}</td>
|
||||
<td nowrap>{{sous_ucast.resitel.telefon}}</td>
|
||||
<td class="fill"></td>
|
||||
|
||||
</tr>
|
||||
|
||||
{% empty %}
|
||||
Žádní účastníci nebyli...
|
||||
{% endfor %}
|
||||
</table>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
|
5
seminar/templates/seminar/soustredeni/ucastnici.tex
Normal file
5
seminar/templates/seminar/soustredeni/ucastnici.tex
Normal file
|
@ -0,0 +1,5 @@
|
|||
{% load tex %}
|
||||
\newcommand{\datum}{{datum|date:"j. n. Y"|sloz}}
|
||||
{% for u in ucastnici %}
|
||||
\stvrzenka{{u.cislo_stvrzenky|sloz}}{{u.jmeno|sloz}}{{u.prijmeni|sloz}}{{u.ulice|sloz}}{{u.psc|sloz}}{{u.mesto|sloz}}
|
||||
{% endfor %}
|
61
seminar/unicodecsv.py
Normal file
61
seminar/unicodecsv.py
Normal file
|
@ -0,0 +1,61 @@
|
|||
import csv, codecs, cStringIO
|
||||
|
||||
class UTF8Recoder:
|
||||
"""
|
||||
Iterator that reads an encoded stream and reencodes the input to UTF-8
|
||||
"""
|
||||
def __init__(self, f, encoding):
|
||||
self.reader = codecs.getreader(encoding)(f)
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
def next(self):
|
||||
return self.reader.next().encode("utf-8")
|
||||
|
||||
class UnicodeReader:
|
||||
"""
|
||||
A CSV reader which will iterate over lines in the CSV file "f",
|
||||
which is encoded in the given encoding.
|
||||
"""
|
||||
|
||||
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
|
||||
f = UTF8Recoder(f, encoding)
|
||||
self.reader = csv.reader(f, dialect=dialect, **kwds)
|
||||
|
||||
def next(self):
|
||||
row = self.reader.next()
|
||||
return [unicode(s, "utf-8") for s in row]
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
||||
class UnicodeWriter:
|
||||
"""
|
||||
A CSV writer which will write rows to CSV file "f",
|
||||
which is encoded in the given encoding.
|
||||
"""
|
||||
|
||||
def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
|
||||
# Redirect output to a queue
|
||||
self.queue = cStringIO.StringIO()
|
||||
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
|
||||
self.stream = f
|
||||
self.encoder = codecs.getincrementalencoder(encoding)()
|
||||
|
||||
def writerow(self, row):
|
||||
self.writer.writerow([s.encode("utf-8") for s in row])
|
||||
# Fetch UTF-8 output from the queue ...
|
||||
data = self.queue.getvalue()
|
||||
data = data.decode("utf-8")
|
||||
# ... and reencode it into the target encoding
|
||||
data = self.encoder.encode(data)
|
||||
# write to the target stream
|
||||
self.stream.write(data)
|
||||
# empty queue
|
||||
self.queue.truncate(0)
|
||||
|
||||
def writerows(self, rows):
|
||||
for row in rows:
|
||||
self.writerow(row)
|
||||
|
|
@ -3,16 +3,11 @@ from django.conf.urls import patterns, url
|
|||
from django.contrib.auth.decorators import user_passes_test
|
||||
from . import views, export
|
||||
from utils import staff_member_required
|
||||
from prednasky.views import newPrednaska, Prednaska_hotovo
|
||||
from django.views.generic.base import RedirectView
|
||||
|
||||
staff_member_required = user_passes_test(lambda u: u.is_staff)
|
||||
|
||||
urlpatterns = [
|
||||
# prednasky
|
||||
url(r'^prednasky/$', newPrednaska),
|
||||
url(r'^prednasky/hotovo$', Prednaska_hotovo),
|
||||
|
||||
# REDIRECTy
|
||||
url(r'^jak-resit/$', RedirectView.as_view(url='/co-je-MaM/jak-resit/')),
|
||||
|
||||
|
@ -33,6 +28,9 @@ urlpatterns = [
|
|||
url(r'^soustredeni/probehlo/$', views.SoustredeniListView.as_view(),
|
||||
name = 'seminar_seznam_soustredeni'),
|
||||
url(r'^soustredeni/probehlo/(?P<soustredeni>\d+)/$', views.SoustredeniView.as_view(), name='seminar_soustredeni'),
|
||||
url(r'^soustredeni/(?P<soustredeni>\d+)/seznam_ucastniku$', staff_member_required(views.SoustredeniUcastniciView.as_view()), name='soustredeni_ucastnici'),
|
||||
url(r'^soustredeni/(?P<soustredeni>\d+)/stvrzenky/(?P<first_num>\d+)$', staff_member_required(views.soustredeniStvrzenkyExportView), name='soustredeni_stvrzenky'),
|
||||
url(r'^soustredeni/(?P<soustredeni>\d+)/export_ucastniku$', staff_member_required(views.soustredeniUcastniciExportView), name='soustredeni_ucastnici_export'),
|
||||
url(r'^soustredeni/(?P<soustredeni>\d+)/fotogalerie/', include('galerie.urls')),
|
||||
|
||||
# Zadani
|
||||
|
|
|
@ -6,7 +6,7 @@ from django.core.urlresolvers import reverse
|
|||
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
|
||||
from django.views import generic
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.http import Http404
|
||||
from django.http import Http404,HttpResponseBadRequest
|
||||
from django.db.models import Q
|
||||
from django.views.decorators.csrf import ensure_csrf_cookie
|
||||
from django.contrib.auth import authenticate, login
|
||||
|
@ -14,6 +14,7 @@ from django.contrib.auth import authenticate, login
|
|||
from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel, Novinky, Soustredeni_Ucastnici, Pohadka, Prispevek
|
||||
from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva
|
||||
from . import utils
|
||||
from .unicodecsv import UnicodeWriter
|
||||
|
||||
from datetime import timedelta, date, datetime
|
||||
from itertools import groupby
|
||||
|
@ -26,6 +27,7 @@ import unicodedata
|
|||
import json
|
||||
import traceback
|
||||
import sys
|
||||
import csv
|
||||
|
||||
|
||||
def verejna_temata(rocnik):
|
||||
|
@ -528,9 +530,52 @@ class SoustredeniView(generic.DetailView):
|
|||
template_name = 'seminar/archiv/soustredeni.html'
|
||||
|
||||
def soustredeniObalkyView(request,soustredeni):
|
||||
soustredeni = Soustredeni.objects.filter(id = soustredeni)[0]
|
||||
soustredeni = get_object_or_404(Soustredeni,id = soustredeni)
|
||||
return obalkyView(request,soustredeni.ucastnici.all())
|
||||
|
||||
class SoustredeniUcastniciView(generic.ListView):
|
||||
model = Soustredeni_Ucastnici
|
||||
template_name = 'seminar/soustredeni/seznam_ucastniku.html'
|
||||
|
||||
def get_queryset(self):
|
||||
self.soustredeni = get_object_or_404(Soustredeni, id=self.kwargs["soustredeni"])
|
||||
return Soustredeni_Ucastnici.objects.filter(soustredeni=self.soustredeni).select_related('resitel')
|
||||
|
||||
def soustredeniStvrzenkyExportView(request,soustredeni,first_num):
|
||||
first_num = int(first_num)
|
||||
soustredeni = get_object_or_404(Soustredeni,id = soustredeni)
|
||||
ucastnici = Resitel.objects.filter(soustredeni=soustredeni)
|
||||
for (idx,u) in enumerate(ucastnici):
|
||||
u.cislo_stvrzenky = first_num+idx;
|
||||
tex = render(request,'seminar/soustredeni/ucastnici.tex', {'ucastnici': ucastnici, 'datum':soustredeni.datum_zacatku }).content
|
||||
|
||||
tempdir = tempfile.mkdtemp()
|
||||
with open(tempdir+"/ucastnici.tex","w") as texfile:
|
||||
# Pokud TeX chce ISO Latin, tak se da encode nastavit
|
||||
texfile.write(tex.decode("utf-8").encode("utf-8"))
|
||||
shutil.copy(os.path.join(settings.STATIC_ROOT, 'seminar/stvrzenka.sty'),tempdir)
|
||||
shutil.copy(os.path.join(settings.STATIC_ROOT, 'seminar/stvrzenky.tex'),tempdir)
|
||||
subprocess.call(["cslatex","stvrzenky.tex"],cwd = tempdir)
|
||||
subprocess.call(["dvipdf","stvrzenky.dvi"],cwd = tempdir)
|
||||
|
||||
with open(tempdir+"/stvrzenky.pdf","rb") as pdffile:
|
||||
response = HttpResponse(pdffile.read(),content_type='application/pdf')
|
||||
shutil.rmtree(tempdir)
|
||||
return response
|
||||
|
||||
|
||||
def soustredeniUcastniciExportView(request,soustredeni):
|
||||
soustredeni = get_object_or_404(Soustredeni,id = soustredeni)
|
||||
ucastnici = Resitel.objects.filter(soustredeni=soustredeni)
|
||||
response = HttpResponse(content_type='text/csv')
|
||||
response['Content-Disposition'] = 'attachment; filename="ucastnici.csv"'
|
||||
|
||||
writer = UnicodeWriter(response)
|
||||
writer.writerow(["jmeno", "prijmeni", "rok_maturity", "telefon", "email", "ulice", "mesto", "psc","stat"])
|
||||
for u in ucastnici:
|
||||
writer.writerow([u.jmeno, u.prijmeni, str(u.rok_maturity), u.telefon, u.email, u.ulice, u.mesto, u.psc, u.stat.name])
|
||||
return response
|
||||
|
||||
|
||||
### Články
|
||||
|
||||
|
|
Loading…
Reference in a new issue