| 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') |
|---|