from django.db import models from django.utils.translation import ugettext_lazy as _ from satchmo_store.contact.models import Contact import datetime import logging log = logging.getLogger('newsletter.models') _NOTSET = object() class NullContact(object): """Simple object emulating a Contact, so that we can add users who aren't Satchmo Contacts. Note, this is *not* a Django object, and is not saved to the DB, only to the subscription lists. """ def __init__(self, full_name, email): if not full_name: full_name = email.split('@')[0] self.full_name = full_name self.email = email def get_contact_or_fake(full_name, email): """Get a `Contact` by email or if it doesn't exist, then a `NullContact`""" try: contact = Contact.objects.get(email=email) except Contact.DoesNotExist: contact = NullContact(full_name, email) return contact class Subscription(models.Model): """A newsletter subscription.""" subscribed = models.BooleanField(_('Subscribed'), default=True) email = models.EmailField(_('Email'), max_length=75) create_date = models.DateField(_("Creation Date")) update_date = models.DateField(_("Update Date")) def email_is_subscribed(cls, email): try: sub = cls.objects.get(email=email) return sub.subscribed except cls.DoesNotExist: return False email_is_subscribed = classmethod(email_is_subscribed) def __unicode__(self): if self.subscribed: flag="Y" else: flag="N" return u"[%s] %s" % (flag, self.email) def __repr__(self): return "<Subscription: %s>" % str(self) def attribute_value(self, name, value=_NOTSET): """Get a value from an attribute.""" try: att = self.attributes.get(name=name) value = att.value except SubscriptionAttribute.DoesNotExist: if value != _NOTSET: raise return value def save(self, **kwargs): if not self.pk: self.create_date = datetime.date.today() self.update_date = datetime.date.today() super(Subscription, self).save(**kwargs) def update_attribute(self, name, value): """Update or create a `SubscriptionAttribute` object with the passed `name` and `value`.""" value = str(value) try: att = self.attributes.get(name=name) att.value = value except SubscriptionAttribute.DoesNotExist: att = SubscriptionAttribute(subscription=self, name=name, value=value) att.save() return att def update_attributes(self, attributes): """Update `SubscriptionAttribute` objects from a dictionary of name val mappings.""" return [self.update_attribute(name, value) for name, value in attributes.items()] class SubscriptionAttribute(models.Model): """ Allows arbitrary name/value pairs (as strings) to be attached to a subscription. """ subscription = models.ForeignKey(Subscription, related_name="attributes") name = models.SlugField(_("Attribute Name"), max_length=100, ) value = models.CharField(_("Value"), max_length=255) class Meta: verbose_name = _("Subscription Attribute") verbose_name_plural = _("Subscription Attributes") import config import listeners listeners.start_listening()