Merge branch 'master' of atrey.karlin.mff.cuni.cz:/akce/MaM/MaMweb/mamweb
Conflicts: seminar/views.py
This commit is contained in:
		
						commit
						0b30583b0a
					
				
					 12 changed files with 284 additions and 41 deletions
				
			
		|  | @ -6,6 +6,12 @@ F2="$2" | ||||||
| TMPF1=`tempfile` | TMPF1=`tempfile` | ||||||
| TMPF2=`tempfile` | TMPF2=`tempfile` | ||||||
| 
 | 
 | ||||||
|  | if which colordiff; then | ||||||
|  |   DIFF=colordiff | ||||||
|  | else | ||||||
|  |   DIFF=diff | ||||||
|  | fi | ||||||
|  | 
 | ||||||
| if [ "z$F1" == "z" ]; then | if [ "z$F1" == "z" ]; then | ||||||
|   echo "Requies argument" |   echo "Requies argument" | ||||||
|   exit 1 |   exit 1 | ||||||
|  | @ -21,7 +27,7 @@ else | ||||||
|   cat "$F2" | bunzip2 > "$TMPF2" |   cat "$F2" | bunzip2 > "$TMPF2" | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| colordiff "$TMPF1" "$TMPF2" | $DIFF "$TMPF1" "$TMPF2" | ||||||
| 
 | 
 | ||||||
| rm "$TMPF1" "$TMPF2" | rm "$TMPF1" "$TMPF2" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -5,6 +5,7 @@ from .settings_common import * | ||||||
| # See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ | # See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ | ||||||
| 
 | 
 | ||||||
