You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
5.6 KiB
124 lines
5.6 KiB
# -*- 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} for item in SearchQuerySet().models(Theme, Tag).autocomplete(content_auto=term)]
|
|
#themes = [{'text':item.name, 'id':item.id, 'name':'th'} for item in Theme.objects.filter(translations__name__contains=term)]
|
|
#tags = [{'text':item.name, 'id':item.id, 'name':'tg'} for item in Tag.objects.filter(translations__name__contains=term)]
|
|
#objects = themes + tags
|
|
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)
|
|
|
|
def expo_autosearch(request):
|
|
if request.GET:
|
|
lang = translation.get_language()
|
|
term = request.GET['term']
|
|
qs = SearchQuerySet().models(Exposition, Theme, Tag).autocomplete(content_auto=term).order_by('text')
|
|
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]
|
|
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 |