merged from develop

remotes/origin/1203
Nazar Kotjuk 10 years ago
commit f8d7af905f
  1. 3
      accounts/views.py
  2. 2
      article/models.py
  3. 3
      article/views.py
  4. 3
      company/views.py
  5. 3
      conference/forms.py
  6. 3
      conference/views.py
  7. 3
      core/utils.py
  8. 72
      core/views.py
  9. 37
      expobanner/admin.py
  10. 6
      exposition/forms.py
  11. 3
      exposition/views.py
  12. 20
      functions/custom_views.py
  13. 19
      functions/overrides.py
  14. 2
      photologue/views.py
  15. 3
      place_exposition/views.py
  16. 12
      proj/settings.py
  17. 16
      specialist_catalog/admin_urls.py
  18. 2
      specialist_catalog/forms.py
  19. 3
      specialist_catalog/models.py
  20. 18
      specialist_catalog/urls.py
  21. 61
      specialist_catalog/views.py
  22. 31
      templates/admin/expobanner/banner_stat.html
  23. 36
      templates/admin/expobanner/main_stat.html
  24. 31
      templates/admin/expobanner/paid_stat.html
  25. 35
      templates/admin/specialist/catalog_all.html
  26. 10
      templates/admin/specialist/catalog_new.html
  27. 7
      templates/client/accounts/calendar.html
  28. 6
      templates/client/blank.html
  29. 2
      templates/client/exposition/exposition_detail.html
  30. 2
      templates/client/includes/article/news_on_main_logo.html
  31. 28
      templates/client/includes/conference/default_description.html
  32. 54
      templates/client/includes/exposition/default_description.html
  33. 3
      translator/views.py

@ -8,7 +8,8 @@ from django.contrib.auth.decorators import login_required
from django.utils.translation import ugettext as _, get_language from django.utils.translation import ugettext as _, get_language
from django.utils import timezone from django.utils import timezone
from django_messages.forms import SendForm from django_messages.forms import SendForm
from django.views.generic import TemplateView, FormView, ListView from django.views.generic import TemplateView, FormView
from functions.custom_views import ListView
from sorl.thumbnail import get_thumbnail from sorl.thumbnail import get_thumbnail
from .forms import ChangePasswordForm, EmailAnnouncementForm, FeedFilterForm from .forms import ChangePasswordForm, EmailAnnouncementForm, FeedFilterForm
from company.forms import CreateCompanyForm from company.forms import CreateCompanyForm

@ -45,7 +45,7 @@ class ArticleManager(TranslationManager):
if cached_news: if cached_news:
return cached_news return cached_news
else: else:
news = list(self.news().filter(publish_date__isnull=False).order_by('-main_page', '-publish_date')[:3]) news = list(self.news().filter(publish_date__isnull=False).order_by('-main_page', '-publish_date', '-modified')[:3])
cache.set(key, news, self.cache_time) cache.set(key, news, self.cache_time)
return news return news

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json import json
from django.views.generic import DetailView, ListView from django.views.generic import DetailView
from functions.custom_views import ListView
from django.http import HttpResponse from django.http import HttpResponse
from models import Article from models import Article
from forms import ArticleFilterForm from forms import ArticleFilterForm

@ -2,7 +2,8 @@
import json import json
from django.http import HttpResponse from django.http import HttpResponse
from django.conf import settings from django.conf import settings
from django.views.generic import ListView, DetailView from django.views.generic import DetailView
from functions.custom_views import ListView
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext as _, get_language from django.utils.translation import ugettext as _, get_language
from haystack.query import EmptySearchQuerySet from haystack.query import EmptySearchQuerySet

@ -132,7 +132,8 @@ class ConferenceCreateForm(forms.Form):
else: else:
conference = obj conference = obj
conference.theme.clear() conference.theme.clear()
conference.tag.clear() if data.get('tag'):
conference.tag.clear()
#simple fields #simple fields
if not getattr(conference, 'url'): if not getattr(conference, 'url'):

@ -6,7 +6,8 @@ from django.http import HttpResponse, Http404, HttpResponseRedirect, HttpRespons
from django.contrib import messages from django.contrib import messages
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.views.generic import ListView, DetailView from django.views.generic import DetailView
from functions.custom_views import ListView
from django.views.generic.edit import FormMixin from django.views.generic.edit import FormMixin
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.utils import translation from django.utils import translation

@ -6,6 +6,7 @@ http://www.simplistix.co.uk/presentations/python-excel.pdf
""" """
import xlwt import xlwt
import datetime import datetime
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
HEADER_STYLE = xlwt.easyxf('font: bold on') HEADER_STYLE = xlwt.easyxf('font: bold on')
@ -82,7 +83,7 @@ def queryset_to_workbook(queryset, columns, report_date = None):
sheet.write_merge(0, 6, 0, 6, u'Мой календарь собитий на %s года' % report_date.strftime("%B %Y"), main_style) sheet.write_merge(0, 6, 0, 6, u'Мой календарь собитий на %s года' % report_date.strftime("%B %Y"), main_style)
for i in range(7): for i in range(7):
sheet.row(i).set_style(xlwt.Style.easyxf('font:height 300;')) sheet.row(i).set_style(xlwt.Style.easyxf('font:height 300;'))
sheet.insert_bitmap('/home/www/proj/media/logo.bmp', row=0, col=5, x=0, y=0, scale_x=0.3, scale_y=2) sheet.insert_bitmap(settings.MEDIA_ROOT + 'logo.bmp', row=0, col=5, x=0, y=0, scale_x=0.3, scale_y=2)
# drawing headers # drawing headers
header_list = [u'#', u'Название события',u'Даты',u'Краткое описание',u'Место проведения', u'Заметка', u'Ссылка на событие'] header_list = [u'#', u'Название события',u'Даты',u'Краткое описание',u'Место проведения', u'Заметка', u'Ссылка на событие']

