place search 2 fields

remotes/origin/1203
Nazar Kotyuk 12 years ago
parent e1b5ceba82
commit c7c1cc147b
  1. 9
      accounts/search_indexes.py
  2. 1
      city/management/__init__.py
  3. 1
      city/management/commands/__init__.py
  4. 8210
      city/management/commands/errors.txt
  5. 128
      city/management/commands/fill_city.py
  6. 129
      city/management/commands/fill_city_desc.py
  7. 12
      city/search_indexes.py
  8. 26
      core/forms.py
  9. 37
      core/views.py
  10. 37
      functions/forms.py
  11. 49
      import_xls/excel_settings.py
  12. 31
      import_xls/export_forms.py
  13. 9
      place_exposition/models.py
  14. 31
      place_exposition/search_indexes.py
  15. 3
      place_exposition/views.py
  16. 3
      proj/urls.py
  17. 2
      schema.xml
  18. 5
      templates/client/base_catalog.html
  19. 56
      templates/client/includes/catalog_search.html
  20. 59
      templates/client/includes/place/search_result.html
  21. 70
      templates/client/place/search.html
  22. 3
      templates/client/search/indexes/accounts/user_text.txt
  23. 1
      templates/client/search/indexes/city/city_text.txt
  24. 4
      templates/client/search/indexes/place_exposition/placeexposition_text.txt

@ -5,9 +5,16 @@ from models import User
class UserIndex(indexes.SearchIndex, indexes.Indexable): class UserIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True) text = indexes.CharField(document=True, use_template=True)
first_name = indexes.CharField(model_attr='first_name') first_name = indexes.CharField(model_attr='first_name')
last_name = indexes.CharField(model_attr='last_name')
email = indexes.NgramField(model_attr='email')
#email = indexes.CharField(model_attr='email')
def get_model(self): def get_model(self):
return User return User
def index_queryset(self, using=None): def index_queryset(self, using=None):
return self.get_model().objects.all()
return self.get_model().objects.filter(is_active=True)

@ -1 +0,0 @@
__author__ = 'kotzilla'

@ -1 +0,0 @@
__author__ = 'kotzilla'

File diff suppressed because it is too large Load Diff

