Source code for eventsourcing.domain.model.collection

from __future__ import absolute_import, division, print_function, unicode_literals

from eventsourcing.domain.model.entity import AbstractEntityRepository, TimestampedVersionedEntity


[docs]class Collection(TimestampedVersionedEntity):
[docs] class Event(TimestampedVersionedEntity.Event): """Supertype for events of collection entities."""
[docs] class Created(Event, TimestampedVersionedEntity.Created): """Published when collection is created."""
[docs] class Discarded(Event, TimestampedVersionedEntity.Discarded): """Published when collection is discarded."""
[docs] class EventWithItem(Event): @property def item(self): return self.__dict__['item']
[docs] class ItemAdded(EventWithItem):
[docs] def __mutate__(self, obj): obj = super(Collection.ItemAdded, self).__mutate__(obj) obj._items.add(self.item) return obj
[docs] class ItemRemoved(EventWithItem):
[docs] def __mutate__(self, obj): obj = super(Collection.ItemRemoved, self).__mutate__(obj) obj._items.remove(self.item) return obj
[docs] def __init__(self, **kwargs): super(Collection, self).__init__(**kwargs) self._items = set()
[docs] def __iter__(self): return self._items.__iter__()
@property def items(self): self.__assert_not_discarded__() return self._items
[docs] def add_item(self, item): self.__trigger_event__(self.ItemAdded, item=item)
[docs] def remove_item(self, item): self.__trigger_event__(self.ItemRemoved, item=item)
[docs]def register_new_collection(collection_id=None): return Collection.__create__(originator_id=collection_id)
[docs]class AbstractCollectionRepository(AbstractEntityRepository): pass