Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72a1ca284a | ||
|
|
7efb302c10 |
No files matched your search
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mediawiki",
|
"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).",
|
"description": "MediaWiki-Seiten/Templates lesen, rendern und schreiben via wiki.py (fetch/update/render/search, Instanzen wiki & devwiki).",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "inmedias.it"
|
"name": "inmedias.it"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: mediawiki
|
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".
|
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.1.0
|
version: 0.2.0
|
||||||
---
|
---
|
||||||
|
|
||||||
# MediaWiki (wiki.py)
|
# 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 search "Suchbegriff" [-n <namespace>] # Titelsuche
|
||||||
./wiki.py -w devwiki update "Kunde:Beispiel GmbH" datei.wiki --summary "..." # speichern
|
./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 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)
|
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.
|
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
|
## Hinweise
|
||||||
- `search` liefert Titel; `render` ist nützlich, um vor/nach dem Schreiben das
|
- `search` liefert Titel; `render` ist nützlich, um vor/nach dem Schreiben das
|
||||||
Ergebnis zu prüfen, ohne die Seite im Browser zu öffnen.
|
Ergebnis zu prüfen, ohne die Seite im Browser zu öffnen.
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ def cmd_search(args: argparse.Namespace) -> None:
|
|||||||
sys.exit(f"Error: unknown namespace '{ns_key}'. "
|
sys.exit(f"Error: unknown namespace '{ns_key}'. "
|
||||||
f"Known: all, {', '.join(NAMESPACES)}")
|
f"Known: all, {', '.join(NAMESPACES)}")
|
||||||
|
|
||||||
|
try:
|
||||||
result = site.api(
|
result = site.api(
|
||||||
"query", list="search",
|
"query", list="search",
|
||||||
srsearch=args.query,
|
srsearch=args.query,
|
||||||
@@ -95,6 +96,12 @@ def cmd_search(args: argparse.Namespace) -> None:
|
|||||||
srlimit=50,
|
srlimit=50,
|
||||||
srprop="title|snippet",
|
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"]
|
hits = result["query"]["search"]
|
||||||
if not hits:
|
if not hits:
|
||||||
print("(keine Ergebnisse)", file=sys.stderr)
|
print("(keine Ergebnisse)", file=sys.stderr)
|
||||||
@@ -110,6 +117,25 @@ def cmd_render(args: argparse.Namespace) -> None:
|
|||||||
print(result["parse"]["text"]["*"], end="")
|
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:
|
def cmd_upload(args: argparse.Namespace) -> None:
|
||||||
path = Path(args.file_path)
|
path = Path(args.file_path)
|
||||||
if not path.exists():
|
if not path.exists():
|
||||||
@@ -161,6 +187,12 @@ def main() -> None:
|
|||||||
render_p.add_argument("title", help="Page title")
|
render_p.add_argument("title", help="Page title")
|
||||||
render_p.set_defaults(func=cmd_render)
|
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 = 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("file_path", help="Absolute path to the local file")
|
||||||
upload_p.add_argument("wiki_filename", help="Target filename on the wiki (without 'File:' prefix)")
|
upload_p.add_argument("wiki_filename", help="Target filename on the wiki (without 'File:' prefix)")
|
||||||
|
|||||||
Reference in new issue
Block a user