diff --git a/galerie/admin.py b/galerie/admin.py index a2c70452..6aa82ca2 100644 --- a/galerie/admin.py +++ b/galerie/admin.py @@ -13,8 +13,7 @@ def zverejnit_fotogalerii(modeladmin, request, queryset): for galerie in queryset: galerie.zobrazit = Galerie.Viditelnost.VZDY galerie.save() - zverejnit_fotogalerii(modeladmin, request, - Galerie.objects.filter(galerie_up = galerie)) + zverejnit_fotogalerii(modeladmin, request, galerie.podgalerie.all()) zverejnit_fotogalerii.short_description = 'Zveřejnit fotogalerie' @@ -24,32 +23,29 @@ def prepnout_fotogalerii_do_org_rezimu(modeladmin, request, queryset): for galerie in queryset: galerie.zobrazit = Galerie.Viditelnost.ORG galerie.save() - prepnout_fotogalerii_do_org_rezimu(modeladmin, request, - Galerie.objects.filter(galerie_up = galerie)) + prepnout_fotogalerii_do_org_rezimu(modeladmin, request, galerie.podgalerie.all()) prepnout_fotogalerii_do_org_rezimu.short_description = \ 'Přepnout do režimu úprav (zneveřejní galerii)' class GalerieInline(admin.TabularInline): model = Soubor - fields = ['soubor', 'nazev', 'popis', 'typ', 'poradi'] + fields = ['soubor', 'nazev', 'popisek', 'typ', 'poradi'] readonly_fields = ['nazev'] formfield_overrides = { models.TextField: {'widget': forms.TextInput}, } +@admin.register(Soubor) class SouborAdmin(admin.ModelAdmin): - list_display = ('soubor', 'nazev', 'popis', 'poradi') - search_fields = ['nazev','popis'] + list_display = ('soubor', 'nazev', 'popisek', 'poradi') + search_fields = ['nazev','popisek'] +@admin.register(Galerie) class GalerieAdmin(admin.ModelAdmin): model = Galerie - fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'popis', 'galerie_up', 'soustredeni', 'poradi') + fields = ('zobrazit', 'nazev', 'titulni_obrazek', 'poznamka', 'nadgalerie', 'soustredeni', 'poradi') autocomplete_fields = ['titulni_obrazek'] - list_display = ('nazev', 'soustredeni', 'galerie_up', 'poradi', 'zobrazit', 'datum_zmeny') + list_display = ('nazev', 'soustredeni', 'nadgalerie', 'poradi', 'zobrazit', 'datum_zmeny') inlines = [GalerieInline] actions = [zverejnit_fotogalerii, prepnout_fotogalerii_do_org_rezimu] save_on_top = True - ordering = ['galerie_up__nazev', 'poradi'] - -admin.site.register(Soubor, SouborAdmin) -admin.site.register(Galerie, GalerieAdmin) diff --git a/galerie/forms.py b/galerie/forms.py index 188f5817..2acf7d68 100644 --- a/galerie/forms.py +++ b/galerie/forms.py @@ -2,7 +2,7 @@ from django import forms class KomentarForm(forms.Form): """Formulář na přidání/úpravu popisku u souboru (obrázku)""" - komentar = forms.CharField(label = "Komentář:", max_length = 300, required=False) + popisek = forms.CharField(label = "Popisek:", max_length = 300, required=False) class NewGalerieForm(forms.Form): nazev = forms.CharField(label = "Název galerie", max_length = 100) diff --git a/galerie/models.py b/galerie/models.py index 695bdb54..f42edb43 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -30,8 +30,8 @@ def galerie_filename(self, filename): # soustředění je v cestě jen pokud galerie pod nějaké patří cesta = ( ['Galerie'] + - (["soustredeni_{}".format(gal.soustredeni.pk)] if gal.soustredeni else []) + - ["galerie_{}".format(cislo_gal), self.nazev] + ([f"soustredeni_{gal.soustredeni.pk}"] if gal.soustredeni else []) + + [f"galerie_{cislo_gal}", self.nazev] ) return os.path.join(*cesta) @@ -45,22 +45,22 @@ class Soubor(models.Model): VIDEO = 'video', 'Video' NEVIM = 'nevim', 'Neznámý typ' typ = models.CharField('Typ', max_length=16, blank=False, null=False, choices=Typ.choices, default=Typ.NEVIM) - # Filename by default; slouží k řazení - nazev = models.CharField('Jméno souboru', max_length=50, blank=True, null=True) - # ~~Rádoby~~ vtipný popisek od orgů - popis = models.TextField('Popisek', blank=True, null=True) + nazev = models.CharField('Jméno souboru', max_length=50, blank=True, null=True, + help_text="Název, slouží k řazení. Typicky není potřeba vyplnit, automaticky se použije jméno nahraného souboru.") + #: ~~Rádoby~~ vtipný popisek od orgů + popisek = models.TextField('Popisek', blank=True, null=True) datum_vlozeni = models.DateTimeField('Datum vložení', auto_now_add=True) galerie = models.ForeignKey('Galerie', blank=True, null=True, on_delete=models.CASCADE) - # Primární klíč k řazení pro overridování řazení podle názvu - poradi = models.IntegerField('Pořadí', blank=True, null=True) + poradi = models.IntegerField('Pořadí', blank=True, null=True, + help_text='Primární klíč pro řazení v rámci galerie.') def __str__(self): return f'Soubor {self.nazev} ({self.soubor.name})' class Meta: - verbose_name = 'Soubor' - verbose_name_plural = 'Soubory' - db_table = 'galerie_obrazek' # FIXME: přejmenovat + verbose_name = 'Soubor (Obrázek ap.)' + verbose_name_plural = 'Soubory (Obrázky ap.)' + db_table = 'galerie_soubor' ordering = ['galerie', 'poradi', 'nazev'] def save(self, *args, **kwargs): @@ -82,7 +82,7 @@ class Soubor(models.Model): case _: raise ValueError("Neznámý typ obrázku, bug v kódu!") def get_absolute_url(self): - return reverse('galerie_soubor', pk=self.galerie.pk, fotka=self.pk) + return reverse('galerie_soubor', kwargs={'galerie': self.galerie.pk, 'soubor': self.pk}) class Galerie(models.Model): class Viditelnost(models.IntegerChoices): @@ -95,10 +95,13 @@ class Galerie(models.Model): datum_vytvoreni = models.DateTimeField('Datum vytvoření', auto_now_add = True) datum_zmeny = models.DateTimeField('Datum poslední změny', auto_now = True) poznamka = models.TextField('neveřejná poznámka', blank = True, null = True) - titulni_obrazek = models.ForeignKey(Soubor, blank = True, null = True, related_name = "+", on_delete = models.SET_NULL) + titulni_obrazek = models.ForeignKey(Soubor, verbose_name = 'Titulní obrázek', blank = True, null = True, related_name = "+", on_delete = models.SET_NULL) zobrazit = models.IntegerField('Zobrazit?', default = Viditelnost.ORG, choices = Viditelnost.choices) # TODO: Dj5 už stačí `choices = Viditelnost` - galerie_up = models.ForeignKey('Galerie', blank = True, null = True, + #: None pro hlavní galerie soustředění + nadgalerie = models.ForeignKey('Galerie', verbose_name = 'Nadgalerie', blank = True, null = True, + related_name='podgalerie', on_delete=models.PROTECT) + #: None pro podgalerie, not None pro hlavní galerie soustředění soustredeni = models.ForeignKey(Soustredeni, blank = True, null = True, on_delete=models.PROTECT) poradi = models.IntegerField('Pořadí', blank = True, null = False, default = 0) @@ -109,6 +112,7 @@ class Galerie(models.Model): verbose_name = 'Galerie' verbose_name_plural = 'Galerie' db_table = 'galerie_galerie' + ordering = ['nadgalerie__datum_vytvoreni', 'poradi', 'nazev'] def get_absolute_url(self): - return reverse('galerie_galerie', pk=self.pk) + return reverse('galerie_galerie', kwargs={'galerie': self.pk}) diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html index b9114576..97838b52 100644 --- a/galerie/templates/galerie/Galerie.html +++ b/galerie/templates/galerie/Galerie.html @@ -3,7 +3,7 @@ {% load bazmeky %} {% block nadpis1a %} -{{galerie.nazev}}: {{ obrazek.popis | default:"Fotka" }} +{{galerie.nazev}}: {{ obrazek.popisek | default:"Fotka" }} {% endblock %} @@ -21,17 +21,17 @@ {% if predchozi_obrazek %} // doleva if (e.which == 37) { - window.location.assign("{% url 'galerie_soubor' pk=galerie.pk fotka=predchozi_obrazek.pk %}#nahoru"); + window.location.assign("{% url 'galerie_soubor' galerie=galerie.pk soubor=predchozi_obrazek.pk %}#nahoru"); } {% endif %} {% if dalsi_obrazek %} // doprava if (e.which == 39) { - window.location.assign("{% url 'galerie_soubor' pk=galerie.pk fotka=dalsi_obrazek.pk %}#nahoru"); + window.location.assign("{% url 'galerie_soubor' galerie=galerie.pk soubor=dalsi_obrazek.pk %}#nahoru"); } {% endif %} if (e.which == 27) { - window.location.assign("{% url 'galerie_galerie' pk=galerie.pk %}#obsah"); + window.location.assign("{% url 'galerie_galerie' galerie=galerie.pk %}#obsah"); } }); @@ -51,7 +51,7 @@