src/iconolab/signals/handlers.py
author durandn
Mon, 01 Aug 2016 10:41:24 +0200
changeset 90 8d7815ecd211
parent 89 23679a6def77
child 94 a47934ff37ec
permissions -rw-r--r--
signals are now sent in model methods rather than views

from django.apps import apps
from django.db.models.signals import post_save
from django.dispatch import Signal, receiver

from iconolab.models import Annotation, AnnotationRevision, IconolabComment

# Signal sent during method Annotation.validate_existing_revision to update stats
revision_accepted = Signal(providing_args=["instance"])
revision_created = Signal(providing_args=["instance"])


def increment_stats_on_new_revision(sender, instance, **kwargs):
    # Annotation stats
    annotation = instance.annotation
    annotation.stats.submitted_revisions_count += 1
    if instance.state in [AnnotationRevision.ACCEPTED, AnnotationRevision.STUDIED]:
        annotation.stats.accepted_revisions_count += 1
    annotation.stats.set_tags_stats()
    annotation.stats.save()
    # Image stats
    image = instance.annotation.image
    image.stats.submitted_revisions_count += 1
    image.stats.set_tags_stats()
    image.stats.save()

    
def increment_stats_on_new_comments(sender, instance, created, **kwargs):
    if created:
        model = apps.get_model(instance.content_type.app_label,instance.content_type.model)
        object_pk = instance.object_pk
        annotation = model._default_manager.get(pk=object_pk)
        annotation.stats.comments_count +=1
        annotation.stats.save()
        annotation.image.stats.comments_count +=1
        annotation.image.stats.save()


def increment_accepted_revisions(sender, instance, **kwargs):
    annotation = instance.annotation
    annotation.stats.accepted_revisions_count += 1
    annotation.stats.save()

def increment_annotations_count(sender, instance, created, **kwargs):
    if created:
        image = instance.image
        image.stats.annotations_count += 1
        image.stats.submitted_revisions_count += 1
        image.stats.set_tags_stats()
        image.stats.save()

post_save.connect(increment_annotations_count, sender=Annotation)
post_save.connect(increment_stats_on_new_comments, sender=IconolabComment)
revision_created.connect(increment_stats_on_new_revision, sender=AnnotationRevision)
revision_accepted.connect(increment_accepted_revisions, sender=AnnotationRevision)