from __future__ import unicode_literals from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from actstream.models import Action from .classes import EventType from .managers import ( EventSubscriptionManager, ObjectEventSubscriptionManager ) @python_2_unicode_compatible class StoredEventType(models.Model): """ Model to mirror the real event classes as database objects. """ name = models.CharField( max_length=64, unique=True, verbose_name=_('Name') ) class Meta: verbose_name = _('Stored event type') verbose_name_plural = _('Stored event types') def __str__(self): return force_text(self.get_class()) def get_class(self): return EventType.get(name=self.name) @property def label(self): return self.get_class().label @property def namespace(self): return self.get_class().namespace @python_2_unicode_compatible class EventSubscription(models.Model): """ This model stores the event subscriptions of an user for the entire system. """ user = models.ForeignKey( db_index=True, on_delete=models.CASCADE, related_name='event_subscriptions', to=settings.AUTH_USER_MODEL, verbose_name=_('User') ) stored_event_type = models.ForeignKey( on_delete=models.CASCADE, related_name='event_subscriptions', to=StoredEventType, verbose_name=_('Event type') ) objects = EventSubscriptionManager() class Meta: verbose_name = _('Event subscription') verbose_name_plural = _('Event subscriptions') def __str__(self): return force_text(self.stored_event_type) @python_2_unicode_compatible class Notification(models.Model): """ This model keeps track of the notifications for an user. Notifications are created when an event to which this user has been subscribed, are commited elsewhere in the system. """ user = models.ForeignKey( db_index=True, on_delete=models.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL, verbose_name=_('User') ) action = models.ForeignKey( on_delete=models.CASCADE, related_name='notifications', to=Action, verbose_name=_('Action') ) read = models.BooleanField(default=False, verbose_name=_('Read')) class Meta: ordering = ('-action__timestamp',) verbose_name = _('Notification') verbose_name_plural = _('Notifications') def __str__(self): return force_text(self.action) @python_2_unicode_compatible class ObjectEventSubscription(models.Model): content_type = models.ForeignKey( on_delete=models.CASCADE, to=ContentType, ) object_id = models.PositiveIntegerField() content_object = GenericForeignKey( ct_field='content_type', fk_field='object_id', ) user = models.ForeignKey( db_index=True, on_delete=models.CASCADE, related_name='object_subscriptions', to=settings.AUTH_USER_MODEL, verbose_name=_('User') ) stored_event_type = models.ForeignKey( on_delete=models.CASCADE, related_name='object_subscriptions', to=StoredEventType, verbose_name=_('Event type') ) objects = ObjectEventSubscriptionManager() class Meta: verbose_name = _('Object event subscription') verbose_name_plural = _('Object event subscriptions') def __str__(self): return force_text(self.stored_event_type)