Deadliny u řešení
This commit is contained in:
		
							parent
							
								
									862ee994dc
								
							
						
					
					
						commit
						e30ae81854
					
				
					 7 changed files with 25 additions and 35 deletions
				
			
		|  | @ -66,7 +66,7 @@ $(document).ready(function(){ | ||||||
| {# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #} | {# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #} | ||||||
| <p>Forma: {{ object.get_forma_display }}</p> | <p>Forma: {{ object.get_forma_display }}</p> | ||||||
| 
 | 
 | ||||||
| <p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.cas_doruceni | deadline_html }}</p> | <p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.deadline_reseni | deadline_html }}</p> | ||||||
| 
 | 
 | ||||||
| {# Soubory: #} | {# Soubory: #} | ||||||
| <h3>Přílohy:</h3> | <h3>Přílohy:</h3> | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ | ||||||
| {# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #} | {# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #} | ||||||
| <p>Forma: {{ object.get_forma_display }}</p> | <p>Forma: {{ object.get_forma_display }}</p> | ||||||
| 
 | 
 | ||||||
| <p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.cas_doruceni | deadline_html }}</p> | <p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.deadline_reseni | deadline_html }}</p> | ||||||
| 
 | 
 | ||||||
| {# Soubory: #} | {# Soubory: #} | ||||||
| <h3>Přílohy:</h3> | <h3>Přílohy:</h3> | ||||||
|  |  | ||||||
|  | @ -29,7 +29,7 @@ | ||||||
| 		<td class="problem odevzdanareseni_small"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:27 }}</span></td> | 		<td class="problem odevzdanareseni_small"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:27 }}</span></td> | ||||||
| 		<td class="problem odevzdanareseni_mini"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:10 }}</span></td> | 		<td class="problem odevzdanareseni_mini"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:10 }}</span></td> | ||||||
|         <td>{{ hodn.body|default_if_none:"---" }}</td> |         <td>{{ hodn.body|default_if_none:"---" }}</td> | ||||||
| 		<td>{{ hodn.reseni.cas_doruceni | deadline_html }}</td> | 		<td>{{ hodn.deadline_body | deadline_html }}</td> | ||||||
| 	</tr> | 	</tr> | ||||||
| 	{% endfor %} | 	{% endfor %} | ||||||
| </table> | </table> | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
| {% block content %} | {% block content %} | ||||||
| 
 | 
 | ||||||
