From fec0f9e7102802b9adafd4fc24b92a95130d3e9f Mon Sep 17 00:00:00 2001 From: Kaleb Hornsby Date: Wed, 17 Jan 2018 07:15:25 -0500 Subject: [PATCH] Allow choices for Signal.signal to be configured This adds a DB_MAILER_SIGNAL_CHOICES setting. It also changes signal values from expecting to be a name for a member in the module `django.db.models.signals` and now expects a full path to a signal. This allows user to specify other signals that they may choose to define. The migrations will rename all records in the database that uses the previous naming convention. --- dbmail/defaults.py | 9 + dbmail/migrations/0015_dynamic_signals.py | 31 +++ dbmail/models.py | 15 +- dbmail/signals.py | 3 +- .../south_migrations/0045_dynamic_signals.py | 260 ++++++++++++++++++ docs/conf.rst | 9 + 6 files changed, 316 insertions(+), 11 deletions(-) create mode 100644 dbmail/migrations/0015_dynamic_signals.py create mode 100644 dbmail/south_migrations/0045_dynamic_signals.py diff --git a/dbmail/defaults.py b/dbmail/defaults.py index 5b74358..4bf6b27 100644 --- a/dbmail/defaults.py +++ b/dbmail/defaults.py @@ -135,5 +135,14 @@ def get_settings(key, default): 'DB_MAILER_MODEL_SUBSCRIPTION_DATA_FIELD', 'dbmail.fields.DataTextField') APNS_PROVIDER_DEFAULT_ACTION = get_settings( 'DB_MAILER_APNS_PROVIDER_DEFAULT_ACTION', 'Show') +_SIGNALS = [ + ('django.db.models.signals.pre_save', 'pre_save'), + ('django.db.models.signals.post_save', 'post_save'), + ('django.db.models.signals.pre_delete', 'pre_delete'), + ('django.db.models.signals.post_delete', 'post_delete'), + ('django.db.models.signals.m2m_changed', 'm2m_changed'), +] +SIGNAL_CHOICES = get_settings( + 'DB_MAILER_SIGNAL_CHOICES', _SIGNALS) DEBUG = settings.DEBUG and get_settings('DB_MAILER_DEBUG', False) diff --git a/dbmail/migrations/0015_dynamic_signals.py b/dbmail/migrations/0015_dynamic_signals.py new file mode 100644 index 0000000..57f6805 --- /dev/null +++ b/dbmail/migrations/0015_dynamic_signals.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.3 on 2017-08-01 12:06 +from __future__ import unicode_literals + +from dbmail.defaults import SIGNAL_CHOICES, _SIGNALS +from django.db import migrations, models + +def make_signals_dynamic(apps, schema_editor): + Signal = apps.get_model('dbmail', 'Signal') + for module_path, signal_name in _SIGNALS: + Signal.objects.filter(signal=signal_name).update(signal=module_path) + +def make_signals_undynamic(apps, schema_editor): + Signal = apps.get_model('dbmail', 'Signal') + for module_path, signal_name in _SIGNALS: + Signal.objects.filter(signal=module_path).update(signal=signal_name) + +class Migration(migrations.Migration): + + dependencies = [ + ('dbmail', '0014_auto_20170801_1206'), + ] + + operations = [ + migrations.AlterField( + model_name='signal', + name='signal', + field=models.CharField(default=b'django.db.models.signals.post_save', max_length=255, verbose_name='Signal', choices=list(SIGNAL_CHOICES)) + ), + migrations.RunPython(make_signals_dynamic, make_signals_undynamic) + ] diff --git a/dbmail/models.py b/dbmail/models.py index 32132cf..2c3c679 100644 --- a/dbmail/models.py +++ b/dbmail/models.py @@ -19,7 +19,8 @@ PRIORITY_STEPS, UPLOAD_TO, DEFAULT_CATEGORY, AUTH_USER_MODEL, DEFAULT_FROM_EMAIL, DEFAULT_PRIORITY, CACHE_TTL, BACKEND, _BACKEND, BACKENDS_MODEL_CHOICES, MODEL_HTMLFIELD, - MODEL_SUBSCRIPTION_DATA_FIELD, SORTED_BACKEND_CHOICES, TRACK_USE_GEOIP2 + MODEL_SUBSCRIPTION_DATA_FIELD, SORTED_BACKEND_CHOICES, TRACK_USE_GEOIP2, + SIGNAL_CHOICES ) from dbmail import initial_signals, import_by_string @@ -497,19 +498,13 @@ class Meta: @python_2_unicode_compatible class Signal(models.Model): - SIGNALS = ( - 'pre_save', - 'post_save', - 'pre_delete', - 'post_delete', - 'm2m_changed', - ) + SIGNALS = SIGNAL_CHOICES name = models.CharField(_('Name'), max_length=100) model = models.ForeignKey( 'contenttypes.ContentType', verbose_name=_('Model')) signal = models.CharField( - _('Signal'), choices=zip(SIGNALS, SIGNALS), - max_length=15, default='post_save') + _('Signal'), choices=SIGNALS, + max_length=255, default='post_save') template = models.ForeignKey(MailTemplate, verbose_name=_('Template')) group = models.ForeignKey( MailGroup, verbose_name=_('Email group'), blank=True, null=True, diff --git a/dbmail/signals.py b/dbmail/signals.py index 793df8e..98ec878 100644 --- a/dbmail/signals.py +++ b/dbmail/signals.py @@ -9,6 +9,7 @@ from django.db.models import signals from django import dispatch +from dbmail import import_by_string from dbmail.defaults import ( SIGNALS_QUEUE, SIGNALS_MAIL_QUEUE, SIGNAL_DEFERRED_DISPATCHER, ENABLE_USERS, SEND_RETRY, SEND_RETRY_DELAY @@ -160,7 +161,7 @@ def signal_receiver(sender, **kwargs): def initial_signals(): for signal in Signal.objects.filter(is_active=True): - def_signal = getattr(signals, signal.signal) + def_signal = import_by_string(signal.signal) def_signal.connect( signal_receiver, sender=signal.model.model_class(), dispatch_uid=signal.model.name diff --git a/dbmail/south_migrations/0045_dynamic_signals.py b/dbmail/south_migrations/0045_dynamic_signals.py new file mode 100644 index 0000000..851747b --- /dev/null +++ b/dbmail/south_migrations/0045_dynamic_signals.py @@ -0,0 +1,260 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models +from dbmail.defaults import _SIGNALS + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Changing field 'Signal.signal' + db.alter_column('dbmail_signal', 'signal', self.gf('django.db.models.fields.CharField')(max_length=255)) + for module_path, signal_name in _SIGNALS: + orm.Signal.objects.filter(signal=signal_name).update(signal=module_path) + + def backwards(self, orm): + # Changing field 'Signal.signal' + db.alter_column('dbmail_signal', 'signal', self.gf('django.db.models.fields.CharField')(max_length=15)) + for module_path, signal_name in _SIGNALS: + orm.Signal.objects.filter(signal=module_path).update(signal=signal_name) + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'dbmail.apikey': { + 'Meta': {'object_name': 'ApiKey'}, + 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '25'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.mailbasetemplate': { + 'Meta': {'object_name': 'MailBaseTemplate'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'message': ('django.db.models.fields.TextField', [], {}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.mailbcc': { + 'Meta': {'object_name': 'MailBcc'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.mailcategory': { + 'Meta': {'object_name': 'MailCategory'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '25'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.mailfile': { + 'Meta': {'object_name': 'MailFile'}, + 'filename': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'files'", 'to': "orm['dbmail.MailTemplate']"}) + }, + 'dbmail.mailfromemail': { + 'Meta': {'object_name': 'MailFromEmail'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'credential': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['dbmail.MailFromEmailCredential']", 'null': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '75'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.mailfromemailcredential': { + 'Meta': {'object_name': 'MailFromEmailCredential'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'fail_silently': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'host': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'port': ('django.db.models.fields.PositiveIntegerField', [], {}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'use_tls': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'username': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}) + }, + 'dbmail.mailgroup': { + 'Meta': {'object_name': 'MailGroup'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.mailgroupemail': { + 'Meta': {'unique_together': "(('email', 'group'),)", 'object_name': 'MailGroupEmail'}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '75'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'emails'", 'to': "orm['dbmail.MailGroup']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'dbmail.maillog': { + 'Meta': {'object_name': 'MailLog'}, + 'backend': ('django.db.models.fields.CharField', [], {'default': "'mail'", 'max_length': '25', 'db_index': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'error_exception': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dbmail.MailLogException']", 'null': 'True', 'blank': 'True'}), + 'error_message': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_sent': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'log_id': ('django.db.models.fields.CharField', [], {'max_length': '60', 'db_index': 'True'}), + 'num_of_retries': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'provider': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '250', 'null': 'True', 'db_index': 'True', 'blank': 'True'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dbmail.MailTemplate']"}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'dbmail.maillogemail': { + 'Meta': {'object_name': 'MailLogEmail'}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '350'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'log': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dbmail.MailLog']"}), + 'mail_type': ('django.db.models.fields.CharField', [], {'max_length': '3'}) + }, + 'dbmail.maillogexception': { + 'Meta': {'object_name': 'MailLogException'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ignore': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '150'}) + }, + 'dbmail.maillogtrack': { + 'Meta': {'object_name': 'MailLogTrack'}, + 'counter': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}), + 'ip_area_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_city': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_country_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_country_code3': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_country_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_dma_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_latitude': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_longitude': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'ip_region': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'is_read': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'mail_log': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dbmail.MailLog']"}), + 'ua': ('django.db.models.fields.CharField', [], {'max_length': '350', 'null': 'True', 'blank': 'True'}), + 'ua_browser': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'ua_browser_version': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'ua_dist': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'ua_dist_version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'ua_os': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'ua_os_version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.mailsubscription': { + 'Meta': {'object_name': 'MailSubscription'}, + 'address': ('django.db.models.fields.CharField', [], {'max_length': '350', 'db_index': 'True'}), + 'backend': ('django.db.models.fields.CharField', [], {'default': "'dbmail.backends.mail'", 'max_length': '50'}), + 'data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'defer_at_allowed_hours': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'end_hour': ('django.db.models.fields.CharField', [], {'default': "'23:59'", 'max_length': '5'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_checked': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True'}), + 'is_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}), + 'start_hour': ('django.db.models.fields.CharField', [], {'default': "'00:00'", 'max_length': '5'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '350', 'null': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}) + }, + 'dbmail.mailtemplate': { + 'Meta': {'object_name': 'MailTemplate'}, + 'base': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dbmail.MailBaseTemplate']", 'null': 'True', 'blank': 'True'}), + 'bcc_email': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['dbmail.MailBcc']", 'symmetrical': 'False', 'blank': 'True'}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['dbmail.MailCategory']", 'null': 'True', 'blank': 'True'}), + 'context_note': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'enable_log': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'from_email': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': "orm['dbmail.MailFromEmail']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'interval': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_admin': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_html': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'message': ('django.db.models.fields.TextField', [], {}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'db_index': 'True'}), + 'num_of_retries': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}), + 'priority': ('django.db.models.fields.SmallIntegerField', [], {'default': '6'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.signal': { + 'Meta': {'object_name': 'Signal'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dbmail.MailGroup']", 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'interval': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'model': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'receive_once': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'rules': ('django.db.models.fields.TextField', [], {'default': "'{{ instance.email }}'", 'null': 'True', 'blank': 'True'}), + 'signal': ('django.db.models.fields.CharField', [], {'default': "'django.db.models.signals.post_save'", 'max_length': '255'}), + 'template': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dbmail.MailTemplate']"}), + 'update_model': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) + }, + 'dbmail.signaldeferreddispatch': { + 'Meta': {'object_name': 'SignalDeferredDispatch'}, + 'args': ('django.db.models.fields.TextField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'done': ('django.db.models.fields.NullBooleanField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}), + 'eta': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'kwargs': ('django.db.models.fields.TextField', [], {}), + 'params': ('django.db.models.fields.TextField', [], {}) + }, + 'dbmail.signallog': { + 'Meta': {'object_name': 'SignalLog'}, + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'model_pk': ('django.db.models.fields.BigIntegerField', [], {}), + 'signal': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['dbmail.Signal']"}) + } + } + + complete_apps = ['dbmail'] \ No newline at end of file diff --git a/docs/conf.rst b/docs/conf.rst index 60bebd3..030959f 100644 --- a/docs/conf.rst +++ b/docs/conf.rst @@ -118,6 +118,15 @@ App settings # Remove database long tasks after execution DB_MAILER_SIGNAL_DB_DEFERRED_PURGE = True + # Define the signals to be used in the Signal Model Admin + DB_MAILER_SIGNAL_CHOICES = [ + ('django.db.models.signals.pre_save', 'pre_save'), + ('django.db.models.signals.post_save', 'post_save'), + ('django.db.models.signals.pre_delete', 'pre_delete'), + ('django.db.models.signals.post_delete', 'post_delete'), + ('django.db.models.signals.m2m_changed', 'm2m_changed'), + ] + # Enable/Disable tracking functionality. # If tracking is enabled, Logging must be enabled to. # DbMail urls must be configured.