@ -3,7 +3,8 @@ 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, CreateView, DeleteView, UpdateView, DetailView from django.views.generic import CreateView, DeleteView, UpdateView, DetailView
from functions.custom_views import ListView
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
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 _
@ -265,36 +266,39 @@ from django.core.urlresolvers import reverse
def download_workbook(request): def download_workbook(request):
lang = get_language() lang = get_language()
data = request.GET data = request.GET
qs = [] if data:
for i,obj in enumerate(data): qs = []
if data.get('data[%i][name]'%i) == 'expo': for i,obj in enumerate(data):
qs.append(Exposition.objects.language(lang).get(id=data['data[%i][value]'%i])) if data.get('data[%i][name]'%i) == 'expo':
elif data.get('data[%i][name]'%i) == 'conf': qs.append(Exposition.objects.language(lang).get(id=data['data[%i][value]'%i]))
qs.append(Conference.objects.language(lang).get(id=data['data[%i][value]'%i])) elif data.get('data[%i][name]'%i) == 'conf':
qs.append(Conference.objects.language(lang).get(id=data['data[%i][value]'%i]))
earliest_event = qs[0].data_begin
for i, obj in enumerate(qs, start=1): earliest_event = qs[0].data_begin
if obj.data_begin < earliest_event: for i, obj in enumerate(qs, start=1):
earliest_event = obj.data_begin if obj.data_begin < earliest_event:
setattr(obj, 'number', i) earliest_event = obj.data_begin
setattr(obj, 'dates', u'%s - %s'%(obj.data_begin.strftime('%d %B %Y'),obj.data_end.strftime('%d %B %Y'))) setattr(obj, 'number', i)
setattr(obj, 'full_place', u'%s, %s, %s' % (obj.country, obj.city, getattr(obj.place, 'name', ''))) setattr(obj, 'dates', u'%s - %s'%(obj.data_begin.strftime('%d %B %Y'),obj.data_end.strftime('%d %B %Y')))
try: setattr(obj, 'full_place', u'%s, %s, %s' % (obj.country, obj.city, getattr(obj.place, 'name', '')))
setattr(obj, 'link', u'http://www.expomap.ru%s)'%obj.get_absolute_url()) try:
except: setattr(obj, 'link', u'http://www.expomap.ru%s)'%obj.get_absolute_url())
setattr(obj, 'link', u'http://www.expomap.ru%s)'%obj.get_permanent_url()) except:
setattr(obj, 'link', u'http://www.expomap.ru%s)'%obj.get_permanent_url())
columns = (
'number', columns = (
'name', 'number',
'dates', 'name',
'main_title', 'dates',
'full_place', 'main_title',
'participation_note', 'full_place',
'link') 'participation_note',
'link')
workbook = queryset_to_workbook(qs, columns, earliest_event)
response = HttpResponse(content_type='application/vnd.ms-excel') workbook = queryset_to_workbook(qs, columns, earliest_event)
response['Content-Disposition'] = 'attachment; filename="My calendar.xls"' response = HttpResponse(content_type='application/vnd.ms-excel')
workbook.save(response) response['Content-Disposition'] = 'attachment; filename="My calendar.xls"'
return response workbook.save(response)
return response
else:
return HttpResponseRedirect(request.META.get('HTTP_REFERER'), "/profile/calendar/")

