Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72a1ca284a | ||
|
|
7efb302c10 |
No files matched your search
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mediawiki",
|
||||
"version": "0.1.0",
|
||||
"version": "0.1.1",
|
||||
"description": "MediaWiki-Seiten/Templates lesen, rendern und schreiben via wiki.py (fetch/update/render/search, Instanzen wiki & devwiki).",
|
||||
"author": {
|
||||
"name": "inmedias.it"
|
||||
|
||||
@@ -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 <namespace>] # 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.
|
||||
|
||||
@@ -88,13 +88,20 @@ def cmd_search(args: argparse.Namespace) -> None:
|
||||
sys.exit(f"Error: unknown namespace '{ns_key}'. "
|
||||
f"Known: all, {', '.join(NAMESPACES)}")
|
||||
|
||||
result = site.api(
|
||||
"query", list="search",
|
||||
srsearch=args.query,
|
||||
srnamespace=ns,
|
||||
srlimit=50,
|
||||
srprop="title|snippet",
|
||||
)
|
||||
try:
|
||||
result = site.api(
|
||||
"query", list="search",
|
||||
srsearch=args.query,
|
||||
srnamespace=ns,
|
||||
srlimit=50,
|
||||
srprop="title|snippet",
|
||||
)
|
||||
except mwclient.errors.APIError as exc:
|
||||
if exc.code == "cirrussearch-parse-error":
|
||||
sys.exit(f"Error: Suchanfrage nicht verstanden: {args.query!r}\n"
|
||||
f"Hinweis: 'insource:wort' funktioniert, die Regex-Form "
|
||||
f"'insource:/muster/' ist auf dieser Instanz nicht freigeschaltet.")
|
||||
sys.exit(f"Error: Suche fehlgeschlagen ({exc.code}): {exc.info}")
|
||||
hits = result["query"]["search"]
|
||||
if not hits:
|
||||
print("(keine Ergebnisse)", file=sys.stderr)
|
||||
@@ -110,6 +117,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 +187,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)")
|
||||
|
||||
Reference in new issue
Block a user