alcatel/controller/DocumentaryFile.py
changeset 27 8ca7f2cea729
child 37 3848e1813a30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/alcatel/controller/DocumentaryFile.py	Thu Jan 24 16:58:55 2013 +0100
@@ -0,0 +1,181 @@
+'''
+Created on 27 juil. 2012
+
+@author: gerard
+'''
+import datetime
+import logging
+
+from time import  mktime 
+from django.core.cache import cache
+
+from dataparser.ClientDocumentaryFileAttributes import ClientDocumentaryFileAttributes
+from dataparser.ClientDocumentaryFileVisibilityAttributes import ClientDocumentaryFileVisibilityAttribute
+from dataparser.ClientDocumentaryFileDeleteAttributes import ClientDocumentaryFileDeleteAttributes
+from document.models import Cluster
+from document.models import Image
+from document.models import Document
+from document.models import Documentaryfile
+from document.models import Clusterdocumentweight
+from django.contrib.auth.models import User
+
+logger = logging.getLogger('document')
+
+class DocumentaryFile(object):
+
+    def __init__(self, request):
+        logger.info('DocumentaryFile init')
+        self.request = request
+           
+    def create(self):
+        logger.info('create DocumentaryFile')
+        attr = ClientDocumentaryFileAttributes(self.request)
+        logger.info('user = ' + str(attr.get_user()))
+        logger.info('query_id = ' + str(attr.get_query_id()))
+        logger.info('public = ' + str(attr.get_visibility()))
+        query_id = attr.get_query_id()   
+        print query_id   
+        key1 = cache.get(query_id)
+        if key1:
+            context = cache.get(key1['weblab_data_key'])
+            if context == None:
+                print "cache empty"
+                json = '{"Error": "Invalid query id"}'
+                logger.info(json)
+            else:
+                print "cache not empty"
+                list_concepts,concepts_with_detailed_documents_list = context
+                logger.info('list_concepts' + str(list_concepts))
+                logger.info('concepts_with_detailed_documents_list' + str(concepts_with_detailed_documents_list))
+                #parse to get the value to save the documentary file
+                json = self.parseAndSaveValue(list_concepts,concepts_with_detailed_documents_list, attr )
+        else:
+            json = '{"Error": "Invalid query id"}'
+            logger.info(json)
+        return json
+    
+    def visibilityChange(self):
+        logger.info('visibilityChange')
+        attr = ClientDocumentaryFileVisibilityAttribute(self.request)
+        logger.info('get_user = ' + str(attr.get_user()))
+        logger.info('get_documentary_file_id = ' + str(attr.get_documentary_file_id()))
+        logger.info('get_visibility = ' + str(attr.get_visibility()))
+        try:
+            documentaryfile = Documentaryfile.objects.get(pk=attr.get_documentary_file_id())
+        except Documentaryfile.DoesNotExist:
+            json = '{"Error": "Invalid documentary id"}'
+            logger.info(json)
+            return json
+        
+        logger.info('documentaryfile.user.name = ' + str(documentaryfile.user.username))
+        if documentaryfile.user.username == attr.get_user():
+            if attr.get_visibility() == 'public':
+                visibility_attr = True
+            elif attr.get_visibility() == 'private':
+                visibility_attr = False
+            else:
+                json = '{"Error" : "Invalid visibility parameter"}'
+                logger.info(json)
+                return json
+            
+            for thecluster in documentaryfile.cluster_set.all():
+                for thedocument in thecluster.document.all():
+                    for theannotationdoc in thedocument.annotationdocument_set.all():
+                        theannotationdoc.visibility = visibility_attr
+                        theannotationdoc.save()
+                       
+            documentaryfile.visibility = visibility_attr
+            documentaryfile.save()
+            json = '{"visibility": "' + attr.get_visibility() + '"}'
+            logger.info(json)
+        else:
+            json = '{"Error": "User does not matched"}'
+            logger.info(json)
+       
+        return json
+        
+    def delete(self):
+        logger.info('delete DocumentaryFile')
+        attr = ClientDocumentaryFileDeleteAttributes(self.request)
+        logger.info('get_user = ' + str(attr.get_user()))
+        logger.info('get_documentary_file_id = ' + str(attr.get_documentary_file_id()))
+        docId = attr.get_documentary_file_id()
+        if docId == '':
+            json= '{"Error": "No documentary_file_id attribute in the http post request"}'
+            logger.info(json)
+            return json
+        
+        try:
+            documentaryfile = Documentaryfile.objects.get(pk=attr.get_documentary_file_id())
+        except Documentaryfile.DoesNotExist:
+            json= '{"Error": "Invalid documentary_file_id"}'
+            logger.info(json)
+            return json
+        
+        logger.info('documentaryfile.user.username = ' + str(documentaryfile.user.username))
+        if documentaryfile.user.username == attr.get_user():
+            #verify if the associated documents are associated to another documentaryfile. if not delete the documents
+            for thecluster in documentaryfile.cluster_set.all():     
+                for thedocument in thecluster.document.all():
+                    nb = (Clusterdocumentweight.objects.filter(document_id=thedocument.documentId)).count()
+                    logger.info('nb' + str(nb))
+                    if nb == 1:
+                        thedocument.delete()
+           
+            documentaryfile.delete()
+            json = '{"documentary_file_deleted" :' + str(docId) + '}'
+            logger.info(json)
+        else:
+            json= '{"Error": "User does not match"}'
+            logger.info(json)
+       
+        return json  
+    
+    def parseAndSaveValue(self, list_concepts,concepts_with_detailed_documents_list, attr):
+        #parse the context
+
+        try:
+            user_attr = User.objects.get(username=attr.get_user)
+        except User.DoesNotExist, err:
+            logger.info(' Error: '+ str(err))
+            json = '{"Error": "User does not existed"}' 
+            return json
+        
+        visibility_attr = attr.get_visibility()
+        if visibility_attr == 'public':
+            visibility_bool = True
+        else:
+            visibility_bool = False
+            
+        title_attr = attr.get_title()
+        description_attr = attr.get_description()
+        #query_id_attr = attr.get_query_id()
+        #TODO url image
+        image1 = Image(url='url')
+        image1.save()
+        
+        now = datetime.datetime.now()
+        mktime(now.timetuple())
+        print mktime(now.timetuple())
+           
+        # create the documentary file
+        dossierDoc1 = Documentaryfile(title=title_attr, date=now , description=description_attr, visibility=visibility_bool, list_concepts=list_concepts, concepts_with_detailed_documents_list = concepts_with_detailed_documents_list, image=image1, user=user_attr)
+        dossierDoc1.save()
+        nb_concept = len(concepts_with_detailed_documents_list)
+        logger.info('nb_concept = ' + str(nb_concept))
+        for concept_index, concept_with_detailed_documents_list in enumerate(concepts_with_detailed_documents_list) :
+            cluster1 = Cluster.objects.create(title=list_concepts[concept_index]['title'], description=list_concepts[concept_index]['abstract'], weight=list_concepts[concept_index]['score'], documentaryfile=dossierDoc1, image=image1)
+            for detailed_document in concept_with_detailed_documents_list:
+                logger.info(detailed_document)
+                logger.info('cluster_id and doc_id = ' + str(list_concepts[concept_index]['title']+' and '+detailed_document['id']))
+                #Verify if the document exist already in database
+                try:
+                    doc1 = Document.objects.get(pk=detailed_document['id'])
+                except Document.DoesNotExist:
+                    doc1 = Document.objects.create(documentId=detailed_document['id'], title=detailed_document['title'],description=detailed_document['abstract'],date=datetime.datetime.fromtimestamp(int(detailed_document['date'])).isoformat(), image=image1)
+                    
+                clusterDocWeight1 = Clusterdocumentweight(cluster=cluster1, document=doc1, weight=detailed_document['weight'])
+                clusterDocWeight1.save()
+        json= '{"documentary_file_created":' + str(dossierDoc1.id) + '}'
+        logger.info(json)
+        return json
\ No newline at end of file