src/cm/denorm_engine.py
author Simon Descarpentries <sid@sopinspace.com>
Tue, 06 May 2014 13:52:01 +0200
changeset 651 9bbc657f6837
parent 407 2d14a80716e2
permissions -rw-r--r--
Replace DISABLE_TRACKING and TRACKING_HTML by a TRACKING_ID variable in configuration files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
# This is the denormalisation engine
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
# his goal is to leverage on django's signal to update
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
# denormalized fields
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
# this should be used with beanstalk or starling
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
# python client (there is 2) http://github.com/earl/beanstalkc/tree/master
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
import logging
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
from django.db.models import signals
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
from cm.models import TextVersion, Text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
# Text denormalisation
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
def update_text_from_last_version(sender, **kwargs):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
    Update text's last version
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
    """
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
    text_version = kwargs['instance']
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
    try:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
        text = text_version.text
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
        text.update_denorm_fields()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
    except Text.DoesNotExist:
278
3d25afbd78ff fix unit tests
raph
parents: 0
diff changeset
    21
        pass
3d25afbd78ff fix unit tests
raph
parents: 0
diff changeset
    22
        #logging.warning('No text found for text_version: %i' %text_version.id)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
        
407
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    24
# GIB when deleting last revision, do not delete related text
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    25
def delete_last_version (sender, instance, signal, *args, **kwargs):
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    26
  if instance.id == instance.text.last_text_version_id:
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    27
    previous = instance.get_previous_version()
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    28
    if previous:
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    29
      instance.text.last_text_version_id = previous.id
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    30
      instance.text.save()
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
        
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
def connect_all():
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    # text updated by text_version
407
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    34
    signals.pre_delete.connect(delete_last_version, sender=TextVersion)
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
    signals.post_save.connect(update_text_from_last_version, sender=TextVersion)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
    signals.post_delete.connect(update_text_from_last_version, sender=TextVersion)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
407
2d14a80716e2 When last_version is deleted, do not delete text and previous versions in cascade, but really delete text only when there is no previous version, otherwise update text.last_version with previous version.
gibus
parents: 278
diff changeset
    39
connect_all()