From 944afc597408a9ba857c6353cae9dbcebe9a3876 Mon Sep 17 00:00:00 2001 From: Tomas Gavenciak Date: Mon, 29 Jun 2015 00:27:02 +0200 Subject: [PATCH] Prepracovani exportu, doplneni exportu soustredek --- seminar/export.py | 148 ++++++++++---------- seminar/models.py | 24 ++++ seminar/ovvpfile.py | 15 +- seminar/templates/seminar/export_index.csv | 2 - seminar/templates/seminar/export_rocnik.csv | 11 -- seminar/urls.py | 1 + 6 files changed, 115 insertions(+), 86 deletions(-) delete mode 100644 seminar/templates/seminar/export_index.csv delete mode 100644 seminar/templates/seminar/export_rocnik.csv diff --git a/seminar/export.py b/seminar/export.py index ce52220a..2e7d6bd2 100644 --- a/seminar/export.py +++ b/seminar/export.py @@ -1,80 +1,92 @@ -import datetime +import datetime, django from django.shortcuts import get_object_or_404, render -from django.http import HttpResponseRedirect +from django.http import HttpResponse from django.core.urlresolvers import reverse from django.views import generic -from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik - -class ExportIndexView(generic.base.TemplateView): - template_name = 'seminar/export_index.csv' - content_type = 'text/plain; charset=utf-8' - def get_context_data(self, **kwargs): - context = super(ExportIndexView, self).get_context_data(**kwargs) - context['exports'] = [] +from django.utils.encoding import force_text + +from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni +from .ovvpfile import OvvpFile + +class ExportIndexView(generic.View): + def get(self, request): + + ls = [] for r in Rocnik.objects.all(): if r.verejna_cisla(): url = reverse('seminar_export_rocnik', kwargs={'prvni_rok': r.prvni_rok}) - context['exports'].append(url.split('/')[-1]) - return context + ls.append(url.split('/')[-1]) + for s in Soustredeni.objects.all(): + if s.ucastnici.count() >= 1: + url = reverse('seminar_export_sous', kwargs={'datum_zacatku': s.datum_zacatku.isoformat()}) + ls.append(url.split('/')[-1]) + return HttpResponse('\n'.join(ls) + '\n', content_type='text/plain; charset=utf-8') -class ExportRocnikView(generic.DetailView): - slug_field = 'prvni_rok' - slug_url_kwarg = 'prvni_rok' - model = Rocnik - template_name = 'seminar/export_rocnik.csv' - content_type = 'text/plain; charset=utf-8' - def get_context_data(self, **kwargs): - context = super(ExportRocnikView, self).get_context_data(**kwargs) - rocnik = context['rocnik'] - cislo = rocnik.posledni_verejne_cislo() - sloupce = ['id', 'name', 'surname', - 'gender', 'born', 'email', 'end-year', - 'street', 'town', 'postcode', 'country', - 'spam-flag', 'spam-date', 'school', 'school-name', - 'points', 'rank',] - radky = [] +def default_ovvpfile(event, rocnik): + of = OvvpFile() + of.headers['version'] = '1' + of.headers['event'] = event + of.headers['year'] = force_text(rocnik.prvni_rok) + of.headers['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + of.headers['id-scope'] = 'mam' + of.headers['id-generation'] = '1' + return of + + +class ExportSousView(generic.View): + + def get(self, request, datum_zacatku=None): + try: + dz = django.utils.dateparse.parse_date(datum_zacatku) + except: + dz = None + if dz is None: + raise django.http.Http404() + s = get_object_or_404(Soustredeni, datum_zacatku=dz) + + of = default_ovvpfile('MaM.sous', s.rocnik) + of.headers['x-event-begin'] = s.datum_zacatku.isoformat() + of.headers['x-event-end'] = s.datum_konce.isoformat() + of.headers['x-event-location'] = s.misto + of.headers['comment'] = u'MaM-Web export ucastniku soustredeni v {x-event-location} od {x-event-begin} do {x-event-end}'.format(**of.headers) + of.columns = ['id', 'name', 'surname', 'gender', 'email', 'end-year', 'school', 'school-name'] + + for u in s.ucastnici.all(): + of.rows.append(u.export_row()) + + return of.to_HttpResponse() + + +class ExportRocnikView(generic.View): + + def get(self, request, prvni_rok=None): + try: + pr = int(prvni_rok) + except: + pr = None + if pr is None: + raise django.http.Http404() + + rocnik = get_object_or_404(Rocnik, prvni_rok=pr) + cislo = rocnik.posledni_verejne_cislo() vysledky = VysledkyKCislu.objects.filter(cislo = cislo).select_related("resitel").order_by('-body_celkem').all() + of = default_ovvpfile('MaM.rocnik', rocnik) + of.headers['comment'] = u'MaM-Web export aktivnich resitelu rocniku {rocnik} do cisla {cislo}'.format( + rocnik=rocnik, cislo=cislo) + of.columns = ['id', 'name', 'surname', 'gender', 'born', 'email', 'end-year', + 'street', 'town', 'postcode', 'country', 'spam-flag', 'spam-date', + 'school', 'school-name', 'points', 'rank',] + posledni_body = 100000 posledni_poradi = 0 for vi in range(len(vysledky)): + v = vysledky[vi] - rd = {} - - rd['name'] = v.resitel.jmeno - rd['surname'] = v.resitel.prijmeni - rd['id'] = v.resitel.id - - rd['gender'] = 'M' if v.resitel.pohlavi_muz else 'F' - if v.resitel.datum_narozeni: - rd['born'] = v.resitel.datum_narozeni.strftime("%Y-%m-%d") - else: - rd['born'] = '' - rd['email'] = v.resitel.email - rd['end-year'] = v.resitel.rok_maturity - - # TODO(gavento): Adresa skoly, kdyz preferuje zasilani tam? - rd['street'] = v.resitel.ulice - rd['town'] = v.resitel.mesto - rd['postcode'] = v.resitel.psc - rd['country'] = v.resitel.stat - - if v.resitel.datum_souhlasu_zasilani: - rd['spam-flag'] = 'Y' - rd['spam-date'] = v.resitel.datum_souhlasu_zasilani.strftime("%Y-%m-%d") - else: - rd['spam-flag'] = '' - rd['spam-date'] = '' - - if v.resitel.skola: - rd['school'] = v.resitel.skola.aesop_id - rd['school-name'] = str(v.resitel.skola) - else: - rd['school'] = '' - rd['school-name'] = 'Skola neni znama' + rd = v.resitel.export_row() if posledni_body > v.body_celkem: posledni_body = v.body_celkem @@ -82,16 +94,8 @@ class ExportRocnikView(generic.DetailView): rd['rank'] = posledni_poradi rd['points'] = v.body_celkem - r = [] - for c in sloupce: - r.append(rd.pop(c)) - assert len(rd) == 0 - radky.append(r) - - context['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - context['cislo'] = cislo - context['sloupce'] = sloupce - context['radky'] = radky - return context + of.rows.append(rd) + + return of.to_HttpResponse() diff --git a/seminar/models.py b/seminar/models.py index 23578780..bc7f6b43 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -186,6 +186,30 @@ class Resitel(SeminarModelBase): def __str__(self): return force_unicode(self.plne_jmeno()) + def export_row(self): + "Slovnik pro pouziti v OVVP exportu" + return { + 'id': self.id, + 'name': self.jmeno, + 'surname': self.prijmeni, + 'gender': 'M' if self.pohlavi_muz else 'F', + 'born': self.datum_narozeni.isoformat() if self.datum_narozeni else '', + 'email': self.email, + 'end-year': self.rok_maturity, + + # TODO(gavento): Adresa skoly, kdyz preferuje zasilani tam? + 'street': self.ulice, + 'town': self.mesto, + 'postcode': self.psc, + 'country': self.stat, + + 'spam-flag': 'Y' if self.datum_souhlasu_zasilani else '', + 'spam-date': self.datum_souhlasu_zasilani.isoformat() if self.datum_souhlasu_zasilani else '', + + 'school': self.skola.aesop_id if self.skola else '', + 'school-name': str(self.skola) if self.skola else 'Skola neni znama', + } + @reversion.register(ignore_duplicate_revisions=True) @python_2_unicode_compatible diff --git a/seminar/ovvpfile.py b/seminar/ovvpfile.py index 46d34df3..471c06c6 100644 --- a/seminar/ovvpfile.py +++ b/seminar/ovvpfile.py @@ -1,9 +1,19 @@ # -*- coding: utf-8 -*- +try: + from django.http import HttpResponse + from django.utils.encoding import force_text +except: + force_text = str + + class OvvpFile(object): def __init__(self): + # { header: value, ... } self.headers = {} + # [ 'column-name', ... ] self.columns = [] + # [ { column: value, ...}, ...] self.rows = [] def to_lines(self): @@ -15,11 +25,14 @@ class OvvpFile(object): yield '\t'.join([c for c in self.columns]) + '\n' # rows for r in self.rows: - yield '\t'.join([r[c] for c in self.columns]) + '\n' + yield '\t'.join([force_text(r[c]) for c in self.columns]) + '\n' def to_string(self): return ''.join(self.to_lines()) + def to_HttpResponse(self): + return HttpResponse(self.to_string(), content_type='text/plain; charset=utf-8') + def parse_from(self, source, with_headers=True): "Parse data from file, string or line iterator, overwriting self" if isinstance(source, str) or isinstance(source, unicode): diff --git a/seminar/templates/seminar/export_index.csv b/seminar/templates/seminar/export_index.csv deleted file mode 100644 index edb833cf..00000000 --- a/seminar/templates/seminar/export_index.csv +++ /dev/null @@ -1,2 +0,0 @@ -{% for e in exports %}{{ e }} -{% endfor %} diff --git a/seminar/templates/seminar/export_rocnik.csv b/seminar/templates/seminar/export_rocnik.csv deleted file mode 100644 index a8668e39..00000000 --- a/seminar/templates/seminar/export_rocnik.csv +++ /dev/null @@ -1,11 +0,0 @@ -version 1 -event MaM.rocnik -year {{ rocnik.prvni_rok }} -date {{ date }} -id-scope mam -id-generation 1 -comment MaM-Web export aktivnich resitelu rocniku {{ rocnik }} do cisla {{ cislo.kod }} - -{% for c in sloupce %}{{ c }} {% endfor %} -{% for r in radky %}{% for c in r %}{{ c }} {% endfor %} -{% endfor %} diff --git a/seminar/urls.py b/seminar/urls.py index 3ed44bd0..e3264601 100644 --- a/seminar/urls.py +++ b/seminar/urls.py @@ -16,5 +16,6 @@ urlpatterns = patterns('', url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), url(r'^aesop-export/mam-rocnik-(?P\d+)\.csv$', export.ExportRocnikView.as_view(), name='seminar_export_rocnik'), + url(r'^aesop-export/mam-sous-(?P[\d-]+)\.csv$', export.ExportSousView.as_view(), name='seminar_export_sous'), url(r'^aesop-export/index.csv$', export.ExportIndexView.as_view(), name='seminar_export_index'), )