diff --git a/galerie/admin.py b/galerie/admin.py index c663287e..a04cf6d9 100644 --- a/galerie/admin.py +++ b/galerie/admin.py @@ -30,14 +30,14 @@ def prepnout_fotogalerii_do_org_rezimu(modeladmin, request, queryset): class GalerieInline(admin.TabularInline): model = Obrazek - fields = ['obrazek_velky', 'nazev', 'popis', 'obrazek_maly_tag', 'poradi'] - readonly_fields = ['nazev', 'obrazek_maly_tag'] + fields = ['soubor', 'nazev', 'popis', 'typ', 'poradi'] + readonly_fields = ['nazev'] formfield_overrides = { models.TextField: {'widget': forms.TextInput}, } class ObrazekAdmin(admin.ModelAdmin): - list_display = ('obrazek_velky', 'nazev', 'popis', 'obrazek_maly_tag', 'poradi') + list_display = ('soubor', 'nazev', 'popis', 'poradi') search_fields = ['nazev','popis'] class GalerieAdmin(admin.ModelAdmin): diff --git a/galerie/migrations/0017_obecne_typy_souboru.py b/galerie/migrations/0017_obecne_typy_souboru.py new file mode 100644 index 00000000..58ffb650 --- /dev/null +++ b/galerie/migrations/0017_obecne_typy_souboru.py @@ -0,0 +1,33 @@ +# Generated by Django 4.2.20 on 2025-05-05 00:21 + +from django.db import migrations, models +import galerie.models + +def zatim_byly_jen_obrazky(apps, schema_editor): + Obrazek = apps.get_model("galerie", "Obrazek") + Obrazek.objects.all().update(typ='obrazek') + +class Migration(migrations.Migration): + + dependencies = [ + ('galerie', '0016_alter_obrazek_galerie'), + ] + + operations = [ + migrations.RenameField( + model_name='obrazek', + old_name='obrazek_velky', + new_name='soubor', + ), + migrations.AlterField( + model_name='obrazek', + name='soubor', + field=models.FileField(help_text='Lze vložit libovolně velký obrázek. Ideální je, aby alespoň jeden rozměr měl alespoň 500px.', upload_to=galerie.models.galerie_filename), + ), + migrations.AddField( + model_name='obrazek', + name='typ', + field=models.CharField(choices=[('obrazek', 'Obrázek'), ('video', 'Video'), ('nevim', 'Neznámý typ')], default='nevim', max_length=16, verbose_name='Typ'), + ), + migrations.RunPython(zatim_byly_jen_obrazky, migrations.RunPython.noop) + ] diff --git a/galerie/models.py b/galerie/models.py index 44c1120e..dc5340f9 100644 --- a/galerie/models.py +++ b/galerie/models.py @@ -24,10 +24,12 @@ def obrazek_filename_maly(): pass def obrazek_filename_stredni(): pass +def obrazek_filename(): + pass def obrazek_filename_velky(): pass -def obrazek_filename(self, filename): +def galerie_filename(self, filename): gal = self.galerie cislo_gal = gal.pk @@ -44,43 +46,51 @@ def obrazek_filename(self, filename): return os.path.join(*cesta) +# Technicky misnomer: takový `Obrazek` může být i videjko a výhledově i něco dalšího… class Obrazek(models.Model): - obrazek_velky = models.ImageField(upload_to=obrazek_filename, + # „originál“ (modulo max. velikost uploadu na web FIXME!) + soubor = models.FileField(upload_to=galerie_filename, help_text = "Lze vložit libovolně velký obrázek. Ideální je, aby alespoň jeden rozměr měl alespoň 500px.") - obrazek_stredni = ImageSpecField(source='obrazek_velky', - processors=[Transpose(Transpose.AUTO), ResizeToFit(900, 675, upscale=False)], - options={'quality': 95}) - obrazek_maly = ImageSpecField(source='obrazek_velky', - processors=[Transpose(Transpose.AUTO), ResizeToFit(167, 167, upscale=False)], - options={'quality': 95}) + class Typ(models.TextChoices): + OBRAZEK = 'obrazek', 'Obrázek' + 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('Název', max_length=50, blank=True, null=True) + # ~~Rádoby~~ vtipný popisek od orgů popis = models.TextField('Popis', 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) def __str__(self): - return self.obrazek_velky.name + return f'Obrázek {self.nazev} ({self.soubor.name})' class Meta: verbose_name = 'Obrázek' verbose_name_plural = 'Obrázky' - ordering = ['nazev'] - - def obrazek_maly_tag(self): - if not self.obrazek_maly: - return '' - return u''.format(self.obrazek_maly.url) - obrazek_maly_tag.short_description = "Náhled" - obrazek_maly_tag.allow_tags = True + ordering = ['nazev'] #FIXME: zohlednit pořadí a asi i příslušnost ke galerii def save(self, *args, **kwargs): # obrázek potřebuje název, protože se z něj generuje cesta pro jeho uložení # (a pak se podle něj taky řadí) if self.nazev is None: - self.nazev = os.path.basename(self.obrazek_velky.name) + self.nazev = os.path.basename(self.soubor.name) super(Obrazek, self).save(*args, **kwargs) + def jako_bazmek(self): + """ + Hlavní metoda pro dělání `galerie.typy.ZobrazitelnyBazmek` z DB objektů + """ + import galerie.typy as typy # pozor, cyklí! + match self.typ: + case self.Typ.OBRAZEK: return typy.Obrazek(self) + case self.Typ.VIDEO: return typy.Video(self) + case self.Typ.NEVIM: return typy.DummyBazmek(self) + case _: raise ValueError("Neznámý typ obrázku, bug v kódu!") + class Galerie(models.Model): nazev = models.CharField('Název', max_length=100) diff --git a/galerie/static/css/galerie.css b/galerie/static/css/galerie.css index 46e02367..6120cf3f 100644 --- a/galerie/static/css/galerie.css +++ b/galerie/static/css/galerie.css @@ -6,9 +6,10 @@ /* velká fotka */ /* zmenšování spolu s oknem prohlížeče */ .galerie .obrazek, .titulni_obrazek { - max-width: 100%; + max-width: max(100%, 900px); + max-height: 900px; height: auto; - width: auto\9; /* ie8 */ + width: auto; } .predchozi_obrazek{ @@ -75,6 +76,8 @@ .galerie_nahledy img { margin: 10px; + max-height: 100px; + max-width: 200px; } .galerie_nahledy div.navigace { diff --git a/galerie/static/galerie/neznamy_placeholder.svg b/galerie/static/galerie/neznamy_placeholder.svg new file mode 100644 index 00000000..d4482304 --- /dev/null +++ b/galerie/static/galerie/neznamy_placeholder.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + diff --git a/galerie/static/galerie/video_placeholder.svg b/galerie/static/galerie/video_placeholder.svg new file mode 100644 index 00000000..8a7d0ab9 --- /dev/null +++ b/galerie/static/galerie/video_placeholder.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + diff --git a/galerie/templates/galerie/Galerie.html b/galerie/templates/galerie/Galerie.html index 364d0b51..4db694dc 100644 --- a/galerie/templates/galerie/Galerie.html +++ b/galerie/templates/galerie/Galerie.html @@ -1,5 +1,6 @@ {% extends "galerie/base.html" %} +{% load bazmeky %} {% block nadpis1a %} {{galerie.nazev}}: {{ obrazek.popis | default:"Fotka" }} @@ -64,11 +65,7 @@ {% endwith %} {% endif%} - {{obrazek.popis}} + {% zobrazit obrazek.jako_bazmek alt=obrazek.popis title=obrazek.popis class="obrazek" %} {% if obrazky_dalsi %} {% with obrazky_dalsi|first as dalsi_obrazek %} @@ -79,7 +76,7 @@ {% endif%} - + {# Popisek fotky #} @@ -110,21 +107,14 @@ {% endif %} {# nahledy predchozich obrazku #} {% for obrazek in obrazky_predchozi %} - + {% zmenseny_nahled obrazek.jako_bazmek height=100 %} {% endfor %} - - {{obrazek.popis}} + {% zmenseny_nahled obrazek.jako_bazmek alt=obrazek.popis class="obrazek" id="prostredni" %} -