| {% for dl, mnozina_reseni in reseni_podle_deadlinu.items %} | {% for dl, mnozina_reseni in reseni_podle_deadlinu.items %} | ||||||
| <h1>{{ dl.2 | deadline_html }}</h1> | <h1>{{ dl | deadline_html }}</h1> | ||||||
| <ul> | <ul> | ||||||
| 	{% for obj in mnozina_reseni %} | 	{% for obj in mnozina_reseni %} | ||||||
| 	<li>{{ obj.sum_body }} b za <a href="{% url 'odevzdavatko_detail_reseni' pk=obj.id %}">{{ obj }}</a> ({{ obj.get_forma_display }} {{ obj.cas_doruceni }}) | 	<li>{{ obj.sum_body }} b za <a href="{% url 'odevzdavatko_detail_reseni' pk=obj.id %}">{{ obj }}</a> ({{ obj.get_forma_display }} {{ obj.cas_doruceni }}) | ||||||
|  |  | ||||||
|  | @ -202,7 +202,7 @@ class ReseniProblemuView(MultipleObjectTemplateResponseMixin, MultipleObjectMixi | ||||||
| 		# XXX: Předat groupby do template nejde: https://stackoverflow.com/questions/6906593/itertools-groupby-in-a-django-template | 		# XXX: Předat groupby do template nejde: https://stackoverflow.com/questions/6906593/itertools-groupby-in-a-django-template | ||||||
| 		# Django má {% regroup %}, ale ten potřebuje, aby klíč byl atribut položky: https://docs.djangoproject.com/en/3.2/ref/templates/builtins/#regroup | 		# Django má {% regroup %}, ale ten potřebuje, aby klíč byl atribut položky: https://docs.djangoproject.com/en/3.2/ref/templates/builtins/#regroup | ||||||
| 		# Takže rozbalíme groupby do slovníku klíč → seznam sami (dictionary comphrehension) | 		# Takže rozbalíme groupby do slovníku klíč → seznam sami (dictionary comphrehension) | ||||||
| 		ctx['reseni_podle_deadlinu'] = {k: list(v) for k,v in groupby(ctx['object_list'], lambda r: deadline(r.cas_doruceni))} | 		ctx['reseni_podle_deadlinu'] = {k: list(v) for k,v in groupby(ctx['object_list'], lambda r: r.deadline_reseni)} | ||||||
| 
 | 
 | ||||||
| 		# Pro sitetree: | 		# Pro sitetree: | ||||||
| 		ctx["resitel_id"] = self.kwargs['resitel'] | 		ctx["resitel_id"] = self.kwargs['resitel'] | ||||||
|  | @ -320,9 +320,8 @@ class PrehledOdevzdanychReseni(ListView): | ||||||
| 		ctx = super().get_context_data(*args, **kwargs) | 		ctx = super().get_context_data(*args, **kwargs) | ||||||
| 		# Ročník určujeme podle čísla, do jehož deadlinu došlo řešení. | 		# Ročník určujeme podle čísla, do jehož deadlinu došlo řešení. | ||||||
| 		# Chceme to mít seřazené, takže místo comphrerehsion ručně postavíme pole polí. Django templates neumí použít OrderedDict :-/ | 		# Chceme to mít seřazené, takže místo comphrerehsion ručně postavíme pole polí. Django templates neumí použít OrderedDict :-/ | ||||||
| 		# TODO: Funkce deadline vrací deadliny v jiném ročníku, zvlášť pokud se vyrobí řešení až po deadlinu (třeba při poslání mailem) |  | ||||||
| 		podle_rocniku = [] | 		podle_rocniku = [] | ||||||
| 		for rocnik, hodnoceni in groupby(ctx['object_list'], lambda ho: deadline(ho.reseni.cas_doruceni)[1].rocnik if deadline(ho.reseni.cas_doruceni) is not None else None): | 		for rocnik, hodnoceni in groupby(ctx['object_list'], lambda ho: ho.deadline_body.cislo.rocnik if ho.deadline_body is not None else None): | ||||||
| 			podle_rocniku.append((rocnik, list(hodnoceni))) | 			podle_rocniku.append((rocnik, list(hodnoceni))) | ||||||
| 		ctx['podle_rocniku'] = reversed(podle_rocniku) # Od nejnovějšího ročníku | 		ctx['podle_rocniku'] = reversed(podle_rocniku) # Od nejnovějšího ročníku | ||||||
| 		# TODO: Umožnit stažení / zobrazení řešení | 		# TODO: Umožnit stažení / zobrazení řešení | ||||||
|  |  | ||||||
|  | @ -78,6 +78,9 @@ class Reseni(bm.SeminarModelBase): | ||||||
|         return "{}({}): {}({})".format(self.resitele.first(),len(self.resitele.all()), self.problem.first() ,len(self.problem.all())) |         return "{}({}): {}({})".format(self.resitele.first(),len(self.resitele.all()), self.problem.first() ,len(self.problem.all())) | ||||||
|     # NOTE: Potenciální DB HOG (bez select_related) |     # NOTE: Potenciální DB HOG (bez select_related) | ||||||
| 
 | 
 | ||||||
|  |     def deadline_reseni(self): | ||||||
|  |         return am.Deadline.objects.filter(deadline__gte=self.cas_doruceni).order_by("deadline").first() | ||||||
|  | 
 | ||||||
| ## Pravdepodobne uz nebude potreba: | ## Pravdepodobne uz nebude potreba: | ||||||
| #	def save(self, *args, **kwargs): | #	def save(self, *args, **kwargs): | ||||||
| #		if ((self.cislo_body is None) and (self.problem.cislo_reseni) and | #		if ((self.cislo_body is None) and (self.problem.cislo_reseni) and | ||||||
|  |  | ||||||
|  | @ -1,44 +1,32 @@ | ||||||
| from django import template | from django import template | ||||||
| from django.utils.safestring import mark_safe | from django.utils.safestring import mark_safe | ||||||
| from seminar.utils import TypDeadline, deadline |  | ||||||
| register = template.Library() | register = template.Library() | ||||||
| 
 | import seminar.models as m | ||||||
| @register.filter(name='deadline') |  | ||||||
| def deadline_text(datum): |  | ||||||
| 	if deadline(datum) is None: |  | ||||||
| 		return 'Neznámý deadline' |  | ||||||
| 	typ, cislo, dl = deadline(datum) |  | ||||||
| 	strings = { |  | ||||||
| 		TypDeadline.PredDeadline: f"1. deadline čísla {cislo} ({dl})", |  | ||||||
| 		TypDeadline.SousDeadline: f"Soustřeďkový deadline čísla {cislo} ({dl})", |  | ||||||
| 		TypDeadline.FinalDeadline: f"Finální deadline čísla {cislo} ({dl})", |  | ||||||
| 		} |  | ||||||
| 	return strings[typ] |  | ||||||
| 
 | 
 | ||||||
| @register.filter(name='deadline_kratseji') | @register.filter(name='deadline_kratseji') | ||||||
| def deadline_kratsi_text(datum): | def deadline_kratsi_text(deadline: m.Deadline): | ||||||
| 	if deadline(datum) is None: | 	if deadline is None: | ||||||
| 		return 'NONE' | 		return 'NONE' | ||||||
| 	typ, cislo, dl = deadline(datum) |  | ||||||
| 	strings = { | 	strings = { | ||||||
| 		TypDeadline.PredDeadline: f"{cislo} ♲", | 		m.Deadline.TYP_PRVNI: f"{deadline.cislo} ♲", | ||||||
| 		TypDeadline.SousDeadline: f"{cislo} Ⓢ", | 		m.Deadline.TYP_SOUS: f"{deadline.cislo} Ⓢ", | ||||||
| 		TypDeadline.FinalDeadline: f"{cislo} ✓", | 		m.Deadline.TYP_PRVNI_A_SOUS: f"{deadline.cislo} ♲Ⓢ", | ||||||
|  | 		m.Deadline.TYP_CISLA: f"{deadline.cislo} ✓", | ||||||
| 		} | 		} | ||||||
| 	return strings[typ] | 	return strings[deadline.typ] | ||||||
| 
 | 
 | ||||||
| @register.filter(name='deadline_html') | @register.filter(name='deadline_html') | ||||||
| def deadline_html(datum): | def deadline_html(deadline: m.Deadline): | ||||||
| 	if deadline(datum) is None: | 	if deadline is None: | ||||||
| 		return 'Neznámý deadline' | 		return 'Neznámý deadline' | ||||||
| 	typ, _, _ = deadline(datum) | 	text = deadline_kratsi_text(deadline) | ||||||
| 	text = deadline_kratsi_text(datum) |  | ||||||
| 	classes = { | 	classes = { | ||||||
| 		TypDeadline.PredDeadline: 'preddeadline', | 		m.Deadline.TYP_PRVNI: 'preddeadline', | ||||||
| 		TypDeadline.SousDeadline: 'sous_deadline', | 		m.Deadline.TYP_SOUS: 'sous_deadline', | ||||||
| 		TypDeadline.FinalDeadline: 'final_deadline', | 		m.Deadline.TYP_PRVNI_A_SOUS: 'sous_deadline', | ||||||
|  | 		m.Deadline.TYP_CISLA: 'final_deadline', | ||||||
| 		} | 		} | ||||||
| 	return mark_safe(f'<span class="{classes[typ]}">{text}</span>') | 	return mark_safe(f'<span class="{classes[deadline.typ]}">{text}</span>') | ||||||
| 
 | 
 | ||||||
| @register.filter(name='zkrat_nazev_problemu') | @register.filter(name='zkrat_nazev_problemu') | ||||||
| def zkrat_nazev_problemu(nazev,width): | def zkrat_nazev_problemu(nazev,width): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue