diff --git a/seminar/models.py b/seminar/models.py index c93ac71d..2e8daa4a 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -681,6 +681,23 @@ class VysledkyKCislu(VysledkyBase): return force_unicode(u"%s: %sb / %sb (do %s)" % (self.resitel.plne_jmeno(), self.body, self.body_celkem, str(self.cislo))) +@python_2_unicode_compatible +class VysledkyCelkemKCislu(VysledkyBase): + + class Meta: + db_table = 'seminar_body_celkem_k_cislu' + abstract = False + managed = False + + body_celkem = models.DecimalField(max_digits=8, decimal_places=1, db_column='body_celkem', + verbose_name=u'body celkem do čísla včetně minulých ročníků') + + def __str__(self): + # NOTE: DB HOG (ale nepouzivany) + return force_unicode(u"%s: %sb / %sb (do %s)" % (self.resitel.plne_jmeno(), self.body, self.body_celkem, str(self.cislo))) +#mozna potreba upravit + + @reversion.register(ignore_duplicate_revisions=True) @python_2_unicode_compatible class Nastaveni(SingletonModel): diff --git a/seminar/views.py b/seminar/views.py index f7e099dc..a33bfedf 100644 --- a/seminar/views.py +++ b/seminar/views.py @@ -45,6 +45,78 @@ class RocnikView(generic.DetailView): {'verbose_name': queryset.model._meta.verbose_name}) return obj + def get_context_data(self, **kwargs): + context = super(RocnikView, self).get_context_data(**kwargs) + + vysledkyCelkem = VysledkyCelkemKCislu.objects.all().order_by('-body_celkem').select_related("resitel") + # vysledkyCisla = VysledkyKCislu.objects.filter(cislo.rocnik = context[]) + + problemy = sorted(list(set([r.problem for r in reseni])), key=lambda x:(0 if x.typ==Problem.TYP_ULOHA else 1,x.kod)) + #setridi problemy podle typu a poradi zadani + problem_index = {} + for i in range(len(problemy)): + problem_index[problemy[i].id] = i + #umoznuje zjistit index podle id problemu + + vysledky_resitele = {} + stejne_body = {} + konec_rozmezi = {} + vysledkovka = [] + posledni_body = 100000 + predchozi_poradi = None + body_minule = None + + for vi in range(len(vysledky)): + v = vysledky[vi] + tv = RadekVysledkovky() + tv.resitel = v.resitel + tv.rocnik = tv.resitel.rocnik(context['cislo'].datum_vydani) + tv.resitel.titul = tv.resitel.titul(v.body_celkem) + tv.vysledek = v + #odkazuje na VysledkyKCislu + tv.body = ['']*len(problemy) + #pole bodu za ulohy + tv.poradi = '' + #defaultni poradi je prazdne - kvuli sdilenym mistum + tv.body_minule = 0 + #pocet bodu do tohoto cisla + if posledni_body > v.body_celkem: + if stejne_body.get(posledni_body): + konec_rozmezi[posledni_body] = int(predchozi_poradi.poradi) + stejne_body[posledni_body] + #druha hranice sdilenych pozic - zacatek + pocet lidi se stejnymi body + predchozi_poradi.poradi = '{0}. -- {1}.'.format(predchozi_poradi.poradi,konec_rozmezi[posledni_body]) + #predchozi radek ktery menil pocty bodu bude mit rozsah, pokud bylo vice radku se stejnym poctem bodu + elif predchozi_poradi : + predchozi_poradi.poradi = '{0}.'.format(predchozi_poradi.poradi) + #pokud nebyl rozsah hodnot, pridam tecku za cislo + posledni_body = v.body_celkem + tv.poradi = vi + 1 + #poradi se meni jen u resitele s rozdilnym poctem bodu nez mel minuly + predchozi_poradi = tv + elif posledni_body == v.body_celkem: + if not stejne_body.get(v.body_celkem): + stejne_body[v.body_celkem] = 1 + #pokud klic neexistuje, zalozim novy pro tohoto resitele + else: + stejne_body[v.body_celkem] += 1 + #rozsirim pocet resitelu sdilejici stejnou pozici + vysledky_resitele[v.resitel.id] = tv + #odkaz na radek vysledkovky patrici danemu resiteli + vysledkovka.append(tv) + + for r in reseni: + 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['problemy'] = problemy + return context + + class ProblemView(generic.DetailView): model = Problem template_name = 'seminar/archiv/problem.html' @@ -96,7 +168,7 @@ class CisloView(generic.DetailView): v = vysledky[vi] tv = RadekVysledkovky() tv.resitel = v.resitel - tv.rocnik = tv.resitel.rocnik(context['cislo'].rocnik) + tv.rocnik = tv.resitel.rocnik(context['cislo'].datum_vydani) tv.resitel.titul = tv.resitel.titul(v.body_celkem) tv.vysledek = v #odkazuje na VysledkyKCislu @@ -152,6 +224,15 @@ class CisloVysledkovkaView(CisloView): content_type = 'text/plain; charset=UTF8' #vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani +class RocnikVysledkovkaView(RocnikView): + model = Rocnik + template_name = 'seminar/archiv/rocnik_vysledkovka.tex' + #content_type = 'application/x-tex; charset=UTF8' + #umozni rovnou stahnout TeXovsky dokument + content_type = 'text/plain; charset=UTF8' + #vypise na stranku textovy obsah vyTeXane vysledkovky k okopirovani + + ### Soustredeni class SoustredeniListView(generic.ListView):