alcatel/controller/Clusters.py
author Nicolas Sauret <nicolas.sauret@iri.centrepompidou.fr>
Thu, 10 Apr 2014 14:20:23 +0200
changeset 47 c0b4a8b5a012
parent 27 8ca7f2cea729
permissions -rw-r--r--
add toolkit.html + démonstrateurs

'''
Created on 7 aout 2012

@author: gerard
'''
import logging
import simplejson

from dataparser.ClustersGetAttributes import ClustersGetAttributes
from document.models import Annotationcluster
from document.models import Cluster
from document.models import Clusterdocumentweight
from document.models import Document
from document.models import Documentaryfile
from django.contrib.auth.models import User
from mediapartdb.MediapartReader import MediapartReader

logger = logging.getLogger('document')

# List of documents of a cluster with annotations
class Clusters(object):

    def __init__(self, request):
        self.request = request
    
    def get_treemap_of_clusters(self):
        attr = ClustersGetAttributes(self.request)
        
        if not attr.get_user():
            json = '{"error msg": "user is not defined"}'
            return json
        if not attr.get_documentary_file_id():
            json = '{"error msg": "documentary_file_id is not defined"}'
            return json
        
        the_user = User.objects.get(username=attr.get_user())
        
        if the_user:
            docFiles = Documentaryfile.objects.filter(id=int(attr.get_documentary_file_id()), user_id=the_user.id )
            if len(docFiles) == 0:
                json = '{"error msg": "There is no documentary file belonging to the user specified"}'
                return json
        
        reader = MediapartReader()
        
        json = {"clusters":[]}
        clusters = Cluster.objects.filter(documentaryfile=int(attr.get_documentary_file_id()))
        for cluster in clusters:
            jsoncluster = {'id':cluster.id}
            jsoncluster['title'] = cluster.title
            jsoncluster['abstract'] = cluster.description
            jsoncluster['weight'] = cluster.weight
            
            jsoncluster['annotations'] = []
            
            annotations = Annotationcluster.objects.filter(cluster=cluster.id)
            for annotation in annotations:
                jsonanno = {'id':annotation.id}
                jsonanno['user'] = str(annotation.user)
                jsonanno['text'] = str(annotation.description)
                jsoncluster['annotations'].append(jsonanno)
             
            jsoncluster['documents'] = []
            
            doc_weights = Clusterdocumentweight.objects.filter(cluster_id=cluster.id)
            sorted_doc_weights = sorted(doc_weights, key=lambda a_cluster_doc_weight: a_cluster_doc_weight.weight)
            
            for index_doc, doc_weights in enumerate(sorted_doc_weights):
                if index_doc < 3:
                    jsondoc = {'id':doc_weights.document.documentId}
                    doc = Document.objects.get(documentId=doc_weights.document.documentId)
                    jsondoc['title'] = str(doc.title.encode("utf8"))
                    url = reader.get_url(str(doc_weights.document.documentId))
                    jsondoc['url_document'] = url
                    jsondoc['date'] = str(doc.date.isoformat())
                    category = reader.get_category(str(doc_weights.document.documentId))
                    jsondoc['category'] = category
                    jsondoc['url_image'] = 'TO BE DEFINED'
                    jsondoc['weight'] = float(doc_weights.weight)
    
                    jsoncluster['documents'].append(jsondoc)
                else:
                    break
            jsoncluster['document_number'] = len(sorted_doc_weights)
            json['clusters'].append(jsoncluster)
        
        result = simplejson.dumps(json)
        logger.debug(result)
        return result