Merge branch 'data_migrations' into test
This commit is contained in:
		
						commit
						7ecf2ae9ff
					
				
					 5 changed files with 57 additions and 23 deletions
				
			
		
							
								
								
									
										19
									
								
								seminar/migrations/0092_auto_20210309_2049.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								seminar/migrations/0092_auto_20210309_2049.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| # Generated by Django 2.2.15 on 2021-03-09 19:49 | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| import django.db.models.deletion | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('seminar', '0091_resitel_zasilat_cislo_emailem'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='tema', | ||||
|             name='rocnik', | ||||
|             field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='temata', to='seminar.Rocnik', verbose_name='ročník'), | ||||
|         ), | ||||
|     ] | ||||
|  | @ -962,6 +962,7 @@ class Clanek(Problem): | |||
| 	cislo = models.ForeignKey(Cislo, blank=True, null=True, on_delete=models.PROTECT, | ||||
| 		verbose_name='číslo vydání', related_name='vydane_clanky') | ||||
| 
 | ||||
| 	@cached_property | ||||
| 	def kod_v_rocniku(self): | ||||
| 		if self.stav == 'zadany': | ||||
| # Nemělo by být potřeba | ||||
|  |  | |||
|  | @ -22,12 +22,12 @@ function sousdeadline() { | |||
|   {% if typ_deadline == 'soustredeni' %} | ||||
|   <a href="" onClick="sousdeadline()" | ||||
|      title="Body za řešení, která nám přijdou do tohoto deadlinu, se ještě započítají pro účast na připravovaném soustředění."> | ||||
|      deadlinu</a> odeslání <a href="/zadani/aktualni/">řešení | ||||
|      deadlinu</a> odeslání <a href="/aktualni/zadani/">řešení | ||||
|   </a> pro účast na soustředění | ||||
| 
 | ||||
|   {% elif typ_deadline == 'preddeadline' %} <a href="" onClick="preddeadline()" | ||||
|   title="Řešení, která nám přijdou do tohoto deadlinu, se pokusíme opravit co nejdříve, abyste měli ještě šanci si je ještě opravit před definitivním deadlinem čísla.">1. deadlinu</a> aktuálního <a href="/zadani/aktualni/">čísla</a>  | ||||
|   {% else %} deadlinu aktuálního <a href="/zadani/aktualni/">čísla</a>  | ||||
|   title="Řešení, která nám přijdou do tohoto deadlinu, se pokusíme opravit co nejdříve, abyste měli ještě šanci si je ještě opravit před definitivním deadlinem čísla.">1. deadlinu</a> aktuálního <a href="/aktualni/zadani/">čísla</a>  | ||||
|   {% else %} deadlinu aktuálního <a href="/aktualni/zadani/">čísla</a>  | ||||
|   {% endif %}zbývá: | ||||
|       {{nejblizsi_deadline|timeuntil}}</big></b></p> | ||||
| </div> | ||||
|  | @ -48,27 +48,31 @@ function sousdeadline() { | |||
|   </h1> | ||||
| 
 | ||||
|   <div> | ||||
|     M&M je korespondenční seminář. Vydáváme časopis a v něm zajímavé podněty k přemýšlení. Ty na ně můžeš reagovat, | ||||
|     experimentovat a objevovat s námi fascinující zákoutí matiky, fyziky a informatiky. | ||||
|     M&M je korespondenční seminář pro středoškoláky. Vydáváme časopis, v němž najdeš různá témata z matematiky, fyziky a informatiky.  | ||||
|     Součástí témat jsou problémy a úlohy, nad kterými se můžeš zamyslet, experimentovat a bádat. | ||||
|     <a href="prihlaska/?"> <div class="button"> Zaregistruj se! </div> </a> | ||||
|     M&M je taky soutěž. Za svá řešení dostaneš body a můžeš vyhrát zajímavé ceny, dostat se | ||||
|     na Matfyz bez přijímaček a především, můžeš s námi jet na skvělé soustředění. | ||||
|     <a href="cojemam/odmeny"> <div class="button"> Co můžeš vyhrát? </div> </a> {# FIXME odkaz #} | ||||
|   </div> | ||||
|     </div> | ||||
|    | ||||
| </div> | ||||
| 
 | ||||
| <div class="temata_titulka"> | ||||
| 
 | ||||
|   <h1> | ||||
|       Řeš témata! | ||||
|       Vyřeš to! | ||||
|   </h1> | ||||
| 
 | ||||
|   <div> | ||||
|     M&M je taky soutěž. Řešení, která nám pošleš, opravíme, a dostaneš za ně body. Můžeš vyhrát zajímavé ceny, dostat se | ||||
|     na Matfyz bez přijímaček a především, můžeš s námi jet na skvělé soustředění. | ||||
|     <br><br> | ||||
|     <a href="cojemam/odmeny"> <div class="button"> Co můžeš vyhrát? </div> </a> {# FIXME odkaz #} | ||||
|    | ||||
| <!-- | ||||
|     Přidej se k nám! Pusť se do řešení témát. | ||||
|     {% for tema in aktualni_temata %} | ||||
|     <a href="{{ tema.url }}"> <div class="button"> {{ tema.nazev }} </div> </a> | ||||
|     {% endfor %} | ||||
| --> | ||||
|   </div> | ||||
|    | ||||
| </div> | ||||
|  |  | |||
|  | @ -230,7 +230,7 @@ def cisla_rocniku(rocnik, jen_verejne=True): | |||
| 		seznam objektů typu Cislo | ||||
| 	"""	 | ||||
| 	if jen_verejne: | ||||
| 		return rocnik.verejna_cisla() | ||||
| 		return rocnik.verejne_vysledkovky_cisla() | ||||
| 	else: | ||||
| 		return rocnik.cisla.all().order_by('poradi') | ||||
| 
 | ||||
|  |  | |||
|  | @ -48,7 +48,7 @@ def sloupec_s_poradim(setrizene_body): | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| def body_resitelu(resitele, za, odjakziva=True): | ||||
| def body_resitelu(resitele, za, odjakziva=True, jen_verejne=False): | ||||
| 	""" Funkce počítající počty bodů pro zadané řešitele,  | ||||
| 	buď odjakživa do daného ročníku/čísla anebo za daný ročník/číslo. | ||||
| 	Parametry: | ||||
|  | @ -94,12 +94,22 @@ def body_resitelu(resitele, za, odjakziva=True): | |||
| 		body_k_zapocteni = Sum('reseni__hodnoceni__body', | ||||
| 			filter=( Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok=rok, | ||||
| 					reseni__hodnoceni__cislo_body__poradi__lte=cislo.poradi) )) | ||||
| 	elif rocnik and odjakziva: # Spočítáme body za starší ročníky až do zadaného včetně.	 | ||||
| 		body_k_zapocteni = Sum('reseni__hodnoceni__body',  | ||||
| 			filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok)) | ||||
| 	elif rocnik and odjakziva: # Spočítáme body za starší ročníky až do zadaného včetně. | ||||
| 		if jen_verejne: | ||||
| 			body_k_zapocteni = Sum('reseni__hodnoceni__body', | ||||
| 									filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok, | ||||
| 											reseni__hodnoceni__cislo_body__verejna_vysledkovka=True)) | ||||
| 		else: | ||||
| 			body_k_zapocteni = Sum('reseni__hodnoceni__body', | ||||
| 				filter= Q(reseni__hodnoceni__cislo_body__rocnik__prvni_rok__lte=rok)) | ||||
| 	elif rocnik and not odjakziva: # Spočítáme body za daný ročník. | ||||
| 		body_k_zapocteni = Sum('reseni__hodnoceni__body', | ||||
| 			filter= Q(reseni__hodnoceni__cislo_body__rocnik=rocnik)) | ||||
| 		if jen_verejne: | ||||
| 			body_k_zapocteni = Sum('reseni__hodnoceni__body', | ||||
| 								   filter=Q(reseni__hodnoceni__cislo_body__rocnik=rocnik, | ||||
| 											reseni__hodnoceni__cislo_body__verejna_vysledkovka=True)) | ||||
| 		else: | ||||
| 			body_k_zapocteni = Sum('reseni__hodnoceni__body', | ||||
| 								   filter=Q(reseni__hodnoceni__cislo_body__rocnik=rocnik)) | ||||
| 	else:  | ||||
| 		assert True, "body_resitelu: Neplatná kombinace za a odjakživa." | ||||
| 
 | ||||
|  | @ -149,14 +159,14 @@ def vysledkovka_rocniku(rocnik, jen_verejne=True): | |||
| 		body_cisla_slov[cislo.id] = cislobody | ||||
| 
 | ||||
| 	# získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně | ||||
| 	resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele) | ||||
| 	resitel_rocnikbody_sezn = secti_body_za_rocnik(rocnik, aktivni_resitele, jen_verejne=jen_verejne) | ||||
| 
 | ||||
