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.
 
 
 
 
 
 

182 lines
8.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
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()
#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)} 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')
from banners.models import Redirect
from django.db.models import F
import datetime
def set_cookie(response, key, value, days_expire = 7):
if days_expire is None:
max_age = 365 * 24 * 60 * 60 #one year
else:
max_age = days_expire * 24 * 60 * 60
expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT")
response.set_cookie(key, value, max_age=max_age, expires=expires)
def get_popover_info(request):
id = request.GET.get('rdr')
if id:
Redirect.objects.filter(id=id).update(views = F('views') + 1)
response = HttpResponse('success')
set_cookie(response, 'popover_test1', '1')
return response