Changeset 1f5bf2d in flexoentity


Ignore:
Timestamp:
12/08/25 10:00:18 (5 weeks ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
master
Children:
e230c40
Parents:
ea28ca0
Message:

redesign entity manager to support local, staging and permanent persistance

Location:
flexoentity
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • flexoentity/composite_backend.py

    rea28ca0 r1f5bf2d  
    3939    @primary.setter
    4040    def primary(self, new_primary):
    41         self._primary = new_primary   
     41        self._primary = new_primary
    4242
    43     def add_backend(self, backend, clear=False):
     43    def add_sync_backend(self, backend, clear=False):
    4444        """
    4545        Append an additional backend.
  • flexoentity/domain_manager.py

    rea28ca0 r1f5bf2d  
    3333    ENTITY_CLASS = Domain
    3434
    35     def __init__(self, backend, registry=None):
    36         super().__init__(backend)
     35    def __init__(self, local_backend, staging_backend, permanent_backend, registry=None):
     36        super().__init__(local_backend=local_backend,
     37                         staging_backend=staging_backend,
     38                         permanent_backend=permanent_backend)
    3739        self._registry = registry
    3840        self._index_by_domain_id = {}
     
    5052        """Rebuild domain_id lookup table from backend contents."""
    5153        self._index_by_domain_id.clear()
    52         for dom in self.backend.load_all():
    53             self._index_by_domain_id[dom.domain_id] = dom
     54        for backend in [self.local_backend, self.staging_backend, self.permanent_backend]:
     55            for dom in backend.load_all():
     56                self._index_by_domain_id[dom.domain_id] = dom
    5457
    5558    # ------------------------------------------------------------
  • flexoentity/entity_manager.py

    rea28ca0 r1f5bf2d  
    1717    ENTITY_CLASS = None  # must be overridden by subclasses
    1818
    19     def __init__(self, backend):
     19    def __init__(self, local_backend, staging_backend, permanent_backend):
    2020        if self.ENTITY_CLASS is None:
    2121            raise ValueError("Subclasses must define ENTITY_CLASS")
     
    2323        if not issubclass(self.ENTITY_CLASS, FlexoEntity):
    2424            raise TypeError("ENTITY_CLASS must be a subclass of FlexOEntity")
    25         self.backend = backend
     25        self.local_backend = local_backend
     26        self.staging_backend = staging_backend
     27        self.permanent_backend = permanent_backend
    2628
    2729    # ------------------------------------------------------------------
     
    3234        """Insert a new entity."""
    3335        self._ensure_type(entity)
    34         self.backend.save(entity)
     36        self.local_backend.save(entity)
    3537
    3638    def update(self, entity):
    3739        """Replace an existing entity (same flexo_id)."""
    3840        self._ensure_type(entity)
    39         self.backend.update(entity)
     41        self.local_backend.update(entity)
    4042
    4143    def delete(self, flexo_id: str):
    4244        """Remove entity by string flexo_id."""
    43         self.backend.delete(flexo_id)
     45        self.local_backend.delete(flexo_id)
    4446
    4547    # ------------------------------------------------------------------
     
    5254        Returns ENTITY_CLASS instance or None.
    5355        """
    54         return self.backend.load(flexo_id)
     56        return self.local_backend.load(flexo_id)
    5557
    5658    def all(self):
    5759        """Load all entities as a list of instances."""
    58         return self.backend.load_all()
     60        return self.local_backend.load_all()
     61
     62    def promote_to_staging(self, flexo_id):
     63        entity = self.local_backend.load(flexo_id)
     64        self.staging_backend.save(entity)
     65
     66    def promote_to_permanent(self, flexo_id):
     67        entity = self.staging_backend.load(flexo_id)
     68        self.permanent_backend.save(entity)
     69
     70    def sync_all(self):
     71        # sync staging → local
     72        for e in self.staging_backend.load_all():
     73            self.local_backend.save(e)
     74
     75        # sync permanent → local
     76        for e in self.permanent_backend.load_all():
     77            self.local_backend.save(e)
     78        self.refresh()
     79
    5980    # ------------------------------------------------------------------
    6081    # Helpers
     
    6586
    6687    def count(self) -> int:
    67         return len(self.backend.load_all())
     88        return len(self.local_backend.load_all())
    6889
    6990    def add_or_update(self, entity):
     
    7899
    79100    def as_collection(self):
    80         return TypedCollection(self.ENTITY_CLASS, items=self.backend.load_all())
     101        return TypedCollection(self.ENTITY_CLASS, items=self.local_backend.load_all())
    81102
    82103    # ------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.