Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions dbmail/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
31 changes: 31 additions & 0 deletions dbmail/migrations/0015_dynamic_signals.py
Original file line number Diff line number Diff line change
@@ -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)
]
15 changes: 5 additions & 10 deletions dbmail/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion dbmail/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Loading