chore: úklid nálezů z lintů

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ů.
This commit is contained in:
david-spacil committed 2026-09-01 23:10:33 +02:00
1 parent d398d2cd1b
commit 048ffe4e2a
5 files changed
+45 -34

No files matched your search

-1
View File
@@ -31,6 +31,5 @@ def classFactory(iface): # pylint: disable=invalid-name
:param iface: A QGIS interface instance.
:type iface: QgsInterface
"""
#
from .amcr_viewer import AmcrViewer
return AmcrViewer(iface)
+7 -5
View File
@@ -98,7 +98,7 @@ def parse_codelist_file(filename, target_dict=None):
def load_all_data():
"""Loads the codelist during plugin startup."""
ensure_codelists_dir()
categorized_data = {k: {} for k in slovnicek.keys()}
categorized_data = {k: {} for k in slovnicek}
parse_codelist_file('heslar.csv', categorized_data)
return categorized_data
@@ -124,7 +124,9 @@ def fetch_set(base_url, internal_name, api_set, task=None):
try:
if "digiarchiv" not in base_url:
response = requests.get(base_url, params=params_amcr, timeout=30)
response = requests.get(
base_url, params=params_amcr, timeout=30
)
response.raise_for_status()
root = ET.fromstring(response.content) # nosec
@@ -193,7 +195,7 @@ def fetch_set(base_url, internal_name, api_set, task=None):
time.sleep(0.5)
else:
break
else:
response = requests.get(base_url, params=params_da, timeout=30)
response.raise_for_status()
@@ -210,8 +212,8 @@ def fetch_set(base_url, internal_name, api_set, task=None):
'Kód': nazev,
'Kategorie': internal_name
})
break
break
except Exception as e:
QgsMessageLog.logMessage(
+17 -9
View File
@@ -13,7 +13,7 @@ from qgis.utils import iface
from .amcr_codelists import (OBDOBI, TYP_AKCE, KRAJE, AREAL, ORGANIZACE,
OKRESY, KATASTRY, VEDOUCI, PIAN_PRESNOST,
TYP_LOKALITY, DRUH_LOKALITY, JISTOTA,
LOKALITA_ZACHOVALOST, PRISTUPNOST,
LOKALITA_ZACHOVALOST, PRISTUPNOST,
NALEZ_KATEGORIE, DRUH_NALEZU, SPECIFIKACE,
NALEZOVE_OKOLNOSTI, NALEZCE,
download_heslare, refresh_globals)
@@ -608,7 +608,7 @@ class AmcrFilterDialog(QDialog):
# This will show exactly what went wrong (e.g. PermissionError)
msg = (
"Aktualizace selhala z důvodu chyby:\n"
f"{str(task.exception)}"
f"{task.exception!s}"
)
else:
msg = "Aktualizace byla zrušena uživatelem."
@@ -660,7 +660,7 @@ class AmcrFilterDialog(QDialog):
filters['f_vedouci'] = self.selection_cache['vedouci']
if self.selection_cache['organizace']:
filters['f_organizace'] = self.selection_cache['organizace']
filters['f_organizace'] = self.selection_cache['organizace']
if self.selection_cache['typ_lokality']:
filters['f_typ_lokality'] = self.selection_cache['typ_lokality']
@@ -669,7 +669,9 @@ class AmcrFilterDialog(QDialog):
if self.selection_cache['jistota']:
filters['f_jistota'] = self.selection_cache['jistota']
if self.selection_cache['lokalita_zachovalost']:
filters['f_lokalita_zachovalost'] = self.selection_cache['lokalita_zachovalost']
filters['f_lokalita_zachovalost'] = (
self.selection_cache['lokalita_zachovalost']
)
# Samostatné nálezy
if self.selection_cache['nalez_kategorie']:
@@ -679,7 +681,9 @@ class AmcrFilterDialog(QDialog):
if self.selection_cache['specifikace']:
filters['f_specifikace'] = self.selection_cache['specifikace']
if self.selection_cache['nalezove_okolnosti']:
filters['f_nalezove_okolnosti'] = self.selection_cache['nalezove_okolnosti']
filters['f_nalezove_okolnosti'] = (
self.selection_cache['nalezove_okolnosti']
)
if self.selection_cache['nalezce']:
filters['f_nalezce'] = self.selection_cache['nalezce']
@@ -718,7 +722,8 @@ class LoginDialog(QDialog):
- storeAuthenticationConfig() and loadAuthenticationConfig() both have
SIP_INOUT on their config parameter, so Python bindings return a tuple
(bool, QgsAuthMethodConfig) rather than just bool. Always unpack both.
- loadAuthenticationConfig() with full=False loads only metadata (name, method,
- loadAuthenticationConfig() with full=False loads only metadata
(name, method,
id) but NOT the config() values like username/password. Use full=True to
access those.
"""
@@ -949,7 +954,7 @@ class LoginDialog(QDialog):
# We skip hasConfigId() as it may return False
# despite the config existing
# (in-memory cache may not be populated yet in QGIS 4).
ok_load, existing_cfg = (
ok_load, _ = (
self._load_config(existing_id, full=False)
if existing_id
else (False, None)
@@ -978,7 +983,9 @@ class LoginDialog(QDialog):
settings = QSettings()
existing_id = settings.value(self.SETTINGS_KEY, "")
if existing_id:
QgsApplication.authManager().removeAuthenticationConfig(existing_id)
QgsApplication.authManager().removeAuthenticationConfig(
existing_id
)
settings.remove(self.SETTINGS_KEY)
QMessageBox.information(
self,
@@ -1013,4 +1020,5 @@ class LoginDialog(QDialog):
if not ok:
return "", ""
return cfg.config("username", ""), cfg.config("password", "") # nosec B106
return (cfg.config("username", ""),
cfg.config("password", "")) # nosec B106
+12 -11
View File
@@ -109,8 +109,9 @@ def login_to_api(username: str, password: str):
except requests.exceptions.HTTPError as e:
status = e.response.status_code if e.response is not None else None
_log(f"CHYBA HTTP {status if status else '?'}: "
f"{e.response.text[:300] if e.response is not None else 'žádná odpověď'}",
telo = (e.response.text[:300] if e.response is not None
else "žádná odpověď")
_log(f"CHYBA HTTP {status if status else '?'}: {telo}",
Qgis.MessageLevel.Critical)
LAST_LOGIN_ERROR = 'auth' if status in (401, 403) else 'network'
return None
@@ -623,7 +624,8 @@ def load_amcr_data(canvas, bb, filters=None,
for dj in djs:
# Skip negative evidence units if requested
if skip_negativni and dj.get('dj_negativni_jednotka') is True:
if (skip_negativni
and dj.get('dj_negativni_jednotka') is True):
continue
komps = dj.get('dj_komponenta', [])
@@ -643,7 +645,8 @@ def load_amcr_data(canvas, bb, filters=None,
dj_id = dj.get('ident_cely')
dj_typ = dj.get('dj_typ')
# Merge shared metadata with documentation unit-specific fields
# Merge shared metadata with documentation
# unit-specific fields
dj_meta = {
**meta,
'dj_id': dj_id,
@@ -690,7 +693,8 @@ def load_amcr_data(canvas, bb, filters=None,
or {}
).get('value', ""),
}
pian_lookup[dj_pian_value].append(komp_meta)
pian_lookup[dj_pian_value].append(
komp_meta)
target_pian_ids_count += 1
else:
# DJ without components — still include
@@ -704,7 +708,8 @@ def load_amcr_data(canvas, bb, filters=None,
'komponenta_areal': "",
'komponenta_obdobi': "",
}
pian_lookup[dj_pian_value].append(empty_meta)
pian_lookup[dj_pian_value].append(
empty_meta)
target_pian_ids_count += 1
else:
target_pian_ids_count += 1
@@ -907,9 +912,6 @@ def load_amcr_data(canvas, bb, filters=None,
)
return
# ==========================================
# D) LAYER CREATION (QGIS Memory Layers)
# ==========================================
@@ -947,7 +949,6 @@ def load_amcr_data(canvas, bb, filters=None,
QgsField("typ_dj", QMetaType.Type.QString),
]
cols += [
QgsField(typ_dat, QMetaType.Type.QString),
QgsField("definicni_body", QMetaType.Type.QString),
@@ -1265,7 +1266,7 @@ def load_amcr_data(canvas, bb, filters=None,
]
feat.setAttributes(atributy)
target_list.append(feat)
except Exception as ex:
QgsMessageLog.logMessage(
f"Chyba při tvorbě feature: {ex}",
+9 -8
View File
@@ -29,7 +29,7 @@ class AmcrViewer:
locale_path = os.path.join(
self.plugin_dir,
'i18n',
'AmcrViewer_{}.qm'.format(locale)
f'AmcrViewer_{locale}.qm'
)
# Install the translator if a translation file
@@ -41,7 +41,7 @@ class AmcrViewer:
# Initialize internal state
self.actions = []
self.menu = self.tr(u'&AMČR Viewer')
self.menu = self.tr('&AMČR Viewer')
self.first_start = None
def tr(self, message):
@@ -102,7 +102,7 @@ class AmcrViewer:
# custom dropdown menu
self.action_download_akce = self.add_action(
icon_path=icon_akce_path,
text=self.tr(u'Stáhnout data akcí | AMČR Viewer'),
text=self.tr('Stáhnout data akcí | AMČR Viewer'),
callback=lambda checked=False: self.run_download('akce'),
parent=self.iface.mainWindow(),
add_to_menu=False,
@@ -112,8 +112,9 @@ class AmcrViewer:
self.action_download_pas = self.add_action(
icon_path=icon_pas_path,
text=self.tr(u'Stáhnout data samostatných nálezů | AMČR Viewer'),
callback=lambda checked=False: self.run_download('samostatny_nalez'),
text=self.tr('Stáhnout data samostatných nálezů | AMČR Viewer'),
callback=lambda checked=False: self.run_download(
'samostatny_nalez'),
parent=self.iface.mainWindow(),
add_to_menu=False,
add_to_toolbar=False
@@ -122,7 +123,7 @@ class AmcrViewer:
self.action_download_lokality = self.add_action(
icon_path=icon_lokality_path,
text=self.tr(u'Stáhnout data lokalit | AMČR Viewer'),
text=self.tr('Stáhnout data lokalit | AMČR Viewer'),
callback=lambda checked=False: self.run_download('lokalita'),
parent=self.iface.mainWindow(),
add_to_menu=False,
@@ -132,7 +133,7 @@ class AmcrViewer:
self.action_login_dialog = self.add_action(
icon_path=icon_pas_path,
text=self.tr(u'Přihlásit se | AMČR Viewer'),
text=self.tr('Přihlásit se | AMČR Viewer'),
callback=lambda checked=False: self.login(),
parent=self.iface.mainWindow(),
add_to_menu=False,
@@ -142,7 +143,7 @@ class AmcrViewer:
self.action_amcr_help = self.add_action(
icon_path=icon_amcr_help_path,
text=self.tr(u'Nápověda AMČR Help | AMČR Viewer'),
text=self.tr('Nápověda AMČR Help | AMČR Viewer'),
callback=lambda checked=False: self.open_help(),
parent=self.iface.mainWindow(),
add_to_menu=False,