# HG changeset patch # User durandn # Date 1469718448 -7200 # Node ID 49b3f22948d59fa992bf5d6eb86bc3065acb4690 # Parent 9f55f0bcb29ac61716783fab1935816aa1467c7a work on stats: calculatestats command for manage.py, stats in item page, stats in annotations list, stats in annotation page, actions increment stats (view count, annotations count, comment count etc) diff -r 9f55f0bcb29a -r 49b3f22948d5 src/iconolab/management/commands/__init__.py diff -r 9f55f0bcb29a -r 49b3f22948d5 src/iconolab/management/commands/calculatestats.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/iconolab/management/commands/calculatestats.py Thu Jul 28 17:07:28 2016 +0200 @@ -0,0 +1,11 @@ +from django.core.management.base import BaseCommand, CommandError +from iconolab.models import AnnotationStats, ImageStats + +class Command(BaseCommand): + help = "Re-calculates every stat of every stat object (except view_counts) according to the database state" + + def handle(self, *args, **kwargs): + for ann_stats_obj in AnnotationStats.objects.all(): + ann_stats_obj.update_stats() + for img_stats_obj in ImageStats.objects.all(): + img_stats_obj.update_stats() \ No newline at end of file diff -r 9f55f0bcb29a -r 49b3f22948d5 src/iconolab/models.py --- a/src/iconolab/models.py Thu Jul 28 16:55:44 2016 +0200 +++ b/src/iconolab/models.py Thu Jul 28 17:07:28 2016 +0200 @@ -5,6 +5,7 @@ from django.contrib.contenttypes.models import ContentType from django_comments_xtd.models import XtdComment from django.utils.text import slugify +from . import signals import uuid, json, re, requests, urllib @@ -55,6 +56,30 @@ comments_count = models.IntegerField(blank=True, null=True, default=0) folders_inclusion_count = models.IntegerField(blank=True, null=True, default=0) tag_count = models.IntegerField(blank=True, null=True, default=0) + + def set_tags_stats(self): + self.tag_count = Tag.objects.filter(tagginginfo__revision__annotation__image = self.image).distinct().count() + self.save() + + def update_stats(self): + self.annotations_count = 0 + self.submitted_revisions_count = 0 + self.comments_count = 0 + image_annotations = Annotation.objects.filter(image=self.image) + # views_count - Can't do much about views count + # annotations_count + self.annotations_count = image_annotations.count() + # submitted_revisions_count & comment_count + for annotation in image_annotations.all(): + annotation_revisions = annotation.revisions + self.submitted_revisions_count += annotation_revisions.count() + + self.comments_count += XtdComment.objects.for_app_models("iconolab.annotation").filter( + object_pk = annotation.pk, + ).count() + # tag_count + self.tag_count = Tag.objects.filter(tagginginfo__revision__annotation__image = self.image).distinct().count() + self.save() class Image(models.Model): image_guid = models.UUIDField(default=uuid.uuid4, editable=False) @@ -107,6 +132,7 @@ # Create stats object new_annotation_stats = AnnotationStats(annotation=new_annotation) new_annotation_stats.save() + new_annotation_stats.set_tags_stats() new_annotation.stats = new_annotation_stats new_annotation.save() return new_annotation @@ -120,14 +146,35 @@ comments_count = models.IntegerField(blank=True, null=True, default=0) tag_count = models.IntegerField(blank=True, null=True, default=0) + @property def contributors(self): contributors = [] for revision in self.annotation.revisions.filter(state__in=[AnnotationRevision.ACCEPTED, AnnotationRevision.STUDIED]): if revision.author not in contributors: contributors.append(revision.author) - print(contributors) return contributors - + + def set_tags_stats(self): + self.tag_count = Tag.objects.filter(tagginginfo__revision__annotation = self.annotation).distinct().count() + self.save() + + def update_stats(self): + # views_count - Can't do much about views count + # submitted_revisions_count + annotation_revisions = self.annotation.revisions + self.submitted_revisions_count = annotation_revisions.count() + # accepted_revisions_count + self.accepted_revisions_count = annotation_revisions.filter(state=AnnotationRevision.ACCEPTED).count() + annotation_revisions.filter(state=AnnotationRevision.STUDIED).count() + # comment_count + self.comments_count = XtdComment.objects.for_app_models("iconolab.annotation").filter( + object_pk = self.annotation.pk, + ).count() + # contributors_count + self.contributors_count = len(self.contributors) + # tag_count + self.tag_count = Tag.objects.filter(tagginginfo__revision__annotation = self.annotation).distinct().count() + + self.save() class Annotation(models.Model): annotation_guid = models.UUIDField(default=uuid.uuid4, editable=False) @@ -139,9 +186,6 @@ objects = AnnotationManager() - def update_stats(self): - pass - # Call to create a new revision, possibly from a merge @transaction.atomic def make_new_revision(self, author, title, description, fragment, tags_json): diff -r 9f55f0bcb29a -r 49b3f22948d5 src/iconolab/signals/handlers.py --- a/src/iconolab/signals/handlers.py Thu Jul 28 16:55:44 2016 +0200 +++ b/src/iconolab/signals/handlers.py Thu Jul 28 17:07:28 2016 +0200 @@ -0,0 +1,55 @@ +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): + print("REVISION WAS CREATED") + # 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: + print("COMMENT WAS 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() + + +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) + \ No newline at end of file diff -r 9f55f0bcb29a -r 49b3f22948d5 src/iconolab/static/iconolab/css/iconolab.css --- a/src/iconolab/static/iconolab/css/iconolab.css Thu Jul 28 16:55:44 2016 +0200 +++ b/src/iconolab/static/iconolab/css/iconolab.css Thu Jul 28 17:07:28 2016 +0200 @@ -27,6 +27,14 @@ margin-top: 5px; } +.img-stats-dt{ + width: 250px !important; +} + +.img-stats-dd{ + margin-left: 270px !important; +} + .revision-link:hover{ text-decoration: underline; } diff -r 9f55f0bcb29a -r 49b3f22948d5 src/iconolab/templates/iconolab/detail_annotation.html --- a/src/iconolab/templates/iconolab/detail_annotation.html Thu Jul 28 16:55:44 2016 +0200 +++ b/src/iconolab/templates/iconolab/detail_annotation.html Thu Jul 28 17:07:28 2016 +0200 @@ -35,10 +35,12 @@