@ -110,6 +110,20 @@ class BannerStat(DetailView):
model = Banner model = Banner
template_name = 'admin/expobanner/banner_stat.html' template_name = 'admin/expobanner/banner_stat.html'
def get_context_data(self, **kwargs):
context = super(BannerStat, self).get_context_data(**kwargs)
obj = self.object
qs = obj.banner_stat.all()
date_from, date_to = self.request.GET.get('date_from'), self.request.GET.get('date_to')
if date_from:
date_from = datetime.strptime(date_from, "%d.%m.%Y")
qs = qs.filter(date__gt=date_from)
if date_to:
date_to = datetime.strptime(date_to, "%d.%m.%Y")
qs = qs.filter(date__lt=date_to)
context['stats'] = qs
return context
class PaidList(ListView): class PaidList(ListView):
model = Exposition model = Exposition
@ -177,9 +191,17 @@ class PaidStat(DetailView):
participation=Sum('participation_clicks'), participation=Sum('participation_clicks'),
catalog=Sum('catalog_clicks') catalog=Sum('catalog_clicks')
) )
qs = obj.paidstat_set.all()
date_from, date_to = self.request.GET.get('date_from'), self.request.GET.get('date_to')
if date_from:
date_from = datetime.strptime(date_from, "%d.%m.%Y")
qs = qs.filter(date__gt=date_from)
if date_to:
date_to = datetime.strptime(date_to, "%d.%m.%Y")
qs = qs.filter(date__lt=date_to)
context['stats'] = qs
return context return context
# ---------------------------------- # ----------------------------------
class MainList(ListView): class MainList(ListView):
model = Exposition model = Exposition
@ -222,7 +244,7 @@ def main_turn(request, pk, status):
main.save() main.save()
return HttpResponseRedirect('/admin/expobanners/main/list/') return HttpResponseRedirect('/admin/expobanners/main/list/')
from datetime import datetime
class MainStat(DetailView): class MainStat(DetailView):
model = MainPage model = MainPage
@ -231,13 +253,22 @@ class MainStat(DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(MainStat, self).get_context_data(**kwargs) context = super(MainStat, self).get_context_data(**kwargs)
obj = self.object obj = self.object
context['stats'] = obj.link.banner_stat.all()
context['all'] = obj.link.banner_stat.aggregate( context['all'] = obj.link.banner_stat.aggregate(
views=Sum('view'), views=Sum('view'),
clicks=Sum('click'), clicks=Sum('click'),
unique_clicks=Sum('unique_click'), unique_clicks=Sum('unique_click'),
unique_views=Sum('unique_view') unique_views=Sum('unique_view')
) )
qs = obj.link.banner_stat.all()
date_from, date_to = self.request.GET.get('date_from'), self.request.GET.get('date_to')
if date_from:
date_from = datetime.strptime(date_from, "%d.%m.%Y")
qs = qs.filter(date__gt=date_from)
if date_to:
date_to = datetime.strptime(date_to, "%d.%m.%Y")
qs = qs.filter(date__lt=date_to)
context['stats'] = qs
return context return context
# ------------------------------------ # ------------------------------------

@ -161,9 +161,11 @@ class ExpositionCreateForm(forms.Form):
else: else:
exposition = obj exposition = obj
exposition.theme.clear() exposition.theme.clear()
exposition.tag.clear()
exposition.organiser.clear() exposition.organiser.clear()
#exposition.company.clear() if data.get('tag'):
exposition.tag.clear()
#simple fields #simple fields
if not getattr(exposition, 'url'): if not getattr(exposition, 'url'):

@ -4,7 +4,8 @@ import datetime
from django.http import HttpResponseRedirect, HttpResponse, HttpResponsePermanentRedirect from django.http import HttpResponseRedirect, HttpResponse, HttpResponsePermanentRedirect
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.conf import settings from django.conf import settings
from django.views.generic import ListView, DetailView from django.views.generic import DetailView
from functions.custom_views import ListView
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.http import Http404 from django.http import Http404

@ -18,9 +18,23 @@ from hvad.utils import get_translation_aware_manager
#python #python
import random import random
from django.views.generic import ListView as OldListView
from country.models import Country class ListView(OldListView):
"""
List of modules, where overrided ListView is used:
- accounts.views
- article.views
- company.views
- conference.views
- core.views
- exposition.views
- photologue.views
- place_exposition.views
- specialist_catalog.views
- translator.views
"""
paginator_class = settings.DEFAULT_PAGINATOR
@login_required @login_required
def filtered_list(request, objects, template, item_per_page=settings.ADMIN_PAGINATION): def filtered_list(request, objects, template, item_per_page=settings.ADMIN_PAGINATION):
@ -186,7 +200,7 @@ def delete_object(request, Model, Form, url, prev_page,):
return render_to_response('delete.html', args) return render_to_response('delete.html', args)
#-----class------------------ #-----class------------------
from django.views.generic import ListView, DetailView from django.views.generic import DetailView
from functions.views_help import split_params from functions.views_help import split_params
from city.models import City from city.models import City

@ -0,0 +1,19 @@
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
class SeoPaginator(Paginator):
def validate_number(self, number):
"Validates the given 1-based page number."
try:
number = int(number)
except (TypeError, ValueError):
raise PageNotAnInteger('That page number is not an integer')
if number < 1:
raise EmptyPage('That page number is less than 1')
if number > self.num_pages:
if number == 1 and self.allow_empty_first_page:
pass
else:
number = 1
return number

@ -3,7 +3,7 @@ import warnings
from django.conf import settings from django.conf import settings
from django.views.generic.dates import ArchiveIndexView, DateDetailView, DayArchiveView, MonthArchiveView, YearArchiveView from django.views.generic.dates import ArchiveIndexView, DateDetailView, DayArchiveView, MonthArchiveView, YearArchiveView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.views.generic.list import ListView from functions.custom_views import ListView
from .models import Photo, Gallery from .models import Photo, Gallery
# Number of galleries to display per page. # Number of galleries to display per page.

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.views.generic import ListView, DetailView, FormView from django.views.generic import DetailView, FormView
from functions.custom_views import ListView
from django.utils import translation from django.utils import translation
from django.http import HttpResponseRedirect, HttpResponse from django.http import HttpResponseRedirect, HttpResponse
from django.template import RequestContext from django.template import RequestContext

@ -422,10 +422,14 @@ THUMBNAIL_DEBUG = DEBUG
CALLBACK_EMAIL = 'kotzilla@ukr.net' CALLBACK_EMAIL = 'kotzilla@ukr.net'
BOOKING_AID = '333667' BOOKING_AID = '333667'
try:
from functions.overrides import SeoPaginator as Paginator
except ImportError:
from django.core.paginator import Paginator
DEFAULT_PAGINATOR = Paginator
ADMIN_PAGINATION = 20 ADMIN_PAGINATION = 20
CLIENT_PAGINATION = 15 CLIENT_PAGINATION = 15
TEMPLATE_DEBUG = DEBUG TEMPLATE_DEBUG = DEBUG
NO_LOGO = '/static/client/img/no-logo.png' NO_LOGO = '/static/client/img/no-logo.png'
@ -504,4 +508,6 @@ if DEBUG:
# 'INTERCEPT_REDIRECTS': False, # 'INTERCEPT_REDIRECTS': False,
#} #}
""" """
# -- PAGINATION -- #

@ -5,16 +5,14 @@ from .views import *
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^specialist/new/$', SpecialistCreateView.as_view(), name='specialist_new'), url(r'^specialist/new/$', SpecialistCreateView.as_view(), name='specialist_new'),
url(r'^specialist/all/$', SpecialistListView.as_view(), name='specialist_all'), url(r'^specialist/all/$', SpecialistListView.as_view(), name='specialist_all'),
url(r'^specialist/edit/(?P<pk>\d{1,4})/$', SpecialistUpdateView.as_view(), name='specialist_edit'), url(r'^specialist/edit/(?P<pk>\d{1,6})/$', SpecialistUpdateView.as_view(), name='specialist_edit'),
url(r'^specialist/delete/(?P<pk>\d{1,4})/$', SpecialistDeleteView.as_view(), name='specialist_delete'), url(r'^specialist/delete/(?P<pk>\d{1,6})/$', SpecialistDeleteView.as_view(), name='specialist_delete'),
url(r'^catalog/new/$', CatalogCreateView.as_view(), name='catalog_new'), url(r'^catalog/new/$', CatalogCreateView.as_view(), name='catalog_new'),
url(r'^catalog/all/$', CatalogListView.as_view(), name='catalog_all'), url(r'^catalog/all/$', CatalogListView.as_view(), name='catalog_all'),
url(r'^catalog/city/$', CatalogCityView.as_view(), name='catalog_city'), url(r'^catalog/edit/(?P<pk>\d{1,6})/$', CatalogUpdateView.as_view(), name='catalog_edit'),
url(r'^catalog/country/$', CatalogCountryView.as_view(), name='catalog_country'), url(r'^catalog/delete/(?P<pk>\d{1,6})/$', CatalogDeleteView.as_view(), name='catalog_delete'),
url(r'^catalog/edit/(?P<pk>\d{1,4})/$', CatalogUpdateView.as_view(), name='catalog_edit'), url(r'^catalog/(?P<catalog_pk>\d{1,6})/add_feedback/$', FeedbackCreateView.as_view(), name='feedback_new'),
url(r'^catalog/delete/(?P<pk>\d{1,4})/$', CatalogDeleteView.as_view(), name='catalog_delete'),
url(r'^catalog/(?P<catalog_pk>\d{1,4})/add_feedback/$', FeedbackCreateView.as_view(), name='feedback_new'),
#url(r'^catalog/(?P<pk>\d{1,4})/feedbacks/$', FeedbackListView.as_view(), name='feedback_all'), #url(r'^catalog/(?P<pk>\d{1,4})/feedbacks/$', FeedbackListView.as_view(), name='feedback_all'),
url(r'^catalog/(?P<catalog_pk>\d{1,4})/feedback/(?P<id>\d{1,4})/$', FeedbackUpdateView.as_view(), name='feedback_edit'), url(r'^catalog/(?P<catalog_pk>\d{1,6})/feedback/(?P<id>\d{1,4})/$', FeedbackUpdateView.as_view(), name='feedback_edit'),
url(r'^feedback/delete/(?P<pk>\d{1,4})/$', FeedbackDeleteView.as_view(), name='feedback_delete'), url(r'^feedback/delete/(?P<pk>\d{1,6})/$', FeedbackDeleteView.as_view(), name='feedback_delete'),
) )

