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%}
-
+ {% 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 %}
-
-
+ {% zmenseny_nahled obrazek.jako_bazmek alt=obrazek.popis class="obrazek" id="prostredni" %}
-