| INSTALLED_APPS += ( | INSTALLED_APPS += ( | ||||||
|  |     'django_extensions', | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
| # SECURITY WARNING: keep the secret key used in production secret! | # SECURITY WARNING: keep the secret key used in production secret! | ||||||
|  |  | ||||||
|  | @ -5,7 +5,8 @@ from django.core.urlresolvers import reverse | ||||||
| from django.views import generic | from django.views import generic | ||||||
| from django.utils.encoding import force_text | from django.utils.encoding import force_text | ||||||
| 
 | 
 | ||||||
| from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni | from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni | ||||||
|  | from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||||
| from .ovvpfile import OvvpFile | from .ovvpfile import OvvpFile | ||||||
| 
 | 
 | ||||||
| class ExportIndexView(generic.View): | class ExportIndexView(generic.View): | ||||||
|  | @ -75,7 +76,7 @@ class ExportRocnikView(generic.View): | ||||||
| 
 | 
 | ||||||
|         rocnik = get_object_or_404(Rocnik, prvni_rok=pr, exportovat=True) |         rocnik = get_object_or_404(Rocnik, prvni_rok=pr, exportovat=True) | ||||||
|         cislo = rocnik.posledni_zverejnena_vysledkovka_cislo() |         cislo = rocnik.posledni_zverejnena_vysledkovka_cislo() | ||||||
|         vysledky = VysledkyKCislu.objects.filter(cislo = cislo).select_related("resitel").order_by('-body_celkem').all() |         vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = cislo).select_related("resitel").order_by('-body').all() | ||||||
| 
 | 
 | ||||||
|         of = default_ovvpfile('MaM.rocnik', rocnik) |         of = default_ovvpfile('MaM.rocnik', rocnik) | ||||||
|         of.headers['comment'] = u'MaM-Web export aktivnich resitelu rocniku {rocnik} do cisla {cislo}'.format( |         of.headers['comment'] = u'MaM-Web export aktivnich resitelu rocniku {rocnik} do cisla {cislo}'.format( | ||||||
|  | @ -91,11 +92,11 @@ class ExportRocnikView(generic.View): | ||||||
|             v = vysledky[vi] |             v = vysledky[vi] | ||||||
|             rd = v.resitel.export_row() |             rd = v.resitel.export_row() | ||||||
| 
 | 
 | ||||||
|             if posledni_body > v.body_celkem: |             if posledni_body > v.body: | ||||||
|                 posledni_body = v.body_celkem |                 posledni_body = v.body | ||||||
|                 posledni_poradi = vi + 1 |                 posledni_poradi = vi + 1 | ||||||
|             rd['rank'] = posledni_poradi |             rd['rank'] = posledni_poradi | ||||||
|             rd['points'] = v.body_celkem |             rd['points'] = v.body | ||||||
| 
 | 
 | ||||||
|             of.rows.append(rd) |             of.rows.append(rd) | ||||||
|          |          | ||||||
|  |  | ||||||
							
								
								
									
										75
									
								
								seminar/migrations/0028_add_body_celkem_views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								seminar/migrations/0028_add_body_celkem_views.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,75 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import models, migrations | ||||||
|  | import django_countries.fields | ||||||
|  | import seminar.models | ||||||
|  | import django.utils.timezone | ||||||
|  | from django.conf import settings | ||||||
|  | 
 | ||||||
|  | CREATE_VIEWS=""" | ||||||
|  | drop view seminar_body_k_cislu; | ||||||
|  | drop view seminar_body_za_cislo; | ||||||
|  | 
 | ||||||
|  | create view seminar_body_za_cislo as | ||||||
|  |   select | ||||||
|  |     seminar_reseni.cislo_body_id || '-' || seminar_reseni.resitel_id as id, | ||||||
|  |     seminar_reseni.cislo_body_id as cislo_id, | ||||||
|  |     seminar_reseni.resitel_id as resitel_id, | ||||||
|  |     seminar_cisla.cislo as cislo, | ||||||
|  |     seminar_cisla.rocnik_id as rocnik_id, | ||||||
|  |     seminar_rocniky.rocnik as rocnik, | ||||||
|  |     seminar_cisla.verejna_vysledkovka as verejna_vysledkovka, | ||||||
|  |     sum(seminar_reseni.body) as body | ||||||
|  |   from | ||||||
|  |     seminar_reseni | ||||||
|  |     inner join seminar_cisla on seminar_reseni.cislo_body_id = seminar_cisla.id | ||||||
|  |     inner join seminar_rocniky on seminar_cisla.rocnik_id = seminar_rocniky.id | ||||||
|  |   group by seminar_reseni.cislo_body_id, seminar_reseni.resitel_id, seminar_cisla.cislo, | ||||||
|  |     seminar_cisla.rocnik_id, seminar_rocniky.rocnik, seminar_cisla.verejna_vysledkovka | ||||||
|  |   order by body desc; | ||||||
|  | 
 | ||||||
|  | create view seminar_body_k_cislu_rocnik as | ||||||
|  |   select | ||||||
|  |     akt_body.id as id, | ||||||
|  |     akt_body.cislo_id as cislo_id, | ||||||
|  |     akt_body.resitel_id as resitel_id, | ||||||
|  |     akt_body.body as body, | ||||||
|  |     sum(min_body.body) as body_celkem | ||||||
|  |   from | ||||||
|  |     seminar_body_za_cislo as akt_body | ||||||
|  |     inner join seminar_body_za_cislo as min_body on | ||||||
|  |       (akt_body.resitel_id = min_body.resitel_id and | ||||||
|  |         (akt_body.rocnik = min_body.rocnik and akt_body.cislo >= min_body.cislo) | ||||||
|  |       ) | ||||||
|  |   group by akt_body.id, akt_body.cislo_id, akt_body.resitel_id, akt_body.body | ||||||
|  |   order by body_celkem desc; | ||||||
|  | 
 | ||||||
|  | create view seminar_body_k_cislu_odjakziva as | ||||||
|  |   select | ||||||
|  |     akt_body.id as id, | ||||||
|  |     akt_body.cislo_id as cislo_id, | ||||||
|  |     akt_body.resitel_id as resitel_id, | ||||||
|  |     akt_body.body as body, | ||||||
|  |     sum(min_body.body) as body_celkem | ||||||
|  |   from | ||||||
|  |     seminar_body_za_cislo as akt_body | ||||||
|  |     inner join seminar_body_za_cislo as min_body on | ||||||
|  |       (akt_body.resitel_id = min_body.resitel_id and | ||||||
|  |         ((akt_body.rocnik = min_body.rocnik and akt_body.cislo >= min_body.cislo) or | ||||||
|  |          (akt_body.rocnik < min_body.rocnik) | ||||||
|  |         ) | ||||||
|  |       ) | ||||||
|  |   group by akt_body.id, akt_body.cislo_id, akt_body.resitel_id, akt_body.body | ||||||
|  |   order by body_celkem desc; | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [("seminar", "0027_export_flag_a_typ_akce")] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.RunSQL(sql=CREATE_VIEWS) | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
							
								
								
									
										51
									
								
								seminar/migrations/0029_fix_body_celkem_views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								seminar/migrations/0029_fix_body_celkem_views.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | ||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | from django.db import models, migrations | ||||||
|  | import django_countries.fields | ||||||
|  | import seminar.models | ||||||
|  | import django.utils.timezone | ||||||
|  | from django.conf import settings | ||||||
|  | 
 | ||||||
|  | CREATE_VIEWS=""" | ||||||
|  | 
 | ||||||
|  | drop view seminar_body_k_cislu_rocnik; | ||||||
|  | create view seminar_body_k_cislu_rocnik as | ||||||
|  |   select | ||||||
|  |     seminar_cisla.id || '-' || min_body.resitel_id as id, | ||||||
|  |     seminar_cisla.id as cislo_id, | ||||||
|  |     min_body.resitel_id as resitel_id, | ||||||
|  |     sum(min_body.body) as body | ||||||
|  |   from | ||||||
|  |     seminar_cisla | ||||||
|  |     inner join seminar_body_za_cislo as min_body on | ||||||
|  |       (min_body.rocnik_id = seminar_cisla.rocnik_id and seminar_cisla.cislo >= min_body.cislo) | ||||||
|  |   group by seminar_cisla.id, min_body.resitel_id | ||||||
|  |   order by body desc; | ||||||
|  | 
 | ||||||
|  | drop view seminar_body_k_cislu_odjakziva; | ||||||
|  | create view seminar_body_k_cislu_odjakziva as | ||||||
|  |   select | ||||||
|  |     seminar_cisla.id || '-' || min_body.resitel_id as id, | ||||||
|  |     seminar_cisla.id as cislo_id, | ||||||
|  |     min_body.resitel_id as resitel_id, | ||||||
|  |     sum(min_body.body) as body | ||||||
|  |   from | ||||||
|  |     seminar_cisla | ||||||
|  |     inner join seminar_rocniky on | ||||||
|  |       (seminar_cisla.rocnik_id = seminar_rocniky.id) | ||||||
|  |     inner join seminar_body_za_cislo as min_body on | ||||||
|  |       (min_body.rocnik_id = seminar_cisla.rocnik_id and seminar_cisla.cislo >= min_body.cislo) or | ||||||
|  |       (min_body.rocnik < seminar_rocniky.rocnik) | ||||||
|  |   group by seminar_cisla.id, min_body.resitel_id | ||||||
|  |   order by body desc; | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | class Migration(migrations.Migration): | ||||||
|  | 
 | ||||||
|  |     dependencies = [("seminar", "0028_add_body_celkem_views")] | ||||||
|  | 
 | ||||||
|  |     operations = [ | ||||||
|  |         migrations.RunSQL(sql=CREATE_VIEWS) | ||||||
|  |         ] | ||||||
|  | 
 | ||||||
|  | @ -650,9 +650,9 @@ class VysledkyBase(SeminarModelBase): | ||||||
| 
 | 
 | ||||||
|     def __str__(self): |     def __str__(self): | ||||||
|         return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) |         return force_unicode(u"%s: %sb (%s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) | ||||||
|         # NOTE: DB HOG (ale nepouzivany) |         # NOTE: DB zatez pri vypisu (ale nepouzivany) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| @python_2_unicode_compatible |  | ||||||
| class VysledkyZaCislo(VysledkyBase): | class VysledkyZaCislo(VysledkyBase): | ||||||
| 
 | 
 | ||||||
|     class Meta: |     class Meta: | ||||||
|  | @ -660,25 +660,27 @@ class VysledkyZaCislo(VysledkyBase): | ||||||
|         abstract = False |         abstract = False | ||||||
|         managed = False |         managed = False | ||||||
| 
 | 
 | ||||||
|     def __str__(self): |  | ||||||
|         # NOTE: DB HOG (ale nepouzivany) |  | ||||||
|         return force_unicode(u"%s: %sb (za %s)" % (self.resitel.plne_jmeno(), self.body, str(self.cislo))) |  | ||||||
| 
 | 
 | ||||||
| 
 | class VysledkyKCisluZaRocnik(VysledkyBase): | ||||||
| @python_2_unicode_compatible |  | ||||||
| class VysledkyKCislu(VysledkyBase): |  | ||||||
| 
 | 
 | ||||||
|     class Meta: |     class Meta: | ||||||
|         db_table = 'seminar_body_k_cislu' |         db_table = 'seminar_body_k_cislu_rocnik' | ||||||
|         abstract = False |         abstract = False | ||||||
|         managed = False |         managed = False | ||||||
| 
 | 
 | ||||||
|     body_celkem = models.DecimalField(max_digits=8, decimal_places=1, db_column='body_celkem', | #    body = models.DecimalField(max_digits=8, decimal_places=1, db_column='body', | ||||||
|             verbose_name=u'body celkem do čísla') | #            verbose_name=u'body do čísla (za ročník)') | ||||||
| 
 | 
 | ||||||
|     def __str__(self): | 
 | ||||||
|         # NOTE: DB HOG (ale nepouzivany) | class VysledkyKCisluOdjakziva(VysledkyBase): | ||||||
|         return force_unicode(u"%s: %sb / %sb (do %s)" % (self.resitel.plne_jmeno(), self.body, self.body_celkem, str(self.cislo))) | 
 | ||||||
|  |     class Meta: | ||||||
|  |         db_table = 'seminar_body_k_cislu_odjakziva' | ||||||
|  |         abstract = False | ||||||
|  |         managed = False | ||||||
|  | 
 | ||||||
|  | #    body = models.DecimalField(max_digits=8, decimal_places=1, db_column='body', | ||||||
|  | #            verbose_name=u'body do čísla (i minulé ročníky)') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @python_2_unicode_compatible | @python_2_unicode_compatible | ||||||
|  |  | ||||||
|  | @ -34,17 +34,19 @@ | ||||||
|       {% for p in problemy %} |       {% for p in problemy %} | ||||||
|       <th class='border-r'><a href="{{ p.verejne_url }}">{{ p.cislo_zadani.cislo }}.{{ p.kod }}</a> |       <th class='border-r'><a href="{{ p.verejne_url }}">{{ p.cislo_zadani.cislo }}.{{ p.kod }}</a> | ||||||
|       {% endfor %} |       {% endfor %} | ||||||
|       <th class='border-r'>Sum |       <th class='border-r'>Sum<sup>-1</sup> | ||||||
|       <th>Celkem |       <th>Celkem | ||||||
|  |       <th>Odjakživa | ||||||
|   {% for rv in vysledkovka %} |   {% for rv in vysledkovka %} | ||||||
|     <tr> |     <tr> | ||||||
|       <td class='border-r'>{{ rv.poradi }} |       <td class='border-r'>{{ rv.poradi }} | ||||||
|       <th class='border-r'>{{ rv.resitel.plne_jmeno }} [{{ rv.resitel.id }}] |         <th class='border-r'>{{ rv.resitel.plne_jmeno }} {{ rv.titul }} | ||||||
|       {% for b in rv.body %} |       {% for b in rv.body %} | ||||||
|       <td class='border-r'>{{ b }} |       <td class='border-r'>{{ b }} | ||||||
|       {% endfor %} |       {% endfor %} | ||||||
|       <td class='border-r'>{{ rv.vysledek.body |default:0 }} |       <td class='border-r'>{{ rv.body_minule }} | ||||||
|       <td>{{ rv.vysledek.body_celkem }} |       <td><b>{{ rv.body_celkem_rocnik }}</b> | ||||||
|  |       <td>{{ rv.body_celkem_odjakziva }} | ||||||
|     </tr> |     </tr> | ||||||
|   {% endfor %} |   {% endfor %} | ||||||
|   </table> |   </table> | ||||||
|  |  | ||||||
|  | @ -22,12 +22,12 @@ | ||||||
| {% for rv in vysledkovka %} | {% for rv in vysledkovka %} | ||||||
|     {{ rv.poradi }} &  |     {{ rv.poradi }} &  | ||||||
| {% if rv.resitel.titul %}  | {% if rv.resitel.titul %}  | ||||||
| 	\titul{ {{ rv.resitel.titul }} }  | 	\titul{ {{ rv.titul }} }  | ||||||
| {% endif %}  | {% endif %}  | ||||||
| 	{{ rv.resitel.plne_jmeno }} & {{ rv.resitel.rocnik |default:"" }} & {{ rv.body_minule }}  | 	{{ rv.resitel.plne_jmeno }} & {{ rv.resitel.rocnik |default:"" }} & {{ rv.body_minule }}  | ||||||
|     {% for b in rv.body %} |     {% for b in rv.body %} | ||||||
| 		{{ b }} &  | 		{{ b }} &  | ||||||
| 	{% endfor %}  | 	{% endfor %}  | ||||||
| 		{{ rv.vysledek.body |default:0 }} & {{ rv.vysledek.body_celkem }} \\ | 		{{ rv.body_celkem_rocnik |default:0 }} & {{ rv.body_celkem_minule }} \\ | ||||||
| {% endfor %} | {% endfor %} | ||||||
| \end{longtable} | \end{longtable} | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								seminar/templates/seminar/stav_databaze.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								seminar/templates/seminar/stav_databaze.html
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | ||||||
|  | {% extends "base.html" %} | ||||||
|  | 
 | ||||||
|  | {% block content %} | ||||||
|  | <div> | ||||||
|  |   <h2>Stav databáze</h2> | ||||||
|  | 
 | ||||||
|  |   <h3>Řešitelé</h3> | ||||||
|  | 
 | ||||||
|  |   <div>Řešitelů: {{ resitele |length}} ({{ muzi |length}} mužů, {{ zeny |length}} žen)</div> | ||||||
|  |   <div>Křestní jména mužů:</div> | ||||||
|  |   <p><code>{% for n, c in jmena_muzu.items %}{{ n }} ({{ c }}), {% endfor %}</code> | ||||||
|  |   <div>Křestní jména žen:</div> | ||||||
|  |   <p><code>{% for n, c in jmena_zen.items %}{{ n }} ({{ c }}), {% endfor %}</code> | ||||||
|  | 
 | ||||||
|  |   <h3>Nastavení</h3> | ||||||
|  | 
 | ||||||
|  |   <h3>Problémy</h3> | ||||||
|  |   {% for p in problemy %} | ||||||
|  |   <div>{{ p |safe }}</div> | ||||||
|  |   {% endfor %} | ||||||
|  | 
 | ||||||
|  | </div> | ||||||
|  | {% endblock content %} | ||||||
|  | 
 | ||||||
|  | @ -17,6 +17,8 @@ urlpatterns = patterns('', | ||||||
| 
 | 
 | ||||||
|     url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), |     url(r'^zadani/aktualni/$', views.AktualniZadaniView, name='seminar_aktualni_zadani'), | ||||||
| 
 | 
 | ||||||
|  |     url(r'^stav$', views.StavDatabazeView, name='stav_databaze'), | ||||||
|  | 
 | ||||||
|     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/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'), | ||||||
|  |  | ||||||
|  | @ -1,5 +1,17 @@ | ||||||
| # -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||||||
| 
 | 
 | ||||||
|  | import datetime | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def histogram(seznam): | ||||||
|  |     d = {} | ||||||
|  |     for i in seznam: | ||||||
|  |         if i not in d: | ||||||
|  |             d[i] = 0 | ||||||
|  |         d[i] += 1 | ||||||
|  |     return d | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| roman_numerals = zip((1000, 900,  500, 400, 100,  90, 50,  40, 10,  9,   5,  4,   1), | roman_numerals = zip((1000, 900,  500, 400, 100,  90, 50,  40, 10,  9,   5,  4,   1), | ||||||
|                      ('M',  'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')) |                      ('M',  'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')) | ||||||
| 
 | 
 | ||||||
|  | @ -18,3 +30,49 @@ def from_roman(rom): | ||||||
|             return i + from_roman(rom[len(n):]) |             return i + from_roman(rom[len(n):]) | ||||||
|     raise Exception('Invalid roman numeral: "%s"', rom) |     raise Exception('Invalid roman numeral: "%s"', rom) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | def seznam_problemu(): | ||||||
|  |     from .models import Problem, Resitel, Rocnik, Reseni, Cislo | ||||||
|  |     problemy = [] | ||||||
|  | 
 | ||||||
|  |     # Pomocna fce k formatovani problemovych hlasek | ||||||
|  |     def prb(cls, msg, objs=None): | ||||||
|  |         s = u'<b>%s:</b> %s' % (cls.__name__, msg) | ||||||
|  |         if objs: | ||||||
|  |             s += u' [' | ||||||
|  |             for o in objs: | ||||||
|  |                 try: | ||||||
|  |                     url = o.admin_url() | ||||||
|  |                 except: | ||||||
|  |                     url = None | ||||||
|  |                 if url: | ||||||
|  |                     s += u'<a href="%s">%s</a>, ' % (url, o.pk, ) | ||||||
|  |                 else: | ||||||
|  |                     s += u'%s, ' % (o.pk, ) | ||||||
|  |             s = s[:-2] + u']' | ||||||
|  |         problemy.append(s) | ||||||
|  | 
 | ||||||
|  |     # Duplicita jmen | ||||||
|  |     jmena = {} | ||||||
|  |     for r in Resitel.objects.all(): | ||||||
|  |         j = r.plne_jmeno() | ||||||
|  |         if j not in jmena: | ||||||
|  |             jmena[j] = [] | ||||||
|  |         jmena[j].append(r) | ||||||
|  |     for j in jmena: | ||||||
|  |         if len(jmena[j]) > 1: | ||||||
|  |             prb(Resitel, u'Duplicitní jméno "%s"' % (j, ), jmena[j]) | ||||||
|  | 
 | ||||||
|  |     # Data maturity a narození | ||||||
|  |     for r in Resitel.objects.all(): | ||||||
|  |         if not r.rok_maturity: | ||||||
|  |             prb(Resitel, u'Neznámý rok maturity', [r]) | ||||||
|  |         if r.rok_maturity and (r.rok_maturity < 1990 or r.rok_maturity > datetime.date.today().year + 10): | ||||||
|  |             prb(Resitel, u'Podezřelé datum maturity', [r]) | ||||||
|  |         if r.datum_narozeni and (r.datum_narozeni.year < 1970 or r.datum_narozeni.year > datetime.date.today().year - 12): | ||||||
|  |             prb(Resitel, u'Podezřelé datum narození', [r]) | ||||||
|  | #        if not r.email: | ||||||
|  | #            prb(Resitel, u'Neznámý email', [r]) | ||||||
|  | 
 | ||||||
|  |     return problemy | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -5,8 +5,9 @@ from django.views import generic | ||||||
| from django.utils.translation import ugettext as _ | from django.utils.translation import ugettext as _ | ||||||
| from django.http import Http404 | from django.http import Http404 | ||||||
| 
 | 
 | ||||||
| from .models import Problem, Cislo, Reseni, VysledkyKCislu, Nastaveni, Rocnik, Soustredeni, Organizator | from .models import Problem, Cislo, Reseni, Nastaveni, Rocnik, Soustredeni, Organizator, Resitel | ||||||
| 
 | from .models import VysledkyZaCislo, VysledkyKCisluZaRocnik, VysledkyKCisluOdjakziva | ||||||
|  | from . import utils | ||||||
| 
 | 
 | ||||||
| def AktualniZadaniView(request): | def AktualniZadaniView(request): | ||||||
|     nastaveni = get_object_or_404(Nastaveni) |     nastaveni = get_object_or_404(Nastaveni) | ||||||
|  | @ -146,7 +147,7 @@ class CisloView(generic.DetailView): | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super(CisloView, self).get_context_data(**kwargs) |         context = super(CisloView, self).get_context_data(**kwargs) | ||||||
| 
 | 
 | ||||||
|         vysledky = VysledkyKCislu.objects.filter(cislo = context['cislo']).order_by('-body_celkem').select_related("resitel") |         vysledky = VysledkyKCisluZaRocnik.objects.filter(cislo = context['cislo']).order_by('-body').select_related("resitel") | ||||||
|         reseni = Reseni.objects.filter(cislo_body = context['cislo']).select_related("resitel") |         reseni = Reseni.objects.filter(cislo_body = context['cislo']).select_related("resitel") | ||||||
| 
 | 
 | ||||||
|         problemy = sorted(list(set([r.problem for r in reseni])), key=lambda x:(0 if x.typ==Problem.TYP_ULOHA else 1,x.kod)) |         problemy = sorted(list(set([r.problem for r in reseni])), key=lambda x:(0 if x.typ==Problem.TYP_ULOHA else 1,x.kod)) | ||||||
|  | @ -168,17 +169,22 @@ class CisloView(generic.DetailView): | ||||||
|             v = vysledky[vi] |             v = vysledky[vi] | ||||||
|             tv = RadekVysledkovky() |             tv = RadekVysledkovky() | ||||||
|             tv.resitel = v.resitel   |             tv.resitel = v.resitel   | ||||||
|             tv.rocnik = tv.resitel.rocnik(context['cislo'].datum_vydani) |  | ||||||
|             tv.resitel.titul = tv.resitel.titul(v.body_celkem) |             tv.resitel.titul = tv.resitel.titul(v.body_celkem) | ||||||
|  |             tv.rocnik = tv.resitel.rocnik(context['cislo'].rocnik) | ||||||
|             tv.vysledek = v |             tv.vysledek = v | ||||||
|             #odkazuje na VysledkyKCislu |             #odkazuje na VysledkyKCislu | ||||||
|             tv.body = ['']*len(problemy) |             tv.body = ['']*len(problemy) | ||||||
|             #pole bodu za ulohy |             #pole bodu za ulohy | ||||||
|             tv.poradi = '' |             tv.poradi = '' | ||||||
|             #defaultni poradi je prazdne - kvuli sdilenym mistum |             #defaultni poradi je prazdne - kvuli sdilenym mistum | ||||||
|             tv.body_minule = 0 |             tv.body_celkem_rocnik = v.body | ||||||
|  |             tv.body_celkem_odjakziva = VysledkyKCisluOdjakziva.objects.get(resitel=v.resitel, cislo=context['cislo']).body | ||||||
|  |             body_cislo_q = VysledkyZaCislo.objects.filter(resitel=v.resitel, cislo=context['cislo']) | ||||||
|  |             tv.body_cislo = body_cislo_q[0].body if len(body_cislo_q) > 0 else 0 | ||||||
|  |             tv.body_minule = tv.body_celkem_rocnik - tv.body_cislo | ||||||
|  |             tv.titul = tv.resitel.titul(tv.body_celkem_odjakziva) | ||||||
|             #pocet bodu do tohoto cisla |             #pocet bodu do tohoto cisla | ||||||
|             if posledni_body > v.body_celkem: |             if posledni_body > tv.body_celkem_rocnik: | ||||||
|                 if stejne_body.get(posledni_body): |                 if stejne_body.get(posledni_body): | ||||||
|                     konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body] |                     konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body] | ||||||
|                     #druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body |                     #druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body | ||||||
|  | @ -187,16 +193,16 @@ class CisloView(generic.DetailView): | ||||||
|                 elif predchozi_poradi : |                 elif predchozi_poradi : | ||||||
|                     predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi) |                     predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi) | ||||||
|                     #pokud nebyl rozsah hodnot, pridam tecku za cislo |                     #pokud nebyl rozsah hodnot, pridam tecku za cislo | ||||||
|                 posledni_body = v.body_celkem |                 posledni_body = tv.body_celkem_rocnik | ||||||
|                 tv.poradi = vi + 1 |                 tv.poradi = vi + 1 | ||||||
|                 #poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly |                 #poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly | ||||||
|                 predchozi_poradi = tv |                 predchozi_poradi = tv | ||||||
|             elif posledni_body == v.body_celkem: |             elif posledni_body == tv.body_celkem_rocnik: | ||||||
|                 if not stejne_body.get(v.body_celkem): |                 if not stejne_body.get(tv.body_celkem_rocnik): | ||||||
|                     stejne_body[v.body_celkem] = 1 |                     stejne_body[tv.body_celkem_rocnik] = 1 | ||||||
|                     #pokud klic neexistuje, zalozim novy pro tohoto resitele |                     #pokud klic neexistuje, zalozim novy pro tohoto resitele | ||||||
|                 else: |                 else: | ||||||
|                     stejne_body[v.body_celkem] += 1 |                     stejne_body[tv.body_celkem_rocnik] += 1 | ||||||
|                     #rozsirim pocet resitelu sdilejici stejnou pozici |                     #rozsirim pocet resitelu sdilejici stejnou pozici | ||||||
|             vysledky_resitele[v.resitel.id] = tv |             vysledky_resitele[v.resitel.id] = tv | ||||||
|             #odkaz na radek vysledkovky patrici danemu resiteli |             #odkaz na radek vysledkovky patrici danemu resiteli | ||||||
|  | @ -204,10 +210,6 @@ class CisloView(generic.DetailView): | ||||||
| 
 | 
 | ||||||