@ -22,7 +22,7 @@ class SpecialistCatalogForm(TranslatableModelForm):
class Meta: class Meta:
model = SpecialistCatalog model = SpecialistCatalog
fields = ['price', 'currency', 'logo_preview', 'main_descr', 'place_photo', fields = ['price', 'currency', 'logo', 'main_descr', 'place_photo',
'specialists', 'city', 'country', 'type', 'title', 'benefits', 'big_cities'] 'specialists', 'city', 'country', 'type', 'title', 'benefits', 'big_cities']
widgets = { widgets = {
'type': forms.Select(choices=(('1', 'Country'), ('2', 'City'))), 'type': forms.Select(choices=(('1', 'Country'), ('2', 'City'))),

@ -28,13 +28,14 @@ class Specialist(models.Model):
class SpecialistCatalog(TranslatableModel): class SpecialistCatalog(TranslatableModel):
price = models.IntegerField(verbose_name=u"Цена", default=200) price = models.IntegerField(verbose_name=u"Цена", default=200)
currency = models.CharField(max_length=255, verbose_name=u"Валюта", default=u"EUR") currency = models.CharField(max_length=255, verbose_name=u"Валюта", default=u"EUR")
logo_preview = models.ImageField(verbose_name=u"Логотип", blank=True, upload_to='specialist_catalog/logo_preview/') logo = models.ImageField(db_column= "logo_preview", verbose_name=u"Логотип", blank=True, upload_to='specialist_catalog/logo_preview/')
place_photo = models.ImageField(verbose_name=u"Фото для города", blank=True, upload_to='specialist_catalog/place_photo/') place_photo = models.ImageField(verbose_name=u"Фото для города", blank=True, upload_to='specialist_catalog/place_photo/')
specialists = models.ManyToManyField(Specialist, verbose_name=u"Специалисты", blank=True) specialists = models.ManyToManyField(Specialist, verbose_name=u"Специалисты", blank=True)
city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город", blank=True, null=True) city = models.ForeignKey(City, on_delete=models.PROTECT, verbose_name=u"Город", blank=True, null=True)
country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна", blank=False) country = models.ForeignKey(Country, on_delete=models.PROTECT, verbose_name=u"Страна", blank=False)
type = models.PositiveSmallIntegerField(verbose_name=u"Тип(Страна/Город)", default=2) type = models.PositiveSmallIntegerField(verbose_name=u"Тип(Страна/Город)", default=2)
objects = TranslationManager()
translations = TranslatedFields( translations = TranslatedFields(
title=models.CharField(max_length=255, verbose_name=u"Заголовок"), title=models.CharField(max_length=255, verbose_name=u"Заголовок"),

@ -1,11 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import url, patterns from django.conf.urls import url, patterns
from .views import CatalogDetailedView, SpecCatalog from .views import CatalogDetailedView, SpecCatalog, redirect_old
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^city/$', SpecCatalog.as_view(), {'type': 'city'}, name="spec_city"), url(r'^city/(?P<city>.*)/all/page/(?P<page>\d+)/$', redirect_old, {'type': 'city'}),
url(r'^country/$', SpecCatalog.as_view(), {'type': 'country'}, name="spec_country"), url(r'^city/(?P<city>.*)/all/$', redirect_old, {'type': 'city'}),
url(r'^city/$', SpecCatalog.as_view(), {'type': 'city', 'meta_id': 86}, name="spec_city"),
url(r'^city/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'city', 'meta_id': 88}, name="spec_catalog_city"),
url(r'^city/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'city'}, name="spec_catalog_city"), url(r'^country/(?P<country>.*)/all/page/(?P<page>\d+)/$', redirect_old),
url(r'^country/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'country'}, name="spec_catalog_country"), url(r'^country/(?P<country>.*)/all/$', redirect_old),
url(r'^country/$', SpecCatalog.as_view(), {'type': 'country', 'meta_id': 86}, name="spec_country"),
url(r'^country/(?P<slug>.*)/$', CatalogDetailedView.as_view(), {'type': 'country', 'meta_id': 87}, name="spec_catalog_country"),
url(r'^(?P<slug>.*)/$', redirect_old),
url(r'^page/(?P<page>\d+)/$', redirect_old),
url(r'^$', redirect_old),
) )

@ -1,16 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.views.generic import CreateView, UpdateView, DeleteView, ListView, FormView, DetailView from django.views.generic import CreateView, UpdateView, DeleteView, FormView, DetailView
from functions.custom_views import ListView
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from meta.views import MetadataMixin
from .forms import * from .forms import *
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
from django.conf import settings from django.conf import settings
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from service.order_forms import TranslationForm from service.order_forms import TranslationForm
from django.http import HttpResponseRedirect, Http404 from django.http import HttpResponseRedirect, Http404, HttpResponsePermanentRedirect
from .models import _city, _country from .models import _city, _country
# =========== ADMIN VIEWS =========== # =========== ADMIN VIEWS ===========
# Specialist views # Specialist views
@ -70,35 +74,24 @@ class CatalogCreateView(CreateView):
success_url = reverse_lazy("catalog_all") success_url = reverse_lazy("catalog_all")
class CatalogListView(ListView):
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_all.html'
paginate_by = settings.ADMIN_PAGINATION
class CatalogCityView(ListView):
model = SpecialistCatalog
template_name = 'admin/specialist/catalog_all.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self): class CatalogListView(ListView):
query = self.request.GET.get('query', None)
qs = self.model.objects.language().filter(type=2)
if query:
qs = qs.filter(title__icontains=query)
return qs
class CatalogCountryView(ListView):
model = SpecialistCatalog model = SpecialistCatalog
template_name = 'admin/specialist/catalog_all.html' template_name = 'admin/specialist/catalog_all.html'
paginate_by = settings.ADMIN_PAGINATION paginate_by = settings.ADMIN_PAGINATION
paginator_class = settings.DEFAULT_PAGINATOR
def get_queryset(self): def get_queryset(self):
query = self.request.GET.get('query', None) _GET = self.request.GET
qs = self.model.objects.language().filter(type=1) query, city, country, only_cntry = _GET.get('query'), _GET.get('city'), _GET.get('country'), _GET.get('only_countries')
qs = self.model.objects.language()
if only_cntry:
qs = qs.filter(type=1)
if query: if query:
qs = qs.filter(title__icontains=query) qs = qs.filter(title__icontains=query)
if city:
qs = qs.filter(city__translations__name__icontains=city)
if country:
qs = qs.filter(country__translations__name__icontains=country)
return qs return qs
@ -155,7 +148,7 @@ class FeedbackDeleteView(DeleteView):
# ========= CLIENT VIEWS ============ # ========= CLIENT VIEWS ============
class CatalogDetailedView(SingleObjectMixin, FormView): class CatalogDetailedView(MetadataMixin, SingleObjectMixin, FormView):
model = SpecialistCatalog model = SpecialistCatalog
form_class = TranslationForm form_class = TranslationForm
template_name = "client/specialist_catalog/catalog_detailed.html" template_name = "client/specialist_catalog/catalog_detailed.html"
@ -164,12 +157,16 @@ class CatalogDetailedView(SingleObjectMixin, FormView):
def get_catalog_obj(self): def get_catalog_obj(self):
if self.kwargs.get('type') is "country": if self.kwargs.get('type') is "country":
try: try:
return self.model.objects.language().get(type=1, country__url=self.kwargs.get('slug')) spec_catalog = self.model.objects.language().get(type=1, country__url=self.kwargs.get('slug'))
self.kwargs['country'] = spec_catalog.country
return spec_catalog
except self.model.DoesNotExist: except self.model.DoesNotExist:
raise Http404 raise Http404
else: else:
try: try:
return self.model.objects.language().get(type=2, city__url=self.kwargs.get('slug')) spec_catalog = self.model.objects.language().get(type=2, city__url=self.kwargs.get('slug'))
self.kwargs['city'] = spec_catalog.city
return spec_catalog
except self.model.DoesNotExist: except self.model.DoesNotExist:
raise Http404 raise Http404
@ -197,7 +194,7 @@ class CatalogDetailedView(SingleObjectMixin, FormView):
init['city'] = obj.city.name init['city'] = obj.city.name
return init return init
class SpecCatalog(ListView): class SpecCatalog(MetadataMixin, ListView):
model = SpecialistCatalog model = SpecialistCatalog
template_name = 'client/specialist_catalog/catalog.html' template_name = 'client/specialist_catalog/catalog.html'
@ -223,3 +220,11 @@ class SpecCatalog(ListView):
else: else:
context['title'] = _(u'Переводчики по городам') context['title'] = _(u'Переводчики по городам')
return context return context
def redirect_old(request, *args, **kwargs):
if not kwargs.get('type'):
return HttpResponsePermanentRedirect('/translators/country/')
else:
return HttpResponsePermanentRedirect('/translators/city/')

@ -1,5 +1,6 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load static %} {% load static %}
{% load i18n %}
{% block scripts %} {% block scripts %}
<script src="{% static 'js/jquery.dataTables.min.js' %}"></script> <script src="{% static 'js/jquery.dataTables.min.js' %}"></script>
{% endblock %} {% endblock %}
@ -12,6 +13,20 @@
<h2><i class="icon-align-justify"></i> {{ object }} (Пароль: {{ object.stat_pswd }})</h2> <h2><i class="icon-align-justify"></i> {{ object }} (Пароль: {{ object.stat_pswd }})</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
<!-- date filter -->
<div class="row-fluid">
<form class = "form-inline" method="get" >
<div class="form-group ">
<label class="control-label" for="id_date_from"> {% trans "с: " %}</label>
<input class="form-control" type="text" name="date_from" id="id_date_from">
<label for="id_date_to" >{% trans "по: " %}</label>
<input class="form-control" type="text" name="date_to" id="id_date_to" >
<button class="btn btn-primary" type="submit" >{% trans "Фильтровать" %}</button>
</div>
</form>
</div>
<!-- end date filter -->
<table class="table table-striped table-bordered bootstrap-datatable datatable"> <table class="table table-striped table-bordered bootstrap-datatable datatable">
<thead> <thead>
<tr> <tr>
@ -23,7 +38,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% with stats=object.banner_stat.all %} {% with stats=stats %}
{% for stat in stats %} {% for stat in stats %}
<tr> <tr>
<td>{{ stat.date|date:"Y-m-d" }}</td> <td>{{ stat.date|date:"Y-m-d" }}</td>
@ -39,5 +54,19 @@
</div> </div>
</div> </div>
</div> </div>
<script>
console.log("down");
$('#id_date_from').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
$('#id_date_to').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
console.log("1");
</script>
{% endblock %} {% endblock %}

@ -1,7 +1,14 @@
{% extends 'admin/base.html' %} {% extends 'admin/base.html' %}
{% load static %} {% load static %}
{% load i18n %}
{% block scripts %} {% block scripts %}
<script src="{% static 'js/jquery.dataTables.min.js' %}"></script> {# datetimepicker #}
<script type="text/javascript">
console.log("2");
</script>
<script src="{% static 'js/jquery.dataTables.min.js' %}"></script>
{% endblock %} {% endblock %}
@ -16,6 +23,19 @@
<div class="span8">Линк на статистику: <b>{{ request.get_host }}/expo-b/banner/{{ object.link.id }}/stat/</b></div> <div class="span8">Линк на статистику: <b>{{ request.get_host }}/expo-b/banner/{{ object.link.id }}/stat/</b></div>
<div class="span4">Пароль: <b>{{ object.link.stat_pswd }}</b></div> <div class="span4">Пароль: <b>{{ object.link.stat_pswd }}</b></div>
</div> </div>
<!-- date filter -->
<div class="row-fluid">
<form class = "form-inline" method="get" >
<div class="form-group ">
<label class="control-label" for="id_date_from"> {% trans "с: " %}</label>
<input class="form-control" type="text" name="date_from" id="id_date_from">
<label for="id_date_to" >{% trans "по: " %}</label>
<input class="form-control" type="text" name="date_to" id="id_date_to" >
<button class="btn btn-primary" type="submit" >{% trans "Фильтровать" %}</button>
</div>
</form>
</div>
<!-- end date filter -->
<table class="table table-striped table-bordered bootstrap-datatable datatable"> <table class="table table-striped table-bordered bootstrap-datatable datatable">
<thead> <thead>
<tr> <tr>
@ -52,5 +72,19 @@
</div> </div>
</div> </div>
</div> </div>
<script>
console.log("down");
$('#id_date_from').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
$('#id_date_to').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
console.log("1");
</script>
{% endblock %} {% endblock %}

@ -1,4 +1,5 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load i18n %}
{% load static %} {% load static %}
{% block scripts %} {% block scripts %}
<script src="{% static 'js/jquery.dataTables.min.js' %}"></script> <script src="{% static 'js/jquery.dataTables.min.js' %}"></script>
@ -16,6 +17,20 @@
<div class="span8">Линк на статистику: <b>{{ request.get_host }}/expo-b/paid/{{ object.id }}/stat/</b></div> <div class="span8">Линк на статистику: <b>{{ request.get_host }}/expo-b/paid/{{ object.id }}/stat/</b></div>
<div class="span4">Пароль: <b>{{ object.stat_pswd }}</b></div> <div class="span4">Пароль: <b>{{ object.stat_pswd }}</b></div>
</div> </div>
<!-- date filter -->
<div class="row-fluid">
<form class = "form-inline" method="get" >
<div class="form-group ">
<label class="control-label" for="id_date_from"> {% trans "с: " %}</label>
<input class="form-control" type="text" name="date_from" id="id_date_from">
<label for="id_date_to" >{% trans "по: " %}</label>
<input class="form-control" type="text" name="date_to" id="id_date_to" >
<button class="btn btn-primary" type="submit" >{% trans "Фильтровать" %}</button>
</div>
</form>
</div>
<!-- end date filter -->
<table class="table table-striped table-bordered bootstrap-datatable datatable"> <table class="table table-striped table-bordered bootstrap-datatable datatable">
<thead> <thead>
<tr> <tr>
@ -34,7 +49,7 @@
<td>{{ all.participation}}</td> <td>{{ all.participation}}</td>
<td>{{ all.catalog }}</td> <td>{{ all.catalog }}</td>
</tr> </tr>
{% with stats=object.paidstat_set.all %} {% with stats=stats %}
{% for stat in stats %} {% for stat in stats %}
<tr> <tr>
<td>{{ stat.date|date:"Y-m-d" }}</td> <td>{{ stat.date|date:"Y-m-d" }}</td>
@ -50,5 +65,19 @@
</div> </div>
</div> </div>
</div> </div>
<script>
console.log("down");
$('#id_date_from').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
$('#id_date_to').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
console.log("1");
</script>
{% endblock %} {% endblock %}

@ -1,5 +1,6 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load thumbnail %} {% load thumbnail %}
{% load i18n %}
{% block body %} {% block body %}
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
@ -7,24 +8,38 @@
</div> </div>
<div class="box-content"> <div class="box-content">
<form method="get"> <form method="get">
<input id="find" type ='text' name = 'query' placeholder="Введите запрос"> <input id="find" type ='text' name = 'query' placeholder={% trans "Заголовок" %}>
<button type="submit" class="btn">Найти</button> <input id="find_country" type ='text' name = 'country' placeholder={% trans "Страна" %}>
<input id="find_city" type ='text' name = 'city' placeholder={% trans "Город" %}>
<label for="only_country">{% trans "Только страны" %} <input class="checkbox" id="only_country" type ='checkbox' name = 'only_countries'></label>
<button type="submit" class="btn">{% trans "Найти" %}</button>
</form> </form>
</div> </div>
</div> </div>
<script>
var cbx = $("#only_country")[0];
var fnd = $("#find_city")[0];
cbx.onclick = function(){
if (cbx.checked == true){
fnd.disabled = true;
}
else{
fnd.disabled = false;
}
}
</script>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-arrow-down"></i>Все каталоги специалистов</h2> <h2><i class="icon-arrow-down"></i>{% trans "Все каталоги специалистов" %}</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th>Заголовок</th> <th>{% trans "Заголовок" %}</th>
<th>{% if request.path == "/admin/specialist_catalog/catalog/city/" %}Город{% elif request.path == "/admin/specialist_catalog/catalog/country/" %}Страна{% else %}Страна/Город{% endif %}</th> <th>{% trans 'Страна/Город' %}</th>
<th>Link</th> <th>Link</th>
<th>&nbsp;</th> <th>&nbsp;</th>
</tr> </tr>
@ -34,16 +49,16 @@
<tr> <tr>
<td>{{ item.title }}</td> <td>{{ item.title }}</td>
<td>{% if item.type == 1%}{{ item.country.name }}{% else %}{{ item.city.name }}{% endif %}</td> <td>{% if item.type == 1%}{{ item.country.name }}{% else %}{{ item.city.name }}{% endif %}</td>
<td><a href="{{ item.get_absolute_url }}" target="_blank">на сайте</a></td> <td><a href="{{ item.get_absolute_url }}" target="_blank">{% trans "на сайте" %}</a></td>
<td class="center sorting_1"> <td class="center sorting_1">
<a class="btn-small btn-info" href='{% url "catalog_edit" item.id %}'> <a class="btn-small btn-info" href='{% url "catalog_edit" item.id %}'>
Изменить {% trans "Изменить" %}
</a> </a>
</td> </td>
<td> <td>
<a class="btn-small btn-danger delete" href='{% url "catalog_delete" item.id %}'> <a class="btn-small btn-danger delete" href='{% url "catalog_delete" item.id %}'>
Удалить {% trans "Удалить" %}
</a> </a>
</td> </td>
</tr> </tr>
@ -51,7 +66,7 @@
</tbody> </tbody>
</table> </table>
<a class="btn btn-success" href='{% url "catalog_new" %}'> <a class="btn btn-success" href='{% url "catalog_new" %}'>
<i class="icon-plus-sign icon-white"></i> Добавить </a> <i class="icon-plus-sign icon-white"></i> {% trans "Добавить" %}</a>
</div> </div>
{% include 'admin/includes/admin_pagination.html' %} {% include 'admin/includes/admin_pagination.html' %}

@ -103,12 +103,12 @@
<span class="help-inline">{{ form.specialists.errors }}</span> <span class="help-inline">{{ form.specialists.errors }}</span>
</div> </div>
</div> </div>
{# logo_preview #} {# logo #}
<div class="control-group {% if form.logo_preview.errors %}error{% endif %}"> <div class="control-group {% if form.logo.errors %}error{% endif %}">
<label class="control-label">{{ form.logo_preview.label }}:</label> <label class="control-label">{{ form.logo.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.logo_preview }} <output id="list_logo"></output> {{ form.logo }} <output id="list_logo"></output>
<span class="help-inline">{{ form.logo_preview.errors }}</span> <span class="help-inline">{{ form.logo.errors }}</span>
</div> </div>
</div> </div>
{# place_photo #} {# place_photo #}

@ -65,7 +65,12 @@
} }
console.log(clear_list); console.log(clear_list);
var query = $.param({data:clear_list}); var query = $.param({data:clear_list});
window.location.href = "/profile/calendar/export/?" + query; if(clear_list.length > 0){
window.location.href = "/profile/calendar/export/?" + query;
}
else{
alert('{% trans "Не выбрано ни одного события!" %}')
}
}); });
}) })

