
-- views.py ------------

from django.http import HttpResponse, HttpResponseBadRequest
from django.views.decorators.cache import cache_page
from django.db.models import Q

# from http://www.djangosnippets.org/snippets/233/
# generalized for variable queryset and fieldname

def autocomplete(request, queryset, searchfields=[], resultfields=[]):
    if resultfields:
        fields = resultfields
    else:
        fields = []
        for searchfield in searchfields:
            if '__' in searchfield:
                fields.append(searchfield[:searchfield.index('__')])
            else:
                fields.append(searchfield)

    def iter_results(results):
        if results:
            for r in results:
                result = ''
                for field in fields:
                    value = getattr(r, field)
                    if result:
                        result += '|%s' % value
                    else:
                        result = '%s' % value
                yield '%s\n' % result

    if not request.GET.get('q'):
        return HttpResponse(mimetype='text/plain')

    q = request.GET.get('q')
    limit = request.GET.get('limit', 15)

    try:
        limit = int(limit)
    except ValueError:
        return HttpResponseBadRequest()

    qs = None

    for searchfield in searchfields:
        kwargs = {}
        if '__' in searchfield:
            kwargs[searchfield] = q
        else:
            kwargs['%s__istartswith' % searchfield] = q
        if qs:
            qs = qs | Q(**kwargs)
        else:
            qs = Q(**kwargs)

    object_list = queryset.filter(qs)[:limit]
    return HttpResponse(iter_results(object_list), mimetype='text/plain')

autocomplete = cache_page(autocomplete, 60 * 60)





-- urls.py ---------

# -*- coding: utf-8 -*-

from django.conf.urls.defaults import *
from models import *

besuch = {
  'queryset': Besuch.objects.filter(besuchsende__isnull=True).order_by('besuchsbeginn'),
  'searchfields': ['besucher__name__icontains', 'besucher__firma__name__icontains', 'besuchsempfaenger__name__icontains', 'besuchsziel__ort__icontains'],
  'resultfields': ['id', 'besucher', 'besuchsempfaenger', 'besuchsziel', 'besuchsbeginn']
}

urlpatterns += patterns('views',
    (r'^besuch/search/$', 'autocomplete', besuch ),
)

