WIP: Překopání galerií (a implementace videí) #99

Draft
ledoian wants to merge 50 commits from galerie_videjka into master
Owner

Velká část kódu je napsaná, migrace zatím vůbec, takže se dá testovat jen podivně ze shellu bez sáhnutí na databázi.

TODO (z message u b25d475148 přepsáno sem, ať jde odškrtávat):

  • vymyslet všemu použitelnější jména
  • Napsat migraci
  • ve views a modelech se pořád ještě vyskytuje obrazek_stredni a obrazek_velky
  • nevím, co dělá Admin a nahrávání obrázků
  • chybí funkce na tipování typů nahraných obrázků (a její použití v kódu)
  • podpora pro videjka zatím není vůbec (jen připravený kód)
  • DummyBazmek nemá použitelné placeholdery (představuji si SVG s nějakým vykřičníkem a odkazem do Admina
  • opravit syntaxi v dokumentaci
  • zakomentovaný kód buď smazat, nebo přetvořit v něco užitečného
  • vyřešit konflikt s masterem
  • Napsat migrace
  • Možná mít explicitní primární klíče?

TODO z !95 (nevyřešené k 2025-12-19):

  • napsat test, že se správně vynucují práva kolem sousu
  • dořešit FIXME
  • přejmenovat templates
  • „Přepsat model a použít přímo dolů“ (podle komentáře v !95)
  • zvednout limit na velikost souborů u galerií

TODO další (převážně ze spodu):

  • dořešit (své vlastní) námitky z review
  • tipovat typ při přidávání z Adminu?
  • zdokumentovat:
    • jak se co jmenuje a proč
    • že SVG neumíme
    • jak se galerie zveřejňuje
  • dopsat testy

Další tipy, co umět:

  • V Adminu umět filtrovat podle hlavního soustřeďka nebo něčeho, ať se dá Galerie najít i tam (je tam bambilion galerií pojmenovaných Sobota…)
  • Při prohazování galerií actually prohazovat a ne mít obskurní counter
  • Otestovat videa na různých platformách (jablečné telefony) a popsat, které kodeky se smějí používat (tj. nejspíš jen H.264 + Opus/Vorbis/OGG; asi napsat i správný ffmpegový příkaz na wiki nebo si na to udělat klikátko??)
Velká část kódu je napsaná, ~~migrace zatím vůbec, takže se dá testovat jen podivně ze shellu bez sáhnutí na databázi.~~ TODO (z message u b25d475148a3ad1708963b26ddd7c132a76298fa přepsáno sem, ať jde odškrtávat): - [x] vymyslet *všemu* použitelnější jména - [x] Napsat migraci - [x] ve views a modelech se pořád ještě vyskytuje `obrazek_stredni` a `obrazek_velky` - [x] nevím, co dělá Admin a nahrávání obrázků - [x] chybí funkce na tipování typů nahraných obrázků (a její použití v kódu) - [x] podpora pro videjka zatím není vůbec (jen připravený kód) - [x] DummyBazmek nemá použitelné placeholdery (představuji si SVG s nějakým vykřičníkem a odkazem do Admina - [x] opravit syntaxi v dokumentaci - [x] zakomentovaný kód buď smazat, nebo přetvořit v něco užitečného - [x] vyřešit konflikt s masterem - [x] Napsat migrace - [ ] Možná mít explicitní primární klíče? TODO z !95 (nevyřešené k 2025-12-19): - [x] napsat test, že se správně vynucují práva kolem sousu - [ ] dořešit FIXME - [x] přejmenovat templates - [x] „Přepsat model a použít přímo dolů“ (podle komentáře v !95) - [ ] zvednout limit na velikost souborů u galerií TODO další (převážně ze spodu): - [x] dořešit (své vlastní) námitky z review - [ ] tipovat typ při přidávání z Adminu? - [ ] zdokumentovat: - jak se co jmenuje a proč - že SVG neumíme - jak se galerie zveřejňuje - [x] dopsat testy Další tipy, co umět: - [ ] V Adminu umět filtrovat podle hlavního soustřeďka nebo něčeho, ať se dá Galerie najít i tam (je tam bambilion galerií pojmenovaných Sobota…) - [ ] Při prohazování galerií actually prohazovat a ne mít obskurní counter - [ ] Otestovat videa na různých platformách (jablečné telefony) a popsat, které kodeky se smějí používat (tj. nejspíš jen H.264 + Opus/Vorbis/OGG; asi napsat i správný ffmpegový příkaz na wiki nebo si na to udělat klikátko??)
už od Dj 2.0 nefunkční, kdyžtak se přidá zpět později…
Plán: udělat z `obrazek_velky` `soubor`, přidat `typ` (`OBRAZEK`,
`VIDEO`, `NEVIM`) a ImageKit použít jen na vyrábění zmenšených obrázků
(pro `VIDEO` použít `<video>` přímo; pro `NEVIM` nějaký generický
placeholder a pokyn orgovi, ať to opraví v Adminu.

Ref: https://django-imagekit.readthedocs.io/en/latest/#defining-specs-outside-of-models
Co funguje: ~~nic, protože není vygenerovaná migrace~~ Nejspíš lecos,
ale nejde to otestovat. Speciálně, pokud zavolám funkce z `galerie.typy`
ručně ze shellu, tak se to popřeškáluje a výsledná URL jde skutečně
vyrenderovat na webu (resp. šlo v nějaké průběžné verzi před zavedením
templatetagu).

TODO:
- ve views a modelech se pořád ještě vyskytuje `obrazek_stredni` a `obrazek_velky`
- nevím, co dělá Admin a nahrávání obrázků
- chybí funkce na tipování typů nahraných obrázků (a její použití v kódu)
- podpora pro videjka zatím není vůbec (jen připravený kód)
- DummyBazmek nemá použitelné placeholdery (představuji si SVG s nějakým
  vykřičníkem a odkazem do Admina
Author
Owner

Jo, a v komentářích jsou random zakomentované kusy kódu, které se buď mají objevit jinde (a jinak), nebo smazat úplně… připsáno do TODO

~~Jo, a v komentářích jsou random zakomentované kusy kódu, které se buď mají objevit jinde (a jinak), nebo smazat úplně…~~ připsáno do TODO
ledoian changed title from WIP: Videjka a další bazmeky do galerií to RFC: Videjka a další bazmeky do galerií 2025-05-05 15:39:11 +02:00
Author
Owner
  • opravit syntaxi v dokumentaci

@zelvuska Máš tip, odkud mám syntaxi dokumentace opsat? Vím, že jsme něco měli, jen se mi to nechce dohledávat, tak jestli zvládneš vytáhnout z paměti…

> - [x] opravit syntaxi v dokumentaci @zelvuska Máš tip, odkud mám syntaxi dokumentace opsat? Vím, že jsme něco měli, jen se mi to nechce dohledávat, tak jestli zvládneš vytáhnout z paměti…
Author
Owner

Prohlašuji galerii s videjky za MVP, jdu nasadit na testweb (v nějaké ad-hoc kombinaci s !98), pusťte se do hejtění kódu a testování

Prohlašuji galerii s videjky za MVP, jdu nasadit na testweb (v nějaké ad-hoc kombinaci s !98), pusťte se do hejtění kódu a testování
ledoian left a comment
Author
Owner

Moje poznámky k tomu, co se má vylepšit…

Moje poznámky k tomu, co se má vylepšit…
@ -47,2 +49,3 @@
# 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!)
Author
Owner

doku

doku
ledoian marked this conversation as resolved
@ -56,0 +56,4 @@
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í
Author
Owner

doku nebo help_text

doku nebo help_text
ledoian marked this conversation as resolved
@ -73,3 +74,1 @@
return u'<img src="{}">'.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
Author
Owner

FIXME

FIXME
ledoian marked this conversation as resolved
@ -76,2 +77,4 @@
.galerie_nahledy img {
margin: 10px;
max-height: 100px;
max-width: 200px;
Author
Owner

Hodnoty random nastřelené… (asi nevadí)

Hodnoty random nastřelené… (asi nevadí)
Author
Owner

… asi nevadí.

… asi nevadí.
ledoian marked this conversation as resolved
@ -111,3 +108,3 @@
{# nahledy predchozich obrazku #}
{% for obrazek in obrazky_predchozi %}
<a href="../{{obrazek.pk}}#nahoru"><img src="{{obrazek.obrazek_maly.url}}" height="100"></a>
<a href="../{{obrazek.pk}}#nahoru">{% zmenseny_nahled obrazek.jako_bazmek height=100 %}</a>
Author
Owner

zrušit height?

zrušit height?
ledoian marked this conversation as resolved
@ -125,3 +115,3 @@
{# nahledy nasledujicich obrazku #}
{% for obrazek in obrazky_dalsi %}
<a href="../{{obrazek.pk}}#nahoru"><img src="{{obrazek.obrazek_maly.url}}" height="100"></a>
<a href="../{{obrazek.pk}}#nahoru">{% zmenseny_nahled obrazek.jako_bazmek height=100 %}</a>
Author
Owner

i tady zrušit height?

i tady zrušit height?
ledoian marked this conversation as resolved
@ -59,3 +60,1 @@
<img src="{{ obrazek.url }}"
/>
{% endwith %}
{% zmenseny_nahled pgalerie.titulni_obrazek.jako_bazmek class="" %}
Author
Owner

Má mít class nebo tam ten atribut nemá být vůbec

Má mít class nebo tam ten atribut nemá být vůbec
ledoian marked this conversation as resolved
@ -106,0 +98,4 @@
href="./{{obrazek.pk}}#nahoru" class="galerie_nahled">
<span class="vystredeno"></span>
{% zmenseny_nahled obrazek.jako_bazmek %}
{# title=obrazek.popis (a byl tu if, že se použil jen když existoval…) width=obrazek.obrazek_maly.width height=obrazek.obrazek_maly.height #}
Author
Owner

smazat? title by se měl použít z vnějšího tagu, či?

smazat? title by se měl použít z vnějšího tagu, či?
Author
Owner

Nepoužije se, ale stejně ve dvou třetinách obrázku neviditelně překáží „Předcházející“ a „Následující“, tak to smažu i tady.

Nepoužije se, ale stejně ve dvou třetinách obrázku neviditelně překáží „Předcházející“ a „Následující“, tak to smažu i tady.
Author
Owner

Kecáááám, koukám na ten druhý template. Ale tady se to taky projevuje přímo. Takže smažu všechno :-D

Kecáááám, koukám na ten druhý template. Ale tady se to taky projevuje přímo. Takže smažu všechno :-D
ledoian marked this conversation as resolved
galerie/typy.py Outdated
@ -0,0 +14,4 @@
from django.contrib.staticfiles.finders import find
# FIXME: static fily na lokálním webu??
find = lambda x: '/static/'+x
Author
Owner

FIXME

FIXME
ledoian marked this conversation as resolved
galerie/typy.py Outdated
@ -0,0 +23,4 @@
from imagekit.cachefiles import ImageCacheFile
from imagekit.processors import ResizeToFit, Transpose
HTML = str | SafeString
Author
Owner

Komentář, že v Py3.12 má být type HTML = ...

Komentář, že v Py3.12 má být `type HTML = ...`
ledoian marked this conversation as resolved
galerie/typy.py Outdated
@ -0,0 +122,4 @@
attrs = _fmt_attrs(kwargs)
# Stavíme HTML ad-hoc, co se může rozbít :'-)
obrazek = format_html(r'<img src="{}"/>', self.placeholder, attrs)
popisek = format_html(r'<p style="text-align: center; font-size: 1.1em;">Prosím oprav typ aktuálního obrázku v <a href="{}">adminu</a>!</p>', reverse('admin:galerie_obrazek_change', args=(self.db_objekt.id,)))
Author
Owner

hnus

hnus
Author
Owner

Pořád mi sice přijde, že mít takhle stavěné HTML v kódu je hnus, ale nevím, jestli dává smysl to měnit. Můžu vybastlit někde dedikovanou šablonu (asi ne doslova django template), ale mám trochu pocit, že to akorát rozhází kód na různá místa a tolik to nepomůže…

Názory? Teď mám pocit, že to prostě nebudu řešit a zavřu to…

Pořád mi sice přijde, že mít takhle stavěné HTML v kódu je hnus, ale nevím, jestli dává smysl to měnit. Můžu vybastlit někde dedikovanou šablonu (asi ne doslova django template), ale mám trochu pocit, že to akorát rozhází kód na různá místa a tolik to nepomůže… Názory? Teď mám pocit, že to prostě nebudu řešit a zavřu to…
ledoian marked this conversation as resolved
@ -0,0 +29,4 @@
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)
Author
Owner

Možná by směrem zpátky spíš mělo selhat, pokud v galerii existuje ne-obrázek…

Možná by směrem zpátky spíš mělo selhat, pokud v galerii existuje ne-obrázek…
ledoian marked this conversation as resolved
Author
Owner

Při ručním přidávání obrázků z Adminu se netipuje typ automaticky :-/

Při ručním přidávání obrázků z Adminu se netipuje typ automaticky :-/
Author
Owner

SVG zjevně není obrázek (Pillow ho neumí zpracovat)…

SVG zjevně není obrázek (Pillow ho neumí zpracovat)…
@ -7,3 +7,3 @@
/* zmenšování spolu s oknem prohlížeče */
.galerie .obrazek, .titulni_obrazek {
max-width: 100%;
max-width: max(100%, 900px);
Owner

900 je nějak moc, ne? (Třeba když jsi na mobilu, tak to znamená, že uvidíš minimum z toho obrázku, ne?)

900 je nějak moc, ne? (Třeba když jsi na mobilu, tak to znamená, že uvidíš minimum z toho obrázku, ne?)
Author
Owner

To je vzaté z původních views.py, za to nemůžu já :-D Ale je to hodně, co třeba 600px? (Haluzím velmi náhodně a na monitoru, zas to nemůže být moc málo, jinak se to zmenší moc…)

To je vzaté z původních `views.py`, za to nemůžu já :-D Ale je to hodně, co třeba `600px`? (Haluzím velmi náhodně a na monitoru, zas to nemůže být moc málo, jinak se to zmenší moc…)
Owner

Aha, tak to asi nechme…

Aha, tak to asi nechme…
zelvuska marked this conversation as resolved
Author
Owner

Není zdokumentované, jak galerii zveřejňovat – je potřeba nejdřív přenastavit neveřejné galerie na správná práva a pak případně automaticky zveřejnit všechno…

Není zdokumentované, jak galerii zveřejňovat – je potřeba nejdřív přenastavit neveřejné galerie na správná práva a pak případně automaticky zveřejnit všechno…
Potřeba proklikat!
Myslím, že to nefunguje, ještě nejsou změněné templaty.
A není napsaná migrace
A není to zdokumentované
Neříkám, že to funguje, ale říkám, že mi běží netriviální testy :-)
Chybí:
- migrace
- přejmenovat templates
ledoian changed title from RFC: Videjka a další bazmeky do galerií to Překopání galerií (a implementace videí) 2025-12-19 08:43:42 +01:00
ledoian changed title from Překopání galerií (a implementace videí) to WIP: Překopání galerií (a implementace videí) 2025-12-19 08:56:27 +01:00
@ -21,3 +22,3 @@
// doleva
if (e.which == 37) {
window.location.assign("../{{ predchozi_obrazek.pk }}#nahoru");
window.location.assign("{% url 'galerie_soubor' soustredeni=soustredeni.id galerie=galerie.pk soubor=predchozi_obrazek.pk %}#nahoru");
Author
Owner

Django dokumentace doporučuje používat get_absolute_url. Tím by se navíc zmenšila duplikace kódu.

Django dokumentace [doporučuje](https://docs.djangoproject.com/en/6.0/ref/models/instances/#get-absolute-url) používat `get_absolute_url`. Tím by se navíc zmenšila duplikace kódu.
ledoian marked this conversation as resolved
Author
Owner
  • dopsat testy

Asi se nesnažím napsat kompletní sadu testů, která popíše všechno. Mám test/y na to, že galerie v běžném případě funguje, až se najdou další problémy, tak se napíšou další testy (což není neobvyklý přístup k testování i v jiných projektech).

A jestli je ten test napsaný dobře a dává smysl, to mi určitě řekne review :-P

> - [x] dopsat testy Asi se nesnažím napsat kompletní sadu testů, která popíše všechno. Mám test/y na to, že galerie v běžném případě funguje, až se najdou další problémy, tak se napíšou další testy (což není neobvyklý přístup k testování i v jiných projektech). A jestli je ten test napsaný dobře a dává smysl, to mi určitě řekne review :-P
Ěblý templaty mi z nějakého důvodu ani neukázaly warning, že `obrazky`
neexistují. Resp. asi mě vypekl ten `{% if obrazky %}`, protože ten je
oficiálně dělaný na to, aby to neexistovalo. (Still bad design imho, ale
co už…)
Manuální, snad se nerozbilo :-P
Jo, hackuju existující migraci, tak jsem asi rozbilo někomu workflow.
Not sorry, odmigrujte a namigrujte znova lol
Author
Owner

@ledoian wrote in #99 (comment):

  • Otestovat videa na různých platformách (jablečné telefony) a popsat, které kodeky se smějí používat (tj. nejspíš jen H.264 + Opus/Vorbis/OGG; asi napsat i správný ffmpegový příkaz na wiki nebo si na to udělat klikátko??)

Než to zapomenu: ffmpeg -i tmp/Kosticka1.ogv -vcodec libx264 -acodec libopus tmp/Kosticka1.mp4 fungovalo (asi by chtělo potunit, aby se nekódovalo na CPU pokud nemusí, ale tohle je asi rozumný začátek)

@ledoian wrote in https://gitea.ks.matfyz.cz/mam/mamweb/pulls/99#issue-662: > * Otestovat videa na různých platformách (jablečné telefony) a popsat, které kodeky se smějí používat (tj. nejspíš jen H.264 + Opus/Vorbis/OGG; asi napsat i správný ffmpegový příkaz na wiki nebo si na to udělat klikátko??) Než to zapomenu: `ffmpeg -i tmp/Kosticka1.ogv -vcodec libx264 -acodec libopus tmp/Kosticka1.mp4` fungovalo (asi by chtělo potunit, aby se nekódovalo na CPU pokud nemusí, ale tohle je asi rozumný začátek)
Author
Owner

Co se kodeků videa týče: teoreticky jde nabídnout prohližeči víc různých ekvivalentních souborů pomocí <source>. Fakt hodně se mi to nechce dělat, protože to znamená mít pro Soubor víc souborů a nějak to pohandlovat, a zní mi jako pain jak vyrobit příčetný frontend/UX, tak to reprezentovat v modelu, tak na to brát ohled v čemkoliv, co zpracovává galerie.

Takže to dělat nebudu, bude dovolený jeden kodek a org zařídí, že se video zkonvertuje… (A audio kodek možná nakonec nebude Opus, ale AAC, protože podpora Opusu v MP4 přibyla pozdě…)

Co se kodeků videa týče: teoreticky jde nabídnout prohližeči víc různých ekvivalentních souborů pomocí [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/source). Fakt hodně se mi to nechce dělat, protože to znamená mít pro Soubor víc souborů a nějak to pohandlovat, a zní mi jako pain jak vyrobit příčetný frontend/UX, tak to reprezentovat v modelu, tak na to brát ohled v čemkoliv, co zpracovává galerie. Takže to dělat nebudu, bude dovolený jeden kodek a org zařídí, že se video zkonvertuje… (A audio kodek možná nakonec nebude Opus, ale AAC, protože podpora Opusu v MP4 přibyla pozdě…)
This pull request is marked as a work in progress.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin galerie_videjka:galerie_videjka
git switch galerie_videjka

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch master
git merge --no-ff galerie_videjka
git switch galerie_videjka
git rebase master
git switch master
git merge --ff-only galerie_videjka
git switch galerie_videjka
git rebase master
git switch master
git merge --no-ff galerie_videjka
git switch master
git merge --squash galerie_videjka
git switch master
git merge --ff-only galerie_videjka
git switch master
git merge galerie_videjka
git push origin master
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mam/mamweb!99
No description provided.