|         for r in reseni: |         for r in reseni: | ||||||
|             vysledky_resitele[r.resitel.id].body[problem_index[r.problem.id]] = r.body |             vysledky_resitele[r.resitel.id].body[problem_index[r.problem.id]] = r.body | ||||||
|             body_za_cislo = vysledky_resitele[r.resitel.id].vysledek.body |  | ||||||
|             #body za toto cislo, stejne jako tv.vysledek.body |  | ||||||
|             body_celkem = vysledky_resitele[r.resitel.id].vysledek.body_celkem |  | ||||||
|             vysledky_resitele[r.resitel.id].body_minule = body_celkem - body_za_cislo  |  | ||||||
|          |          | ||||||
| 
 | 
 | ||||||
|         context['vysledkovka'] = vysledkovka |         context['vysledkovka'] = vysledkovka | ||||||
|  | @ -242,3 +244,22 @@ class SoustredeniListView(generic.ListView): | ||||||
| class SoustredeniView(generic.DetailView): | class SoustredeniView(generic.DetailView): | ||||||
|     model = Soustredeni |     model = Soustredeni | ||||||
|     template_name = 'seminar/archiv/soustredeni.html' |     template_name = 'seminar/archiv/soustredeni.html' | ||||||
|  | 
 | ||||||
|  | ### Status | ||||||
|  | 
 | ||||||
|  | def StavDatabazeView(request): | ||||||
|  | #    nastaveni = Nastaveni.objects.get() | ||||||
|  |     problemy = utils.seznam_problemu() | ||||||
|  |     muzi = Resitel.objects.filter(pohlavi_muz=True) | ||||||
|  |     zeny = Resitel.objects.filter(pohlavi_muz=False) | ||||||
|  |     return render(request, 'seminar/stav_databaze.html', | ||||||
|  |             { | ||||||
|  | #                'nastaveni': nastaveni, | ||||||
|  |                 'problemy': problemy, | ||||||
|  | 
 | ||||||
|  |                 'resitele': Resitel.objects.all(), | ||||||
|  |                 'muzi': muzi, | ||||||
|  |                 'zeny': zeny, | ||||||
|  |                 'jmena_muzu': utils.histogram([r.jmeno for r in muzi]), | ||||||
|  |                 'jmena_zen': utils.histogram([r.jmeno for r in zeny]), | ||||||
|  |             }) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Aneta
						Aneta