fix candidat
[auf_rh_dae.git] / project / monkey.py
index 888b205..a283dc8 100644 (file)
@@ -1,23 +1,33 @@
 # -*- 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'
+# 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.conf import settings
+from django.core.urlresolvers import reverse
 from django.http import HttpResponse
+from django.forms.util import flatatt
+from django.utils.safestring import mark_safe
+from django.template.loader import render_to_string
+
 import ajax_select.views
+from ajax_select import get_lookup
+from ajax_select.fields import AutoCompleteSelectWidget
 
-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
+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:
@@ -25,33 +35,30 @@ def fk_ajax_lookup(request,channel):
         query = request.GET['q']
     else:
         if 'q' not in request.POST:
-            return HttpResponse('') # suspicious
+            return HttpResponse('')  # suspicious
         query = request.POST['q']
-    
+
     lookup_channel = get_lookup(channel)
-    
+
     if query:
-        instances = lookup_channel.get_query(query,request)
+        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("|","¦")
+        itemf = itemf.replace("\n", "").replace("|", "¦")
         resultf = lookup_channel.format_result(item)
-        resultf = resultf.replace("\n","").replace("|","¦")
+        resultf = resultf.replace("\n", "").replace("|", "¦")
         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)) )
+        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):
 
@@ -64,4 +71,56 @@ def value_from_datadict(self, data, files, name):
     else:
         return None
 
-AutoCompleteSelectWidget.value_from_datadict = value_from_datadict
+
+def patched_render(self, name, value, attrs=None):
+    """
+    prevention contre les choses supprimees
+    """
+    # precheck existence valeur
+    lookup = get_lookup(self.channel)
+    if value:
+        objs = lookup.get_objects([value])
+        if len(objs) == 0:
+            value = ''
+
+    # copie de django_ajax_selects-1.1.4-py2.6.egg/ajax_select/fields.py
+    value = value or ''
+    final_attrs = self.build_attrs(attrs)
+    self.html_id = final_attrs.pop('id', name)
+
+    lookup = get_lookup(self.channel)
+    if value:
+        objs = lookup.get_objects([value])
+        try:
+            obj = objs[0]
+        except IndexError:
+            raise Exception("%s cannot find object:%s" % (lookup, value))
+        current_result = mark_safe(lookup.format_item(obj))
+    else:
+        current_result = ''
+
+    context = {
+            'name': name,
+            'html_id': self.html_id,
+            'lookup_url': reverse(
+                'ajax_lookup', kwargs={'channel': self.channel}
+            ),
+            'current_id': value,
+            'current_result': current_result,
+            'help_text': self.help_text,
+            'extra_attrs': mark_safe(flatatt(final_attrs)),
+            'func_slug': self.html_id.replace("-", ""),
+            'add_link': self.add_link,
+            'admin_media_prefix': settings.ADMIN_MEDIA_PREFIX
+            }
+
+    return mark_safe(render_to_string((
+        'autocompleteselect_%s.html' % self.channel,
+        'autocompleteselect.html'
+    ), context))
+
+
+def patch_ajax_selects():
+    ajax_select.views.ajax_lookup = fk_ajax_lookup
+    AutoCompleteSelectWidget.render = patched_render
+    AutoCompleteSelectWidget.value_from_datadict = value_from_datadict