diff -r 5bb249eefdd1 -r 22ab430e9b64 web/ldt/text/views.py --- /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) +