Merge pull request 'Role v odevzdávátku' (!97) from odevzdavatko_role into master

Reviewed-on: #97
This commit is contained in:
Jonas Havelka 2025-05-04 18:41:35 +02:00
commit 8bde5c7e4b
5 changed files with 78 additions and 3 deletions

View file

@ -0,0 +1,10 @@
.odevzdavatko-role {
font-size: 0.8em;
.vyrazne {
color: var(--hlavni-oranzova);
}
.nevyrazne {
color: #aaa;
}
}

View file

@ -0,0 +1,6 @@
{% extends "base.html" %}
{% load static %}
{% block custom_css %}
<link href="{% static 'css/odevzdavatko.css' %}?version=1" rel="stylesheet">
{% endblock %}

View file

@ -1,6 +1,7 @@
{% extends "base.html" %}
{% extends "odevzdavatko/base.html" %}
{% load barvy_reseni %}
{% load orgove %}
{% block content %}
@ -27,7 +28,15 @@ Do data (včetně): {{ filtr.reseni_do }}
{% for p in problemy %}
<th>
{# TODO: Přehled řešení k problému, odkázaný odsud? #}
<span title="Autor: {{ p.autor }}, Garant: {{ p.garant }}, Opravovatelé: {{ p.opravovatele.all | join:", " }}">{{ p }}</span>{# TODO: role? e.g. Úloha 3.3 (role: AG) jakože autor a garant #}
<span title="Autor: {{ p.autor }}, Garant: {{ p.garant }}, Opravovatelé: {{ p.opravovatele.all | join:", " }}">{{ p }}
<span class="odevzdavatko-role">
{% spaceless %}
<span class="{{ p|ma_autora:user|yesno:"vyrazne,nevyrazne" }}">A</span>
<span class="{{ p|ma_garanta:user|yesno:"vyrazne,nevyrazne" }}">G</span>
<span class="{{ p|ma_opravovatele:user|yesno:"vyrazne,nevyrazne" }}">O</span>
{% endspaceless %}
</span>
</span>
</th>
{% endfor %}
</tr>

View file

@ -0,0 +1,27 @@
from django import template
register = template.Library()
from personalni.utils import organizator_cehokoliv
# Jen typová anotace
from tvorba.models import Problem
from personalni.models import Osoba, Organizator, Resitel, Prijemce
from django.contrib.auth.models import AnonymousUser, User
@register.filter
def ma_autora(p: Problem, o: Osoba | Organizator | User | AnonymousUser | Resitel | Prijemce) -> bool | None:
o = organizator_cehokoliv(o)
if o is None: return None
return p.autor == o
@register.filter
def ma_garanta(p: Problem, o: Osoba | Organizator | User | AnonymousUser | Resitel | Prijemce) -> bool | None:
o = organizator_cehokoliv(o)
if o is None: return None
return p.garant == o
@register.filter
def ma_opravovatele(p: Problem, o: Osoba | Organizator | User | AnonymousUser | Resitel | Prijemce) -> bool | None:
o = organizator_cehokoliv(o)
if o is None: return None
return p.opravovatele.contains(o)

View file

@ -201,4 +201,27 @@ def resitel_uzivatele(u: User | AnonymousUser) -> Resitel | None:
if o is None: return None
return resitel_osoby(o)
# TODO: organizator_osoby, organizator_uzivatele
def resitel_cehokoliv(r: User | AnonymousUser | Osoba | Organizator | Resitel | Prijemce) -> Organizator | None:
if isinstance(r, User): r = resitel_uzivatele(r)
if isinstance(r, Osoba): r = resitel_osoby(r)
if isinstance(r, Resitel) or isinstance(r, Prijemce): r = resitel_osoby(r.osoba)
assert isinstance(r, Resitel) or r is None
return r
def organizator_osoby(o: Osoba) -> Organizator | None:
try:
return o.org
except Osoba.org.RelatedObjectDoesNotExist:
return None
def organizator_uzivatele(u: User | AnonymousUser) -> Organizator | None:
o = osoba_uzivatele(u)
if o is None: return None
return organizator_osoby(o)
def organizator_cehokoliv(o: User | AnonymousUser | Osoba | Organizator | Resitel | Prijemce) -> Organizator | None:
if isinstance(o, User): o = organizator_uzivatele(o)
if isinstance(o, Osoba): o = organizator_osoby(o)
if isinstance(o, Resitel) or isinstance(o, Prijemce): o = organizator_osoby(o.osoba)
assert isinstance(o, Organizator) or o is None
return o