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