diff --git a/galerie/migrations/0014_alter_galerie_zobrazit.py b/galerie/migrations/0014_alter_galerie_zobrazit.py new file mode 100644 index 00000000..c53393f3 --- /dev/null +++ b/galerie/migrations/0014_alter_galerie_zobrazit.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.20 on 2025-04-23 18:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('galerie', '0013_post_split_soustredeni'), + ] + + operations = [ + migrations.AlterField( + model_name='galerie', + name='zobrazit', + field=models.IntegerField(choices=[(0, 'Vždy'), (1, 'Organizátorům'), (3, 'Účastníkům a orgům'), (2, 'Nikdy')], default=1, verbose_name='Zobrazit?'), + ), + ] diff --git a/galerie/models.py b/galerie/models.py index 074b0d26..bca860a9 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -10,9 +10,11 @@ from soustredeni.models import Soustredeni VZDY=0 ORG=1 NIKDY=2 +UCASTNIK=3 VIDITELNOST = ( (VZDY, 'Vždy'), (ORG, 'Organizátorům'), + (UCASTNIK, 'Účastníkům a orgům'), (NIKDY, 'Nikdy'), ) diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html index ff8ebfe3..9aa4b40b 100644 --- a/galerie/templates/galerie/Galerie.html +++ b/galerie/templates/galerie/Galerie.html @@ -83,7 +83,7 @@ {# Popisek fotky #}
- {% if preview %} + {% if upravy_popisku %}
{% csrf_token %} diff --git a/galerie/utils.py b/galerie/utils.py new file mode 100644 index 00000000..352e197b --- /dev/null +++ b/galerie/utils.py @@ -0,0 +1,6 @@ +from galerie.models import Galerie + +def top_galerie(g: Galerie) -> Galerie: + while g.galerie_up is not None: + g = g.galerie_up + return g diff --git a/galerie/views.py b/galerie/views.py index cf9ade8b..0e20055d 100644 --- a/galerie/views.py +++ b/galerie/views.py @@ -5,18 +5,32 @@ from django.shortcuts import render, HttpResponseRedirect, get_object_or_404 from django.template import RequestContext from datetime import datetime -from galerie.models import Obrazek, Galerie +from galerie.utils import top_galerie +from personalni.utils import resitel_uzivatele + +from galerie.models import Obrazek, Galerie, VZDY, ORG, UCASTNIK, NIKDY from soustredeni.models import Soustredeni from galerie.forms import KomentarForm, NewGalerieForm def zobrazit(galerie, request): - preview = False - if galerie.zobrazit >= 1: - if request.user.je_org: - preview = True; - else: - raise Http404 - return preview + soustredeni = top_galerie(galerie).soustredeni + # Superuživatelům úplně všechny galerie. + if request.user.is_superuser: return True + + if galerie.zobrazit == VZDY: return True + if galerie.zobrazit == NIKDY: return False + if galerie.zobrazit == ORG and request.user.je_org: return True + if galerie.zobrazit == UCASTNIK: + if request.user.je_org: + return True + resitel = resitel_uzivatele(request.user) + if resitel is not None and resitel.soustredeni_set.contains(soustredeni): + return True + return False + +def dovolit_upravy_popisku(galerie, request): + # FIXME: Dočasné: úpravy jen když je to v org-only stavu. (Odpovídá předchozímu chování) + return request.user.je_org and galerie.zobrazit in (ORG, NIKDY) def cesta_od_korene(g): @@ -37,7 +51,8 @@ def nahled(request, pk, soustredeni): podgalerie = podgalerie.filter(zobrazit__lt=1) obrazky = Obrazek.objects.filter(galerie = galerie).order_by('poradi', 'nazev') - preview = zobrazit(galerie, request) + ma_se_zobrazit = zobrazit(galerie, request) + if not ma_se_zobrazit: raise Http404("Galerie sice existuje, ale my se tváříme, že ne :-D") sourozenci = [] if galerie.galerie_up: @@ -62,7 +77,7 @@ def nahled(request, pk, soustredeni): {'galerie' : galerie, 'podgalerie' : podgalerie, 'obrazky' : obrazky, - 'preview' : preview, + 'upravy_popisku' : dovolit_upravy_popisku(galerie, request), 'cesta': cesta, 'sourozenci': sourozenci, 'predchozi': predchozi, @@ -78,7 +93,8 @@ def detail(request, pk, fotka, soustredeni): NAHLEDU = 1 galerie = get_object_or_404(Galerie, pk=pk) - preview = zobrazit(galerie, request) + ma_se_zobrazit = zobrazit(galerie, request) + if not ma_se_zobrazit: raise Http404("Obrázek neukážu!") obrazek = get_object_or_404(Obrazek, pk=fotka) obrazky = galerie.obrazek_set.all().order_by('poradi', 'nazev') @@ -98,7 +114,7 @@ def detail(request, pk, fotka, soustredeni): break else: # Obrazek neni v galerii/stitku. - raise Http404 + raise Http404("„Obrázek není v galerii/štítku“, ať už to znamená cokoliv…") # Nacteni okolnich obrazku a galerii @@ -153,7 +169,7 @@ def detail(request, pk, fotka, soustredeni): 'sirka' : sirka, 'obrazky_predchozi' : obrazky_predchozi, 'obrazky_dalsi' : obrazky_dalsi, - 'preview' : preview, + 'upravy_popisku' : dovolit_upravy_popisku(galerie, request), 'form' : form, 'cesta': cesta_od_korene(galerie), }) @@ -179,7 +195,7 @@ def new_galerie(request, galerie, soustredeni): gal = Galerie() gal.nazev = form.cleaned_data['nazev'] #gal.popis = form.cleaned_data['popis'] # popis nepouzivame - gal.zobrazit = 1 # galerie je v procesu vytvareni + gal.zobrazit = ORG # galerie je v procesu vytvareni ''' pokud je to podgalerie pridej nadrazenou galerii a nadrazene soustredeni nechej volne, pokud je to hlavni galerie, tak nadrazena galerie neexistuje, diff --git a/personalni/utils.py b/personalni/utils.py index 02e541da..f3c796e6 100644 --- a/personalni/utils.py +++ b/personalni/utils.py @@ -3,7 +3,7 @@ import re from django.contrib.auth import get_user_model from django.contrib.auth.decorators import permission_required, user_passes_test -from django.contrib.auth.models import AnonymousUser +from django.contrib.auth.models import AnonymousUser, User from django.db import transaction import soustredeni.models @@ -182,3 +182,23 @@ def merge_osoby(cilova, zdrojova): cilova.save() input("Potvrdit transakci osob (^C pro zrušení) ") + +def osoba_uzivatele(u: User | AnonymousUser) -> Osoba | None: + if u.is_anonymous: return None + try: + return u.osoba + except User.osoba.RelatedObjectDoesNotExist: + return None + +def resitel_osoby(o: Osoba) -> Resitel | None: + try: + return o.resitel + except Osoba.resitel.RelatedObjectDoesNotExist: + return None + +def resitel_uzivatele(u: User | AnonymousUser) -> Resitel | None: + o = osoba_uzivatele(u) + if o is None: return None + return resitel_osoby(o) + +# TODO: organizator_osoby, organizator_uzivatele