Prepare front for Senseetive api.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/egonomy/admin.py Mon Mar 04 17:40:57 2013 +0100
@@ -0,0 +1,7 @@
+from django.contrib import admin
+from egonomy.models import Image, ImageInfo, ImageMetadata, Fragment
+
+admin.site.register(Image)
+admin.site.register(ImageInfo)
+admin.site.register(ImageMetadata)
+admin.site.register(Fragment)
--- a/src/egonomy/static/egonomy/css/egonomy.css Mon Mar 04 15:29:30 2013 +0100
+++ b/src/egonomy/static/egonomy/css/egonomy.css Mon Mar 04 17:40:57 2013 +0100
@@ -328,6 +328,10 @@
background: #D0E0FF; margin: 5px 0; padding: 6px; border-radius: 4px; color: #003366;
font-weight: bold; font-size: 13px; float: left;
}
+.add-button-grey {
+ background: #AAAAAA; margin: 5px 0; padding: 6px; border-radius: 4px; color: #555555;
+ font-weight: bold; font-size: 13px; float: left;
+}
.big-button {
background: #D0E0FF; margin: 10px 0 10px 16px; padding: 8px; border-radius: 4px; color: #003366;
--- a/src/egonomy/static/egonomy/js/cutout.js Mon Mar 04 15:29:30 2013 +0100
+++ b/src/egonomy/static/egonomy/js/cutout.js Mon Mar 04 17:40:57 2013 +0100
@@ -178,7 +178,7 @@
var transd = "M"
+ points.map(function(p) { return (p.x / paper.width).toString().replace(/(\.\d{4})\d*/,"$1") + " " + (p.y / paper.height).toString().replace(/(\.\d{4})\d*/,"$1") }).join("L")
+ "Z";
- $(".fragment-path").val(transd);
+ $(".fragment-path").val(transd).change();
}
var dragdeltax, dragdeltay, pathDragging;
--- a/src/egonomy/templates/egonomy_create_fragment.html Mon Mar 04 15:29:30 2013 +0100
+++ b/src/egonomy/templates/egonomy_create_fragment.html Mon Mar 04 17:40:57 2013 +0100
@@ -42,9 +42,17 @@
addTags($("#pertimm_thesaurus_tags").text().split(', '));
});
}
- // Function to add one tag
- $(".addable_tag").click(function() {
- addTags([$(this).text()])
+ // Check if path is not empty ("" or "MZ")
+ $(".fragment-path").change(function() {
+ var v = $(".fragment-path").val();
+ if(v!="" && v!="MZ"){
+ $("#senseetive_click").removeClass("add-button-grey");
+ $("#senseetive_click").addClass("clickable add-button");
+ }
+ else{
+ $("#senseetive_click").addClass("add-button-grey");
+ $("#senseetive_click").removeClass("clickable add-button");
+ }
});
// Init tagit autocomplete with tags from various sources
autocomplete_tags = $("#rmn_tags").text().split(', ');
@@ -52,6 +60,49 @@
autocomplete_tags = autocomplete_tags.concat($("#pertimm_description_tags").text().split(', '));
autocomplete_tags = autocomplete_tags.concat($("#pertimm_thesaurus_tags").text().split(', '));
$('#user_keywords').tagit({availableTags: autocomplete_tags, allowSpaces: true});
+
+ // Function to add one tag
+ $(".addable_tag").click(function() {
+ addTags([$(this).text()]);
+ });
+
+ // Init senseetive api request
+ if($("#senseetive_click")){
+ $("#senseetive_click").click(function() {
+ var v = $(".fragment-path").val();
+ if(v!="" && v!="MZ"){
+ var data_obj = { "image":"{{ img.id }}", "path":$("#fragment_path").val() };
+ $.ajax({
+ url: '{% url "senseetive_api" %}',
+ data: data_obj,
+ dataType: "json",
+ success: function(data, status, request){
+ var n = data.length;
+ if(n>0){
+ s = '<span id="add_senseetive_tags">';
+ for(var i=0;i<n;i++){
+ s += '<span class="clickable addable_tag">' + data[i] + '</span>';
+ if(i<(n-1)) s += ', ';
+ }
+ s += '</span><br/><span id="senseetive_tags" class="right clickable">+ {% trans 'Add all Senseetive keywords to yours' %}</span>';
+ $("#senseetive_holder").html(s);
+ // Function to add one tag
+ $("#senseetive_holder .addable_tag").click(function() {
+ addTags([$(this).text()]);
+ });
+ // Functions to add all tags from senseetive
+ $("#senseetive_tags").click(function() {
+ addTags($("#add_senseetive_tags").text().split(', '));
+ });
+ }
+ },
+ error: function(jqXHR, textStatus, errorThrown) {
+ $("#senseetive_holder").html("<strong>ERROR</strong> : " + jqXHR.responseText);
+ }
+ });
+ }
+ });
+ }
};
function addTags(tags){
nt = tags.length;
@@ -140,6 +191,10 @@
<br/><span id="add_pertimm_thesaurus" class="right clickable">+ {% trans 'Add all Pertimm thesaurus keywords to yours' %}</span></td>
</tr>
{% endif %}
+ <tr>
+ <th>{% trans "Senseetive keywords" %} :</th>
+ <td id="senseetive_holder"><p id="senseetive_click" class="add-button-grey">{% trans 'Request keywords from Senseetive API' %}</p></td>
+ </tr>
</table>
<div class="fullwidth">
<input class="user-submit" type="submit" value="{% trans 'Save the fragment' %}" />
--- a/src/egonomy/urls.py Mon Mar 04 15:29:30 2013 +0100
+++ b/src/egonomy/urls.py Mon Mar 04 17:40:57 2013 +0100
@@ -17,6 +17,7 @@
url(r'^allpictures/$', 'egonomy.views.all_pictures', name='all_pictures'),
url(r'^allfragments/$', 'egonomy.views.all_fragments', name='all_fragments'),
url(r'^userfragments/(?P<username>.*)/$', 'egonomy.views.user_fragments', name='user_fragments'),
+ url(r'^senseetiveapi/$', 'egonomy.views.senseetive_api', name='senseetive_api'),
# Uncomment the admin/doc line below to enable admin documentation:
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
--- a/src/egonomy/views.py Mon Mar 04 15:29:30 2013 +0100
+++ b/src/egonomy/views.py Mon Mar 04 17:40:57 2013 +0100
@@ -4,7 +4,7 @@
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.core.urlresolvers import reverse
from django.db.models.aggregates import Max
-from django.http.response import HttpResponseForbidden
+from django.http.response import HttpResponseForbidden, HttpResponse
from django.shortcuts import get_object_or_404, render_to_response, redirect
from django.template import RequestContext
from django.utils.translation import ugettext as _
@@ -13,8 +13,9 @@
from egonomy.search_indexes.paginator import SearchPaginator
from egonomy.search_indexes.query import ModelRelatedSearchQuerySet
from haystack.query import RelatedSearchQuerySet
+import json
+
import logging
-
logger = logging.getLogger(__name__)
@@ -213,3 +214,26 @@
+def senseetive_api(request):
+
+ # Get the cur_page_nb number parameter if possible
+ image_id = request.GET.get("image") or None
+ frg_path = request.GET.get("path") or "MZ"
+ if not image_id or frg_path=="MZ":
+ return HttpResponseForbidden("The request needs an image and a not null path parameters.")
+ # This is a TEMPORARY algorithm. In the future, this function build a picture from the fragment and will request the senseetive api
+ img = get_object_or_404(Image.objects.select_related('info', 'metadata'), id=image_id)
+ frg_list = Fragment.objects.filter(image=img)
+ tag_list = []
+ for frg in frg_list:
+ tags = frg.tags.split(",")
+ for t in tags:
+ t = t.strip()
+ if t != "":
+ logger.debug(t)
+ tag_list.append(t)
+
+ return HttpResponse(json.dumps(sorted(set(tag_list))))
+
+
+