@ -1,128 +0,0 @@
from django.core.management.base import BaseCommand, CommandError
import urllib2, base64, json
from country.models import Country
from city.models import City
from functions.form_check import translit_with_separator
import string, random
def random_url():
salt = 'randomurl-'
r = ''.join(random.choice(string.ascii_lowercase) for _ in range(8))
return salt+r
class Command(BaseCommand):
# booking data
b_username = 'expomap'
b_password = '33xp00m33p'
def fill_city(self, d):
lang = d['languagecode']
id = d['city_id']
country_code = d['countrycode']
name = d['name']
country = Country.objects.filter(country_code=country_code)[0]
try:
city = City.objects.get(id=id)
except City.DoesNotExist:
try:
url = translit_with_separator(name)+'-%s'%country_code
except:
url = random_url()
city = City(country=country, id=id, url=url)
city.translate(lang)
city.name = name
try:
city.save()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
try:
url = translit_with_separator(name)+'-%s'%country_code
except:
url = random_url()
city.url = url
try:
city.save()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
try:
tr = City._meta.translations_model.objects.get(language_code=lang,master__id=getattr(city, 'id'))
except:
city.translate(lang)
city.name = name
try:
city.save()
return
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
tr.name = name
tr.save()
return
def handle(self, *args, **options):
ROWS = 1000
qs = Country.objects.filter()
codes = [country.country_code for country in qs]
#print(codes[86:])
for code in codes[86:]:# start from 7 cause previous already filled(delete this)
offset= 0
run = True
while(run):
url = 'https://distribution-xml.booking.com/json/bookings.getCities?countrycodes=%s&rows=%s&offset=%s&lanuagecodes=ru,en'%(code ,ROWS, offset)
request = urllib2.Request(url)
base64string = base64.encodestring('%s:%s' % (self.b_username, self.b_password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
continue
#raise CommandError('request failed. code error: %s'%code)
except urllib2.URLError, e:
continue
#raise CommandError('request failed. code error: %s'%code)
if response:
try:
json_list = response.read()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n'%str(e))
continue
else:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: bad request\n')
continue
try:
cities = json.loads(json_list)
except:
continue
for city in cities:
if isinstance(city, dict):
self.fill_city(city)
print('city: %s, country: %s, language: %s'%(city.get('name'), city.get('countrycode'), city.get('languagecode')))
if len(cities) < ROWS:
run = False
else:
offset += ROWS

@ -1,129 +0,0 @@
from django.core.management.base import BaseCommand, CommandError
import urllib2, base64, json
from country.models import Country
from city.models import City
from functions.form_check import translit_with_separator
import string, random
def random_url():
salt = 'randomurl-'
r = ''.join(random.choice(string.ascii_lowercase) for _ in range(8))
return salt+r
class Command(BaseCommand):
# booking data
b_username = 'expomap'
b_password = '33xp00m33p'
def fill_city(self, d):
lang = d['languagecode']
id = d['city_id']
country_code = d['countrycode']
name = d['name']
country = Country.objects.filter(country_code=country_code)[0]
try:
city = City.objects.get(id=id)
except City.DoesNotExist:
try:
url = translit_with_separator(name)+'-%s'%country_code
except:
url = random_url()
city = City(country=country, id=id, url=url)
city.translate(lang)
city.name = name
try:
city.save()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
try:
url = translit_with_separator(name)+'-%s'%country_code
except:
url = random_url()
city.url = url
try:
city.save()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
try:
tr = City._meta.translations_model.objects.get(language_code=lang,master__id=getattr(city, 'id'))
except:
city.translate(lang)
city.name = name
try:
city.save()
return
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n city: %s\n'%(str(e), str(d)))
return
tr.name = name
tr.save()
return
def handle(self, *args, **options):
ROWS = 1000
qs = Country.objects.filter()
codes = [country.country_code for country in qs]
#print(sorted(codes, reverse=True))
for code in sorted(codes, reverse=True):
offset= 0
run = True
while(run):
url = 'https://distribution-xml.booking.com/json/bookings.getCities?countrycodes=%s&rows=%s&offset=%s&lanuagecodes=ru,en'%(code ,ROWS, offset)
request = urllib2.Request(url)
base64string = base64.encodestring('%s:%s' % (self.b_username, self.b_password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
continue
#raise CommandError('request failed. code error: %s'%code)
except urllib2.URLError, e:
continue
#raise CommandError('request failed. code error: %s'%code)
if response:
try:
json_list = response.read()
except Exception, e:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: %s\n'%str(e))
continue
else:
with open('/home/kotzilla/Documents/qwer/proj/city/management/commands/errors.txt', 'a') as f:
f.write('error: bad request\n')
continue
try:
cities = json.loads(json_list)
except:
continue
for city in cities:
if isinstance(city, dict):
self.fill_city(city)
print('city: %s, country: %s, language: %s'%(city.get('name'), city.get('countrycode'), city.get('languagecode')))
if len(cities) < ROWS:
run = False
else:
offset += ROWS

@ -1,12 +1,18 @@
from haystack import indexes from haystack import indexes
from models import City from models import City
"""
class CityIndex(indexes.SearchIndex, indexes.Indexable): class CityIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True) text = indexes.CharField(document=True, use_template=True)
name = indexes.CharField(model_attr='name') translations = indexes.MultiValueField()
#name = indexes.CharField(model_attr='translations__name')
def prepare_translations(self, obj):
return [tr.name for tr in obj.translations.all()]
def get_model(self): def get_model(self):
return City return City
def index_queryset(self, using=None): def index_queryset(self, using=None):
return self.get_model().objects.all() return self.get_model().objects.filter()
"""

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from django import forms
from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference
from django.utils.translation import ugettext_lazy as _
from haystack.query import SearchQuerySet, EmptySearchQuerySet
class PlaceSearchForm(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
def search(self):
q = self.cleaned_data.get('q')
w = self.cleaned_data.get('w')
if not q and not w:
return EmptySearchQuerySet()
sqs = SearchQuerySet().models(PlaceExposition, PlaceConference)
if q:
sqs = sqs.auto_query(q)
if w:
sqs = sqs.filter(where__contains=w)
return sqs

@ -1,15 +1,43 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from country.models import Country from country.models import Country
from city.models import City from city.models import City
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
from place_conference.models import PlaceConference from place_conference.models import PlaceConference
from django.views.generic import ListView from django.views.generic import ListView, FormView
from functions.views_help import split_params from functions.views_help import split_params
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.http import HttpResponse
from forms import PlaceSearchForm
class PlaceSearchView(ListView):
paginate_by = 2
template_name = 'place/search.html'
model = PlaceExposition
search_form = PlaceSearchForm
def get_queryset(self):
if self.request.GET:
form = self.search_form(self.request.GET)
if form.is_valid():
return form.search()
else:
return []
else:
return []
def get_context_data(self, **kwargs):
context = super(PlaceSearchView, self).get_context_data(**kwargs)
context['search_form'] = PlaceSearchForm(self.request.GET)
queries = self.request.GET.copy()
if queries.has_key('page'):
del queries['page']
context['queries'] = queries
context['search_action'] = '/places/search/'
return context
class PlaceListView(ListView): class PlaceListView(ListView):
@ -18,6 +46,7 @@ class PlaceListView(ListView):
single_page = False single_page = False
template_name = 'place_catalog_test.html' template_name = 'place_catalog_test.html'
model = 'places' model = 'places'
search_form = PlaceSearchForm
def get_params(self): def get_params(self):
model_names = {'places': _(u'Места')} model_names = {'places': _(u'Места')}
@ -77,6 +106,8 @@ class PlaceListView(ListView):
context = super(PlaceListView, self).get_context_data(**kwargs) context = super(PlaceListView, self).get_context_data(**kwargs)
context['filter'] = self.params context['filter'] = self.params
context['single_page'] = self.single_page context['single_page'] = self.single_page
context['search_form'] = self.search_form
context['search_action'] = '/places/search/'
return context return context
class PlacePhotoView(PlaceListView): class PlacePhotoView(PlaceListView):

@ -3,6 +3,8 @@ from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from theme.models import Theme from theme.models import Theme
from haystack.query import SearchQuerySet
class AdminSearchForm(forms.Form): class AdminSearchForm(forms.Form):
search_name = forms.CharField(required=False, max_length=50) search_name = forms.CharField(required=False, max_length=50)
@ -16,3 +18,38 @@ class ThemeSearch(forms.Form):
widget=forms.CheckboxSelectMultiple) widget=forms.CheckboxSelectMultiple)
class AbstractSearch(forms.Form):
q = forms.CharField(label=_(u'Поиск'), required=False)
w = forms.CharField(label=_(u'Где'), required=False)
model = None
def search(self):
if not self.is_valid():
return []
q = self.cleaned_data.get('q')
w = self.cleaned_data.get('w')
if not q and not w:
return []
sqs = SearchQuerySet().models(self.model)
if q:
sqs = sqs.auto_query(q)
if w:
sqs = sqs.filter(where__contains=w)
return sqs
#sqs = SearchQuerySet().models(self.model).auto_query(self.cleaned_data.get('q'))
#return sqs
from place_exposition.models import PlaceExposition
from place_exposition.models import EXPOSITION_TYPE
class SearchPlaceExpositionForm(AbstractSearch):
model = PlaceExposition
type = forms.ChoiceField(choices=EXPOSITION_TYPE, required=False)

@ -8,7 +8,7 @@ from hvad.utils import get_translation_aware_manager
def get_bool(value): def get_bool(value):
if value: if value:
return 1 return 1
return 0 return ''
def get_int(value): def get_int(value):
if not value: if not value:
@ -46,17 +46,56 @@ def get_tag(tag, theme):
result += '['+','.join(tag_list)+']' result += '['+','.join(tag_list)+']'
return result return result
from place_exposition.models import EXPOSITION_TYPE
def get_place_type(): def get_place_type(value):
pass for t in EXPOSITION_TYPE:
if value == t[0]:
return t[1]
return t[0][1]
place_settings=[
{'name': 'id', 'verbose_name': u'id', 'type': get_int, 'width':1500},
{'name': 'name', 'verbose_name': u'Название', 'type': unicode},
{'name': 'type', 'verbose_name': u'Тип', 'type': get_place_type},##########
{'name': 'main_title', 'verbose_name': u'Краткое описание', 'type': unicode},
{'name': 'country', 'verbose_name': u'Страна', 'type': unicode},
{'name': 'city', 'verbose_name': u'Город', 'type': unicode},
{'name': 'address', 'verbose_name': u'Адресс', 'type': unicode},
{'name': 'phone', 'verbose_name': u'Тел.', 'type': get_int},
{'name': 'fax', 'verbose_name': u'Факс', 'type': get_int},
{'name': 'web_page', 'verbose_name': u'Веб-сайт', 'type': unicode},
{'name': 'email', 'verbose_name': u'Email', 'type': unicode},
{'name': 'virtual_tour', 'verbose_name': u'Виртуальный тур', 'type': unicode},
{'name': 'virtual_tour', 'verbose_name': u'Виртуальный тур', 'type': unicode},
{'name': 'foundation_year', 'verbose_name': u'Год основания', 'type': get_int},
{'name': 'event_in_year', 'verbose_name': u'Количество мероприятий в год', 'type': get_int},
{'name': 'total_area', 'verbose_name': u'Общая выставочная площадь, кв. м.', 'type': get_int},
{'name': 'closed_area', 'verbose_name': u'Закрытая выставочная площадь, кв. м.', 'type': get_int},
{'name': 'open_area', 'verbose_name': u'Открытая выставочная площадь, кв. м.', 'type': get_int},
{'name': 'total_pavilions', 'verbose_name': u'Количество павильонов', 'type': get_int},
{'name': 'total_halls', 'verbose_name': u'Конференц-залы', 'type': get_int},
{'name': 'bank', 'verbose_name': u'Банк/Банкоматы/Обмен валюты', 'type': get_bool},
{'name': 'children_room', 'verbose_name': u'Детская комната', 'type': get_bool},
{'name': 'disabled_service', 'verbose_name': u'Сервис для людей с ограниченными физическими возможностями', 'type': get_bool},
{'name': 'conference_centre', 'verbose_name': u'Конгресс-центр', 'type': get_bool},
{'name': 'business_centre', 'verbose_name': u'Бизнес-центр', 'type': get_bool},
{'name': 'online_registration', 'verbose_name': u'On-line регистрация', 'type': get_bool},
{'name': 'wifi', 'verbose_name': u'Wi-Fi', 'type': get_bool},
{'name': 'cafe', 'verbose_name': u'Кафе и рестораны', 'type': get_bool},
{'name': 'terminals', 'verbose_name': u'Информационные терминалы', 'type': get_bool},
{'name': 'parking', 'verbose_name': u'Парковка', 'type': get_bool},
{'name': 'press_centre', 'verbose_name': u'Пресс-центр', 'type': get_bool},
{'name': 'mobile_application', 'verbose_name': u'Мобильное приложение', 'type': get_bool},
]
field_settings = [ field_settings = [
{'name': 'id', 'verbose_name': u'id', 'type': get_int, 'width':1500}, {'name': 'id', 'verbose_name': u'id', 'type': get_int, 'width':1500},
{'name': 'url', 'verbose_name': u'url', 'type': unicode}, {'name': 'url', 'verbose_name': u'url', 'type': unicode},
{'name': 'name', 'verbose_name': u'Имя', 'type': unicode}, {'name': 'name', 'verbose_name': u'Название', 'type': unicode},
{'name': 'type', 'verbose_name': u'Тип', 'type': get_place_type, 'width':8000}, #{'name': 'type', 'verbose_name': u'Тип', 'type': get_place_type, 'width':8000},
{'name': 'data_begin', 'verbose_name': u'Дата начала', 'type': unicode}, {'name': 'data_begin', 'verbose_name': u'Дата начала', 'type': unicode},
{'name': 'data_end', 'verbose_name': u'Дата окончания', 'type': unicode}, {'name': 'data_end', 'verbose_name': u'Дата окончания', 'type': unicode},
{'name': 'audience', 'verbose_name': u'Аудитория', 'type': get_audience}, {'name': 'audience', 'verbose_name': u'Аудитория', 'type': get_audience},

@ -100,8 +100,39 @@ class ExportTagForm(ExportForm):
def get_fname(self): def get_fname(self):
return 'tags.xls' return 'tags.xls'
from excel_settings import place_settings
class ExportPlaceExpositionForm(ExportForm): class ExportPlaceExpositionForm(ExportForm):
model = PlaceExposition model = PlaceExposition
def export(self):
data = self.cleaned_data
objects = self.get_objects(data)
if not objects:
# not found any objects
return None
for row, object in enumerate(objects):
# column number
col = 0
for field in place_settings:
try:
value = getattr(object, field['name'])
except AttributeError:
# doesnt have such field. exit from iteration
continue
if row == 0:
# first iteration. set names. set columns width
self.worksheet.write(0, col, field.get('verbose_name', 'default'), self.style)
#self.worksheet.write(1, col, field.get('name'), self.style)
self.worksheet.col(col).width = field.get('width', 3333)
if field['name']=='tag':
self.worksheet.write(row+1, col, field.get('type')(value, object.theme))
else:
self.worksheet.write(row+1, col, field.get('type')(value))
col += 1
return self.workbook
def get_fname(self): def get_fname(self):
return 'places.xls' return 'places.xls'

@ -89,6 +89,11 @@ class PlaceExposition(TranslatableModel):
class Meta: class Meta:
ordering = ['translations__name'] ordering = ['translations__name']
def get_index_text(self):
names = [tr.name for tr in self.translations.all()]
return names
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk)) return self.lazy_translation_getter('name', unicode(self.pk))
@ -116,9 +121,7 @@ class PlaceExposition(TranslatableModel):
def get_scheme(self): def get_scheme(self):
scheme = self.files.filter(purpose='scheme teritory') scheme = self.files.filter(purpose='scheme teritory')
return scheme return scheme
if scheme:
return scheme[0]
return scheme
def events(self): def events(self):
events = Exposition.objects.filter(place=self)[:6] events = Exposition.objects.filter(place=self)[:6]

@ -0,0 +1,31 @@
from haystack import indexes
from models import PlaceExposition
from django.conf import settings
class PlaceExpositionIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
where = indexes.MultiValueField()
def prepare_where(self, obj):
country = [tr.name for tr in obj.country.translations.all()]
city = [tr.name for tr in obj.city.translations.all()]
return country + city
"""
translations = indexes.MultiValueField()
def prepare_translations(self, obj):
return [tr.name for tr in obj.translations.all()]
"""
def get_model(self):
return PlaceExposition
def index_queryset(self, using=None):
return self.get_model().objects.filter()

@ -2,6 +2,7 @@
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse from django.http import HttpResponseRedirect, HttpResponse
from django.template import RequestContext from django.template import RequestContext
from django.core.context_processors import csrf
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
#models #models
@ -31,4 +32,4 @@ def place(request, url, photo=None):
if photo: if photo:
args['object'] = place args['object'] = place
return render_to_response('photoreport.html', args, context_instance=RequestContext(request)) return render_to_response('photoreport.html', args, context_instance=RequestContext(request))
return render_to_response('place.html', args, context_instance=RequestContext(request)) return render_to_response('place.html', args, context_instance=RequestContext(request))

@ -2,7 +2,7 @@
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from views import AdvertisingView from views import AdvertisingView
from core.views import PlaceListView, PlacePhotoView from core.views import PlaceListView, PlacePhotoView, PlaceSearchView
from views import MainPageView from views import MainPageView
@ -22,6 +22,7 @@ urlpatterns = patterns('',
url(r'^messages/', include('django_messages.urls')), url(r'^messages/', include('django_messages.urls')),
url(r'^advertising/$', AdvertisingView.as_view()), url(r'^advertising/$', AdvertisingView.as_view()),
url(r'^places/search/$', PlaceSearchView.as_view()),
url(r'^places/(?P<params>.*)/photo/$', PlacePhotoView.as_view()), url(r'^places/(?P<params>.*)/photo/$', PlacePhotoView.as_view()),
url(r'^places/(?P<params>.*)/(?P<page>\d+)/$', PlaceListView.as_view()), url(r'^places/(?P<params>.*)/(?P<page>\d+)/$', PlaceListView.as_view()),
url(r'^places/(?P<page>\d+)/$', PlaceListView.as_view()), url(r'^places/(?P<page>\d+)/$', PlaceListView.as_view()),

@ -150,6 +150,8 @@
<field name="first_name" type="text_en" indexed="true" stored="true" multiValued="false" /> <field name="first_name" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="last_name" type="text_en" indexed="true" stored="true" multiValued="false" />
</fields> </fields>
<!-- field to use to determine and enforce document uniqueness. --> <!-- field to use to determine and enforce document uniqueness. -->

@ -52,7 +52,10 @@
</aside> </aside>
<div class="mcl"> <div class="mcl">
{% include 'client/includes/catalog_search.html' %}
{% with search_form=search_form search_action=search_action%}
{% include 'client/includes/catalog_search.html' %}
{% endwith %}
{% block bread_scrumbs %} {% block bread_scrumbs %}
{% with filter=filter %} {% with filter=filter %}

@ -2,31 +2,31 @@
{% load i18n %} {% load i18n %}
<div class="in-search-form"> <div class="in-search-form">
<form action="#"> <form action="{{ search_action }}">
<div class="s-title">{% trans 'поиск событий' %}</div> <div class="s-title">{% trans 'поиск событий' %}</div>
<div class="search-form-wrap"> <div class="search-form-wrap">
<div class="search-line"> <div class="search-line">
<div class="sf-field-wrap"> <div class="sf-field-wrap">
<div class="sf-field"> <div class="sf-field">
<label for="search">{% trans 'Я ищу:' %}</label> <label for="search">{% trans 'Я ищу:' %}</label>
<div class="input-text"><input type="text" class="autocomplete" id="search" name="query" /></div> <div class="input-text">{{ search_form.q }}</div>
</div> </div>
</div> </div>
<div class="sf-field-wrap"> <div class="sf-field-wrap">
<div class="sf-field"> <div class="sf-field">
<label for="where">{% trans 'Где:' %}</label> <label for="where">{% trans 'Где:' %}</label>
<div class="input-text"><input type="text" class="autocomplete" id="where" name="where" /></div> <div class="input-text">{{ search_form.w }}</div>
</div> </div>
</div> </div>
<div class="sf-field-wrap"> <div class="sf-field-wrap">
<button type="submit"><span>{% trans 'найти' %}</span></button> <button type="submit"><span>{% trans 'найти' %}</span></button>
</div> </div>
</div> </div>
<div class="search-line sl-options"> <div class="search-line sl-options">
<div class="sf-field-wrap">{% trans 'Тематика: ' %}<a class="pw-open" href="#pw-subj">Не важно</a></div> <div class="sf-field-wrap">{% trans 'Тематика: ' %}<a class="pw-open" href="#pw-subj">Не важно</a></div>
<div class="sf-field-wrap">{% trans 'Место: ' %}<a class="pw-open" href="#pw-place">Не важно</a></div> <div class="sf-field-wrap">{% trans 'Место: ' %}<a class="pw-open" href="#pw-place">Не важно</a></div>
<div class="sf-field-wrap">{% trans 'Период: ' %}<a class="pw-open" href="#pw-period">Не важно</a></div> <div class="sf-field-wrap">{% trans 'Период: ' %}<a class="pw-open" href="#pw-period">Не важно</a></div>
</div> </div>
</div> </div>
</form> </form>
</div> </div>

@ -0,0 +1,59 @@
{% load static %}
{% load i18n %}
{% load template_filters %}
<ul class="cat-list cl-places">
{% for result in query %}
<li class="cl-item">
<div class="cl-item-wrap clearfix">
<a href="/{{ result.object.get_permanent_url }}">
<div class="cli-pict">
{% with obj=result.object %}
{% include 'client/includes/show_logo.html' %}
{% endwith %}
</div>
</a>
<div class="cli-info">
<div class="cli-top clearfix">
<div class="cli-approved">
{% if result.object.approved %}
<img src="{% static 'clint/img/approved-logo.png' %}" alt="" title="Approved Event" />
{% endif %}
</div>
<header>
<div class="cli-title"><a href="{{ result.object.get_permanent_url }}">
{{ result.object.name|safe }}</a></div>
</header>
<div class="cli-descr">{{ result.object.get_type }}</div>
</div>
<div class="cli-bot clearfix">
{% if result.object.total_area %}
<div class="cli-dim">{{ result.object.total_area }} м2</div>
{% endif %}
<div class="cli-place"><a href="#">{{ result.object.country }}</a>, <a href="#">{{ result.object.city }}</a>, <a href="{{ result.object.get_permanent_url }}">{{ result.object.adress }}</a></div>
</div>
</div>
<div class="cli-buttons clearfix">
<div class="cli-m-buttons">
<a class="button icon-info" href="{{ result.object.get_permanent_url }}">{% trans 'описание' %}</a>
{% if result.object.get_events_number %}
<a class="button green icon-list" href="#">{% trans 'события' %} ({{ result.object.get_events_number }})</a>
{% endif %}
{% if result.object.get_photos %}
<a class="button blue icon-photo" href="{{ result.object.get_permanent_url }}/photo/">{% trans 'фото' %}</a>
{% endif %}
</div>
<!--
<div class="cli-s-buttons">
<a class="button blue2 lc" href="#">{% trans 'Найти отели поблизости' %}</a>
</div>
-->
</div>
</div>
</li>
{% endfor %}
</ul>

@ -0,0 +1,70 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% load template_filters %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<a href="/places/">{% trans 'Места' %}</a>
<strong>{% trans 'Поиск' %}</strong>
</div>
{% endblock %}
{% block page_title %}
<div class="page-title">
<h1>{% trans 'Поиск' %}:</h1>
</div>
{% endblock %}
{% block content_list %}
{% with query=object_list %}
{% include 'includes/place/search_result.html' %}
{% endwith %}
{% endblock %}
{% block paginator %}
{% if page_obj.paginator.num_pages > 1 %}
<div class="pagination clearfix">
<div class="pg-info"> Показано {{ page_obj.start_index }} - {{ page_obj.end_index }} <i>(всего {{ page_obj.paginator.count }} позиций)</i></div>
<div class="pg-body">
{% if page_obj.has_previous %}
<a class="pg-prev" href="?page={{ page_obj.previous_page_number }}&{{ queries.urlencode }}">Предыдущая</a>
{% else %}
<a class="pg-prev disabled" href="#">Предыдущая</a>
{% endif %}
<ul>
{% if page_obj.number > 2 %}
<li><a href="?page={{ 1 }}&{{ queries.urlencode }} ">{{ 1 }}</a></li>
{% if page_obj.number > 3 %}
<li>...</li>
{% endif %}
{% endif %}
{% if page_obj.has_previous %}
<li><a href="?page={{ page_obj.previous_page_number }}&{{ queries.urlencode }}">{{ page_obj.previous_page_number }}</a></li>
{% endif %}
<li><b>{{ page_obj.number }}</b></li>
{% if page_obj.has_next %}
<li><a href="?page={{ page_obj.next_page_number }}&{{ queries.urlencode }}">{{ page_obj.next_page_number }}</a></li>
{% endif %}
{% if page_obj.paginator.num_pages|subtract:page_obj.number > 1 %}
{% if page_obj.paginator.num_pages|subtract:page_obj.number > 2 %}
<li>...</li>
{% endif %}
<li><a href="?page={{ page_obj.paginator.num_pages }}&{{ queries.urlencode }}">{{ page_obj.paginator.num_pages }}</a></li>
{% endif %}
</ul>
{% if page_obj.has_next %}
<a class="pg-next" href="?page={{ page_obj.next_page_number }}&{{ queries.urlencode }}">Следующая</a>
{% else %}
<a class="pg-next disabled" href="#">Следующая</a>
{% endif %}
</div>
</div>
{% endif %}
{% endblock %}

@ -0,0 +1,3 @@
{{ object.first_name }}
{{ object.last_name }}
{{ object.email }}

@ -0,0 +1,4 @@
{% for text in object.get_index_text %}
{{ text }}
{% endfor %}
Loading…
Cancel
Save