# -*- 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 from conference.models import Conference # 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() if model == Area and request.GET.get('norussia'): objects = filter(lambda x: x['id'] != 159, objects) #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': qs = list(SearchQuerySet().models(Country, City, Area).autocomplete(content_auto=term)[:6]) objects = [{'text':get_by_lang(item, 'name', lang), 'id': item.pk, 'name': item.form_name} for item in qs] #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, indent=4), 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), 'theme_id': item.theme_id if item.model_name == 'tag' else None} for item in SearchQuerySet().models(Theme, Tag).autocomplete(content_auto=term)] return HttpResponse(json.dumps(objects, indent=4), 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'] term = term.strip() d = datetime.date.today() expos = list(SearchQuerySet().models(Exposition).filter(data_end__gte=d).autocomplete(content_auto=term).order_by('data_begin','text')[:6]) confs = list(SearchQuerySet().models(Conference).filter(data_end__gte=d).autocomplete(content_auto=term).order_by('data_begin','text')[:6]) tags = list(SearchQuerySet().models(Tag).autocomplete(content_auto=term).order_by('text')[:6]) themes = list(SearchQuerySet().models(Theme).autocomplete(content_auto=term).order_by('text')[:6]) res = expos + themes + tags + confs 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, indent=4), 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 #------------------------------------------------------ # POPOVERS #------------------------------------------------------ import random from django.shortcuts import render from django.template.loader import render_to_string def get_popover(request): response = {'success': True} theme_id = request.GET.get('theme_id') themes = {'2': ['client/popups/auto_modal.html', 'client/popups/auto_banner.html'], '32': ['client/popups/auto_modal.html', 'client/popups/auto_banner.html', 'client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'], '54': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'], '26': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'], '22': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'], '15': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'], '44': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html'], '30': ['client/popups/cemat_modal.html', 'client/popups/cemat_banner1.html', 'client/popups/cemat_banner2.html']} popovers = themes.get(theme_id) if not popovers: popovers = ['fail'] response['success'] = False popover = random.choice(popovers) html = render_to_string(popover) response['html'] = html return HttpResponse(json.dumps(response), content_type='application/json')