mirror of
https://github.com/jazzband/django-ddp.git
synced 2026-03-28 20:20:34 +00:00
106 lines
2.9 KiB
Python
106 lines
2.9 KiB
Python
"""Django DDP app config."""
|
|
|
|
from __future__ import print_function
|
|
|
|
from django.apps import AppConfig
|
|
from django.core import serializers
|
|
from django.conf import settings, ImproperlyConfigured
|
|
from django.db import DatabaseError
|
|
from django.db.models import signals, Field
|
|
|
|
from dddp.api import collection_name
|
|
from dddp.notify import send_notify
|
|
from dddp.models import Connection
|
|
|
|
|
|
IN_MIGRATION = False
|
|
|
|
|
|
def on_save(sender, **kwargs):
|
|
"""Post-save signal handler."""
|
|
global IN_MIGRATION
|
|
if IN_MIGRATION: return
|
|
send_notify(
|
|
model=sender,
|
|
obj=kwargs['instance'],
|
|
msg=kwargs['created'] and 'added' or 'changed',
|
|
using=kwargs['using'],
|
|
)
|
|
|
|
|
|
def on_delete(sender, **kwargs):
|
|
"""Post-delete signal handler."""
|
|
global IN_MIGRATION
|
|
if IN_MIGRATION: return
|
|
send_notify(
|
|
model=sender,
|
|
obj=kwargs['instance'],
|
|
msg='removed',
|
|
using=kwargs['using'],
|
|
)
|
|
|
|
|
|
def on_m2m_changed(sender, **kwargs):
|
|
"""M2M-changed signal handler."""
|
|
global IN_MIGRATION
|
|
if IN_MIGRATION: return
|
|
# See https://docs.djangoproject.com/en/1.7/ref/signals/#m2m-changed
|
|
if kwargs['action'] in (
|
|
'post_add',
|
|
'post_remove',
|
|
'post_clear',
|
|
):
|
|
if kwargs['reverse'] == False:
|
|
objs = [kwargs['instance']]
|
|
model = objs[0].__class__
|
|
else:
|
|
model = kwargs['model']
|
|
objs = model.objects.filter(pk__in=kwargs['pk_set'])
|
|
|
|
for obj in objs:
|
|
send_notify(
|
|
model=model,
|
|
obj=obj,
|
|
msg='changed',
|
|
using=kwargs['using'],
|
|
)
|
|
|
|
|
|
def on_pre_migrate(sender, **kwargs):
|
|
global IN_MIGRATION
|
|
IN_MIGRATION = True
|
|
|
|
|
|
def on_post_migrate(sender, **kwargs):
|
|
"""Post-migrate signal handler."""
|
|
global IN_MIGRATION
|
|
IN_MIGRATION = False
|
|
try:
|
|
Connection.objects.all().delete()
|
|
except DatabaseError:
|
|
pass
|
|
|
|
|
|
class DjangoDDPConfig(AppConfig):
|
|
|
|
"""Django app config for django-ddp."""
|
|
|
|
name = 'dddp'
|
|
verbose_name = 'Django DDP'
|
|
|
|
def ready(self):
|
|
"""Initialisation for django-ddp (setup lookups and signal handlers)."""
|
|
serializers.register_serializer('ddp', 'dddp.serializer')
|
|
if not settings.DATABASES:
|
|
raise ImproperlyConfigured('No databases configured.')
|
|
for (alias, conf) in settings.DATABASES.items():
|
|
if conf['ENGINE'] != 'django.db.backends.postgresql_psycopg2':
|
|
raise ImproperlyConfigured(
|
|
'%r uses %r: django-ddp only works with PostgreSQL.' % (
|
|
alias, conf['backend'],
|
|
)
|
|
)
|
|
signals.post_save.connect(on_save)
|
|
signals.post_delete.connect(on_delete)
|
|
signals.m2m_changed.connect(on_m2m_changed)
|
|
signals.post_migrate.connect(on_post_migrate)
|