web/ldt/text/views.py
changeset 9 22ab430e9b64
child 10 000f3ca19eaa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/text/views.py	Tue Nov 16 14:15:07 2010 +0100
@@ -0,0 +1,254 @@
+from django.conf import settings
+from django.contrib.auth.decorators import login_required
+from django.core.urlresolvers import reverse
+from django.db import IntegrityError
+from django.db.models import Q
+from django.forms.util import ErrorList
+from django.http import HttpResponse, Http404, HttpResponseRedirect, \
+    HttpResponseForbidden, HttpResponseServerError, HttpResponseBadRequest
+from django.shortcuts import render_to_response, get_object_or_404, \
+    get_list_or_404
+from django.template import RequestContext
+from django.template.loader import render_to_string
+from django.utils.html import escape
+from django.utils.translation import ugettext as _, ungettext
+from httplib import CONFLICT
+from ldt.core.models import Owner
+from ldt.text.utils import boolean_convert
+from lxml import etree
+from lxml.html import fromstring, fragment_fromstring
+from ldt.text.models import *
+from string import Template
+from urllib2 import urlparse
+from utils import *
+import StringIO
+import base64
+import cgi
+import django.core.urlresolvers
+import ldt.auth as ldt_auth
+import ldt.utils.path as ldt_utils_path
+import logging
+import lucene
+import tempfile
+import uuid
+
+
+## Filters the annotation depending on the request parameters
+## Returns an xml containing the resulting annotations
+def filter_annotation(request, uri=None, filter=None, limit=None, creator=None):
+    annotlist = None
+    query = Q()    
+    
+    if request.GET.get('uri'):
+        query &= Q(uri=request.GET.get('uri'))
+    if request.GET.get('creator'):
+        query &= Q(creator=request.GET.get('creator'))
+    if request.GET.get('filter') and len(request.GET.get('filter')) > 0:
+        query &= Q(text__icontains=request.GET.get('filter'))
+
+    annotlist = Annotation.objects.filter(query)
+    
+    if request.GET.get('limit'):
+        nb = request.GET.get('limit')
+        #offset = request.GET.get('limit')[1]
+        annotlist = annotlist[:nb]
+
+    #create xml
+    iri = lxml.etree.Element('iri')
+    doc = lxml.etree.ElementTree(iri)
+    
+    for annot in annotlist:
+        textannotation = lxml.etree.SubElement(iri, 'text-annotation')
+        id = lxml.etree.SubElement(textannotation,'id')
+        id.text = annot.external_id
+        uri = lxml.etree.SubElement(textannotation,'uri')
+        uri.text = annot.uri
+        
+        if annot.tags:
+            if type(annot.tags) is unicode:
+                annot.tags = eval(annot.tags)
+            tags = lxml.etree.SubElement(textannotation,'tags')
+            ltags = normalize_tags(annot.tags)
+            for t in ltags:
+                tag = lxml.etree.SubElement(tags, 'tag')
+                tag.text = t
+            
+        content = lxml.etree.SubElement(textannotation,'content')
+        color = lxml.etree.SubElement(content,'color')
+        color.text = annot.color
+        description = lxml.etree.SubElement(content,'description')
+        description.text = annot.description
+        title = lxml.etree.SubElement(content,'title')
+        title.text = annot.title
+        text = lxml.etree.SubElement(content,'text')
+        text.text = annot.text
+        
+        meta = lxml.etree.SubElement(textannotation,'meta')
+        contributor = lxml.etree.SubElement(meta, "contributor")
+        contributor.text = annot.contributor
+        creator = lxml.etree.SubElement(meta, "contributor")
+        creator.text = annot.creator
+        creationdate = lxml.etree.SubElement(meta, "created")
+        creationdate.text = str(annot.creation_date)
+        updatedate = lxml.etree.SubElement(meta, "modified")
+        updatedate.text = str(annot.update_date)
+        
+    return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8")
+
+
+## Creates an annotation from a urlencoded xml content
+## Returns an xml-structured annotation
+#@login_required
+def create_annotation(request, content):
+    cont = base64.urlsafe_b64decode(request.POST["content"])
+    doc = lxml.etree.fromstring(cont)
+    
+    id = unicode(doc.xpath("/iri/text-annotation/id/text()")[0])
+    if id is None:
+        id = generate_uuid()
+        
+    uri = unicode(doc.xpath("/iri/text-annotation/uri/text()")[0])
+    ltags = []
+    for tag in doc.xpath("/iri/text-annotation/tags/tag/text()"):
+        ltags.append(unicode(tag))
+    tags=normalize_tags(ltags)
+    
+    title = unicode(doc.xpath("/iri/text-annotation/content/title/text()")[0])
+    desc = unicode(doc.xpath("/iri/text-annotation/content/description/text()")[0])
+    text = unicode(doc.xpath("/iri/text-annotation/content/text/text()")[0])
+    color = unicode(doc.xpath("/iri/text-annotation/content/color/text()")[0])
+    
+    creator = unicode(doc.xpath("/iri/text-annotation/meta/creator/text()")[0])
+    contributor = unicode(doc.xpath("/iri/text-annotation/meta/contributor/text()")[0])
+    creation_date = unicode(doc.xpath("/iri/text-annotation/meta/created/text()")[0])
+    update_date = unicode(doc.xpath("/iri/text-annotation/meta/modified/text()")[0])
+    
+    try:
+        annotation = Annotation.create_annotation(external_id=id, uri=uri, tags=tags, title=title, description=desc, text=text, color=color, creator=creator, contributor=contributor, creation_date=creation_date, update_date=update_date)
+        annotation.save()
+        return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8")
+        #return doc
+    except:
+    #except Annotation.IntegrityError:
+        #print 'This id is already used! Please choose another one!'
+        raise CONFLICT
+    
+    
+    
+## Gets an annotation (from its id)
+## Returns the xml-structured annotation
+def get_annotation(request, id):
+    try:
+        annot = Annotation.objects.get(external_id=request.GET.get('id',''))
+    except:
+    #except Annotation.DoesNotExist:
+        raise Http404
+    iri = lxml.etree.Element('iri')
+    doc = lxml.etree.ElementTree(iri)
+    
+    textannotation = lxml.etree.SubElement(iri, 'text-annotation')
+    id = lxml.etree.SubElement(textannotation,'id')
+    id.text = annot.external_id
+    uri = lxml.etree.SubElement(textannotation,'uri')
+    uri.text = annot.uri
+    
+    if annot.tags:
+        if type(annot.tags) is unicode:
+            annot.tags = eval(annot.tags)
+        tags = lxml.etree.SubElement(textannotation,'tags')
+        ltags = normalize_tags(annot.tags)
+        for t in ltags:
+            tag = lxml.etree.SubElement(tags, 'tag')
+            tag.text = t
+    
+    content = lxml.etree.SubElement(textannotation,'content')
+    color = lxml.etree.SubElement(content,'color')
+    color.text = annot.color
+    description = lxml.etree.SubElement(content,'description')
+    description.text = annot.description
+    title = lxml.etree.SubElement(content,'title')
+    title.text = annot.title
+    text = lxml.etree.SubElement(content,'text')
+    text.text = annot.text
+    
+    meta = lxml.etree.SubElement(textannotation,'meta')
+    contributor = lxml.etree.SubElement(meta, "contributor")
+    contributor.text = annot.contributor
+    creator = lxml.etree.SubElement(meta, "creator")
+    creator.text = annot.creator
+    creationdate = lxml.etree.SubElement(meta, "created")
+    creationdate.text = str(annot.creation_date)
+    updatedate = lxml.etree.SubElement(meta, "modified")
+    updatedate.text = str(annot.update_date)
+
+    #return doc
+    return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8")
+
+
+## Deletes an annotation (from its id)
+## Returns an empty xml-structured annotation
+#@login_required
+def delete_annotation(request, id):
+    try:
+        annot = Annotation.objects.get(external_id=request.POST["id"])
+        annot.delete()
+    #except Annotation.DoesNotExist:
+    except:
+        raise Http404
+    
+    doc=create_empty_annotation()
+    #return doc
+    return HttpResponse(lxml.etree.tostring(doc, pretty_print=True), mimetype="text/xml;charset=utf-8")
+
+
+## Updates the content of an annotation
+## Returns the xml-structured updated annotation
+#@login_required
+def update_annotation(request, content, id):
+    try:
+        annot = Annotation.objects.get(external_id=request.POST["id"])
+    #except Annotation.DoesNotExist:
+    except:
+        raise Http404
+    
+    cont = base64.urlsafe_b64decode(request.POST["content"])
+    doc = lxml.etree.fromstring(cont)
+    
+    uri = doc.xpath("/iri/text-annotation/uri/text()")
+    if uri != [] and annot.uri != uri[0]:
+        annot.uri = unicode(uri[0])
+    
+    tags = []
+    for tag in doc.xpath("/iri/text-annotation/tags/tag"):
+        tags.append(unicode(tag.text))
+    if annot.tags is not None:
+        if type(annot.tags) is unicode:
+            annot.tags = eval(annot.tags)
+        tags += annot.tags
+    tags = normalize_tags(tags)
+    annot.tags=tags
+    
+    title = doc.xpath("/iri/text-annotation/content/title/text()")
+    if title != [] and annot.title != title[0]:
+        annot.title = unicode(title[0])
+    desc = doc.xpath("/iri/text-annotation/content/description/text()")
+    if desc != [] and annot.description != desc[0]:
+        annot.description = unicode(desc[0])
+    text = doc.xpath("/iri/text-annotation/content/text/text()")
+    if text != [] and annot.text != text[0]:
+        annot.text = unicode(text[0])
+    color = doc.xpath("/iri/text-annotation/content/color/text()")
+    if color != [] and annot.color != color[0]:
+        annot.color = unicode(color[0])
+    
+    contributor = doc.xpath("/iri/text-annotation/meta/contributor/text()")
+    if contributor != [] and annot.contributor != contributor[0]:
+        annot.contributor = unicode(contributor[0])
+    update_date = doc.xpath("/iri/text-annotation/meta/modified/text()")
+    if update_date != [] and annot.update_date != update_date[0]:
+        annot.update_date = unicode(update_date[0])
+
+    annot.save()
+    
+    return get_annotation(id)
+