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 'code'
9 ################################################################################
10 from ajax_select
import get_lookup
11 from django
.contrib
.admin
import site
12 from django
.db
import models
13 from django
.http
import HttpResponse
14 import ajax_select
.views
16 def fk_ajax_lookup(request
,channel
):
17 """ this view supplies results for both foreign keys and many to many fields """
19 # it should come in as GET unless global $.ajaxSetup({type:"POST"}) has been set
20 # in which case we'll support POST
21 if request
.method
== "GET":
22 # we could also insist on an ajax request
23 if 'q' not in request
.GET
:
24 return HttpResponse('')
25 query
= request
.GET
['q']
27 if 'q' not in request
.POST
:
28 return HttpResponse('') # suspicious
29 query
= request
.POST
['q']
31 lookup_channel
= get_lookup(channel
)
34 instances
= lookup_channel
.get_query(query
,request
)
39 for item
in instances
:
40 itemf
= lookup_channel
.format_item(item
)
41 itemf
= itemf
.replace("\n","").replace("|","¦")
42 resultf
= lookup_channel
.format_result(item
)
43 resultf
= resultf
.replace("\n","").replace("|","¦")
44 fk
= getattr(lookup_channel
, 'fk_key', None)
46 id = getattr(item
, fk
)
49 results
.append( "|".join((unicode(id),itemf
,resultf
)) )
50 return HttpResponse("\n".join(results
))
52 ajax_select
.views
.ajax_lookup
= fk_ajax_lookup
54 from ajax_select
.fields
import AutoCompleteSelectWidget
56 def value_from_datadict(self
, data
, files
, name
):
58 got
= data
.get(name
, None)
67 AutoCompleteSelectWidget
.value_from_datadict
= value_from_datadict
69 from django
.conf
import settings
70 from django
.core
.urlresolvers
import reverse
71 from django
.utils
.safestring
import mark_safe
72 from django
.forms
.util
import flatatt
73 from django
.template
.loader
import render_to_string
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('ajax_lookup',kwargs
={'channel':self
.channel
}),
107 'current_result': current_result
,
108 'help_text': self
.help_text
,
109 'extra_attrs': mark_safe(flatatt(final_attrs
)),
110 'func_slug': self
.html_id
.replace("-",""),
111 'add_link' : self
.add_link
,
112 'admin_media_prefix' : settings
.ADMIN_MEDIA_PREFIX
115 return mark_safe(render_to_string(('autocompleteselect_%s.html' % self
.channel
, 'autocompleteselect.html'),context
))
119 AutoCompleteSelectWidget
.render
= patched_render