Prepracovani exportu, doplneni exportu soustredek
This commit is contained in:
		
							parent
							
								
									584108444f
								
							
						
					
					
						commit
						944afc5974
					
				
					 6 changed files with 114 additions and 85 deletions
				
			
		|  | @ -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): | def default_ovvpfile(event, rocnik): | ||||||
|     slug_field = 'prvni_rok' |     of = OvvpFile() | ||||||
|     slug_url_kwarg = 'prvni_rok' |     of.headers['version'] = '1' | ||||||
|     model = Rocnik |     of.headers['event'] = event | ||||||
|     template_name = 'seminar/export_rocnik.csv' |     of.headers['year'] = force_text(rocnik.prvni_rok) | ||||||
|     content_type = 'text/plain; charset=utf-8' |     of.headers['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") | ||||||
|     def get_context_data(self, **kwargs): |     of.headers['id-scope'] = 'mam' | ||||||
|         context = super(ExportRocnikView, self).get_context_data(**kwargs) |     of.headers['id-generation'] = '1' | ||||||
|  |     return of | ||||||
| 
 | 
 | ||||||
|         rocnik = context['rocnik'] | 
 | ||||||
|  | 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() |         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 = [] |  | ||||||
| 
 |  | ||||||
|         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)) |  | ||||||
|             assert len(rd) == 0 |  | ||||||
|             radky.append(r) |  | ||||||
|          |          | ||||||
|         context['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") |         return of.to_HttpResponse() | ||||||
|         context['cislo'] = cislo |  | ||||||
|         context['sloupce'] = sloupce |  | ||||||
|         context['radky'] = radky |  | ||||||
|         return context |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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): | ||||||
|  |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| {% for e in exports %}{{ e }} |  | ||||||
| {% endfor %} |  | ||||||
| 
 | 
|  | @ -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. | 
|  | @ -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…
	
		Reference in a new issue
	
	 Tomas Gavenciak
						Tomas Gavenciak