Zum Inhalt

Erste Schritte

Installation

pip install spltz-viur-revision

Benötigt Python ≥ 3.12 und viur-core ≥ 3.7, < 4.

1. Revisionen an einem Skeleton verfolgen

Von RevisionAbstractSkel erben:

from viur.core.skeleton import Skeleton
from viur.revision import RevisionAbstractSkel

class ExampleSkel(RevisionAbstractSkel, Skeleton):
    kindName = "example"
    # … deine Bones …

Standardmäßig erzeugt jeder Schreibvorgang eine neue Revision. Um nur auf Änderungen bestimmter Bones zu reagieren, setze revision_fields:

class ExampleSkel(RevisionAbstractSkel, Skeleton):
    revision_fields = ["title", "body"]

revision_fields = ["*"] ist der Wildcard-Standard — jede nicht-leere Änderungsliste löst eine Revision aus.

Coalescing-Fenster

Schnell aufeinanderfolgende Schreibvorgänge (z. B. Auto-Save) innerhalb eines 15-Minuten-Fensters werden standardmäßig zu einer einzigen Revision zusammengefasst. Pro Skel überschreiben:

import datetime

class ExampleSkel(RevisionAbstractSkel, Skeleton):
    # Coalescing komplett deaktivieren:
    revision_coalesce_window = None

    # Oder verkürzen:
    revision_coalesce_window = datetime.timedelta(minutes=2)

2. Revisions-Endpunkte am Modul bereitstellen

from viur.revision import RevisionModule

class Example(RevisionModule, List):
    ...

Das fügt dem Modul fünf Endpunkte hinzu — die vollständigen Request-/Response-Formen siehe API-Referenz zu RevisionModule:

Methode URL Zweck
GET /<module>/list_revision Revisionen auflisten
GET /<module>/view_revision Eine Revision anzeigen
POST /<module>/apply_revision Eine Revision wiederherstellen
POST /<module>/delete_revision Eine einzelne Revision löschen
GET /<module>/cleanup_revisions_now Aufbewahrung manuell ausführen

Alle erfordern entweder das Recht root oder <moduleName>-manage.

3. Aufbewahrung läuft automatisch

Ein täglicher PeriodicTask dünnt die Historie pro Ursprungs-Entität aus. Zur Bucket-Logik siehe Aufbewahrung.

Programmatische API

Eine bestimmte Revision in eine viewSkel-Instanz laden:

skel = self.viewSkel()
if not skel.read_revision(entity_key, version=3):
    raise errors.NotFound("Revision not found")

version="latest" (Standard) liefert die neueste Revision; übergib eine Ganzzahl, um über revision_index auszuwählen.