1 # -*- encoding: utf-8 -*-
3 ############################################################################
5 # PATCH AJAX SELECT FIELD : pour gérer le fait que certaine FK ne sont pas
6 # forcément mappé sur la PK du modèle, dans notre cas ici c'est le modèle
7 # Pays qui dispose d'un pk sur son id mais les fk sont mappé sur le champs
10 ###########################################################################
12 from django
.conf
import settings
13 from django
.core
.urlresolvers
import reverse
14 from django
.http
import HttpResponse
15 from django
.forms
.util
import flatatt
16 from django
.utils
.safestring
import mark_safe
17 from django
.template
.loader
import render_to_string
19 import ajax_select
.views
20 from ajax_select
import get_lookup
21 from ajax_select
.fields
import AutoCompleteSelectWidget
24 def fk_ajax_lookup(request
, channel
):
26 this view supplies results for both foreign keys and many to many fields
29 # it should come in as GET unless global $.ajaxSetup({type:"POST"}) has
30 # been set in which case we'll support POST
31 if request
.method
== "GET":
32 # we could also insist on an ajax request
33 if 'q' not in request
.GET
:
34 return HttpResponse('')
35 query
= request
.GET
['q']
37 if 'q' not in request
.POST
:
38 return HttpResponse('') # suspicious
39 query
= request
.POST
['q']
41 lookup_channel
= get_lookup(channel
)
44 instances
= lookup_channel
.get_query(query
, request
)
49 for item
in instances
:
50 itemf
= lookup_channel
.format_item(item
)
51 itemf
= itemf
.replace("\n", "").replace("|", "¦")
52 resultf
= lookup_channel
.format_result(item
)
53 resultf
= resultf
.replace("\n", "").replace("|", "¦")
54 fk
= getattr(lookup_channel
, 'fk_key', None)
56 id = getattr(item
, fk
)
59 results
.append("|".join((unicode(id), itemf
, resultf
)))
60 return HttpResponse("\n".join(results
))
63 def value_from_datadict(self
, data
, files
, name
):
65 got
= data
.get(name
, None)
75 def patched_render(self
, name
, value
, attrs
=None):
77 prevention contre les choses supprimees
79 # precheck existence valeur
80 lookup
= get_lookup(self
.channel
)
82 objs
= lookup
.get_objects([value
])
86 # copie de django_ajax_selects-1.1.4-py2.6.egg/ajax_select/fields.py
88 final_attrs
= self
.build_attrs(attrs
)
89 self
.html_id
= final_attrs
.pop('id', name
)
91 lookup
= get_lookup(self
.channel
)
93 objs
= lookup
.get_objects([value
])
97 raise Exception("%s cannot find object:%s" % (lookup
, value
))
98 current_result
= mark_safe(lookup
.format_item(obj
))
104 'html_id': self
.html_id
,
105 'lookup_url': reverse(
106 'ajax_lookup', kwargs
={'channel': self
.channel
}
109 'current_result': current_result
,
110 'help_text': self
.help_text
,
111 'extra_attrs': mark_safe(flatatt(final_attrs
)),
112 'func_slug': self
.html_id
.replace("-", ""),
113 'add_link': self
.add_link
,
114 'admin_media_prefix': settings
.ADMIN_MEDIA_PREFIX
117 return mark_safe(render_to_string((
118 'autocompleteselect_%s.html' % self
.channel
,
119 'autocompleteselect.html'
123 def patch_ajax_selects():
124 ajax_select
.views
.ajax_lookup
= fk_ajax_lookup
125 AutoCompleteSelectWidget
.render
= patched_render
126 AutoCompleteSelectWidget
.value_from_datadict
= value_from_datadict