ajax select fix pk fk different
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Mon, 23 Jan 2012 15:16:31 +0000 (10:16 -0500)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Mon, 23 Jan 2012 15:16:31 +0000 (10:16 -0500)
project/monkey.py [new file with mode: 0644]
project/rh/catalogues.py
project/urls.py

diff --git a/project/monkey.py b/project/monkey.py
new file mode 100644 (file)
index 0000000..888b205
--- /dev/null
@@ -0,0 +1,67 @@
+# -*- encoding: utf-8 -*-
+
+################################################################################
+#
+# PATCH AJAX SELECT FIELD : pour gérer le fait que certaine FK ne sont pas
+# forcément mappé sur la PK du modèle, dans notre cas ici c'est le modèle 
+# Pays qui dispose d'un pk sur son id mais les fk sont mappé sur le champs 'code'
+#
+################################################################################
+from ajax_select import get_lookup
+from django.contrib.admin import site
+from django.db import models
+from django.http import HttpResponse
+import ajax_select.views
+
+def fk_ajax_lookup(request,channel):
+    """ this view supplies results for both foreign keys and many to many fields """
+
+    # it should come in as GET unless global $.ajaxSetup({type:"POST"}) has been set
+    # in which case we'll support POST
+    if request.method == "GET":
+        # we could also insist on an ajax request
+        if 'q' not in request.GET:
+            return HttpResponse('')
+        query = request.GET['q']
+    else:
+        if 'q' not in request.POST:
+            return HttpResponse('') # suspicious
+        query = request.POST['q']
+    
+    lookup_channel = get_lookup(channel)
+    
+    if query:
+        instances = lookup_channel.get_query(query,request)
+    else:
+        instances = []
+
+    results = []
+    for item in instances:
+        itemf = lookup_channel.format_item(item)
+        itemf = itemf.replace("\n","").replace("|","&brvbar;")
+        resultf = lookup_channel.format_result(item)
+        resultf = resultf.replace("\n","").replace("|","&brvbar;")
+        fk = getattr(lookup_channel, 'fk_key', None)
+        if fk is not None:
+            id = getattr(item, fk)
+        else:
+            id = item.pk
+        results.append( "|".join((unicode(id),itemf,resultf)) )
+    return HttpResponse("\n".join(results))
+
+ajax_select.views.ajax_lookup = fk_ajax_lookup
+
+from ajax_select.fields import AutoCompleteSelectWidget
+
+def value_from_datadict(self, data, files, name):
+
+    got = data.get(name, None)
+    if got:
+        try:
+            return long(got)
+        except:
+            return got
+    else:
+        return None
+
+AutoCompleteSelectWidget.value_from_datadict = value_from_datadict
index 2fc3c8e..c2deb97 100644 (file)
@@ -5,6 +5,7 @@ from auf.django.references import models as ref
 import models as rh
 
 class Pays(object):
+    fk_key = "code"
 
     def get_query(self,q,request):
         pays = ref.Pays.objects.filter(Q(nom__icontains=q) | Q(code__icontains=q))
index 2ad76a6..9e0e552 100644 (file)
@@ -5,6 +5,7 @@ from django.contrib import admin
 from auf.django.emploi import settings as sett
 
 from auf.django import permissions
+import monkey
 
 admin.autodiscover()
 permissions.autodiscover()