Implemented full AESOP export
This commit is contained in:
		
							parent
							
								
									7a88ce8006
								
							
						
					
					
						commit
						05a337c6f8
					
				
					 5 changed files with 128 additions and 2 deletions
				
			
		
							
								
								
									
										97
									
								
								seminar/export.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								seminar/export.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,97 @@ | ||||||
|  | import datetime | ||||||
|  | from django.shortcuts import get_object_or_404, render | ||||||
|  | from django.http import HttpResponseRedirect | ||||||
|  | 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'] = [] | ||||||
|  |         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 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 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 = [] | ||||||
|  | 
 | ||||||
|  |         vysledky = VysledkyKCislu.objects.filter(cislo = cislo).select_related("resitel").all() | ||||||
|  | 
 | ||||||
|  |         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'] = v.resitel.skola.nazev | ||||||
|  |             else: | ||||||
|  |                 rd['school'] = '' | ||||||
|  |                 rd['school-name'] = 'Skola neni znama' | ||||||
|  | 
 | ||||||
|  |             if posledni_body > v.body_celkem: | ||||||
|  |                 posledni_body = v.body_celkem | ||||||
|  |                 posledni_poradi = vi + 1 | ||||||
|  |             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 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -14,6 +14,13 @@ from django.core.urlresolvers import reverse | ||||||
| from django_countries.fields import CountryField | from django_countries.fields import CountryField | ||||||
| from solo.models import SingletonModel | from solo.models import SingletonModel | ||||||
| 
 | 
 | ||||||
|  | class SeminarModel(models.Model): | ||||||
|  | 
 | ||||||
|  |     class Meta: | ||||||
|  |         abstract = True | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| # | # | ||||||
| # Mělo by být částečně vytaženo z Aesopa | # Mělo by být částečně vytaženo z Aesopa | ||||||
| # viz https://ovvp.mff.cuni.cz/wiki/aesop/export-skol. | # viz https://ovvp.mff.cuni.cz/wiki/aesop/export-skol. | ||||||
|  | @ -163,7 +170,13 @@ class Rocnik(models.Model): | ||||||
|             return force_unicode(self.rocnik) |             return force_unicode(self.rocnik) | ||||||
| 
 | 
 | ||||||
|     def verejna_cisla(self): |     def verejna_cisla(self): | ||||||
|         return [c for c in self.cisla.all() if c.verejne()] |         vc = [c for c in self.cisla.all() if c.verejne()] | ||||||
|  |         vc.sort(key=lambda c: c.cislo) | ||||||
|  |         return vc | ||||||
|  | 
 | ||||||
|  |     def posledni_verejne_cislo(self): | ||||||
|  |         vc = self.verejna_cisla() | ||||||
|  |         return vc[-1] if vc else None | ||||||
| 
 | 
 | ||||||
|     def druhy_rok(self): |     def druhy_rok(self): | ||||||
|         return self.prvni_rok + 1 |         return self.prvni_rok + 1 | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								seminar/templates/seminar/export_index.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								seminar/templates/seminar/export_index.csv
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | ||||||
|  | {% for e in exports %}{{ e }} | ||||||
|  | {% endfor %} | ||||||
| 
 | 
							
								
								
									
										11
									
								
								seminar/templates/seminar/export_rocnik.csv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								seminar/templates/seminar/export_rocnik.csv
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | version	1 | ||||||
|  | event	MaM.rocnik | ||||||
|  | year	{{ rocnik.prvni_rok }} | ||||||
|  | date	{{ date }} | ||||||
|  | id-scope	main | ||||||
|  | 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,9 +1,12 @@ | ||||||
| from django.conf.urls import patterns, url | from django.conf.urls import patterns, url | ||||||
| from . import views | from . import views, export | ||||||
| 
 | 
 | ||||||
| urlpatterns = patterns('', | urlpatterns = patterns('', | ||||||
|     url(r'^rocnik/(?P<pk>\d+)/$', views.RocnikView.as_view(), name='seminar.rocnik'), |     url(r'^rocnik/(?P<pk>\d+)/$', views.RocnikView.as_view(), name='seminar.rocnik'), | ||||||
|     url(r'^cislo/(?P<pk>\d+)/$', views.CisloView.as_view(), name='seminar.cislo'), |     url(r'^cislo/(?P<pk>\d+)/$', views.CisloView.as_view(), name='seminar.cislo'), | ||||||
|     url(r'^problem/(?P<pk>\d+)/$', views.ProblemView.as_view(), name='seminar.problem'), |     url(r'^problem/(?P<pk>\d+)/$', views.ProblemView.as_view(), name='seminar.problem'), | ||||||
|     url(r'^zadani/$', views.AktualniZadaniView, name='seminar.aktualni_zadani'), |     url(r'^zadani/$', 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/index.csv$', export.ExportIndexView.as_view(), name='seminar.export.index'), | ||||||
| ) | ) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Tomas Gavenciak
						Tomas Gavenciak