Commit 9aba283 vrátil UTF-8 BOM do amcr_dialog.py a amcr_tools.py –
patrně ho doplnil editor při uložení. Oficiální pyqgis4-checker na nich
kvůli tomu znovu padal na SyntaxError, tedy přesně to, co d398d2c
opravoval.
Zároveň zalomen sloučený import z qgis.core v amcr_dialog.py, který měl
87 znaků.
Bez změny chování. Kontroly, které pouští plugins.qgis.org (flake8),
plus ruff.
flake8: odstraněny koncové bílé znaky, srovnány nadbytečné prázdné řádky
a zalomeno 12 řádků přes 79 znaků. Hlášku o HTTP chybě v login_to_api()
si nešlo jen zalomit – tělo odpovědi je nově v proměnné `telo`, výsledný
text je stejný.
ruff: odstraněny zbytečné prefixy u'' u překládaných řetězců (6×),
.format() nahrazen f-stringem, str() uvnitř f-stringu převedeno na !s,
`k in dict.keys()` na `k in dict`, prázdný komentář; nepoužitá rozbalená
proměnná `existing_cfg` nahrazena `_`.
Vědomě neřešeno:
- resources.py (5 zbylých nálezů flake8) je generovaný výstup pyrcc,
nese hlavičku "All changes made in this file will be lost", není nikde
importovaný a v repu k němu chybí zdrojový .qrc.
- ruff BLE001 (10×) hlásí `except Exception`. Ty jsou v pluginu záměrné:
drží pád mimo QGIS a chybu ukážou v liště zpráv. Změna by byla zásah
do chování, ne úklid.
- ruff SIM103 (2×) navrhuje sloučit strážní podmínky do jednoho výrazu.
Obě místa mají ke každé větvi vysvětlující komentář, sloučením by se
staly hůř čitelnými.
- ruff UP009 a I001 (coding hlavička a řazení importů) jsou celoprojektová
konvence; jejich změna patří do samostatného rozhodnutí, ne sem.
Ověřeno v QGIS 3.44.13 (Qt5) i QGIS 4.2.1 (Qt6): importy, vytvoření tasku
i všechny tři filtrační dialogy fungují shodně. Bandit, detect-secrets
i pyqgis4-checker hlásí nula nálezů.
Oficiální kontrola pyqgis4-checker (skript pyqt5_to_pyqt6.py z QGISu)
hlásila u pluginu 13 nekompatibilit a tři soubory vůbec nepřečetla.
Odstraněn UTF-8 BOM z amcr_codelists.py, amcr_dialog.py a amcr_tools.py.
Checker čte zdroják jako UTF-8 bez utf-8-sig a na BOM padá na
SyntaxError: invalid non-printable character U+FEFF, takže se ty soubory
nezkontrolovaly vůbec. Pythonu při běhu BOM nevadí, proto to nikdy
nevyskočilo. heslar.csv si BOM ponechává, tam je kvůli Excelu.
Enumy převedeny na plně kvalifikované tvary (13 míst):
Qgis.{Info,Warning,Critical} -> Qgis.MessageLevel.*,
QgsTask.CanCancel -> QgsTask.Flag.CanCancel,
QgsWkbTypes.*Geometry -> QgsWkbTypes.GeometryType.*Geometry.
Zkrácené tvary v QGIS 4.2.1 zatím fungují, ale kontrola je vytýká
a aliasy do budoucna mizí. Zbytek kódu už scoped tvary používal.
Do AGENTS.md doplněna sekce o kompatibilitě s Qt6 / QGIS 4 se závaznými
pravidly a příkazy na ověření.
Ověřeno spuštěním v QGIS 3.44.13 (Qt 5.15.18) i QGIS 4.2.1 (Qt 6.10.3):
importy, vytvoření tasku i všechny tři filtrační dialogy fungují shodně.
Log pyqgis4-checkeru je nově prázdný.
Shrnuje změny sloučené do této větve oproti main: projektové akce (#53), úklid kódu (#54), stahování samostatných nálezů (#57), diagnostiku prázdných výsledků z API (#58) a filtrování podle data se scrollovatelným dialogem (#59).
* fix: scrollovatelný filtrační dialog
Obsah dialogu přesahoval okno u všech tří typů dat – u akcí zabíral
přes 1280 px v okně vysokém 750 px, takže spodní filtry i tlačítka
byly nedostupné.
Filtry se nově scrollují. Tlačítka OK / Aktualizovat hesláře / Cancel
zůstávají mimo scrollovanou oblast, aby se kvůli potvrzení dialogu
nemuselo scrollovat na konec seznamu.
* feat: filtrování záznamů podle data
Přidává filtr na datum zahájení a ukončení u akcí a na datum nálezu
u samostatných nálezů (#56). Lokalita filtr nedostává – v jejím indexu
žádné datumové pole není, takže by šlo o ovládací prvek bez účinku.
API vyžaduje obě meze intervalu: jednostranný rozsah shodí server na
ArrayIndexOutOfBoundsException a hvězdičku nepřijímá. Prázdné pole se
proto nahrazuje zarážkou 0001-01-01 / 9999-12-31, což jsou shodou
okolností i výchozí meze QgsDateEdit. Blok s oběma poli prázdnými
neposílá do dotazu nic.
Obrácené rozmezí vrací API jako nula záznamů bez chybové hlášky, což
je k nerozeznání od skutečně prázdného výsledku – dialog ho proto
odmítne už při potvrzení a vypíše, kterých filtrů se to týká.
- logování odeslané URL a chyb z těla odpovědi v _api_get_json
- výpis filtrů z dialogu před zahájením stahování
- rozlišení chyby API od prázdného výsledku (api_error)
- dávky geometrií PIAN hlásí chybějící blok 'response'
API vrací chyby s HTTP 200 a klíčem 'error' místo bloku 'response'; resp_json.get('response', {}) z toho udělal prázdný výsledek, takže neplatný parametr, prázdné okno mapy i chyba serveru končily stejnou hláškou "Žádné záznamy nenalezeny".
* feature: dialog: přidána nová pole
přidána pole samostatných nálezů pro filtrovací dialog + upravena viditelnost některých spolčných polí (např. skrýt areál, zobrazit organizaci nejen pro akce, ale i pro PAS, ...)
* feature: tlačítko v menu
v kontextové nabídce přibylo tlačítko pro filtrování PASových záznamů; ikona je zatím placeholder
* feature: rozšíření slovníčku
slovníček interních vs api klíčů byl rozšířen o nová pole (nálezce, okolnosti, ...) a zároveň byla změněna jeho struktura: nově obsahuje i base url vzhledem k tomu, že si skript pro data sahá do dvou různých API; přidáno base url pro digiarchiv
* feature: update funkcí pro stahování dat
funkce fetch_set a download_heslare byly upraveny pro stahování dat nejen z OAI-PMH API, ale nově i z API digiarchivu (= osoby se nově nestahují z hesláře osob, ale z facetek digiarchivu, kde mají osoby přidělené "role" nálezce/vedoucí)
* feature: globals pro PAS
založeny nové heslářové globals, pak přidány do funkce refresh_globals
* feature: nové heslářové globals + cache v dialogu
* feature: aktualizace hesláře
* fix: oprava typ_dat = "pas" na typ_dat = "samostatny_nalez"
* feature: dynamičtjší způsob interpretace typu dat
- archeologicky_zaznam nově čerpá human-readable název pro název vrstvy v typ_dat_vocab
- archeologicky_zaznam_l pro ověřování, jestli je současný typ_dat akce nebo lokalita
* feature (wip): první krůčky logiky pro parsování PAS záznamů
- dosavadní logika parsování platná pro akce a lokality je podmíněna typ_dat
- stub logiky parsování pro samostatné nálezy
* feature: čtení dat z JSON payload
získávání sn-specific dat, jako je nálezce, hloubka nálezu, ale i vlastní wkt, které není závislé na PIANu
* feature: párovací slovník metadat pro samostatné nálezy
* fix: Přístupnost přidána do hesláře aliasů
* fix: oprava chyb z dialogu znemožňujících stahování SN
* fix: předávání filtrů k samostatným nálezům z dialogu do "tools" skriptu
* feat: drobné změny
- escapování názvů vrstev (podtržítko místo mezery)
- `actions_with_geom` -> `entries_with_geom`
- čitelný `typ_dat` pro PAS: `PAS` -> `Samostatný nález`
* feat: dokončení smyčky na ukládání metadat k SN z docs
* feat: plnění vrstvy daty SN
* feat: update ikon pro samostatné nálezy a login
* feature/projektove-akce: do dialogu akce přidán checkbox pro filtrování projektových akcí + backend logika
* feature/projektove-akce: do atributové tabulky akcí přidáno pole Projekt (prázdné, pokud nejde o projektovou akci)
Špatné heslo zadané v přihlašovacím dialogu se dosud uložilo do QGIS
Authentication Manageru a chyba se ukázala až po zavření dialogu.
- Dialog nyní před uložením zkusí přihlášení k API; při neplatných
údajích se nic neuloží a uživatel může údaje rovnou opravit.
- Pokud je server nedostupný (údaje nelze ověřit), uživatel si může
zvolit, zda je uložit neověřené – změna hesla na webu u dříve
uložených údajů tím není dotčena.
- login_to_api nově rozlišuje důvod selhání (LAST_LOGIN_ERROR:
'auth' × 'network'), aby dialog uměl oba případy odlišit.
- Ověřuje se i změna samotného e-mailu (proti uloženému heslu).
Při výpadku sítě uprostřed stahování se dosud chyba jen zapsala do logu:
stránkování se tiše ukončilo s částečnými daty a smyčka PIAN zkoušela
marně všechny zbývající dávky, takže uživatel skončil u hlášky 'Žádná
data k zobrazení' bez vysvětlení.
- Síťové chyby (requests.RequestException) se v obou smyčkách chytají
zvlášť a stahování PIAN se po první z nich ihned ukončí.
- Pokud selže už stahování metadat, zobrazí se červená lišta
'Stahování selhalo: chyba sítě'.
- Pokud se stihla vykreslit část dat, zobrazí se varování, že výsledek
je neúplný a je třeba stahování zopakovat.
- metadata.txt: icon ukazoval na neexistující download.png – plugin se
ve správci zásuvných modulů zobrazoval bez ikony; nastaveno na akce.png.
- Workflow: actions/checkout v2→v4 (v2 je deprecated, Node 12)
a softprops/action-gh-release v1→v2.
- README: poznámka, že knihovna requests nemusí být na Linuxu součástí
systémové instalace QGIS.
Pokud žádný titulek záznamu neprojde filtrem na jednopísmenný kód,
next() vrátil None a do heslar.csv se zapsal prázdný/None kód, který
se mohl dostat do API filtru jako hodnota 'None:or'. Takové záznamy
se nyní přeskakují.
- login_to_api: ošetřena výjimka při parsování ne-JSON odpovědi
(např. HTML chybová stránka za proxy) – dříve propadla až do QGIS.
- _api_get přejmenováno na _api_get_json: tělo odpovědi se parsuje jen
jednou (kontrola expirované session ho znovu využije), místo dvojího
json() na každé dávce.
- Stránkování porovnává počet stažených (ne unikátních) záznamů proti
numFound – stránky plné duplicit už nevyvolávají zbytečné requesty.
- Přidán re-entrancy guard: během běžícího stahování (processEvents
pumpuje event loop) nelze spustit druhé stahování.
- print() nahrazeno QgsMessageLog (záložka AMČR v panelu Zprávy).
- Fallback geometrie z geom_wkt (WGS-84) se nyní transformuje do S-JTSK;
dříve se souřadnice ve stupních vkládaly přímo do vrstvy EPSG:5514
a prvek se vykreslil úplně mimo.
- Nevalidní geometrie (např. samoprůniky polygonů) se před zahozením
zkusí opravit přes makeValid().
- Filtr přesnosti PIAN normalizuje hodnotu pian_presnost (API ji může
vracet jako jednoprvkový seznam) – dříve mohl tiše zahazovat záznamy.
Stejná normalizace pro pian_typ kvůli překladu kódu.
- Přístupy ke komponenta_areal/komponenta_obdobi a az_chranene_udaje
ošetřeny proti hodnotě None (klíč existuje, ale je null).
- amcr_viewer.py: QSettings().value('locale/userLocale') může být None na
čisté instalaci QGIS – ošetřen fallback na 'en', jinak plugin spadne
na TypeError hned při načtení.
- amcr_viewer.py: odstraněn nepoužívaný hvězdičkový import resources.
- amcr_dialog.py: úloha aktualizace heslářů se drží v modulové referenci,
aby GC neuklidil Python wrapper QgsTask před dokončením (známá příčina
pádů QGIS).
- amcr_dialog.py: tlačítko aktualizace se po spuštění zakáže – nelze už
spustit několik stahování paralelně přepisujících heslar.csv.
- amcr_dialog.py: závěrečné QMessageBoxy se parentují na hlavní okno QGIS
místo dialogu, který může být v době dokončení úlohy už zavřený
(smazaný C++ objekt → pád).
* vyměnit xml.etree.ElementTree za defusedxml.ElementTree
* zpátky xml.etree.ElementTree, ale přidáno # nosec; jde o false positive
* switch z ukládání hesel v registrech na používání QGIS Auth Manager
* přidáno nové tlačítko do toolbaru
* přihlašovací dialog
* funkce pro přihlašování
* aplikace získávání dat z API přes session
* zastřešující akce v main skriptu
* ošetření prodlužování session/opětovné přihlášení
* přidání přístupnosti do hesláře
* aktualizace přibaleného hesláře
* oprava stahování hesláře (pristupnost vyžaduje písmeno [A/B/C/D], ne heslo; aktualizace hesláře
* aplikace přístupnosti do filtračního dialogu
* úpravy přihlašovacího dialogu
* čištění amcr_tools.py od zbytečných prvků souvisejících se standalone tabulkou komponent
* aplikace nové logiky přípravy dat v případě požadavku na komponenty
* nové aliasy + přidání dat komponent do finálních tabulek
* oprava pořadí polí v tabulce
* přechod od statického hesláře k dynamickému načítání z OAI-PMH API AMČR
* aplikace načítání heslářů a task management (backend)
* frontend + debugging
* aktualizace přibaleného hesláře
* kosmetické drobnosti
* ošetření speciální případů při stahování hesláře (katastr, okres) + s tím spojená aktualizace přiloženého hesláře
Comprehensive update to improve plugin efficiency and code quality:
- Performance: Increased BATCH_PIAN to 200 and optimized attribute parsing loops.
- Performance: Optimized codelist caching to reload only necessary data.
- UI/UX: Fixed plugin unloading (toolbar icon duplication) and added safe cursor handling.
- Refactoring: Moved GUI helper methods to class level for better OOP structure.
- Modernization: Updated dialog execution syntax to modern PyQt5/6 standards.
- Documentation: Added full inline English documentation across all modules.