| 	# setřídíme řešitele podle počtu bodů a získáme seznam s body od nejvyšších po nenižší | ||||
| 	setrizeni_resitele_id, setrizene_body = setrid_resitele_a_body(resitel_rocnikbody_sezn) | ||||
| 	poradi = sloupec_s_poradim(setrizene_body) | ||||
| 
 | ||||
| 	# získáme body odjakživa | ||||
| 	resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, rocnik) | ||||
| 	resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, rocnik, jen_verejne=jen_verejne) | ||||
| 
 | ||||
| 	# vytvoříme jednotlivé sloupce výsledkovky | ||||
| 	radky_vysledkovky = [] | ||||
|  | @ -216,7 +226,7 @@ def pricti_body(slovnik, resitel, body): | |||
| 	 | ||||
| 	slovnik[resitel.id] += body | ||||
| 
 | ||||
| def secti_body_za_rocnik(za, aktivni_resitele): | ||||
| def secti_body_za_rocnik(za, aktivni_resitele, jen_verejne): | ||||
| 	""" Spočítá body za ročník (celý nebo do daného čísla),  | ||||
| 		setřídí je sestupně a vrátí jako seznam. | ||||
| 	Parametry: | ||||
|  | @ -224,7 +234,7 @@ def secti_body_za_rocnik(za, aktivni_resitele): | |||
| 						daného čísla | ||||
| 	""" | ||||
| 	# spočítáme všem řešitelům jejich body za ročník (False => ne odjakživa) | ||||
| 	resitel_rocnikbody_slov = body_resitelu(aktivni_resitele, za, False) | ||||
| 	resitel_rocnikbody_slov = body_resitelu(aktivni_resitele, za, False, jen_verejne=jen_verejne) | ||||
| 	# zeptáme se na dvojice (řešitel, body) za ročník a setřídíme sestupně | ||||
| 	resitel_rocnikbody_sezn = sorted(resitel_rocnikbody_slov.items(), | ||||
| 					key = lambda x: x[1], reverse = True) | ||||
|  | @ -380,10 +390,10 @@ def vysledkovka_cisla(cislo, context=None): | |||
| 	hlavni_problemy_slovnik, cislobody = secti_body_za_cislo(cislo, aktivni_resitele, hlavni_problemy) | ||||
| 
 | ||||
| 	# získáme body za ročník, seznam obsahuje dvojice (řešitel_id, body) setřízené sestupně | ||||
| 	resitel_rocnikbody_sezn = secti_body_za_rocnik(cislo, aktivni_resitele) | ||||
| 	resitel_rocnikbody_sezn = secti_body_za_rocnik(cislo, aktivni_resitele, jen_verejne=True) | ||||
| 
 | ||||
| 	# získáme body odjakživa | ||||
| 	resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, cislo) | ||||
| 	resitel_odjakzivabody_slov = body_resitelu(aktivni_resitele, cislo, jen_verejne=True) | ||||
| 
 | ||||
| 	# řešitelé setřídění podle bodů za číslo sestupně | ||||
| 	setrizeni_resitele_id = [dvojice[0] for dvojice in resitel_rocnikbody_sezn] | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Jonas Havelka
						Jonas Havelka