From e9871bd6751bd850e09f5b70a469c6fce5746ec7 Mon Sep 17 00:00:00 2001 From: Kaleb Hornsby Date: Wed, 17 Jan 2018 19:39:10 -0500 Subject: [PATCH] Add natural keys Also added unique constraint to signal --- dbmail/fixtures/mailgun_base_templates.json | 3 - dbmail/models.py | 102 +++++++++++++++++++- 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/dbmail/fixtures/mailgun_base_templates.json b/dbmail/fixtures/mailgun_base_templates.json index 80095ae..6fc6e9a 100644 --- a/dbmail/fixtures/mailgun_base_templates.json +++ b/dbmail/fixtures/mailgun_base_templates.json @@ -1,6 +1,5 @@ [ { - "pk": 1, "model": "dbmail.mailbasetemplate", "fields": { "message": "\r\n\r\n\r\n\r\n\r\nActionable emails e.g. reset password\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t\r\n\t
\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\tPlease confirm your email address by clicking the link below.\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\tWe may need to send you critical information about our service and it is important that we have an accurate email address.\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\tConfirm email address\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t— The Mailgunners\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t
Follow @Mail_Gun on Twitter.
\r\n\t\t
\r\n\r\n", @@ -10,7 +9,6 @@ } }, { - "pk": 2, "model": "dbmail.mailbasetemplate", "fields": { "message": "\r\n\r\n\r\n\r\n\r\nAlerts e.g. approaching your limit\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t\r\n\t
\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\tWarning: You're approaching your limit. Please upgrade.\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\tYou have 1 free report remaining.\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\tAdd your credit card now to upgrade your account to a premium plan to ensure you don't miss out on any reports.\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\tUpgrade my account\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\tThanks for choosing Acme Inc.\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t
Unsubscribe from these alerts.
\r\n\t\t
\r\n\r\n", @@ -20,7 +18,6 @@ } }, { - "pk": 3, "model": "dbmail.mailbasetemplate", "fields": { "message": "\r\n\r\n\r\n\r\n\r\nBilling e.g. invoices and receipts\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t\r\n\t
\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t

$33.98 Paid

\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t

Thanks for using Acme Inc.

\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t
Lee Munroe
Invoice #12345
June 01 2014
\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t
Service 1$ 19.99
Service 2$ 9.99
Service 3$ 4.00
Total$ 33.98
\r\n\t\t\t\t\t\t\t\t\t\tView in browser\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t\tAcme Inc. 123 Van Ness, San Francisco 94102\r\n\t\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t
Questions? Email support@acme.inc
\r\n\t\t
\r\n\r\n", diff --git a/dbmail/models.py b/dbmail/models.py index 32132cf..ee87b15 100644 --- a/dbmail/models.py +++ b/dbmail/models.py @@ -38,12 +38,22 @@ def _upload_mail_file(instance, filename): return os.path.join(UPLOAD_TO, filename) +class MailCategoryManager(models.Manager): + def get_by_natural_key(self, name): + return self.get(name=name) + + @python_2_unicode_compatible class MailCategory(models.Model): + objects = MailCategoryManager() + name = models.CharField(_('Category'), max_length=25, unique=True) created = models.DateTimeField(_('Created'), auto_now_add=True) updated = models.DateTimeField(_('Updated'), auto_now=True) + def natural_key(self): + return (self.name,) + def __str__(self): return self.name @@ -52,8 +62,15 @@ class Meta: verbose_name_plural = _('Mail categories') +class MailBaseTemplateManager(models.Manager): + def get_by_natural_key(self, name): + return self.get(name=name) + + @python_2_unicode_compatible class MailBaseTemplate(models.Model): + objects = MailBaseTemplateManager() + name = models.CharField(_('Name'), max_length=100, unique=True) message = HTMLField( _('Body'), help_text=_( @@ -61,6 +78,9 @@ class MailBaseTemplate(models.Model): created = models.DateTimeField(_('Created'), auto_now_add=True) updated = models.DateTimeField(_('Updated'), auto_now=True) + def natural_key(self): + return (self.name,) + def __str__(self): return self.name @@ -102,8 +122,15 @@ class Meta: verbose_name_plural = _('Mail auth settings') +class MailFromEmailManager(models.Manager): + def get_by_natural_key(self, email): + return self.get(email=email) + + @python_2_unicode_compatible class MailFromEmail(models.Model): + objects = MailFromEmailManager() + name = models.CharField(_('Name'), max_length=100) email = models.CharField( _('Email'), max_length=75, unique=True, @@ -140,6 +167,9 @@ def save(self, *args, **kwargs): super(MailFromEmail, self).save(*args, **kwargs) self._clean_template_cache() + def natural_key(self): + return (self.email,) + def __str__(self): return self.name @@ -148,8 +178,15 @@ class Meta: verbose_name_plural = _('Mail from') +class MailBccManager(models.Manager): + def get_by_natural_key(self, email): + return self.get(email=email) + + @python_2_unicode_compatible class MailBcc(models.Model): + objects = MailBccManager() + email = models.EmailField(_('Email'), unique=True) is_active = models.BooleanField(_('Is active'), default=True) created = models.DateTimeField(_('Created'), auto_now_add=True) @@ -166,6 +203,9 @@ def delete(self, using=None): self.__clean_cache() super(MailBcc, self).delete(using) + def natural_key(self): + return (self.email,) + def __str__(self): return self.email @@ -174,8 +214,15 @@ class Meta: verbose_name_plural = _('Mail Bcc') +class MailTemplateManager(models.Manager): + def get_by_natural_key(self, slug): + return self.get(slug=slug) + + @python_2_unicode_compatible class MailTemplate(models.Model): + objects = MailTemplateManager() + name = models.CharField(_('Template name'), max_length=100, db_index=True) subject = models.CharField(_('Subject'), max_length=100) from_email = models.ForeignKey( @@ -275,6 +322,9 @@ def delete(self, using=None): self._clean_cache() super(MailTemplate, self).delete(using) + def natural_key(self): + return (self.slug,) + def __str__(self): return self.name @@ -309,14 +359,24 @@ class Meta: verbose_name_plural = _('Mail files') +class MailLogExceptionManager(models.Manager): + def get_by_natural_key(self, name): + return self.get(name=name) + + @python_2_unicode_compatible class MailLogException(models.Model): + objects = MailLogExceptionManager() + cache_key = 'ignored_exceptions' cache_version = 1 name = models.CharField(_('Exception'), max_length=150, unique=True) ignore = models.BooleanField(_('Ignore'), default=False) + def natural_key(self): + return (self.name,) + def __str__(self): return self.name @@ -429,8 +489,15 @@ class Meta: verbose_name_plural = _('Mail log emails') +class MailGroupManager(models.Manager): + def get_by_natural_key(self, slug): + return self.get(slug=slug) + + @python_2_unicode_compatible class MailGroup(models.Model): + objects = MailGroupManager() + name = models.CharField(_('Group name'), max_length=100) slug = models.SlugField(_('Slug'), unique=True) created = models.DateTimeField(_('Created'), auto_now_add=True) @@ -461,6 +528,9 @@ def delete(self, using=None): self.clean_cache() super(MailGroup, self).delete(using) + def natural_key(self): + return (self.slug,) + def __str__(self): return self.name @@ -469,8 +539,15 @@ class Meta: verbose_name_plural = _('Mail groups') +class MailGroupEmailManager(models.Manager): + def get_by_natural_key(self, email, group): + return self.get(email=email, group=group) + + @python_2_unicode_compatible class MailGroupEmail(models.Model): + objects = MailGroupEmailManager() + name = models.CharField(_('Username'), max_length=100) email = models.CharField( _('Email'), max_length=75, @@ -486,6 +563,9 @@ def delete(self, using=None): self.group.clean_cache() super(MailGroupEmail, self).delete(using) + def natural_key(self): + return (self.email, self.group) + def __str__(self): return self.email @@ -495,8 +575,15 @@ class Meta: unique_together = (('email', 'group',),) +class SignalManager(models.Manager): + def get_by_natural_key(self, name): + return self.get(name=name) + + @python_2_unicode_compatible class Signal(models.Model): + objects = SignalManager() + SIGNALS = ( 'pre_save', 'post_save', @@ -504,7 +591,7 @@ class Signal(models.Model): 'post_delete', 'm2m_changed', ) - name = models.CharField(_('Name'), max_length=100) + name = models.CharField(_('Name'), max_length=100, unique=True) model = models.ForeignKey( 'contenttypes.ContentType', verbose_name=_('Model')) signal = models.CharField( @@ -557,6 +644,9 @@ def mark_as_sent(self, pk): model=self.model, model_pk=pk, signal=self ) + def natural_key(self): + return (self.name,) + def __str__(self): return self.name @@ -612,8 +702,15 @@ class Meta: index_together = (('eta', 'done'),) +class ApiKeyManager(models.Manager): + def get_by_natural_key(self, api_key): + return self.get(api_key=api_key) + + @python_2_unicode_compatible class ApiKey(models.Model): + objects = ApiKeyManager() + name = models.CharField(_('Name'), max_length=25) api_key = models.CharField(_('Api key'), max_length=32, unique=True) is_active = models.BooleanField(_('Is active'), default=True) @@ -636,6 +733,9 @@ def delete(self, using=None): self._clean_cache() super(ApiKey, self).delete(using) + def natural_key(self): + return (self.api_key,) + def __str__(self): return self.name