Annotation créée par {{ annotation.author.username }}

Titre: {{ annotation.current_revision.title }}

Description: {{ annotation.current_revision.description }}

-

Tags:

- + {% if tags_data != "[]" %} +

Tags:

+ +
+ {% endif %} {% if user.is_authenticated %} -
{% if user == annotation.author %} Editer l'annotation @@ -46,7 +48,9 @@ Proposer une révision {% endif %} - {% endif %} + {% endif %} +
+ {% include "partials/annotation_stats_panel.html" with annotation=annotation label="Statistiques sur cette annotation:" %}
-

{{item.metadatas.title}}

-

Description:

-

{{item.metadatas.description}}


+

{% if item.metadatas.title %}{{item.metadatas.title}}{% else %}Objet sans titre{% endif %}

+ {% if item.metadatas.description %} +

Description:

+

{{item.metadatas.description}}


+ {% endif %} {% if item.images.all.count > 1 %} -

Autres images pour cet objet:

+

Autres images pour cet objet:

{% for image in item.images.all %} {% thumbnail image.media "150x150" crop=False as im_small %} @@ -33,6 +35,13 @@ {% endfor %}

{% endif %} + {% for image in item.images.all %} +
+ {% include "partials/image_stats_panel.html" with image=image label="Statistiques sur cette image:" %} +
+ {% endfor %} + + Retour à la liste d'objets
{% for image in item.images.all %} @@ -47,8 +56,10 @@