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 #} | ||||
| <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: #} | ||||
| <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 #} | ||||
| <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: #} | ||||
| <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_mini"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:10 }}</span></td> | ||||
|         <td>{{ hodn.body|default_if_none:"---" }}</td> | ||||
| 		<td>{{ hodn.reseni.cas_doruceni | deadline_html }}</td> | ||||
| 		<td>{{ hodn.deadline_body | deadline_html }}</td> | ||||
| 	</tr> | ||||
| 	{% endfor %} | ||||
| </table> | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
| {% block content %} | ||||
| 
 | ||||
| {% for dl, mnozina_reseni in reseni_podle_deadlinu.items %} | ||||
| <h1>{{ dl.2 | deadline_html }}</h1> | ||||
| <h1>{{ dl | deadline_html }}</h1> | ||||
| <ul> | ||||
| 	{% 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 }}) | ||||
|  |  | |||
|  | @ -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 | ||||
| 		# 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) | ||||
| 		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: | ||||
| 		ctx["resitel_id"] = self.kwargs['resitel'] | ||||
|  | @ -320,9 +320,8 @@ class PrehledOdevzdanychReseni(ListView): | |||
| 		ctx = super().get_context_data(*args, **kwargs) | ||||
| 		# 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 :-/ | ||||
| 		# 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 = [] | ||||
| 		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))) | ||||
| 		ctx['podle_rocniku'] = reversed(podle_rocniku) # Od nejnovějšího ročníku | ||||
| 		# 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())) | ||||
|     # 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: | ||||
| #	def save(self, *args, **kwargs): | ||||
| #		if ((self.cislo_body is None) and (self.problem.cislo_reseni) and | ||||
|  |  | |||
|  | @ -1,44 +1,32 @@ | |||
| from django import template | ||||
| from django.utils.safestring import mark_safe | ||||
| from seminar.utils import TypDeadline, deadline | ||||
| register = template.Library() | ||||
| 
 | ||||
| @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] | ||||
| import seminar.models as m | ||||
| 
 | ||||
| @register.filter(name='deadline_kratseji') | ||||
| def deadline_kratsi_text(datum): | ||||
| 	if deadline(datum) is None: | ||||
| def deadline_kratsi_text(deadline: m.Deadline): | ||||
| 	if deadline is None: | ||||
| 		return 'NONE' | ||||
| 	typ, cislo, dl = deadline(datum) | ||||
| 	strings = { | ||||
| 		TypDeadline.PredDeadline: f"{cislo} ♲", | ||||
| 		TypDeadline.SousDeadline: f"{cislo} Ⓢ", | ||||
| 		TypDeadline.FinalDeadline: f"{cislo} ✓", | ||||
| 		m.Deadline.TYP_PRVNI: f"{deadline.cislo} ♲", | ||||
| 		m.Deadline.TYP_SOUS: f"{deadline.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') | ||||
| def deadline_html(datum): | ||||
| 	if deadline(datum) is None: | ||||
| def deadline_html(deadline: m.Deadline): | ||||
| 	if deadline is None: | ||||
| 		return 'Neznámý deadline' | ||||
| 	typ, _, _ = deadline(datum) | ||||
| 	text = deadline_kratsi_text(datum) | ||||
| 	text = deadline_kratsi_text(deadline) | ||||
| 	classes = { | ||||
| 		TypDeadline.PredDeadline: 'preddeadline', | ||||
| 		TypDeadline.SousDeadline: 'sous_deadline', | ||||
| 		TypDeadline.FinalDeadline: 'final_deadline', | ||||
| 		m.Deadline.TYP_PRVNI: 'preddeadline', | ||||
| 		m.Deadline.TYP_SOUS: 'sous_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') | ||||
| def zkrat_nazev_problemu(nazev,width): | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue