Browse Source

Prepracovani exportu, doplneni exportu soustredek

remotes/origin/vysl
Tomas Gavenciak 9 years ago
parent
commit
944afc5974
  1. 148
      seminar/export.py
  2. 24
      seminar/models.py
  3. 15
      seminar/ovvpfile.py
  4. 2
      seminar/templates/seminar/export_index.csv
  5. 11
      seminar/templates/seminar/export_rocnik.csv
  6. 1
      seminar/urls.py

148
seminar/export.py

@ -1,80 +1,92 @@
import datetime import datetime, django
from django.shortcuts import get_object_or_404, render 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.core.urlresolvers import reverse
from django.views import generic from django.views import generic
from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik from django.utils.encoding import force_text
class ExportIndexView(generic.base.TemplateView): from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni
template_name = 'seminar/export_index.csv' from .ovvpfile import OvvpFile
content_type = 'text/plain; charset=utf-8'
def get_context_data(self, **kwargs): class ExportIndexView(generic.View):
context = super(ExportIndexView, self).get_context_data(**kwargs) def get(self, request):
context['exports'] = []
ls = []
for r in Rocnik.objects.all(): for r in Rocnik.objects.all():
if r.verejna_cisla(): if r.verejna_cisla():
url = reverse('seminar_export_rocnik', kwargs={'prvni_rok': r.prvni_rok}) url = reverse('seminar_export_rocnik', kwargs={'prvni_rok': r.prvni_rok})
context['exports'].append(url.split('/')[-1]) ls.append(url.split('/')[-1])
return context 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'] def default_ovvpfile(event, rocnik):
cislo = rocnik.posledni_verejne_cislo() of = OvvpFile()
sloupce = ['id', 'name', 'surname', of.headers['version'] = '1'
'gender', 'born', 'email', 'end-year', of.headers['event'] = event
'street', 'town', 'postcode', 'country', of.headers['year'] = force_text(rocnik.prvni_rok)
'spam-flag', 'spam-date', 'school', 'school-name', of.headers['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'points', 'rank',] of.headers['id-scope'] = 'mam'
radky = [] 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() 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_body = 100000
posledni_poradi = 0 posledni_poradi = 0
for vi in range(len(vysledky)): for vi in range(len(vysledky)):
v = vysledky[vi] v = vysledky[vi]
rd = {} rd = v.resitel.export_row()
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'
if posledni_body > v.body_celkem: if posledni_body > v.body_celkem:
posledni_body = v.body_celkem posledni_body = v.body_celkem
@ -82,16 +94,8 @@ class ExportRocnikView(generic.DetailView):
rd['rank'] = posledni_poradi rd['rank'] = posledni_poradi
rd['points'] = v.body_celkem rd['points'] = v.body_celkem
r = [] of.rows.append(rd)
for c in sloupce:
r.append(rd.pop(c)) return of.to_HttpResponse()
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

24
seminar/models.py

@ -186,6 +186,30 @@ class Resitel(SeminarModelBase):
def __str__(self): def __str__(self):
return force_unicode(self.plne_jmeno()) 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) @reversion.register(ignore_duplicate_revisions=True)
@python_2_unicode_compatible @python_2_unicode_compatible

15
seminar/ovvpfile.py

@ -1,9 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
try:
from django.http import HttpResponse
from django.utils.encoding import force_text
except:
force_text = str
class OvvpFile(object): class OvvpFile(object):
def __init__(self): def __init__(self):
# { header: value, ... }
self.headers = {} self.headers = {}
# [ 'column-name', ... ]
self.columns = [] self.columns = []
# [ { column: value, ...}, ...]
self.rows = [] self.rows = []
def to_lines(self): def to_lines(self):
@ -15,11 +25,14 @@ class OvvpFile(object):
yield '\t'.join([c for c in self.columns]) + '\n' yield '\t'.join([c for c in self.columns]) + '\n'
# rows # rows
for r in self.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): def to_string(self):
return ''.join(self.to_lines()) 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): def parse_from(self, source, with_headers=True):
"Parse data from file, string or line iterator, overwriting self" "Parse data from file, string or line iterator, overwriting self"
if isinstance(source, str) or isinstance(source, unicode): if isinstance(source, str) or isinstance(source, unicode):

2
seminar/templates/seminar/export_index.csv

@ -1,2 +0,0 @@
{% for e in exports %}{{ e }}
{% endfor %}
1 {% for e in exports %}{{ e }}
2 {% endfor %}

11
seminar/templates/seminar/export_rocnik.csv

@ -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 %}
Can't render this file because it has a wrong number of fields in line 11.

1
seminar/urls.py

@ -16,5 +16,6 @@ urlpatterns = patterns('',
url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'),
url(r'^aesop-export/mam-rocnik-(?P<prvni_rok>\d+)\.csv$', export.ExportRocnikView.as_view(), name='seminar_export_rocnik'), url(r'^aesop-export/mam-rocnik-(?P<prvni_rok>\d+)\.csv$', export.ExportRocnikView.as_view(), name='seminar_export_rocnik'),
url(r'^aesop-export/mam-sous-(?P<datum_zacatku>[\d-]+)\.csv$', export.ExportSousView.as_view(), name='seminar_export_sous'),
url(r'^aesop-export/index.csv$', export.ExportIndexView.as_view(), name='seminar_export_index'), url(r'^aesop-export/index.csv$', export.ExportIndexView.as_view(), name='seminar_export_index'),
) )

Loading…
Cancel
Save