1 | from django.contrib.auth.decorators import login_required, user_passes_test
|
---|
2 | from django.core import serializers
|
---|
3 | from django.http import HttpResponse
|
---|
4 | from django.utils import simplejson
|
---|
5 | from django.db.models.query import QuerySet
|
---|
6 | from django.db import models
|
---|
7 |
|
---|
8 | user_is_staff = user_passes_test(lambda u: u.is_staff and u.is_authenticated())
|
---|
9 |
|
---|
10 | @user_is_staff
|
---|
11 | def ajax_autocomplete(request):
|
---|
12 | """
|
---|
13 | This function will recieve a bunch fo GET requests for the
|
---|
14 | AjaxForeignKey, and return the data for the autocompletion.
|
---|
15 | """
|
---|
16 | try:
|
---|
17 | limit = int(request.GET.get('limit',10))
|
---|
18 | model_module = request.GET['model_module']
|
---|
19 | model_name = request.GET['model_name']
|
---|
20 | ajax_func = request.GET.get('ajax_func', 'ajax_autocomplete')
|
---|
21 | data = request.GET['ajax_data']
|
---|
22 | except KeyError, ValueError:
|
---|
23 | # bad request
|
---|
24 | response = HttpResponse('Malformed Input')
|
---|
25 | response.status_code = 400
|
---|
26 | return response
|
---|
27 |
|
---|
28 | # import the model
|
---|
29 | Model = getattr(__import__(model_module,(),(),['']),model_name)
|
---|
30 |
|
---|
31 | if not issubclass(Model, models.Model):
|
---|
32 | raise ValueError, "Required a model"
|
---|
33 |
|
---|
34 | if hasattr(Model.objects, ajax_func):
|
---|
35 | query_set = getattr(Model.objects, ajax_func)(data)
|
---|
36 | else:
|
---|
37 | query_set = getattr(Model, ajax_func)(data)
|
---|
38 |
|
---|
39 | if type(query_set) == QuerySet:
|
---|
40 | output = list(query_set[:limit])
|
---|
41 | output2 = []
|
---|
42 |
|
---|
43 | for item in output:
|
---|
44 | if hasattr(item, 'ajax_str'):
|
---|
45 | ajax_str = item.ajax_str()
|
---|
46 | else:
|
---|
47 | ajax_str = str(item)
|
---|
48 |
|
---|
49 | output2.append({'id': item['id'], 'ajax_str': ajax_str+' (%s)' % item['id']})
|
---|
50 | else:
|
---|
51 | output = list(query_set[:limit])
|
---|
52 | output2 = []
|
---|
53 | for item in output:
|
---|
54 | output2.append({'id': item['id'], 'ajax_str': item['ajax_str']+' (%s)' % item['id']})
|
---|
55 |
|
---|
56 | content = simplejson.dumps({'result':output2})
|
---|
57 |
|
---|
58 | return HttpResponse(content,
|
---|
59 | mimetype = 'javascript/javascript')
|
---|