Přidáno exportítko CSV řešitelů + použito pro řešitele ročníku
This commit is contained in:
parent
7d795a1fe1
commit
6162d0d671
4 changed files with 87 additions and 1 deletions
|
@ -7,6 +7,7 @@ from django.views.generic.base import TemplateView
|
|||
from django.contrib.auth.models import User, Permission, Group
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.db import transaction
|
||||
from django.http import HttpResponse
|
||||
|
||||
import seminar.models as s
|
||||
import seminar.models as m
|
||||
|
@ -14,6 +15,7 @@ from .forms import PrihlaskaForm, ProfileEditForm, PoMaturiteProfileEditForm
|
|||
|
||||
from datetime import date
|
||||
import logging
|
||||
import csv
|
||||
|
||||
from seminar.views import formularOKView
|
||||
from various.autentizace.views import LoginView
|
||||
|
@ -304,3 +306,71 @@ def profilView(request):
|
|||
return ResitelView.as_view()(request)
|
||||
else:
|
||||
return LoginView.as_view()(request)
|
||||
|
||||
def dataResiteluCsvResponse(queryset, columns=None, with_header=True):
|
||||
"""Pomocná funkce pro vracení dat řešitelů jako CSV. Musí dostat správný QuerySet, který dává Řešitele"""
|
||||
# TODO: Možná nějak zobecnit i na Osoby?
|
||||
# TODO: Nemá to spíš být class-based? Tohle je efektivně metoda "get", které ale chybí "get_queryset"…
|
||||
|
||||
default_columns = (
|
||||
'id',
|
||||
'osoba__jmeno',
|
||||
'osoba__prijmeni',
|
||||
'osoba__prezdivka',
|
||||
'osoba__email',
|
||||
'osoba__telefon',
|
||||
'osoba__user',
|
||||
'osoba__datum_narozeni',
|
||||
'osoba__pohlavi_muz',
|
||||
'osoba__ulice',
|
||||
'osoba__mesto',
|
||||
'osoba__psc',
|
||||
'osoba__stat',
|
||||
'skola', # Bude fungovat takhle?
|
||||
'poznamka',
|
||||
'osoba__poznamka',
|
||||
'rok_maturity',
|
||||
'zasilat',
|
||||
'zasilat_cislo_emailem',
|
||||
'osoba__datum_registrace',
|
||||
'osoba__datum_souhlasu_udaje',
|
||||
'osoba__datum_souhlasu_zasilani',
|
||||
)
|
||||
if columns is None: columns = default_columns
|
||||
|
||||
field_name_overrides = {
|
||||
# Zrušení prefixu "osoba__"
|
||||
'osoba__jmeno': 'jmeno',
|
||||
'osoba__prijmeni': 'prijmeni',
|
||||
'osoba__prezdivka': 'prezdivka',
|
||||
'osoba__email': 'email',
|
||||
'osoba__telefon': 'telefon',
|
||||
'osoba__user': 'user',
|
||||
'osoba__datum_narozeni': 'datum_narozeni',
|
||||
'osoba__pohlavi_muz': 'pohlavi_muz',
|
||||
'osoba__ulice': 'ulice',
|
||||
'osoba__mesto': 'mesto',
|
||||
'osoba__psc': 'psc',
|
||||
'osoba__stat': 'stat',
|
||||
'osoba__datum_registrace': 'datum_registrace',
|
||||
'osoba__datum_souhlasu_udaje': 'datum_souhlasu_udaje',
|
||||
'osoba__datum_souhlasu_zasilani':'datum_souhlasu_zasilani',
|
||||
}
|
||||
|
||||
def get_field_name(column_name):
|
||||
if column_name in field_name_overrides:
|
||||
return field_name_overrides[column_name]
|
||||
return column_name
|
||||
|
||||
response = HttpResponse(content_type='text/csv')
|
||||
writer = csv.writer(response)
|
||||
|
||||
# První řádek je záhlaví
|
||||
if with_header:
|
||||
writer.writerow(map(get_field_name, columns))
|
||||
|
||||
# Data:
|
||||
queryset_list = queryset.values_list(*columns)
|
||||
writer.writerows(queryset_list)
|
||||
|
||||
return response
|
||||
|
|
|
@ -119,7 +119,9 @@
|
|||
|
||||
{% if user.je_org %}
|
||||
<div class='mam-org-only'>
|
||||
<a href='vysledkovka.tex' download>Výsledkovka ročníku (LaTeX, včetně neveřejných)</a>
|
||||
<p><a href='vysledkovka.tex' download>Výsledkovka ročníku (LaTeX, včetně neveřejných)</a></p>
|
||||
{# FIXME: Sice to sem asi nepatří sémanticky, ale bylo to nejjednodušší… #}
|
||||
<p><a href='{% url 'seminar_rocnik_resitele_csv' rocnik=rocnik.rocnik %}' download>CSV export řešitelů</a></p>
|
||||
<h2>Výsledková listina včetně neveřejných bodů</h2>
|
||||
{% include "vysledkovky/vysledkovka_rocnik_neverejna.html" %}
|
||||
</div>
|
||||
|
|
|
@ -36,6 +36,11 @@ urlpatterns = [
|
|||
org_required(views.RocnikVysledkovkaView.as_view()),
|
||||
name='seminar_rocnik_vysledkovka'
|
||||
),
|
||||
path(
|
||||
'rocnik/<int:rocnik>/resitele.csv',
|
||||
org_required(views.resiteleRocnikuCsvExportView),
|
||||
name='seminar_rocnik_resitele_csv'
|
||||
),
|
||||
path(
|
||||
'cislo/<int:rocnik>.<str:cislo>/vysledkovka.tex',
|
||||
org_required(views.CisloVysledkovkaView.as_view()),
|
||||
|
|
|
@ -19,6 +19,7 @@ import treenode.templatetags as tnltt
|
|||
import treenode.serializers as vr
|
||||
from vysledkovky.utils import body_resitelu
|
||||
from vysledkovky.views import vysledkovka_rocniku, vysledkovka_cisla
|
||||
from personalni.views import dataResiteluCsvResponse
|
||||
|
||||
from datetime import date, datetime
|
||||
from django.utils import timezone
|
||||
|
@ -390,6 +391,14 @@ class RocnikView(generic.DetailView):
|
|||
|
||||
return context
|
||||
|
||||
def resiteleRocnikuCsvExportView(request, rocnik):
|
||||
assert request.method in ('GET', 'HEAD')
|
||||
return dataResiteluCsvResponse(
|
||||
utils.resi_v_rocniku(
|
||||
m.Rocnik.objects.get(rocnik=rocnik)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
# FIXME: Pozor, výš je ještě jeden ProblemView!
|
||||
#class ProblemView(generic.DetailView):
|
||||
|
|
Loading…
Reference in a new issue