@ -89,7 +89,11 @@ This template include basic anf main styles and js files,
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-P5C6GR');</script> })(window,document,'script','dataLayer','GTM-P5C6GR');</script>
<!-- End Google Tag Manager --> <!-- End Google Tag Manager -->
<style>
.text-indent-1-5em {
text-indent: 1.5em
}
</style>
</head> </head>

@ -1,4 +1,4 @@
{% extends 'base_catalog.html' %} {% extends 'client/base_catalog.html' %}
{% load i18n %} {% load i18n %}
{% load template_filters %} {% load template_filters %}

@ -2,7 +2,7 @@
{% load thumbnail %} {% load thumbnail %}
{% if obj.logo %} {% if obj.logo %}
{% thumbnail obj.logo "80x80" format="PNG" as im %} {% thumbnail obj.logo "70x70" format="PNG" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" class="pic" alt=""> <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" class="pic" alt="">
{% endthumbnail %} {% endthumbnail %}
{% else %} {% else %}

@ -1,21 +1,21 @@
{% load i18n %}
<div class="ied-text"> <div class="ied-text">
Конференция {{conf.name}} проходит {% include 'client/includes/show_date_block.html' with obj=conf %} в городе {{conf.city.name}}, {{conf.country.name}}. {% blocktrans with name=conf.name%}
<p class="text-indent-1-5em">Конференция {{name}} проходит {% endblocktrans %}{% include 'client/includes/show_date_block.html' with obj=conf %}
{% blocktrans with city=conf.name country=country.name name=conf.name id=conf.city.id code=request.LANGUAGE_CODE date1=conf.data_begin|date:'j' date2=conf.data_begin|date:'Y' date3=conf.data_begin|date:'n' date4=conf.data_end|date:'j' date5=conf.data_end|date:'Y' date6=conf.data_end|date:'n' %}
в городе {{city}}, {{country}}.
Посмотреть, как проехать в место проведения конференции, можно на сайте конгрессной площадки. Посмотреть, как проехать в место проведения конференции, можно на сайте конгрессной площадки.
Деловая программа {{conf.name}} разбита на секции по дням и размещается на сайте мероприятия с подробным списком Деловая программа {{name}} разбита на секции по дням и размещается на сайте мероприятия с подробным списком
докладчиков конференции. Спикеров конференции {{conf.name}} обычно окончательно утверждают за 1-2 месяца до начала конференции. докладчиков конференции. Спикеров конференции {{name}} обычно окончательно утверждают за 1-2 месяца до начала конференции.</p>
<br/> <h3>Ваши деловые контакты на {{name}} </h3>
<p><b>Ваши деловые контакты на {{conf.name}} </b></p> <p class="text-indent-1-5em">Добавьте конференцию {{name}} в расписание, чтобы не потерять важное событие,
<br/>
Добавьте конференцию {{conf.name}} в расписание, чтобы не потерять важное событие,
где встречаются профессионалы нужной Вам отрасли. Создавайте свой календарь мероприятий, просто нажав кнопку где встречаются профессионалы нужной Вам отрасли. Создавайте свой календарь мероприятий, просто нажав кнопку
"Добавить в календарь". "Добавить в календарь".</p>
<br/> <h3>Планируете самостоятельную поездку на {{name}} ? </h3>
<p><b>Планируете самостоятельную поездку на {{conf.name}} ? </b></p> <p class="text-indent-1-5em">Если Вам требуется размещение, мы рекомендуем посмотреть отели и цены в период проведения конференции <a href="http://www.booking.com/searchresults.html?aid=333667&city={{ id }}&do_availability_check=on&label=conf_search&lang={{ code }}&checkin_monthday={{ date1 }}&checkin_year_month={{ date2 }}-{{ date3 }}&checkout_monthday={{ date4 }}&checkout_year_month={{ date5 }}-{{ date6 }}">здесь</a>.
<br/>
Если Вам требуется размещение, мы рекомендуем посмотреть отели и цены в период проведения конференции <a href="http://www.booking.com/searchresults.html?aid=333667&city={{ conf.city.id }}&do_availability_check=on&label=conf_search&lang={{ request.LANGUAGE_CODE }}&checkin_monthday={{ conf.data_begin|date:'j' }}&checkin_year_month={{ conf.data_begin|date:'Y' }}-{{ conf.data_begin|date:'n' }}&checkout_monthday={{ conf.data_end|date:'j' }}&checkout_year_month={{ conf.data_end|date:'Y' }}-{{ conf.data_end|date:'n' }}">здесь</a>.
Не забудьте проверить место и даты конференции на официальном сайте и в календаре организатора. Событие могут перенести, Не забудьте проверить место и даты конференции на официальном сайте и в календаре организатора. Событие могут перенести,
отменить, объединить с проектом схожей тематики. Expomap не несет ответственности за неточности отменить, объединить с проектом схожей тематики. Expomap не несет ответственности за неточности
предоставляемой информации. предоставляемой информации.
Есть вопрос по участию в {{conf.name}} ? Ответим по тел. <b>+7 (499) 999-12-07</b> Есть вопрос по участию в {{name}} ? Ответим по тел. <b>+7 (499) 999-12-07</b></p>
{% endblocktrans %}
</div> </div>

@ -1,24 +1,34 @@
{% load i18n %}
<div class="ied-text"> <div class="ied-text">
Выставка {{expo.name}} проводится {% include 'client/includes/show_date_block.html' with obj=expo %} в городе {{expo.city.name}}, {{expo.country.name}}. {% blocktrans with name=expo.name %}
Экспонируемые продукты и разделы выставки Вы можете посмотреть ниже, в блоке <a href="#additional">«Дополнительная информация».</a> <p class="text-indent-1-5em">Выставка {{ name }} проводится{% endblocktrans %}
Полный список участников {{expo.name}} размещается на официальном сайте выставки и постоянно обновляется. {% include 'client/includes/show_date_block.html' with obj=expo %}
Там же Вы сможете найти экспонентов предыдущего года. Деловая программа {{expo.name}} обычно публикуется ближе к {% blocktrans with city=expo.city.name country=expo.country.name %} в городе {{ city }}, {{ country }}
началу события. .{% endblocktrans %}
<br/> {% blocktrans with name=expo.name id=expo.city.id code=request.LANGUAGE_CODE date1=expo.data_begin|date:'j' date2=expo.data_begin|date:'Y' date3=expo.data_begin|date:'n' date4=expo.data_end|date:'j' date5=expo.data_end|date:'Y' date6=expo.data_end|date:'n' %}
<p><b>Ваш личный календарь</b></p> Экспонируемые продукты и разделы выставки Вы можете посмотреть ниже, в блоке
<br/> <a href="#additional">«Дополнительная информация».</a>
Добавьте выставку {{expo.name}} в расписание, чтобы не потерять важное событие. Создавайте свой календарь мероприятий, Полный список участников {{ name }} размещается на официальном сайте выставки и постоянно обновляется.
просто нажав кнопку Добавить в календарь. Там же Вы сможете найти экспонентов предыдущего года. Деловая программа {{ name }} обычно публикуется ближе к
<br/> началу события.</p>
<p> <b>Планируете самостоятельную поездку на {{expo.name}}?</b></p>
<br/> <h3>Ваш личный календарь</h3>
Мы рекомендуем посмотреть отели и цены в период проведения выставки <a href="http://www.booking.com/searchresults.html?aid=333667&city={{ expo.city.id }}&do_availability_check=on&label=expo_search&lang={{ request.LANGUAGE_CODE }}&checkin_monthday={{ expo.data_begin|date:'j' }}&checkin_year_month={{ expo.data_begin|date:'Y' }}-{{ expo.data_begin|date:'n' }}&checkout_monthday={{ expo.data_end|date:'j' }}&checkout_year_month={{ expo.data_end|date:'Y' }}-{{ expo.data_end|date:'n' }}">здесь</a> . <p class="text-indent-1-5em">Добавьте выставку {{ name }} в <a href="/profile/calendar/">календарь</a>, чтобы не
{% if expo.place %} потерять важное событие. Создавайте свой календарь мероприятий,
Как добраться до выставочного центра {{expo.place.name}} можно посмотреть просто нажав кнопку Добавить в календарь.</p>
<a href="{{expo.place.get_permanent_url}}">здесь</a>.
{% endif %} <h3>Планируете самостоятельную поездку на {{ name }}?</h3>
Не забудьте проверить место и даты выставки на официальном сайте и в календаре выставочного комплекса. <p class="text-indent-1-5em">Мы рекомендуем посмотреть отели и цены в период проведения выставки
Событие могут перенести, отменить, объединить с проектом схожей тематики. <a href="http://www.booking.com/searchresults.html?aid=333667&city={{ id }}&do_availability_check=on&label=expo_search&lang={{ code }}&checkin_monthday={{ date1 }}&checkin_year_month={{ date2 }}-{{ date3 }}&checkout_monthday={{ date4 }}&checkout_year_month={{ date5 }}-{{ date6 }}">здесь</a>.
Expomap не несет ответственности за неточности предоставляемой информации. {% endblocktrans %}{% if expo.place %}
Есть вопрос о посещении или участии в {{ expo.name }}? Ответим по тел. <b>+7 (499) 999-12-07</b> {% blocktrans with name=expo.place.name url=expo.place.url %}Как добраться до выставочного центра {{ name }} можно
посмотреть
<a href="/places/{{ url }}">здесь</a>.{% endblocktrans %}
{% endif %}
{% blocktrans with name=expo.name %}
Не забудьте проверить место и даты выставки на официальном сайте и в календаре выставочного комплекса.
Событие могут перенести, отменить, объединить с проектом схожей тематики.
Expomap не несет ответственности за неточности предоставляемой информации.
Есть вопрос о посещении или участии в {{ name }}? Ответим по тел. <b>+7 (499) 999-12-07</b></p>
{% endblocktrans %}
</div> </div>

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.views.generic import ListView, DetailView from django.views.generic import DetailView
from functions.custom_views import ListView
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.views.generic.detail import SingleObjectMixin from django.views.generic.detail import SingleObjectMixin
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _

Loading…
Cancel
Save