diff --git a/plugins/mediawiki/skills/mediawiki/SKILL.md b/plugins/mediawiki/skills/mediawiki/SKILL.md index 3d25f96..d4df6a0 100644 --- a/plugins/mediawiki/skills/mediawiki/SKILL.md +++ b/plugins/mediawiki/skills/mediawiki/SKILL.md @@ -1,7 +1,7 @@ --- name: mediawiki -description: MediaWiki-Seiten und -Templates lesen, rendern und schreiben. Use when editing/fetching wiki pages (wiki.inmedias.it, devwiki.inmedias.it) or when the user mentions "wiki", "Vorlage/Template", "Kundenseite". -version: 0.1.0 +description: MediaWiki-Seiten und -Templates lesen, rendern, schreiben und deren Parser-Cache leeren. Use when editing/fetching wiki pages (wiki.inmedias.it, devwiki.inmedias.it) or when the user mentions "wiki", "Vorlage/Template", "Kundenseite", or when a page shows stale API data. +version: 0.2.0 --- # MediaWiki (wiki.py) @@ -37,6 +37,8 @@ oder anderen direkten Server-Eingriffen. Reine Lese-/Render-Checks ./wiki.py -w devwiki search "Suchbegriff" [-n ] # Titelsuche ./wiki.py -w devwiki update "Kunde:Beispiel GmbH" datei.wiki --summary "..." # speichern ./wiki.py -w wiki update "Titel" - --summary "..." # Inhalt von stdin +./wiki.py -w wiki purge "Titel" ["Titel 2" ...] [--links] # Parser-Cache leeren +./wiki.py -w wiki upload /pfad/bild.png bild.png --description "..." # Datei hochladen ``` Tipp: Beim Schreiben den Inhalt aus einer Datei (`datei.wiki`) oder `-` (stdin) @@ -57,6 +59,27 @@ dann `.env` im aktuellen Verzeichnis, dann bereits gesetzte Env-Variablen). Sieh Es empfiehlt sich ein eigener Bot-/Service-Account mit den nötigen Schreibrechten. +## Seiten, die ihre Daten aus einer API holen + +Vorlagen mit `#get_web_data` (External Data) werden **nicht** bei jedem +Seitenaufruf ausgeführt. MediaWiki liefert die Seite aus dem Parser-Cache und +fragt die API gar nicht erst an. Ändern sich die Daten hinter der API, zeigt +die Seite weiter beliebig alte Werte — ohne Fehlermeldung, ohne dass es +jemandem auffällt. + +Deshalb gehört nach jedem Datenupload ein Purge: + +```bash +./wiki.py -w wiki purge "Nextcloud (Hosting)" +``` + +`--links` schaltet zusätzlich `forcelinkupdate` ein (langsamer, aktualisiert +die Linktabellen) — für reine Datenaktualisierungen nicht nötig. + +Das betrifft auch die Fehlersuche: Wer nach einer Änderung `render` aufruft und +die alten Werte sieht, hat meist nicht die Daten kaputt, sondern nur den Cache +vor sich. Erst purgen, dann urteilen. + ## Hinweise - `search` liefert Titel; `render` ist nützlich, um vor/nach dem Schreiben das Ergebnis zu prüfen, ohne die Seite im Browser zu öffnen. diff --git a/plugins/mediawiki/skills/mediawiki/wiki.py b/plugins/mediawiki/skills/mediawiki/wiki.py index e1ec04f..8154896 100755 --- a/plugins/mediawiki/skills/mediawiki/wiki.py +++ b/plugins/mediawiki/skills/mediawiki/wiki.py @@ -110,6 +110,25 @@ def cmd_render(args: argparse.Namespace) -> None: print(result["parse"]["text"]["*"], end="") +def cmd_purge(args: argparse.Namespace) -> None: + """Parser-Cache einer oder mehrerer Seiten leeren. + + Noetig fuer Seiten, die ihre Daten per #get_web_data aus einer API holen: + MediaWiki rendert sonst aus dem Parser-Cache weiter und fragt die API gar + nicht erst an - die Seite zeigt dann beliebig alte Werte, ohne dass das + irgendwo auffaellt. + """ + site = get_site(args.wiki) + result = site.api("purge", titles="|".join(args.titles), + forcelinkupdate=1 if args.links else None) + for entry in result.get("purge", []): + title = entry.get("title", "?") + if "missing" in entry: + print(f"Error: page '{title}' does not exist", file=sys.stderr) + else: + print(f"Purged '{title}'") + + def cmd_upload(args: argparse.Namespace) -> None: path = Path(args.file_path) if not path.exists(): @@ -161,6 +180,12 @@ def main() -> None: render_p.add_argument("title", help="Page title") render_p.set_defaults(func=cmd_render) + purge_p = sub.add_parser("purge", help="Clear the parser cache of one or more pages") + purge_p.add_argument("titles", nargs="+", help="Page title(s)") + purge_p.add_argument("--links", action="store_true", + help="Also run forcelinkupdate (slower, updates link tables)") + purge_p.set_defaults(func=cmd_purge) + upload_p = sub.add_parser("upload", help="Upload a local file to the wiki file store") upload_p.add_argument("file_path", help="Absolute path to the local file") upload_p.add_argument("wiki_filename", help="Target filename on the wiki (without 'File:' prefix)")