# -*- coding: utf-8 -*- import json from django.shortcuts import HttpResponse, get_object_or_404 from django.http import Http404 from django.utils import translation from haystack.query import SearchQuerySet from exposition.models import Exposition from country.models import Country, Area, City from theme.models import Tag, Theme from place_exposition.models import PlaceExposition from place_conference.models import PlaceConference from company.models import Company # every this model must have method get_subcategories categories = {'area':{'sub':True, 'model':Area, 'sub_categorie_name':'co'}, 'co':{'sub':False, 'model':Country, 'sub_categorie_name':'ci'}, 'th':{'sub':False, 'model':Theme, 'sub_categorie_name':'tg'}, 'ci':{'sub':False, 'model':City, 'sub_categorie_name':None}, 'tg':{'sub':False, 'model':Tag, 'sub_categorie_name':None}} def sub_category(request): if request.GET: name = request.GET['name'] categorie = categories.get(name) if not categorie: raise Http404 categorie_id = request.GET['id'] model = categorie['model'] obj = get_object_or_404(model, pk=categorie_id) objects = obj.get_sub_categories() #response = {'sub_categories': objects, 'sub':categorie['sub'], 'sub_name': categorie['sub_categorie_name']} return HttpResponse(json.dumps(objects), content_type='application/json') else: raise Http404 search_forms = {'theme':'', 'place':''} # сделать с помощью haystack!!! def search_autocomplete(request): if request.GET: lang = translation.get_language() term = request.GET['term'] form = request.GET['form'] if form == 'place': areas = [{'text':item.name, 'id':item.id, 'name':'area'} for item in Area.objects.filter(translations__name__contains=term)] countries = [{'text':item.name, 'id':item.id, 'name':'co'} for item in Country.objects.select_related('exposition_country')\ .filter(exposition_country__country__isnull=False, translations__language_code=lang, translations__name__contains=term).distinct()] cities = [{'text':item.name, 'id':item.id, 'name':'ci'} for item in City.objects.select_related('exposition_city')\ .filter(exposition_city__city__isnull=False, translations__language_code=lang, translations__name__contains=term).distinct()] objects = areas + countries + cities return HttpResponse(json.dumps(objects), content_type='application/json') if form == 'subj': objects = [{'text': get_by_lang(item, 'name', lang), 'id':item.pk, 'name': item.form_name, 'cat': get_by_lang(item, 'parent', lang)} for item in SearchQuerySet().models(Theme, Tag).autocomplete(content_auto=term)] return HttpResponse(json.dumps(objects), content_type='application/json') else: return HttpResponse("Don't implemented yet") else: raise Http404 def search_parent(request): if request.GET: name = request.GET['name'] categorie = categories.get(name) if not categorie: raise Http404 categorie_id = request.GET['id'] model = categorie['model'] obj = get_object_or_404(model, id=long(categorie_id)) result = obj.get_parent() return HttpResponse(json.dumps(result), content_type='application/json') else: raise Http404 def get_by_lang(item, field, lang='en'): """ :param item: searchresult object field: translated field :return: """ return getattr(item, field+'_'+lang) import datetime def expo_autosearch(request): if request.GET: lang = translation.get_language() term = request.GET['term'] d = datetime.date.today() expos = list(SearchQuerySet().models(Exposition).filter(data_end__gte=d).autocomplete(content_auto=term).order_by('data_begin','text')[:6]) themes = list(SearchQuerySet().models(Tag).autocomplete(content_auto=term).order_by('text')[:15]) res = expos + themes result = [{'cat': get_by_lang(item, 'catalog_name', lang), 'text': '%s (%s)'%(get_by_lang(item, 'name', lang),get_by_lang(item, 'parent', lang)) if get_by_lang(item, 'parent', lang) else get_by_lang(item, 'name', lang), 'url':item.url, 'id':item.pk, 'name': item.form_name} for item in res] result = sorted(result, key=lambda x:x['cat'], reverse=True) return HttpResponse(json.dumps(result), content_type='application/json') else: raise Http404 def place_autosearch(request): if request.GET: lang = translation.get_language() qs = SearchQuerySet().models(PlaceExposition, PlaceConference).autocomplete(content_auto=request.GET['term']) result = [{'cat': get_by_lang(item, 'catalog_name', lang), 'text': get_by_lang(item, 'name', lang), 'url':item.url, 'id':item.pk, 'name': item.form_name} for item in qs].sort(key=lambda x:x['cat']) result = sorted(result, key=lambda x:x['cat']) return HttpResponse(json.dumps(result), content_type='application/json') else: raise Http404 def company_autosearch(request): if request.GET: qs = SearchQuerySet().models(Company, Theme, Tag).autocomplete(content_auto=request.GET['term']) result = [{'cat': item.object.catalog_name, 'text': item.object.name, 'url':item.url, 'id':item.object.id, 'name': item.object.search_name} for item in qs].sort(key=lambda x:x['cat']) result = sorted(result, key=lambda x:x['cat']) return HttpResponse(json.dumps(result), content_type='application/json') else: raise Http404