def appquery(self, djp): '''This function implements the search query. The query is build using the search fields specifies in :attr:`djpcms.views.appsite.ModelApplication.search_fields`. It returns a queryset. ''' qs = super(SearchView,self).appquery(djp) request = djp.request slist = self.appmodel.opts.search_fields if request.method == 'GET': data = dict(request.GET.items()) else: data = dict(request.POST.items()) search_string = data.get(self.search_text,None) if slist and search_string: bits = smart_split(search_string) #bits = search_string.split(' ') for bit in bits: bit = isexact(bit) if not bit: continue or_queries = [Q(**{construct_search(field_name): bit}) for field_name in slist] other_qs = QuerySet(self.appmodel.modelsearch()) other_qs.dup_select_related(qs) other_qs = other_qs.filter(reduce(operator.or_, or_queries)) qs = qs & other_qs return qs
def get_response(self, djp): '''This response works only if it is an AJAX response. Otherwise it raises a ``Http404`` exception.''' request = djp.request if not request.is_ajax(): raise djp.http.Http404 params = dict(request.GET.items()) query = request.GET.get('q', None) search_fields = self.appmodel.search_fields if query and search_fields: q = None for field_name in search_fields: name = construct_search(field_name) if q: q = q | Q( **{str(name):query} ) else: rel_name = name.split('__')[0] q = Q( **{str(name):query} ) qs = self.model.objects.filter(q) data = ''.join([u'%s|%s|%s\n' % (getattr(f,rel_name),f,f.pk) for f in qs]) else: data = '' return djp.http.HttpResponse(data)