Conferences

remotes/origin/1203
Назар Котюк 11 years ago
parent 225e7850eb
commit 3e94c98384
  1. 8
      article/admin.py
  2. 18
      article/models.py
  3. 4
      article/urls.py
  4. 17
      city/models.py
  5. 81
      conference/admin.py
  6. 14
      conference/admin_urls.py
  7. 91
      conference/forms.py
  8. 1
      conference/management/__init__.py
  9. 1
      conference/management/commands/__init__.py
  10. 95
      conference/management/commands/conf_load.py
  11. 154
      conference/models.py
  12. 75
      conference/urls.py
  13. 430
      conference/views.py
  14. 15
      country/models.py
  15. 8
      exposition/forms.py
  16. 2
      exposition/management/commands/exposition_load.py
  17. 78
      exposition/models.py
  18. 2
      exposition/urls.py
  19. 30
      exposition/views.py
  20. 5
      import_xls/excel_settings.py
  21. 20
      proj/admin.py
  22. 1
      proj/admin_urls.py
  23. 50
      proj/settings.py
  24. 17
      settings/admin.py
  25. 2
      settings/admin_urls.py
  26. 25
      settings/forms.py
  27. 45
      static/custom_js/main.js
  28. 37
      templates/admin/article/blog_form.html
  29. 465
      templates/admin/conference/conference.html
  30. 2
      templates/admin/exposition/exposition.html
  31. 8
      templates/admin/settings/main_page.html
  32. 2
      templates/client/article/article.html
  33. 2
      templates/client/article/blog_list.html
  34. 40
      templates/client/conference/catalog.html
  35. 65
      templates/client/conference/catalog_theme.html
  36. 42
      templates/client/conference/conference_by.html
  37. 24
      templates/client/conference/conference_detail.html
  38. 42
      templates/client/conference/conference_list.html
  39. 25
      templates/client/conference/members.html
  40. 26
      templates/client/conference/visitors.html
  41. 2
      templates/client/includes/article/article_logo.html
  42. 11
      templates/client/includes/article/article_on_main_preview.html
  43. 4
      templates/client/includes/article/article_preview.html
  44. 3
      templates/client/includes/booking_block.html
  45. 17
      templates/client/includes/calendar_button.html
  46. 129
      templates/client/includes/conference/conference_list.html
  47. 396
      templates/client/includes/conference/conference_object.html
  48. 4
      templates/client/includes/exposition/catalog_filter_period.html
  49. 4
      templates/client/includes/exposition/exposition_list.html
  50. 4
      templates/client/includes/exposition/exposition_object.html
  51. 2
      templates/client/includes/exposition/tags.html
  52. 21
      templates/client/includes/index/blogs.html
  53. 12
      templates/client/includes/side_confs.html
  54. 18
      templates/client/index.html
  55. 9
      theme/models.py

@ -9,7 +9,7 @@ from django.contrib.contenttypes.models import ContentType
from forms import ArticleForm, ArticleDeleteForm, Article, NewsForm from forms import ArticleForm, ArticleDeleteForm, Article, NewsForm
from theme.models import Tag from theme.models import Tag
from file.models import FileModel, TmpFile from file.models import FileModel, TmpFile
from file.forms import FileModelForm from file.forms import FileModelForm, FileForm
#custom views #custom views
from functions.custom_views import objects_list, add_object_with_file, delete_object from functions.custom_views import objects_list, add_object_with_file, delete_object
@ -180,7 +180,13 @@ class BlogView(FormView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(BlogView, self).get_context_data(**kwargs) context = super(BlogView, self).get_context_data(**kwargs)
self.set_obj() self.set_obj()
context['article'] = self.obj context['article'] = self.obj
if context['article']:
context['file_form'] = FileForm(initial={'model': 'article.Article'})
context['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(context['article']),
object_id=getattr(context['article'], 'id'))
context['languages'] = settings.LANGUAGES context['languages'] = settings.LANGUAGES
return context return context

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import copy import copy
from django.db import models from django.db import models
from django.contrib.contenttypes import generic
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.timezone import now from django.utils.timezone import now
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
@ -11,6 +12,7 @@ from functions.model_utils import base_concrete_model
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
class ArticleManager(TranslationManager): class ArticleManager(TranslationManager):
def safe_get(self, **kwargs): def safe_get(self, **kwargs):
model = self.model model = self.model
@ -91,6 +93,10 @@ class Article(TranslatableModel):
keywords = models.CharField(max_length=255, blank=True), keywords = models.CharField(max_length=255, blank=True),
) )
files = generic.GenericRelation('file.FileModel', content_type_field='content_type', object_id_field='object_id')
class Meta:
ordering = ['-created']
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('main_title', self.pk) return self.lazy_translation_getter('main_title', self.pk)
@ -196,9 +202,17 @@ class Article(TranslatableModel):
def get_permanent_url(self): def get_permanent_url(self):
if self.type == 1: if self.type == 1:
return '/blogs/%s'%self.slug return '/blogs/%s/'%self.slug
elif self.type == 2: elif self.type == 2:
return '/news/%s'%self.slug return '/news/%s/'%self.slug
def get_blog_preview(self):
preview = self.files.filter(purpose='preview')
if preview:
return preview[0]
else:
return None
from django.db.models.signals import post_save from django.db.models.signals import post_save
from functions.signal_handlers import post_save_handler from functions.signal_handlers import post_save_handler

@ -7,6 +7,6 @@ urlpatterns = patterns('',
url(r'blogs/$', BlogList.as_view()), url(r'blogs/$', BlogList.as_view()),
url(r'news/page/(?P<page>\d+)/$', NewsList.as_view()), url(r'news/page/(?P<page>\d+)/$', NewsList.as_view()),
url(r'news/$', NewsList.as_view()), url(r'news/$', NewsList.as_view()),
url(r'blogs/(?P<slug>.*)$', BlogDetail.as_view()), url(r'blogs/(?P<slug>.*)/$', BlogDetail.as_view()),
url(r'news/(?P<slug>.*)$', NewsDetail.as_view()), url(r'news/(?P<slug>.*)/$', NewsDetail.as_view()),
) )

@ -11,6 +11,9 @@ from service.models import Service
from exposition.models import Exposition from exposition.models import Exposition
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
from organiser.models import Organiser from organiser.models import Organiser
from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
# custom functions # custom functions
from functions.db import db_table_exists from functions.db import db_table_exists
from functions.signal_handlers import post_save_handler from functions.signal_handlers import post_save_handler
@ -86,7 +89,19 @@ class City(TranslatableModel):
def expositions_number(self): def expositions_number(self):
return len(Exposition.objects.filter(city=self.id)) return Exposition.objects.filter(city=self.id).count()
def conferences_number(self):
return Conference.objects.filter(city=self.id).count()
def seminars_number(self):
return Seminar.objects.filter(city=self.id).count()
def webinars_number(self):
return Webinar.objects.filter(city=self.id).count()
def get_parent(self): def get_parent(self):
parent = {'text' : self.country.name, 'id': self.country.id, 'name': 'co', parent = {'text' : self.country.name, 'id': self.country.id, 'name': 'co',

@ -13,13 +13,14 @@ from forms import ConferenceChangeForm, ConferenceCreateForm, ConferenceDeleteFo
from theme.models import Tag from theme.models import Tag
from city.models import City from city.models import City
from file.models import FileModel, TmpFile from file.models import FileModel, TmpFile
from file.forms import FileModelForm from file.forms import FileModelForm, FileForm
from photologue.forms import PhotoForm
#python #python
import random import random
#custom views #custom views
from functions.custom_views import objects_list, delete_object from functions.custom_views import objects_list, delete_object
from functions.views_help import get_referer from functions.views_help import get_referer
from functions.admin_views import AdminListView from functions.admin_views import AdminListView, AdminView, upload_photo
def conference_all(request): def conference_all(request):
@ -214,7 +215,83 @@ def conference_change(request, url):
return render_to_response('conference_add.html', args) return render_to_response('conference_add.html', args)
class ConferenceView(AdminView):
form_class = ConferenceCreateForm
model = Conference
success_url = '/admin/conference/all/'
template_name = 'admin/conference/conference.html'
def form_valid(self, form):
self.set_obj()
expo = form.save(obj=self.obj)
return HttpResponseRedirect(self.success_url)
def get_form(self, form_class):
if self.request.POST:
return super(ConferenceView, self).get_form(form_class)
obj = self.set_obj()
if obj:
data = {'web_page':obj.web_page, 'foundation_year': obj.foundation_year,
'data_begin':obj.data_begin, 'data_end':obj.data_end, 'currency':obj.currency,
'tax':obj.tax, 'min_price':obj.min_price, 'max_price':obj.max_price,
'link':obj.link, 'conference_id':obj.id, 'expohit': obj.expohit,
'discount': obj.discount,'canceled': obj.canceled, 'moved': obj.moved,
'visitors': obj.visitors, 'members': obj.members,
'quality_label': [item for item, bool in obj.quality_label if bool==True]}
if obj.place:
data['place'] = obj.place.id
data['theme'] = [item.id for item in obj.theme.all()]
data['tag'] = ','.join(['%s:%s'%(item.id, item.name) for item in obj.tag.all()])
data['organiser'] = [item.id for item in obj.organiser.all()]
data['company'] = [item.id for item in obj.company.all()]
data['country'] = obj.country_id
data['city'] = obj.city_id
for code, name in settings.LANGUAGES:
trans_obj = self.model._meta.translations_model.objects.get(language_code = code,master__id=obj.id) #access to translated fields
data['name_%s' % code] = obj.name
data['description_%s' % code] = trans_obj.description
data['main_title_%s' % code] = trans_obj.main_title
data['time_%s' % code] = trans_obj.time
data['main_themes_%s' % code] = trans_obj.main_themes
data['discount_description_%s' % code] = trans_obj.discount_description
data['title_%s' % code] = trans_obj.title
data['keywords_%s' % code] = trans_obj.keywords
data['descriptions_%s' % code] = trans_obj.descriptions
form =form_class(initial=data)
form.fields['city'].widget.attrs['data-init-text'] = obj.city.name
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.language().filter(theme__in=data['theme'])]
return form
else:
return form_class()
def get_context_data(self, **kwargs):
context = super(ConferenceView, self).get_context_data(**kwargs)
obj = self.set_obj()
if obj:
context['stat_form'] = StatisticForm()
context['file_form'] = FileForm(initial={'model': 'conference.Conference'})
files = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(obj),object_id=getattr(obj, 'id'))
context['files'] = files
context['photo_form'] = PhotoForm()
context['timetable_form'] = TimeTableForm()
context['timetables'] = TimeTable.objects.filter(conference=obj)
return context
class ConferenceListView(AdminListView): class ConferenceListView(AdminListView):
template_name = 'admin/conference/conference_list.html' template_name = 'admin/conference/conference_list.html'
form_class = ConferenceFilterForm form_class = ConferenceFilterForm
model = Conference model = Conference
def upload_conference_photo(request, conf_id):
return upload_photo(request, conf_id, Conference)

@ -1,13 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from admin import ConferenceListView from admin import ConferenceListView, ConferenceView
urlpatterns = patterns('conference.admin', urlpatterns = patterns('conference.admin',
url(r'^add.*/$', 'conference_add'), url(r'^upload-photo/(?P<conf_id>.*)/$', 'upload_conference_photo'),
url(r'^delete/(?P<url>.*)$', 'conference_delete'), url(r'^delete/(?P<url>.*)$', 'conference_delete'),
url(r'^change/(?P<url>.*)/$', 'conference_change'),
url(r'^copy/(?P<url>.*)/$', 'conference_copy'),
url(r'^switch/(?P<url>.*)/(?P<action>.*)$', 'conference_switch'),
#url(r'^all/$', 'conference_all'),
url(r'^all/$', ConferenceListView.as_view()), url(r'^all/$', ConferenceListView.as_view()),
#url(r'^change/(?P<url>.*)/$', 'conference_change'),
url(r'^switch/(?P<url>.*)/(?P<action>.*)$', 'conference_switch'),
url(r'^(?P<url>.*)/$', ConferenceView.as_view()),
url(r'^$', ConferenceView.as_view()),
) )

@ -5,10 +5,10 @@ from ckeditor.widgets import CKEditorWidget
from django.forms.util import ErrorList from django.forms.util import ErrorList
from django.core.validators import validate_email, URLValidator from django.core.validators import validate_email, URLValidator
#models #models
from models import Conference, TimeTable, CURRENCY, Statistic from models import Conference, TimeTable, CURRENCY, Statistic, BIT_AUDIENCE
from country.models import Country from country.models import Country
from city.models import City from city.models import City
from theme.models import Theme from theme.models import Theme, Tag
from organiser.models import Organiser from organiser.models import Organiser
from accounts.models import User from accounts.models import User
from company.models import Company from company.models import Company
@ -21,6 +21,9 @@ from functions.files import check_tmp_files
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
from functions.admin_forms import AdminFilterForm from functions.admin_forms import AdminFilterForm
places = [(item.id, item.name) for item in PlaceConference.objects.language().all()]
places.insert(0,('', 'Не выбрано'))
class ConferenceCreateForm(forms.Form): class ConferenceCreateForm(forms.Form):
""" """
@ -31,18 +34,35 @@ class ConferenceCreateForm(forms.Form):
save function saves data in Conference object. If it doesnt exist create new object save function saves data in Conference object. If it doesnt exist create new object
""" """
PERIODIC = ((0, u'Не выбрано'),
(1.0, u'Ежегодно'), (2.0, u'2 раза в год'), (3.0, u'3 раза в год'),
(4.0, u'4 раза в год'), (5.0, u'5 раз в год'),
(0.5, u'Раз в 2 года'),(0.33, u'Раз в 3 года'),(0.25, u'Раз в 4 года'))
public = [(item1, item2) for item1, item2 in BIT_AUDIENCE]
currencies = [(item, item) for item in CURRENCY] currencies = [(item, item) for item in CURRENCY]
data_begin = forms.DateField(label='Дата начала') data_begin = forms.DateField(label=u'Дата начала', input_formats=['%Y-%m-%d', '%d.%m.%Y'])
data_end = forms.DateField(label='Дата окночания') data_end = forms.DateField(label=u'Дата окончания', input_formats=['%Y-%m-%d', '%d.%m.%Y'])
logo = forms.ImageField(label='Logo', required=False)
organiser = forms.MultipleChoiceField(label=u'Организаторы', required=False,
choices=[(item.id, item.name) for item in Organiser.objects.language().all()])
country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()]) country = forms.ChoiceField(label=u'Страна', choices=[(c.id, c.name) for c in Country.objects.all()])
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all()) theme = forms.MultipleChoiceField(label='Тематики',
place = forms.ModelChoiceField(label='Место проведения', queryset=PlaceConference.objects.all(), choices=[(item.id, item.name) for item in Theme.objects.language().all()])
empty_label='', required=False)
place = forms.ChoiceField(label=u'Место проведения', required=False,
choices=places)
#creates select input with empty choices cause it will be filled with ajax #creates select input with empty choices cause it will be filled with ajax
city = forms.CharField(label=u'Город', widget=forms.HiddenInput()) city = forms.CharField(label=u'Город', widget=forms.HiddenInput())
tag = forms.MultipleChoiceField(label='Теги', required=False) tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(), required=False)
periodic = forms.ChoiceField(label=u'Периодичность', choices=PERIODIC, required=False)
audience = forms.MultipleChoiceField(label=u'Аудитория', choices=public, initial='', required=False)
web_page = forms.CharField(label='Веб страница', required=False) web_page = forms.CharField(label='Веб страница', required=False)
link = forms.CharField(label='Линк на регистрацию', required=False) link = forms.CharField(label='Линк на регистрацию', required=False)
@ -61,9 +81,7 @@ class ConferenceCreateForm(forms.Form):
quality_label = forms.MultipleChoiceField(label='Тип', required=False, quality_label = forms.MultipleChoiceField(label='Тип', required=False,
choices=[('ufi', 'UFI'), ('rsva', 'РСВЯ'), ('exporating', 'ExpoRating')], choices=[('ufi', 'UFI'), ('rsva', 'РСВЯ'), ('exporating', 'ExpoRating')],
widget=forms.CheckboxSelectMultiple()) widget=forms.CheckboxSelectMultiple())
#field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput())
#
conference_id = forms.CharField(required=False, widget=forms.HiddenInput()) conference_id = forms.CharField(required=False, widget=forms.HiddenInput())
@ -99,14 +117,8 @@ class ConferenceCreateForm(forms.Form):
widget=forms.TextInput(attrs={'style':'width: 550px'})) widget=forms.TextInput(attrs={'style':'width: 550px'}))
#!service has bitfield. uncomment when country data will be filled
#services = [(item.id, item.name) for item in Service.objects.all()]
#self.fields['service'] = forms.ChoiceField(label='Услуги', choices=services, required=False)
def save(self, obj=None):
def save(self, id=None):
""" """
changes Conference model object with id = id changes Conference model object with id = id
N/A add new Conference model object N/A add new Conference model object
@ -115,15 +127,18 @@ class ConferenceCreateForm(forms.Form):
""" """
data = self.cleaned_data data = self.cleaned_data
#create new conference object or get exists #create new conference object or get exists
if not id: if not obj:
conference = Conference() conference = Conference()
else: else:
conference = Conference.objects.get(id=id) conference = obj
conference.theme.clear() conference.theme.clear()
conference.tag.clear() conference.tag.clear()
#simple fields #simple fields
conference.url = translit_with_separator(data['name_ru'].strip()).lower() conference.url = translit_with_separator(data['name_ru'].strip()).lower()
if data.get('logo'):
conference.logo = data['logo']
conference.data_begin = data['data_begin'] conference.data_begin = data['data_begin']
conference.data_end = data['data_end'] conference.data_end = data['data_end']
conference.link = data['link'] conference.link = data['link']
@ -141,6 +156,7 @@ class ConferenceCreateForm(forms.Form):
conference.expohit = data['expohit'] conference.expohit = data['expohit']
conference.canceled = data['canceled'] conference.canceled = data['canceled']
conference.moved = data['moved'] conference.moved = data['moved']
conference.periodic = data['periodic']
# generates bitfield # generates bitfield
flag = 0 flag = 0
if data['quality_label']: if data['quality_label']:
@ -148,6 +164,12 @@ class ConferenceCreateForm(forms.Form):
conference.quality_label = flag conference.quality_label = flag
audience = 0
if data['audience']:
audience = reduce(lambda x,y: x|y, (getattr(Conference.audience, item) for item in data['audience']))
conference.audience = audience
if data.get('country'): if data.get('country'):
conference.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset conference.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset
@ -156,22 +178,20 @@ class ConferenceCreateForm(forms.Form):
conference.city = City.objects.get(id=data['city']) conference.city = City.objects.get(id=data['city'])
if data.get('place'): if data.get('place'):
conference.place = PlaceConference.objects.get(id=data['place'].id)#.id cause select uses queryset conference.place = PlaceConference.objects.get(id=data['place'])
else:
conference.place = None
# fill translated fields and save object # fill translated fields and save object
fill_with_signal(Conference, conference, data) fill_with_signal(Conference, conference, data)
#fill manytomany fields conference.theme.add(*data['theme'])
for item in data['theme']: conference.tag.add(*Tag.objects.filter(id__in=data['tag']))
conference.theme.add(item.id)#.id cause select uses queryset conference.organiser.add(*Organiser.objects.filter(id__in=data.get('organiser', [])))
for item in data['tag']:
conference.tag.add(item)
# uses because in the next loop data will be overwritten
conference.save() conference.save()
#save files
check_tmp_files(conference, data['key'])
return conference return conference
def clean(self): def clean(self):
@ -186,6 +206,19 @@ class ConferenceCreateForm(forms.Form):
return self.cleaned_data return self.cleaned_data
def clean_tag(self):
tags = self.cleaned_data.get('tag')
if tags:
res = []
for id in tags.split(','):
try:
res.append(int(id))
except:
continue
return res
else:
return []
def clean_web_page(self): def clean_web_page(self):
""" """
checking web_page checking web_page

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

@ -0,0 +1,95 @@
# -*- coding: utf-8 -*-
import xlrd
from django.core.management.base import BaseCommand
from django.conf import settings
from conference.models import Conference
from import_xls.excel_settings import event_sett
from django.db import IntegrityError
CONF_FILE = settings.MEDIA_ROOT+'/import/conf.xls'
class Command(BaseCommand):
def handle(self, *args, **options):
f = open(CONF_FILE, 'r')
book = xlrd.open_workbook(file_contents=f.read())
sheet = book.sheet_by_index(0)
row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)]
labels = [label for label in row_list[0]]
existing = 0
for row_number, row in enumerate(row_list[1:]):
if row[0] != '':
try:
object = Conference.objects.language('ru').get(id=int(row[0]))
existing += 1
except ValueError:
object = Conference()
object.translate('ru')
except Conference.DoesNotExist:
object = Conference(id= int(row[0]))
object.translate('ru')
existing += 1
else:
# if id blank - its a new place
object = Conference()
object.translate('ru')
methods = []
for col_number, cell in enumerate(row):
label = labels[col_number]
setting = event_sett.get(label)
if setting is None:
continue
if setting.get('method'):
if cell != "":
methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')})
continue
field_name = setting['field']
func = setting.get('func')
if func is not None:
extra_value = setting.get('extra_values')
if extra_value is not None:
# if setting has extra value then
# it is some field like city, theme, tag
# that has relation and can be created
# in function we add language(need for relation fields)
# and extra value from object (like for city need country)
value = func(cell, 'ru', getattr(object, extra_value))
elif setting.get('bitfield'):
value = func(object, cell, setting['label'])
else:
value = func(cell)
setattr(object, field_name, value)
try:
object.save()
except IntegrityError:
print('error %s'% str(object))
continue
print('post save %s'% str(object))
for method in methods:
func = method['func']
if method.get('purpose'):
try:
func(object, method['value'], method['purpose'])
except:
continue
else:
func(object, method['value'])

@ -1,8 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.utils.translation import ugettext as _
from django.db import models from django.db import models
from django.db.models.signals import post_save, pre_save from django.db.models.signals import post_save, pre_save
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from exposition.manager import ClientManager
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from functions.translate import fill_with_signal
from photologue.models import Gallery
from functions.signal_handlers import post_save_handler, pre_save_handler from functions.signal_handlers import post_save_handler, pre_save_handler
import copy import copy
from bitfield import BitField from bitfield import BitField
@ -12,11 +16,14 @@ from functions.db import db_table_exists
from functions.custom_fields import EnumField from functions.custom_fields import EnumField
from functions.models_methods import ExpoManager from functions.models_methods import ExpoManager
from functions.model_mixin import EventMixin, ExpoMixin from functions.model_mixin import EventMixin, ExpoMixin
from functions.models_methods import hvad_to_dict
# check if table exist and create flags if true # check if table exist and create flags if true
flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else []
from django.conf import settings
CURRENCY = ('RUB', 'USD', 'EUR') CURRENCY = settings.CURRENCY
BIT_AUDIENCE = settings.BIT_AUDIENCE
class Conference(TranslatableModel, EventMixin, ExpoMixin): class Conference(TranslatableModel, EventMixin, ExpoMixin):
""" """
@ -25,17 +32,22 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
Uses hvad.TranslatableModel which is child of django.db.models class Uses hvad.TranslatableModel which is child of django.db.models class
""" """
catalog = '/conference/' catalog = '/conference/'
catalog_name = _(u'Конференции:')
# type of event # type of event
event_type = 'conf' event_type = 'conf'
#set manager of this model #set manager of this model
objects = ExpoManager() objects = ExpoManager()
enable = ClientManager()
url = models.SlugField(unique=True) url = models.SlugField(unique=True, max_length=255)
data_begin = models.DateField(verbose_name='Дата начала') data_begin = models.DateField(verbose_name='Дата начала')
data_end = models.DateField(verbose_name='Дата окончания') data_end = models.DateField(verbose_name='Дата окончания')
services = BitField(flags=flags)
#relations #relations
country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT) country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT,
city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT) related_name='conference_country')
city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT,
related_name='conference_city')
place = models.ForeignKey('place_conference.PlaceConference', verbose_name='Место проведения', place = models.ForeignKey('place_conference.PlaceConference', verbose_name='Место проведения',
blank=True, null=True, on_delete=models.PROTECT, related_name='conference_place') blank=True, null=True, on_delete=models.PROTECT, related_name='conference_place')
theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики', theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики',
@ -48,15 +60,20 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
blank=True, null=True, related_name='conference_companies') blank=True, null=True, related_name='conference_companies')
users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки', users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки',
blank=True, null=True, related_name='conference_users') blank=True, null=True, related_name='conference_users')
#!service has bitfield uncomment when country data will be filled photogallery = models.ForeignKey('photologue.Gallery', blank=True, null=True)
services = BitField(flags=flags) logo = models.ImageField(verbose_name='Logo', upload_to='conference/logo/', blank=True)
#service = models.ManyToManyField('service.Service', verbose_name='Услуги', blank=True, null=True) rating = models.IntegerField(default=0, db_index=True) # добавить индекс в базе
quality_label = BitField(flags=['ufi', 'rsva', 'exporating'])
periodic = models.FloatField(verbose_name='Переодичность', blank=True, null=True)
audience = BitField(flags=[k for k, v in BIT_AUDIENCE])
web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True) web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True)
link = models.CharField(verbose_name='Линк на регистрацию', max_length=255, blank=True) link = models.CharField(verbose_name='Линк на регистрацию', max_length=255, blank=True)
quality_label = BitField(flags=['ufi', 'rsva', 'exporating'])
discount = models.PositiveIntegerField(verbose_name='Скидка', blank=True, null=True) discount = models.PositiveIntegerField(verbose_name='Скидка', blank=True, null=True)
# #
currency = EnumField(values=CURRENCY, default='RUB')
currency = EnumField(values=CURRENCY, default='USD')
tax = models.BooleanField(verbose_name='Налог', default=1) tax = models.BooleanField(verbose_name='Налог', default=1)
min_price = models.PositiveIntegerField(verbose_name='Минимальная цена', blank=True, null=True) min_price = models.PositiveIntegerField(verbose_name='Минимальная цена', blank=True, null=True)
max_price = models.PositiveIntegerField(verbose_name='Максимальная цена', blank=True, null=True) max_price = models.PositiveIntegerField(verbose_name='Максимальная цена', blank=True, null=True)
@ -69,6 +86,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
is_published = models.BooleanField(default=0) is_published = models.BooleanField(default=0)
files = generic.GenericRelation('file.FileModel', content_type_field='content_type', object_id_field='object_id') files = generic.GenericRelation('file.FileModel', content_type_field='content_type', object_id_field='object_id')
note = generic.GenericRelation('note.Note', content_type_field='content_type', object_id_field='object_id')
# statistic # statistic
foundation_year = models.PositiveIntegerField(verbose_name='Год основания', blank=True, null=True) foundation_year = models.PositiveIntegerField(verbose_name='Год основания', blank=True, null=True)
visitors = models.PositiveIntegerField(verbose_name='Посетитеил', blank=True, null=True) visitors = models.PositiveIntegerField(verbose_name='Посетитеил', blank=True, null=True)
@ -103,49 +121,18 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
return conferences return conferences
def get_catalog_url(self): def get_catalog_url(self):
return '/conferences/' return '/conference/'
def clone(self): def get_audience(self):
""" checked = [item for item, bool in self.audience if bool==True]
Return an identical copy of the instance with a new ID. audience = []
""" for k, v in BIT_AUDIENCE:
if not self.pk: for item in checked:
raise ValueError('Instance must be saved before it can be cloned.') if item == k:
audience.append(v)
duplicate = copy.copy(self)
# Setting pk to None. Django thinking this is a new object. return ', '.join(audience)
duplicate.pk = None
# url must be unique
duplicate.url += '_copy'
if Conference.objects.safe_get(url=duplicate.url):
#already has copy this instance
return
# duplicate should not be published
duplicate.is_published = False
duplicate.cancel_by_administrator = False
ignore_fields = ['id', 'master', 'language_code']
duplicate.translate('ru')
tr = self._meta.translations_model.objects.get(language_code = 'ru',master__id=self.pk)
for field in duplicate._translated_field_names:
if field in ignore_fields:
continue
setattr(duplicate, field, getattr(tr, field))
duplicate.save()
# but lost all ManyToMany relations and Translations.
# copy relations
for field in self._meta.many_to_many:
source = getattr(self, field.attname)
destination = getattr(duplicate, field.attname)
for item in source.all():
destination.add(item)
return duplicate
def get_calendar_url(self): def get_calendar_url(self):
return '/conference-add-calendar/%s/'%self.id return '/conference-add-calendar/%s/'%self.id
@ -153,12 +140,51 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
def get_visit_url(self): def get_visit_url(self):
return '/conference-visit/%s/'%self.id return '/conference-visit/%s/'%self.id
def get_note_by_user(self, user_id):
note = self.note.filter(user__id=user_id)
try:
return note.get().text
except:
return ''
def tags(self):
return self.tag.language().all()
def get_gallery(self):
if self.photogallery:
return self.photogallery
data = {}
model = type(self)
for code, name in settings.LANGUAGES:
obj = model._meta.translations_model.objects.get(language_code = code,master__id=self.id) #access to translated fields
data['title_%s'%code] = obj.name
data['description_%s'%code] = obj.description
gallery = Gallery()
class Statistic(models.Model): fill_with_signal(Gallery, gallery, data)
self.photogallery = gallery
self.save()
return gallery
class Statistic(TranslatableModel):
conference = models.ForeignKey(Conference, related_name='statistic') conference = models.ForeignKey(Conference, related_name='statistic')
year = models.PositiveIntegerField(verbose_name='Год') year = models.PositiveIntegerField(verbose_name='Год')
members = models.PositiveIntegerField(verbose_name='Посетители') members = models.PositiveIntegerField(verbose_name='Посетители', blank=True, null=True)
visitors = models.PositiveIntegerField(verbose_name='Участники') visitors = models.PositiveIntegerField(verbose_name='Участники', blank=True, null=True)
area = models.PositiveIntegerField(verbose_name='Площадь', blank=True, null=True)
countries_number = models.PositiveIntegerField(verbose_name='Количество стран', blank=True, null=True)
translations = TranslatedFields(
countries = models.TextField(blank=True)
)
def to_dict(self):
return hvad_to_dict(self)
class TimeTable(TranslatableModel): class TimeTable(TranslatableModel):
@ -166,13 +192,27 @@ class TimeTable(TranslatableModel):
TimeTable for business program TimeTable for business program
""" """
exposition = models.ForeignKey(Conference, related_name='business_program') conference = models.ForeignKey(Conference, related_name='business_program')
begin = models.DateTimeField(verbose_name='Начало') begin = models.DateTimeField(verbose_name='Начало')
end = models.DateTimeField(verbose_name='Конец') end = models.DateTimeField(verbose_name='Конец')
timetable_organiser = models.ForeignKey('organiser.Organiser', null=True, blank=True,
related_name='conf_timetable')
#
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(verbose_name='Название', max_length=255) name = models.CharField(verbose_name='Название программы', max_length=255, blank=True),
programe = models.TextField(verbose_name='Программа'),
speaker = models.CharField(verbose_name='Спикеры', max_length=255, blank=True),
place = models.CharField(verbose_name='Место проведения', max_length=255, blank=True)
) )
def to_dict(self):
return hvad_to_dict(self)
pre_save.connect(pre_save_handler, sender=Conference) pre_save.connect(pre_save_handler, sender=Conference)
post_save.connect(post_save_handler, sender=Conference) post_save.connect(post_save_handler, sender=Conference)
post_save.connect(post_save_handler, sender=TimeTable)
post_save.connect(post_save_handler, sender=Statistic)

@ -1,15 +1,74 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from views import ConferenceView from views import ConferenceDetail, ConferenceList, ConferenceByCity, ConferenceByCountry, ConferenceByTheme,\
ConferenceCountryCatalog, ConferenceCityCatalog, ConferenceTagCatalog, ConferenceThemeCatalog, ConferenceMembers,\
ConferenceVisitors, ConferenceServiceView
from exposition.views import ExpositionSearchView
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'conference/(?P<params>.*)/(?P<page>\d+)/$', ConferenceView.as_view()),
url(r'conference/(?P<page>\d+)/$', ConferenceView.as_view()),
url(r'conference/(?P<params>.*)/$', ConferenceView.as_view()), url(r'conference/add-note/(?P<slug>.*)/$', 'conference.views.add_note'),
url(r'conference/$', ConferenceView.as_view()),
#
url(r'conference-add-calendar/(?P<id>\d+)/$', 'conference.views.conference_add_calendar'), url(r'conference-add-calendar/(?P<id>\d+)/$', 'conference.views.conference_add_calendar'),
url(r'conference-remove-calendar/(?P<id>\d+)/$', 'conference.views.conference_remove_calendar'),
url(r'conference-visit/(?P<id>\d+)/$', 'conference.views.conference_visit'), url(r'conference-visit/(?P<id>\d+)/$', 'conference.views.conference_visit'),
url(r'conference-unvisit/(?P<id>\d+)/$', 'conference.views.conference_unvisit'), # search
url(r'conference/search/', ExpositionSearchView.as_view()),
# country catalog
url(r'conference/country/$', ConferenceByCountry.as_view()),
url(r'conference/country/(?P<slug>.*)/(?P<year>\d+)/(?P<month>.*)/page/(?P<page>\d+)/$', ConferenceCountryCatalog.as_view()),
url(r'conference/country/(?P<slug>.*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceCountryCatalog.as_view()),
url(r'conference/country/(?P<slug>.*)/page/(?P<page>\d+)/$', ConferenceCountryCatalog.as_view()),
url(r'conference/country/(?P<slug>.*)/(?P<year>\d+)/(?P<month>.*)/$', ConferenceCountryCatalog.as_view()),
url(r'conference/country/(?P<slug>.*)/(?P<year>\d+)/$', ConferenceCountryCatalog.as_view()),
url(r'conference/country/(?P<slug>.*)/$', ConferenceCountryCatalog.as_view()),
# city catalog
url(r'conference/city/$', ConferenceByCity.as_view()),
url(r'conference/city/(?P<slug>.*)/(?P<year>\d+)/(?P<month>.*)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view()),
url(r'conference/city/(?P<slug>.*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view()),
url(r'conference/city/(?P<slug>.*)/page/(?P<page>\d+)/$', ConferenceCityCatalog.as_view()),
url(r'conference/city/(?P<slug>.*)/(?P<year>\d+)/(?P<month>.*)/$', ConferenceCityCatalog.as_view()),
url(r'conference/city/(?P<slug>.*)/(?P<year>\d+)/$', ConferenceCityCatalog.as_view()),
url(r'conference/city/(?P<slug>.*)/$', ConferenceCityCatalog.as_view()),
# theme catalog
url(r'conference/theme/$', ConferenceByTheme.as_view()),
url(r'conference/theme/(?P<slug>.*)/country/(?P<country_slug>.*)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/country/(?P<country_slug>.*)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/city/(?P<city_slug>.*)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/city/(?P<city_slug>.*)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/(?P<year>\d+)/(?P<month>.*)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/page/(?P<page>\d+)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/(?P<year>\d+)/(?P<month>.*)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/(?P<year>\d+)/$', ConferenceThemeCatalog.as_view()),
url(r'conference/theme/(?P<slug>.*)/$', ConferenceThemeCatalog.as_view()),
# tag catalog
url(r'conference/tag/(?P<slug>.*)/(?P<year>\d+)/(?P<month>.*)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view()),
url(r'conference/tag/(?P<slug>.*)/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view()),
url(r'conference/tag/(?P<slug>.*)/page/(?P<page>\d+)/$', ConferenceTagCatalog.as_view()),
url(r'conference/tag/(?P<slug>.*)/(?P<year>\d+)/(?P<month>.*)/$', ConferenceTagCatalog.as_view()),
url(r'conference/tag/(?P<slug>.*)/(?P<year>\d+)/$', ConferenceTagCatalog.as_view()),
url(r'conference/tag/(?P<slug>.*)/$', ConferenceTagCatalog.as_view()),
# conf additional pages
url(r'conference/(?P<slug>.*)/visitors/page/(?P<page>\d+)/$', ConferenceVisitors.as_view()),
url(r'conference/(?P<slug>.*)/visitors/$', ConferenceVisitors.as_view()),
url(r'conference/(?P<slug>.*)/members/page/(?P<page>\d+)/$', ConferenceMembers.as_view()),
url(r'conference/(?P<slug>.*)/members/$', ConferenceMembers.as_view()),
url(r'conference/(?P<slug>.*)/service/(?P<service_url>.*)/', ConferenceServiceView.as_view()),
# conf list
url(r'conference/(?P<year>\d+)/(?P<month>.*)/page/(?P<page>\d+)/$', ConferenceList.as_view()),
url(r'conference/(?P<year>\d+)/page/(?P<page>\d+)/$', ConferenceList.as_view()),
url(r'conference/(?P<year>\d+)/(?P<month>.*)/$', ConferenceList.as_view()),
url(r'conference/(?P<year>\d+)/$', ConferenceList.as_view()),
url(r'conference/page/(?P<page>\d+)/$', ConferenceList.as_view()),
# conf page
url(r'conference/(?P<slug>.*)/$', ConferenceDetail.as_view()),
url(r'conference/$', ConferenceList.as_view()),
) )
"""
"""

@ -1,12 +1,368 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.http import HttpResponse
from models import Conference
from functions.custom_views import ExpoListView
import json import json
import datetime
from django.conf import settings
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.contrib import messages
from django.shortcuts import get_object_or_404
from django.contrib.contenttypes.models import ContentType
from django.views.generic import ListView, DetailView
from django.views.generic.edit import FormMixin
from django.utils.translation import ugettext as _
from django.utils import translation
from note.models import Note
from models import Conference
from accounts.models import User
from country.models import Country
from city.models import City
from theme.models import Theme, Tag
from service.order_forms import AdvertiseForm
from functions.search_forms import ExpositionSearchForm
MONTHES = settings.MONTHES
class ConferenceBy(ListView):
template_name = 'conference/conference_by.html'
title1 = ''
title2 = ''
"""
abstact class
"""
def get_context_data(self, **kwargs):
context = super(ConferenceBy, self).get_context_data(**kwargs)
context.update({'title1': self.title1, 'title2': self.title2, 'catalog': self.catalog})
return context
class ConferenceByCountry(ConferenceBy):
model = Country
title1 = _(u'По странам')
title2 = _(u'Коференции мира по странам')
catalog = 'country/'
def get_queryset(self):
lang = translation.get_language()
return self.model.objects.select_related('conference_country')\
.filter(conference_country__country__isnull=False, translations__language_code=lang)\
.order_by('translations__name').distinct()
class ConferenceByTheme(ConferenceBy):
model = Theme
title1 = _(u'По тематикам')
title2 = _(u'Коференции мира по тематикам')
catalog = 'theme/'
def get_queryset(self):
lang = translation.get_language()
return self.model.objects.select_related('conference_themes')\
.filter(conference_themes__theme__isnull=False, translations__language_code=lang)\
.order_by('translations__name').distinct()
class ConferenceByCity(ConferenceBy):
model = City
title1 = _(u'По городам')
title2 = _(u'Коференции мира по городам')
catalog = 'city/'
class ConferenceView(ExpoListView): def get_queryset(self):
lang = translation.get_language()
return self.model.objects.select_related('conference_city')\
.filter(conference_city__city__isnull=False, translations__language_code=lang)\
.order_by('translations__name').distinct()
class ConferenceCatalog(ListView):
model = Conference model = Conference
template_name = 'event_catalog.html' paginate_by = settings.CLIENT_PAGINATION
template_name = 'client/conference/catalog.html'
search_form = ExpositionSearchForm
filter_object = None
year = None
month = None
country = None
city = None
def get_filtered_qs(self):
# diferent for views
pass
def get_queryset(self):
qs = self.get_filtered_qs()
year = self.kwargs.get('year')
if year:
qs = qs.filter(data_begin__year=year)
# info for breadscrumbs
if self.country:
self.year = {'text': year, 'link': '%s%s/country/%s/%s/'%
(self.catalog_url, self.filter_object.url, self.country.url, year)
}
elif self.city:
self.year = {'text': year, 'link': '%s%s/city/%s/%s/'%
(self.catalog_url, self.filter_object.url, self.city.url, year)
}
else:
self.year = {'text': year, 'link': '%s%s/%s/'%(self.catalog_url, self.filter_object.url, year)}
month = self.kwargs.get('month')
monthes = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')},
'mar': {'value': 3, 'name': _(u'Март')}, 'apr': {'value': 4, 'name': _(u'Апрель')},
'may': {'value': 5, 'name': _(u'Май')}, 'jun': {'value': 6, 'name': _(u'Июнь')},
'jul': {'value': 7, 'name': _(u'Июль')}, 'aug': {'value': 8, 'name': _(u'Август')},
'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')},
'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}}
if month and monthes.get(month):
qs = qs.filter(data_begin__month=monthes[month]['value'])
if self.country:
self.month = {'text': monthes[month]['name'], 'link': '%s%s/country/%s/%s/%s/'%
(self.catalog_url, self.filter_object.url, self.country.url, year, month)}
elif self.city:
self.month = {'text': monthes[month]['name'], 'link': '%s%s/city/%s/%s/%s/'%
(self.catalog_url, self.filter_object.url, self.city.url, year, month)}
else:
self.month = {'text': monthes[month]['name'], 'link': '%s%s/%s/%s/'%(self.catalog_url, self.filter_object.url, year, month)}
return qs.order_by('data_begin')
def get_context_data(self, **kwargs):
context = super(ConferenceCatalog, self).get_context_data(**kwargs)
context['search_form'] = self.search_form
context['filter_object'] = self.filter_object
context['year'] = self.year
context['month'] = self.month
context['catalog_url'] = self.catalog_url
return context
class ConferenceCountryCatalog(ConferenceCatalog):
catalog_url = '/conference/country/'
def get_filtered_qs(self):
#this method used in parent get_queryset
slug = self.kwargs.get('slug')
country = get_object_or_404(Country, url=slug)
self.filter_object = country
qs = self.model.enable.filter(country=country)
return qs
class ConferenceCityCatalog(ConferenceCatalog):
catalog_url = '/conference/city/'
def get_filtered_qs(self):
#this method used in parent get_queryset
slug = self.kwargs.get('slug')
city = get_object_or_404(City, url=slug)
qs = self.model.enable.filter(city=city)
self.filter_object = city
return qs
class ConferenceThemeCatalog(ConferenceCatalog):
template_name = 'conference/catalog_theme.html'
catalog_url = '/conference/theme/'
country = None
city = None
def get_filtered_qs(self):
#this method used in parent get_queryset
slug = self.kwargs.get('slug')
country_slug = self.kwargs.get('country_slug')
city_slug = self.kwargs.get('city_slug')
theme = get_object_or_404(Theme, url=slug)
qs = self.model.enable.filter(theme=theme)
if country_slug:
country = get_object_or_404(Country, url=country_slug)
self.country = country
qs = qs.filter(country=country)
if city_slug:
city = get_object_or_404(City, url=city_slug)
self.city = city
qs = qs.filter(city=city)
self.filter_object = theme
return qs
def get_context_data(self, **kwargs):
context = super(ConferenceThemeCatalog, self).get_context_data(**kwargs)
if self.country:
context['country'] = self.country
if self.city:
context['city'] = self.city
return context
class ConferenceTagCatalog(ConferenceCatalog):
catalog_url = '/conference/tag/'
def get_filtered_qs(self):
#this method used in parent get_queryset
slug = self.kwargs.get('slug')
tag = get_object_or_404(Tag, url=slug)
qs = self.model.enable.filter(tag=tag)
self.filter_object = tag
return qs
class ConferenceVisitors(ListView):
paginate_by = settings.CLIENT_PAGINATION
model = Conference
#template_name = 'event_visitors.html'
template_name = 'client/conference/visitors.html'
obj = None
search_form = ExpositionSearchForm
def get_queryset(self):
slug = self.kwargs.get('slug')
conference = get_object_or_404(self.model, url=slug)
self.obj = conference
return conference.users.all()
def get_context_data(self, **kwargs):
context = super(ConferenceVisitors, self).get_context_data(**kwargs)
context['object'] = self.obj
context['search_form'] = self.search_form
return context
class ConferenceMembers(ListView):
paginate_by = settings.CLIENT_PAGINATION
model = Conference
#template_name = 'event_visitors.html'
template_name = 'client/conference/members.html'
obj = None
search_form = ExpositionSearchForm
def get_queryset(self):
slug = self.kwargs.get('slug')
conference = get_object_or_404(self.model, url=slug)
self.obj = conference
return conference.company.all()
def get_context_data(self, **kwargs):
context = super(ConferenceMembers, self).get_context_data(**kwargs)
context['object'] = self.obj
context['search_form'] = self.search_form
return context
from service.models import Service
from service.views import order_forms
class ConferenceServiceView(FormMixin, DetailView):
model = Conference
slug_field = 'url'
service = None
def post(self, request, *args, **kwargs):
self.object = self.get_object()
service_url = self.kwargs.get('service_url')
service = get_object_or_404(Service, url=service_url)
service_form = order_forms.get(service_url)
self.form_class = service_form
form = self.get_form(service_form)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_context_data(self, **kwargs):
context = super(ConferenceServiceView, self).get_context_data(**kwargs)
service_url = self.kwargs.get('service_url')
service = get_object_or_404(Service, url=service_url)
self.service = service
self.template_name = service.template
form = order_forms.get(service_url)
self.form_class = form
if not form:
raise Http404
context['form'] = self.get_form(self.form_class)
context['service'] = service
context['object'] = self.get_object()
return context
def form_valid(self, form):
order = form.save(commit=False)
order.conference = self.object
order.save()
messages.success(self.request, _(u'Ваш запрос был успешно отправлен'))
return HttpResponseRedirect(self.request.path)
def get_initial(self):
"""
Returns the initial data to use for forms on this view.
"""
if self.request.user.is_authenticated():
user = self.request.user
initial = {'person_inf': user.get_full_name(),
'person': user.email,
'country': user.profile.country.name if user.profile.country else '',
'city':user.profile.city.name if user.profile.city else '',
'phone': user.profile.phone if user.profile.phone else ''}
return initial
else:
return self.initial.copy()
class ConferenceDetail(DetailView):
model = Conference
slug_field = 'url'
template_name = 'client/conference/conference_detail.html'
def get_context_data(self, **kwargs):
context = super(ConferenceDetail, self).get_context_data(**kwargs)
context['advertising_form'] = AdvertiseForm()
return context
class ConferenceList(ListView):
model = Conference
paginate_by = settings.CLIENT_PAGINATION
template_name = 'client/conference/conference_list.html'
search_form = ExpositionSearchForm
catalog_url = '/conference/'
year = None
month = None
def get_queryset(self):
if self.request.user.is_staff:
now = datetime.datetime.now().date()
qs = self.model.objects.filter(data_begin__gte=now).order_by('data_begin')
else:
qs = self.model.enable.all()
year = self.kwargs.get('year')
if year:
qs = qs.filter(data_begin__year=year)
# info for breadscrumbs
self.year = {'text': year, 'link': '%s%s/'%(self.catalog_url, year)}
month = self.kwargs.get('month')
if month and MONTHES.get(month):
qs = qs.filter(data_begin__month=MONTHES[month]['value'])
self.month = {'text': MONTHES[month]['name'], 'link': '%s%s/%s/'%(self.catalog_url, year, month)}
return qs
def get_context_data(self, **kwargs):
context = super(ConferenceList, self).get_context_data(**kwargs)
context['month'] = self.month
context['catalog_url'] = self.catalog_url
context['search_form'] = self.search_form
context['year'] = self.year
context['month'] = self.month
return context
def conference_add_calendar(request, id): def conference_add_calendar(request, id):
args = {'success': False} args = {'success': False}
@ -14,38 +370,32 @@ def conference_add_calendar(request, id):
if user.is_authenticated(): if user.is_authenticated():
conf = Conference.objects.safe_get(id=id) conf = Conference.objects.safe_get(id=id)
if conf: if conf in user.calendar.get_confs():
user.calendar.conferences.remove(conf)
args['in'] = False
else:
user.calendar.conferences.add(conf) user.calendar.conferences.add(conf)
args['success'] = True args['in'] = True
else:
args['not_authorized'] = True
args['success'] = True args['success'] = True
return HttpResponse(json.dumps(args), content_type='application/json')
def conference_remove_calendar(request, id):
args = {'success': False}
if request.user:
user = request.user
conf = Conference.objects.safe_get(id=id)
if conf:
user.calendar.conferences.remove(conf)
args['success'] = True
else: else:
args['not_authorized'] = True args['not_authorized'] = True
args['success'] = True args['success'] = True
return HttpResponse(json.dumps(args), content_type='application/json') return HttpResponse(json.dumps(args), content_type='application/json')
def conference_visit(request, id): def conference_visit(request, id):
args = {'success': False} args = {'success': False}
user = request.user user = request.user
if user.is_authenticated(): if user.is_authenticated():
conf = Conference.objects.safe_get(id=id) conf = Conference.objects.safe_get(id=id)
if conf: if user in conf.users.all():
conf.users.remove(user)
args['in'] = False
else:
conf.users.add(user) conf.users.add(user)
args['success'] = True args['in'] = True
args['success'] = True
else: else:
args['not_authorized'] = True args['not_authorized'] = True
@ -53,18 +403,34 @@ def conference_visit(request, id):
return HttpResponse(json.dumps(args), content_type='application/json') return HttpResponse(json.dumps(args), content_type='application/json')
def conference_unvisit(request, id): def add_note(request, slug):
args = {'success': False} args = {'success': False}
user = request.user
if user.is_authenticated(): if request.user.is_authenticated():
conf = Conference.objects.safe_get(id=id)
if conf: if request.GET:
conf.users.remove(user) text = request.GET['note_text']
try:
conf = Conference.objects.get(url=slug)
except Conference.DoesNotExist:
raise Http404
ct = ContentType.objects.get_for_model(conf)
object_id = conf.id
user = User.objects.get(id=request.user.id)
if Note.objects.filter(user=user, content_type=ct, object_id=object_id).exists():
Note.objects.filter(user=user, content_type=ct, object_id=object_id).update(text=text)
else:
Note.objects.create(content_type=ct, object_id=object_id, user=user, text=text)
user.calendar.conferences.add(conf)
args['success'] = True
args['text'] = text
else: else:
args['not_authorized'] = True args['not_authorized'] = True
args['success'] = True args['success'] = True
return HttpResponse(json.dumps(args), content_type='application/json') return HttpResponse(json.dumps(args), content_type='application/json')

@ -13,6 +13,9 @@ from service.models import Service
from exposition.models import Exposition from exposition.models import Exposition
from place_exposition.models import PlaceExposition from place_exposition.models import PlaceExposition
from organiser.models import Organiser from organiser.models import Organiser
from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
# func # func
from functions.custom_fields import EnumField from functions.custom_fields import EnumField
from functions.db import db_table_exists from functions.db import db_table_exists
@ -164,6 +167,18 @@ class Country(TranslatableModel):
return len(Exposition.objects.filter(country=self.id)) return len(Exposition.objects.filter(country=self.id))
def conferences_number(self):
return Conference.objects.filter(country=self.id).count()
def seminars_number(self):
return Seminar.objects.filter(country=self.id).count()
def webinars_number(self):
return Webinar.objects.filter(country=self.id).count()
def active_cities(self): def active_cities(self):
lang = translation.get_language() lang = translation.get_language()
return City.objects.select_related('exposition_city')\ return City.objects.select_related('exposition_city')\

@ -28,6 +28,8 @@ from functions.admin_forms import AdminFilterForm
places = [(item.id, item.name) for item in PlaceExposition.objects.language().all()] places = [(item.id, item.name) for item in PlaceExposition.objects.language().all()]
places.insert(0,('', 'Не выбрано')) places.insert(0,('', 'Не выбрано'))
class ExpositionCreateForm(forms.Form): class ExpositionCreateForm(forms.Form):
""" """
Create Exposition form for creating exposition Create Exposition form for creating exposition
@ -80,10 +82,6 @@ class ExpositionCreateForm(forms.Form):
application_deadline = forms.DateField(label=u'Срок подачи стенда', required=False) application_deadline = forms.DateField(label=u'Срок подачи стенда', required=False)
min_stand_size = forms.CharField(label=u'Минимальный размер стенда', required=False) min_stand_size = forms.CharField(label=u'Минимальный размер стенда', required=False)
#price_day = forms.CharField(label=u'Цена за 1 день', required=False)
#price_all = forms.CharField(label=u'Цена за все дни', required=False)
#price_day_bar = forms.CharField(label=u'Цена на стойке 1 день', required=False)
#price_all_bar = forms.CharField(label=u'Цена на стойке все дни', required=False)
price_catalog = forms.CharField(label=u'Цена за каталог', required=False) price_catalog = forms.CharField(label=u'Цена за каталог', required=False)
tax = forms.BooleanField(label=u'Налог включен', initial=True, required=False) tax = forms.BooleanField(label=u'Налог включен', initial=True, required=False)
min_closed_area = forms.CharField(label=u'Минимальная цена закрытой НЕ оборудованной площади', required=False) min_closed_area = forms.CharField(label=u'Минимальная цена закрытой НЕ оборудованной площади', required=False)
@ -227,6 +225,8 @@ class ExpositionCreateForm(forms.Form):
if data.get('place'): if data.get('place'):
exposition.place = PlaceExposition.objects.get(id=data['place']) exposition.place = PlaceExposition.objects.get(id=data['place'])
else:
exposition.place = None
# fill translated fields and save object # fill translated fields and save object
fill_with_signal(Exposition, exposition, data) fill_with_signal(Exposition, exposition, data)

@ -28,7 +28,7 @@ class Command(BaseCommand):
row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)] row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)]
labels = [label for label in row_list[0]] labels = [label for label in row_list[0]]
existing = 0 existing = 0
for row_number, row in enumerate(row_list[1246:]): for row_number, row in enumerate(row_list[1:]):
#print(row_number) #print(row_number)
if row[0] != '': if row[0] != '':

@ -19,6 +19,8 @@ from functions.model_mixin import EventMixin, ExpoMixin
from functions.translate import fill_with_signal from functions.translate import fill_with_signal
from photologue.models import Gallery from photologue.models import Gallery
from import_xls.model_utils import ExpoImportManager from import_xls.model_utils import ExpoImportManager
from functions.models_methods import hvad_to_dict
AUDIENCE1 = ((None,_(u'Не выбрано')), AUDIENCE1 = ((None,_(u'Не выбрано')),
('experts', _(u'Специалисты')), ('experts', _(u'Специалисты')),
@ -28,11 +30,10 @@ AUDIENCE1 = ((None,_(u'Не выбрано')),
AUDIENCE = (None,'experts', 'experts and consumers', 'general public') AUDIENCE = (None,'experts', 'experts and consumers', 'general public')
BIT_AUDIENCE = (('experts', _(u'Специалисты')), ('experts and consumers', _(u'Специалисты и потребители')), BIT_AUDIENCE = settings.BIT_AUDIENCE
('general public', _(u'Широкая публика')))
CURRENCY = ('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR') CURRENCY = settings.CURRENCY
# check if table exist and create flags if true # check if table exist and create flags if true
flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else []
@ -284,48 +285,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
return code return code
return cur return cur
def clone(self):
"""
Return an identical copy of the instance with a new ID.
"""
if not self.pk:
raise ValueError('Instance must be saved before it can be cloned.')
duplicate = copy.copy(self)
# Setting pk to None. Django thinking this is a new object.
duplicate.pk = None
# url must be unique
duplicate.url += '_copy'
if Exposition.objects.safe_get(url=duplicate.url):
#already has copy this instance
return
# duplicate should not be published
duplicate.is_published = False
duplicate.cancel_by_administrator = False
ignore_fields = ['id', 'master', 'language_code']
duplicate.translate('ru')
tr = self._meta.translations_model.objects.get(language_code = 'ru',master__id=self.pk)
for field in duplicate._translated_field_names:
if field in ignore_fields:
continue
setattr(duplicate, field, getattr(tr, field))
duplicate.save()
# but lost all ManyToMany relations and Translations.
# copy relations
for field in self._meta.many_to_many:
source = getattr(self, field.attname)
destination = getattr(duplicate, field.attname)
for item in source.all():
destination.add(item)
return duplicate
class Statistic(TranslatableModel): class Statistic(TranslatableModel):
exposition = models.ForeignKey(Exposition, related_name='statistic') exposition = models.ForeignKey(Exposition, related_name='statistic')
@ -343,10 +302,6 @@ class Statistic(TranslatableModel):
return hvad_to_dict(self) return hvad_to_dict(self)
from django.core import serializers
from functions.models_methods import hvad_to_dict
class TimeTable(TranslatableModel): class TimeTable(TranslatableModel):
""" """
TimeTable for business program TimeTable for business program
@ -389,32 +344,7 @@ class TmpTimeTable(TranslatableModel):
place = models.CharField(verbose_name='Место проведения', max_length=255, blank=True) place = models.CharField(verbose_name='Место проведения', max_length=255, blank=True)
) )
def clone(self, exposition=None):
"""
Return an identical copy of the instance with a new ID.
"""
if not self.pk:
raise ValueError('Instance must be saved before it can be cloned.')
duplicate = copy.copy(self)
# Setting pk to None. Django thinking this is a new object.
duplicate.pk = None
duplicate.exposition = exposition
ignore_fields = ['id', 'master', 'language_code']
duplicate.translate('ru')
tr = self._meta.translations_model.objects.get(language_code = 'ru',master__id=self.pk)
for field in duplicate._translated_field_names:
if field in ignore_fields:
continue
setattr(duplicate, field, getattr(tr, field))
duplicate.save()
return duplicate
pre_save.connect(pre_save_handler, sender=Exposition) pre_save.connect(pre_save_handler, sender=Exposition)
post_save.connect(post_save_handler, sender=Exposition) post_save.connect(post_save_handler, sender=Exposition)

@ -16,7 +16,7 @@ urlpatterns = patterns('',
url(r'exposition-visit/(?P<id>\d+)/$', 'exposition.views.exposition_visit'), url(r'exposition-visit/(?P<id>\d+)/$', 'exposition.views.exposition_visit'),
# search # search
url(r'expo/search/', ExpositionSearchView.as_view()), url(r'expo/search/', ExpositionSearchView.as_view()),
#url(r'expo/search/', 'exposition.views.search_test'),
# country catalog # country catalog

@ -19,6 +19,7 @@ from country.models import Country
from city.models import City from city.models import City
from theme.models import Theme, Tag from theme.models import Theme, Tag
from note.models import Note from note.models import Note
from service.order_forms import AdvertiseForm
from functions.search_forms import ExpositionSearchForm from functions.search_forms import ExpositionSearchForm
from functions.custom_views import ExpoSearchView from functions.custom_views import ExpoSearchView
@ -85,20 +86,6 @@ class ExpositionSearchView(ExpoSearchView):
search_form = ExpositionSearchForm search_form = ExpositionSearchForm
model = Exposition model = Exposition
"""
def search_test(request):
if request.GET:
form = ExpositionSearchForm(request.GET)
if form.is_valid():
form.data_with_parents = form.get_form_data()
object_list = form.search()
context = {}
context['object_list'] = object_list
context['search_form'] = form
return render_to_response('client/exposition/search.html', context)
"""
def exposition_add_calendar(request, id): def exposition_add_calendar(request, id):
args = {'success': False} args = {'success': False}
@ -132,12 +119,6 @@ def exposition_visit(request, id):
args['in'] = True args['in'] = True
args['success'] = True args['success'] = True
"""
if exp:
exp.users.add(user)
args['success'] = True
"""
else: else:
args['not_authorized'] = True args['not_authorized'] = True
args['success'] = True args['success'] = True
@ -145,7 +126,7 @@ def exposition_visit(request, id):
return HttpResponse(json.dumps(args), content_type='application/json') return HttpResponse(json.dumps(args), content_type='application/json')
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
from service.order_forms import AdvertiseForm
class ExpoDetail(DetailView): class ExpoDetail(DetailView):
model = Exposition model = Exposition
slug_field = 'url' slug_field = 'url'
@ -273,12 +254,7 @@ class ExpoList(ListView):
context['month'] = self.month context['month'] = self.month
return context return context
MONTHES = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')}, MONTHES = settings.MONTHES
'mar': {'value': 3, 'name': _(u'Март')}, 'apr': {'value': 4, 'name': _(u'Апрель')},
'may': {'value': 5, 'name': _(u'Май')}, 'jun': {'value': 6, 'name': _(u'Июнь')},
'jul': {'value': 7, 'name': _(u'Июль')}, 'aug': {'value': 8, 'name': _(u'Август')},
'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')},
'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}}
class ExpoCatalog(ListView): class ExpoCatalog(ListView):
model = Exposition model = Exposition

@ -339,15 +339,18 @@ event_sett = {
u'Дата окончания:(YYYY-MM-DD)':{u'field': u'data_end', u'func': to_date}, u'Дата окончания:(YYYY-MM-DD)':{u'field': u'data_end', u'func': to_date},
u'Страна':{u'field': u'country', u'func': to_country}, u'Страна':{u'field': u'country', u'func': to_country},
u'Город':{u'field': u'city_id', u'func': to_city, 'extra_values': 'country'}, u'Город':{u'field': u'city_id', u'func': to_city, 'extra_values': 'country'},
u'Место проведения':{u'field': u'place', u'func': to_place}, #u'Место проведения':{u'field': u'place', u'func': to_place},
u'ID Тематики':{u'field': u'theme', u'func': to_theme, u'method': True},### u'ID Тематики':{u'field': u'theme', u'func': to_theme, u'method': True},###
u'Теги':{u'field': u'tag', u'func': to_tag, u'method': True}, u'Теги':{u'field': u'tag', u'func': to_tag, u'method': True},
#u'Организатор №1':{u'field': u'organiser', u'func': to_tag},#### #u'Организатор №1':{u'field': u'organiser', u'func': to_tag},####
#u'Организатор №2':{u'field': u'organiser', u'func': to_tag},#### #u'Организатор №2':{u'field': u'organiser', u'func': to_tag},####
u'Описание события':{u'field': u'description', u'func': unicode}, u'Описание события':{u'field': u'description', u'func': unicode},
u'Основные темы':{u'field': u'main_themes', u'func': unicode},
u'Условия и скидка':{u'field': u'discount_description', u'func': unicode},
u'Периодичность':{u'field': u'periodic', u'func': to_periodic},### u'Периодичность':{u'field': u'periodic', u'func': to_periodic},###
u'Аудитория':{u'field': u'audience', u'func': to_audience}, u'Аудитория':{u'field': u'audience', u'func': to_audience},
u'Официальный веб-сайт':{u'field': u'web_page', u'func': to_url}, u'Официальный веб-сайт':{u'field': u'web_page', u'func': to_url},
u'Линк на регистрацию':{u'field': u'link', u'func': to_url},
u'Экспонируемые продукты':{u'field': u'products', u'func': unicode}, u'Экспонируемые продукты':{u'field': u'products', u'func': unicode},
u'Время работы':{u'field': u'time', u'func': unicode}, u'Время работы':{u'field': u'time', u'func': unicode},
u'Логотип':{u'field': u'logo', u'func': save_logo, u'method': True}, u'Логотип':{u'field': u'logo', u'func': save_logo, u'method': True},

@ -9,9 +9,11 @@ from file.models import TmpFile, FileModel
from file.forms import FileModelForm, FileForm from file.forms import FileModelForm, FileForm
from city.models import City from city.models import City
from theme.models import Tag from theme.models import Tag
from article.models import Article
from django.db.models.loading import get_model from django.db.models.loading import get_model
def admin_home(request): def admin_home(request):
return render_to_response('base.html') return render_to_response('base.html')
@ -39,6 +41,24 @@ def ajax_tag(request):
else: else:
#request empty - send empty array #request empty - send empty array
return HttpResponse('[]', content_type='application/json') return HttpResponse('[]', content_type='application/json')
def get_news(request):
"""
return array of tags (id, name) filtered by theme values from request
"""
term = request.GET['term'].capitalize()
if not term:
qs = Article.objects.news()[:50]
else:
qs = Article.objects.news().filter(translations__main_title__contains=term)
result = [{'id': item.id, 'label': item.main_title} for item in qs]
return HttpResponse(json.dumps(result), content_type='application/json')
''' '''
def ajax_post_file(request, obj_id=None): def ajax_post_file(request, obj_id=None):
""" """

@ -45,6 +45,7 @@ urlpatterns = required(
url(r'^ajax_delete_file/', 'proj.admin.ajax_delete_file'), url(r'^ajax_delete_file/', 'proj.admin.ajax_delete_file'),
url(r'^ajax_city/', 'proj.admin.ajax_city'), url(r'^ajax_city/', 'proj.admin.ajax_city'),
url(r'^ajax_tag/', 'proj.admin.ajax_tag'), url(r'^ajax_tag/', 'proj.admin.ajax_tag'),
url(r'^ajax/get-news/', 'proj.admin.get_news'),
# #
url(r'^ckeditor/', include('ckeditor.urls')), url(r'^ckeditor/', include('ckeditor.urls')),
url(r'^tinymce/', include('tinymce.urls')), url(r'^tinymce/', include('tinymce.urls')),

@ -26,6 +26,7 @@ DATABASES = {
'PORT': '', 'PORT': '',
} }
} }
''' '''
CACHES = { CACHES = {
'default': { 'default': {
@ -76,10 +77,9 @@ USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes. # If you set this to False, Django will not use timezone-aware datetimes.
USE_TZ = True USE_TZ = True
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/" MEDIA_ROOT = os.path.join(SITE_ROOT, 'media/')
MEDIA_ROOT = os.path.join(SITE_ROOT, 'media/')#'/home/kotzilla/Documents/qwer/proj/media/' CKEDITOR_UPLOAD_PATH = os.path.join(SITE_ROOT, 'media/upload')
CKEDITOR_UPLOAD_PATH = os.path.join(SITE_ROOT, 'media/upload')#'/home/kotzilla/Documents/qwer/proj/media/upload'
CKEDITOR_CONFIGS = { CKEDITOR_CONFIGS = {
@ -95,37 +95,13 @@ CKEDITOR_CONFIGS = {
}, },
} }
#TINYMCE_JS_URL = os.path.join(MEDIA_ROOT, "js/tiny_mce/tiny_mce.js")
#TINYMCE_DEFAULT_CONFIG = {
# 'plugins': "table,spellchecker,paste,searchreplace",
# 'theme': "advanced",
# 'cleanup_on_startup': True,
# 'custom_undo_redo_levels': 10,
# 'width' : 565,
# 'height' : 100
#}
#TINYMCE_SPELLCHECKER = True
#TINYMCE_COMPRESSOR = True
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://example.com/media/", "http://media.example.com/"
MEDIA_URL = '/media/' MEDIA_URL = '/media/'
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = os.path.join(SITE_ROOT, 'static') STATIC_ROOT = os.path.join(SITE_ROOT, 'static')
# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = '/static/' STATIC_URL = '/static/'
# Additional locations of static files
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = ( STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
@ -135,7 +111,7 @@ STATICFILES_FINDERS = (
# Make this unique, and don't share it with anybody. # Make this unique, and don't share it with anybody.
SECRET_KEY = '=yz1@ko%1s8bmel)c84#s*xpxn%4(1e+smdnh*@rdm*5%v!mln' SECRET_KEY = '=yz1@ko%1s8bmel)c84#s*xpxn%4(1e+smdnh*@rdm*5%v!mln'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = ( TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader', 'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader', 'django.template.loaders.app_directories.Loader',
@ -346,7 +322,7 @@ INSTALLED_APPS = (
'bitfield', 'bitfield',
'djutils', 'djutils',
'pytils', 'pytils',
'pymorphy', #'pymorphy',
'password_reset', 'password_reset',
#'social_auth', #'social_auth',
'social.apps.django_app.default', 'social.apps.django_app.default',
@ -419,3 +395,15 @@ 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'
# events settings
CURRENCY = ('RUB', 'USD', 'EUR', 'RMB', 'GBP', 'AED', 'SGD', 'TRY', 'CZK', 'CHF', 'SEK', 'LKR', 'UAH', 'IDR', 'PLN','JPY')
BIT_AUDIENCE = (('experts', _(u'Специалисты')), ('experts and consumers', _(u'Специалисты и потребители')),
('general public', _(u'Широкая публика')))
MONTHES = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')},
'mar': {'value': 3, 'name': _(u'Март')}, 'apr': {'value': 4, 'name': _(u'Апрель')},
'may': {'value': 5, 'name': _(u'Май')}, 'jun': {'value': 6, 'name': _(u'Июнь')},
'jul': {'value': 7, 'name': _(u'Июль')}, 'aug': {'value': 8, 'name': _(u'Август')},
'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')},
'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}}

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json
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.core.context_processors import csrf from django.core.context_processors import csrf
@ -56,6 +57,7 @@ from conference.models import Conference
from seminar.models import Seminar from seminar.models import Seminar
from webinar.models import Webinar from webinar.models import Webinar
from theme.models import Theme from theme.models import Theme
from article.models import Article
import datetime import datetime
def main_page(request): def main_page(request):
@ -70,10 +72,21 @@ def main_page(request):
exposition_themes = Theme.objects.filter(main_page__gt=0, types=Theme.types.exposition) exposition_themes = Theme.objects.filter(main_page__gt=0, types=Theme.types.exposition)
confrence_themes = Theme.objects.filter(main_page__gt=0, types=Theme.types.conference) confrence_themes = Theme.objects.filter(main_page__gt=0, types=Theme.types.conference)
seminar_themes = Theme.objects.filter(main_page__gt=0, types=Theme.types.seminar) seminar_themes = Theme.objects.filter(main_page__gt=0, types=Theme.types.seminar)
news = Article.objects.news().filter(main_page=1)
blogs = Article.objects.blogs().filter(main_page=1)
themes = {'exposition_themes': exposition_themes, 'conference_themes': confrence_themes, themes = {'exposition_themes': exposition_themes, 'conference_themes': confrence_themes,
'seminar_themes':seminar_themes} 'seminar_themes':seminar_themes}
args = {'event_form':MainPageEvent(initial=events), 'theme_form':MainPageThemes(initial=themes), 'article_form':MainPageArticle(),
'news_form':MainPageNews(), 'photoreport_form':MainPagePhotoreport(),} news_form = MainPageNews(initial={'main_page_news':','.join(['%d'%item.id for item in news])})
a = [{'id': int(item.id), 'text': item.main_title} for item in news]
news_form.fields['main_page_news'].widget.attrs['data-init-text'] = json.dumps(a)
article_form = MainPageArticle(initial={'article' : blogs})
args = {'event_form' : MainPageEvent(initial=events), 'theme_form' : MainPageThemes(initial=themes),
'article_form' : article_form,
'news_form' : news_form, 'photoreport_form' : MainPagePhotoreport(),}
args.update(csrf(request)) args.update(csrf(request))
return render_to_response('admin/settings/main_page.html', args) return render_to_response('admin/settings/main_page.html', args)

@ -7,6 +7,6 @@ urlpatterns = patterns('settings.admin',
url(r'^main-page/photoreports/$', 'handle_photoreports'), url(r'^main-page/photoreports/$', 'handle_photoreports'),
url(r'^main-page/themes/$', 'handle_themes'), url(r'^main-page/themes/$', 'handle_themes'),
url(r'^main-page/news/$', 'handle_news'), url(r'^main-page/news/$', 'handle_news'),
url(r'^main-page/articles/$', 'handle_articles'), url(r'^main-page/blogs/$', 'handle_articles'),
url(r'^$', 'change_settings'), url(r'^$', 'change_settings'),
) )

@ -146,20 +146,33 @@ class MainPagePhotoreport(forms.Form):
class MainPageNews(forms.Form): class MainPageNews(forms.Form):
news = forms.ModelMultipleChoiceField(queryset=News.objects.all()) main_page_news = forms.CharField(label=u'Новости', widget=forms.HiddenInput(), required=False,)
def save(self): def save(self):
data = self.cleaned_data data = self.cleaned_data
news = data['news'] news = data['main_page_news']
Article.objects.news().exclude(id__in=[item.id for item in news]).update(main_page=0)
news.update(main_page=1) news.update(main_page=1)
def clean_main_page_news(self):
news = self.cleaned_data['main_page_news']
if news:
news = news.split(',')
qs = Article.objects.news().filter(id__in=news)
else:
qs = Article.objects.none()
return qs
class MainPageArticle(forms.Form): class MainPageArticle(forms.Form):
article = forms.ModelMultipleChoiceField(queryset=Article.objects.all()) article = forms.ModelMultipleChoiceField(queryset=Article.objects.blogs(), required=False,
widget=forms.SelectMultiple(attrs={'style': 'width: 100%;'}))
def save(self): def save(self):
data = self.cleaned_data data = self.cleaned_data
articles = data['articles'] articles = data['article']
Article.objects.blogs().exclude(id__in=[item.id for item in articles]).update(main_page=0)
articles.update(main_page=1) articles.update(main_page=1)
def save(self):
pass

@ -274,7 +274,52 @@ $(document).ready(function(){
}); });
$('#id_main_page_news').select2({
placeholder: "Новости",
multiple: true,
width: '100%',
ajax: {
url: "/admin/ajax/get-news/",
dataType: "json",
quietMillis: 200,
data: function(term, page){
return {term: term,
page: page};
},
results: function (data) {
var results = [];
$.each(data, function(index, item){
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection : function(element, callback) {
var text = $(element).attr('data-init-text');
var data = $.parseJSON(text);
console.log(data);
/*
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
console.log(data)
*/
callback(data);
}
});
// selects // selects
$('#id_tag').select2({ $('#id_tag').select2({

@ -18,7 +18,7 @@
{% block body %} {% block body %}
<form method="post" class="form-horizontal" name="form2" id="form2"enctype="multipart/form-data"> {% csrf_token %} <form method="post" class="form-horizontal" name="form2" id="form2"enctype="multipart/form-data"> {% csrf_token %}
<fieldset> <fieldset>
<legend><i class="icon-edit"></i>{% if article %} Изменить {% else %} Добавить {% endif %}статью</legend> <legend><i class="icon-edit"></i>{% if article %} Изменить {% else %} Добавить {% endif %}статью{% if article %}(<a href="{{ article.get_permanent_url }}" target="_blank">на сайте</a>){% endif %}</legend>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
@ -88,6 +88,39 @@
{# descriptions #} {# descriptions #}
{% include 'admin/forms/multilang.html' with field='descriptions' form=form languages=languages %} {% include 'admin/forms/multilang.html' with field='descriptions' form=form languages=languages %}
</div> </div>
</div>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Файлы</h2>
</div>
<div class="box-content">
{% if article %}
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">Добавить файл</a>
{% else %}
<p>Файлы можно добавлять только после введения основных данных</p>
{% endif %}
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
<thead>
<tr>
<td>id</td>
<td>Файл</td>
<td>Имя</td>
<td>Назначение</td>
<td></td>
</tr>
</thead>
<tbody>
{% include 'file_list.html' with files=files %}
</tbody>
</table>
</div>
</div>
</div> </div>
<div class="controls"> <div class="controls">
@ -96,4 +129,6 @@
</div> </div>
</fieldset> </fieldset>
</form> </form>
{% include 'admin/includes/file_form.html' with file_form=file_form object=article %}
{% endblock %} {% endblock %}

@ -0,0 +1,465 @@
{% extends 'base.html' %}
{% load static %}
{% load thumbnail %}
{% block styles %}
.hover{
display:none;
margin-bottom:10px;
}
.photo:hover .hover {
display: block;
}
{% endblock %}
{# Displays exposition form and file form in modal window #}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
<script src="{% static 'tiny_mce/tiny_mce.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
{# datepicker #}
<link href="{% static 'js/datepicker/css/datepicker.css' %}" rel="stylesheet"/>
<script src="{% static 'js/datepicker/js/bootstrap-datepicker.js' %}"></script>
<script src="{% static 'custom_js/formset_add.js' %}"></script>
<!--
{# ajax #}
<script src="{% static 'custom_js/timetable_post.js' %}"></script>
<script src="{% static 'custom_js/place_city_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
-->
{# datetimepicker #}
<link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/>
<script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#id_data_begin').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
$('#id_data_end').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
$('#id_end').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy hh:ii'
});
$('#id_begin').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy hh:ii'
});
$('#id_application_deadline').datetimepicker({
todayHighlight: true,
format : 'dd.mm.yyyy',
minView:2
});
});
</script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>{% if object %} Изменить {% else %} Добавить {% endif %}конференцию{% if object %}(<a target="_blank" href="{{ object.get_permanent_url }}">на сайте</a>){% endif %}</legend>
<div class="box span8" >
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.exposition_id }}
{# name #}
{% with field='name' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# main_title #}
{% with field='main_title' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# data_begin #}
<div class="control-group {% if form.data_begin.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.data_begin.label }}:</b></label>
<div class="controls">{{ form.data_begin }}
<span class="help-inline">{{ form.data_begin.errors }}</span>
</div>
</div>
{# data_end #}
<div class="control-group {% if form.data_end.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.data_end.label }}:</b></label>
<div class="controls">{{ form.data_end }}
<span class="help-inline">{{ form.data_end.errors }}</span>
</div>
</div>
{# country #}
<div class="control-group {% if form.country.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.country.label }}:</b></label>
<div class="controls">{{ form.country }}
<span class="help-inline">{{ form.country.errors }}</span>
</div>
</div>
{# city #}
<div class="control-group {% if form.city.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.city.label }}:</b></label>
<div class="controls">{{ form.city }}
<span class="help-inline">{{ form.city.errors }}</span>
</div>
</div>
{# place #}
<div class="control-group {% if form.place.errors %}error{% endif %}">
<label class="control-label">{{ form.place.label }}:</label>
<div class="controls">{{ form.place }}
<span class="help-inline">{{ form.place.errors }}</span>
</div>
</div>
{# theme #}
<div class="control-group {% if form.theme.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.theme.label }}:</b></label>
<div class="controls">{{ form.theme }}
<span class="help-inline">{{ form.theme.errors }}</span>
</div>
</div>
{# tag #}
<div class="control-group {% if form.tag.errors %}error{% endif %}">
<label class="control-label">{{ form.tag.label }}:</label>
<div class="controls">{{ form.tag }}
<span class="help-inline">{{ form.tag.errors }}</span>
</div>
</div>
</div>
</div>
<div class="box span8" >
<div class="box-header well">
<h2><i class="icon-pencil"></i> Дополнительная информация</h2>
</div>
<div class="box-content">
{# description #}
{% with field='description' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# web_page #}
<div class="control-group {% if form.web_page.errors %}error{% endif %}">
<label class="control-label">{{ form.web_page.label }}:</label>
<div class="controls">{{ form.web_page }}
<span class="help-inline">{{ form.web_page.errors }}</span>
</div>
</div>
{# link #}
<div class="control-group {% if form.link.errors %}error{% endif %}">
<label class="control-label">{{ form.link.label }}:</label>
<div class="controls">{{ form.link }}
<span class="help-inline">{{ form.link.errors }}</span>
</div>
</div>
{# main_themes #}
{% with field='main_themes' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# time #}
{% with field='time' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# foundation_year #}
<div class="control-group {% if form.foundation_year.errors %}error{% endif %}">
<label class="control-label">{{ form.foundation_year.label }}:</label>
<div class="controls">{{ form.foundation_year }}
<span class="help-inline">{{ form.foundation_year.errors }}</span>
</div>
</div>
{# quality_label #}
<div class="control-group {% if form.quality_label.errors %}error{% endif %}">
<label class="control-label">{{ form.quality_label.label }}:</label>
<div class="controls">{{ form.quality_label }}
<span class="help-inline">{{ form.quality_label.errors }}</span>
</div>
</div>
{# canceled #}
<div class="control-group {% if form.canceled.errors %}error{% endif %}">
<label class="control-label">{{ form.canceled.label }}:</label>
<div class="controls">{{ form.canceled }}
<span class="help-inline">{{ form.canceled.errors }}</span>
</div>
</div>
{# moved #}
<div class="control-group {% if form.moved.errors %}error{% endif %}">
<label class="control-label">{{ form.moved.label }}:</label>
<div class="controls">{{ form.moved }}
<span class="help-inline">{{ form.moved.errors }}</span>
</div>
</div>
{# expohit #}
<div class="control-group {% if form.expohit.errors %}error{% endif %}">
<label class="control-label">{{ form.expohit.label }}:</label>
<div class="controls">{{ form.expohit }}
<span class="help-inline">{{ form.expohit.errors }}</span>
</div>
</div>
</div>
</div>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Условия участия</h2>
</div>
<div class="box-content">
{# currency #}
<div class="control-group {% if form.currency.errors %}error{% endif %}">
<label class="control-label">{{ form.currency.label }}:</label>
<div class="controls">{{ form.currency }}
<span class="help-inline">{{ form.currency.errors }}</span>
</div>
</div>
{# tax #}
<div class="control-group {% if form.tax.errors %}error{% endif %}">
<label class="control-label">{{ form.tax.label }}:</label>
<div class="controls">{{ form.tax }}
<span class="help-inline">{{ form.tax.errors }}</span>
</div>
</div>
{# min_price #}
<div class="control-group {% if form.min_price.errors %}error{% endif %}">
<label class="control-label">{{ form.min_price.label }}:</label>
<div class="controls">{{ form.min_price }}
<span class="help-inline">{{ form.min_price.errors }}</span>
</div>
</div>
{# max_price #}
<div class="control-group {% if form.max_price.errors %}error{% endif %}">
<label class="control-label">{{ form.max_price.label }}:</label>
<div class="controls">{{ form.max_price }}
<span class="help-inline">{{ form.max_price.errors }}</span>
</div>
</div>
{# discount #}
<div class="control-group {% if form.discount.errors %}error{% endif %}">
<label class="control-label">{{ form.discount.label }}:</label>
<div class="controls">{{ form.discount }}
<span class="help-inline">{{ form.discount.errors }}</span>
</div>
</div>
{# discount_description #}
{% with field='discount_description' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
</div>
</div>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Деловая программа</h2>
</div>
<div class="box-content">
{% if object %}
<div id="timetable_wrap">
<table class="table">
<colgroup>
<col span="1" style="width: 35%;">
<col span="1" style="width: 10%;">
<col span="1" style="width: 10%;">
<col span="1" style="width: 25%;">
<col span="1" style="width: 10%;">
<col span="1" style="width: 10%;">
</colgroup>
<thead>
<tr>
<th>Программа</th>
<th>Начало</th>
<th>Конец</th>
<th>Спикеры</th>
<th>Организатор</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for timetable in timetables %}
<tr>
<td>{{ timetable.programe|safe }}</td>
<td>{{ timetable.begin|date:"o-m-d H:i" }}</td>
<td>{{ timetable.end|date:"o-m-d H:i" }}</td>
<td>{{ timetable.speaker }}</td>
<td>
{{ timetable.timetable_organiser }}
</td>
<td>
<button class="btn btn-danger remove_timetable" value="{{ timetable.id }}">
Удалить
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<a href="#timetableModal" id="timetable_add" role="btn btn-success" class="btn btn-success" data-toggle="modal"><i class="icon-plus-sign icon-white"></i> Добавить program</a>
{% else %}
<p>Деловую программу можно добавлять только после введения основных данных</p>
{% endif %}
</div>
</div>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Статистика</h2>
</div>
<div class="box-content">
{# foundation_year #}
<div class="control-group {% if form.foundation_year.errors %}error{% endif %}">
<label class="control-label">{{ form.foundation_year.label }}:</label>
<div class="controls">{{ form.foundation_year }}
<span class="help-inline">{{ form.foundation_year.errors }}</span>
</div>
</div>
{# area #}
<div class="control-group {% if form.area.errors %}error{% endif %}">
<label class="control-label">{{ form.area.label }}:</label>
<div class="controls">{{ form.area }}
<span class="help-inline">{{ form.area.errors }}</span>
</div>
</div>
{# members #}
<div class="control-group {% if form.members.errors %}error{% endif %}">
<label class="control-label">{{ form.members.label }}:</label>
<div class="controls">{{ form.members }}
<span class="help-inline">{{ form.members.errors }}</span>
</div>
</div>
{# visitors #}
<div class="control-group {% if form.visitors.errors %}error{% endif %}">
<label class="control-label">{{ form.visitors.label }}:</label>
<div class="controls">{{ form.visitors }}
<span class="help-inline">{{ form.visitors.errors }}</span>
</div>
</div>
{% if object %}
<div style="padding-left: 160px;{% if object %} {% else %}display: none;{% endif %}">
<table class="table table-hover" style=" width: 100%;">
<thead>
<tr>
<td>Год</td>
<td>Посетители</td>
<td>Участники</td>
<td>Площадь</td>
<td></td>
</tr>
</thead>
<tbody>
{% for stat in object.statistic.all %}
<tr>
<td>{{ stat.year }}</td>
<td>{{ stat.visitors }}</td>
<td>{{ stat.members }}</td>
<td>{{ stat.area }}</td>
<td><a class="btn btn-danger delete_stat" href="/admin/ajax_delete_stat/{{ stat.id }}/"><i class="icon-trash icon-white"></i> Удалить</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<a href="#stat_modal" id="stat_add" role="btn btn-success" class="btn btn-success" data-toggle="modal"><i class="icon-plus-sign icon-white"></i> Добавить год</a>
</div>
{% else %}
{% endif %}
</div>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Файлы</h2>
</div>
<div class="box-content">
{% if object %}
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">Добавить файл</a>
{% else %}
<p>Файлы можно добавлять только после введения основных данных</p>
{% endif %}
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
<thead>
<tr>
<td>id</td>
<td>Файл</td>
<td>Имя</td>
<td>Назначение</td>
<td></td>
</tr>
</thead>
<tbody>
{% include 'file_list.html' with files=files %}
</tbody>
</table>
</div>
</div>
</div>
{% include 'admin/includes/photogallery.html' with object=object %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Мета данные</h2>
</div>
<div class="box-content">
{# keywords #}
{% with field='keywords' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# title #}
{% with field='title' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# descriptions #}
{% with field='descriptions' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% include 'admin/includes/photo_form.html' with form=photo_form object=object %}
{% include 'admin/includes/file_form.html' with file_form=file_form object=object %}
{% include 'admin/includes/stat_form.html' with form=stat_form object=object %}
{% endblock %}

@ -78,8 +78,6 @@
{% block body %} {% block body %}
{# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %} <form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %}
<fieldset> <fieldset>
<legend><i class="icon-edit"></i>{% if object %} Изменить {% else %} Добавить {% endif %}выставку{% if object %}(<a target="_blank" href="{{ object.get_permanent_url }}">на сайте</a>){% endif %}</legend> <legend><i class="icon-edit"></i>{% if object %} Изменить {% else %} Добавить {% endif %}выставку{% if object %}(<a target="_blank" href="{{ object.get_permanent_url }}">на сайте</a>){% endif %}</legend>

@ -31,7 +31,7 @@
</div> </div>
<div class="row-fluid sortable"> <div class="row-fluid sortable">
<div class="box span6"> <div class="box span12">
<div class="box-header well" data-original-title> <div class="box-header well" data-original-title>
<h2><i class="icon-tasks"></i> Новости</h2> <h2><i class="icon-tasks"></i> Новости</h2>
</div> </div>
@ -43,12 +43,14 @@
</form> </form>
</div> </div>
</div> </div>
<div class="box span6"> </div>
<div class="row-fluid sortable">
<div class="box span12">
<div class="box-header well" data-original-title> <div class="box-header well" data-original-title>
<h2><i class="icon-tasks"></i> Обзоры</h2> <h2><i class="icon-tasks"></i> Обзоры</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
<form method="post" action="articles/">{% csrf_token %} <form method="post" action="blogs/">{% csrf_token %}
{{ article_form }} {{ article_form }}
<hr/> <hr/>
<button type="submit" class="btn btn-primary" >Сохранить</button> <button type="submit" class="btn btn-primary" >Сохранить</button>

@ -17,7 +17,7 @@
<div class="m-article cl-news blog_block"> <div class="m-article cl-news blog_block">
<div class="blog_block_headline"> <div class="blog_block_headline">
{% include 'includes/article/article_logo.html' with obj=object %} {% include 'client/includes/article/article_logo.html' with obj=object %}
<h1>{{ object.main_title }}</h1> <h1>{{ object.main_title }}</h1>
<strong><span>{{ object.created|date:"d E Y" }}</span><a class="profile_link" href="{{ object.author.get_permanent_url }}" title="">{{ object.author.get_full_name }}</a></strong> <strong><span>{{ object.created|date:"d E Y" }}</span><a class="profile_link" href="{{ object.author.get_permanent_url }}" title="">{{ object.author.get_full_name }}</a></strong>
{{ object.description|safe }} {{ object.description|safe }}

@ -44,7 +44,7 @@
{% include 'includes/article/article_preview.html' with obj=blog %} {% include 'includes/article/article_preview.html' with obj=blog %}
<h3><a href="{{ blog.get_permanent_url }}" title="">{{ blog.main_title }}</a></h3> <h3><a href="{{ blog.get_permanent_url }}" title="">{{ blog.main_title }}</a></h3>
{{ blog.preview }} {{ blog.preview|safe }}
<strong><span>{{ blog.created|date:"d E Y" }}</span>{% if blog.tag.all.exists %}{% include 'includes/article_tags.html' with obj=blog %}{% endif %}</strong> <strong><span>{{ blog.created|date:"d E Y" }}</span>{% if blog.tag.all.exists %}{% include 'includes/article_tags.html' with obj=blog %}{% endif %}</strong>
</div> </div>
</div> </div>

@ -0,0 +1,40 @@
{% extends 'base_catalog.html' %}
{% load template_filters %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<a href="{{ catalog_url }}">{% trans 'Конференции' %}</a>
{% if month %}
<a href="{{ catalog_url }}{{ filter_object.url }}/">{{ filter_object.name }}</a>
<a href="{{ year.link }}">{{ year.text }}</a>
<strong>{{ month.text }}</strong>
{% else %}
{% if year %}
<a href="{{ catalog_url }}{{ filter_object.url }}/">{{ filter_object.name }}</a>
<strong>{{ year.text }}</strong>
{% else %}
<strong>{{ filter_object.name }}</strong>
{% endif %}
{% endif %}
</div>
{% endblock %}
{% block page_title %}
<div class="page-title">
<h1>{% trans 'Конференции' %}: <strong>{{ filter_object.name }}</strong></h1>
</div>
{% include 'includes/exposition/catalog_filter_period.html' %}
{% endblock %}
{% block content_list %}
{% include 'includes/conference/conference_list.html' with object_list=object_list %}
{% endblock %}
{% block paginator %}
{% include 'includes/catalog_paginator.html' with page_obj=page_obj %}
{% endblock %}

@ -0,0 +1,65 @@
{% extends 'base_catalog.html' %}
{% load template_filters %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<a href="{{ catalog_url }}">{% trans 'Конференции' %}</a>
{% if month %}
<a href="{{ catalog_url }}{{ filter_object.url }}/">{{ filter_object.name }}</a>
{% if country %}
<a href="{{ catalog_url }}{{ filter_object.url }}/country/{{ country.url }}">{{ country.name }}</a>
{% endif %}
{% if city %}
<a href="{{ catalog_url }}{{ filter_object.url }}/city/{{ city.url }}">{{ city.name }}</a>
{% endif %}
<a href="{{ year.link }}">{{ year.text }}</a>
<strong>{{ month.text }}</strong>
{% else %}
{% if year %}
<a href="{{ catalog_url }}{{ filter_object.url }}/">{{ filter_object.name }}</a>
{% if country %}
<a href="{{ catalog_url }}{{ filter_object.url }}/country/{{ country.url }}">{{ country.name }}</a>
{% endif %}
{% if city %}
<a href="{{ catalog_url }}{{ filter_object.url }}/city/{{ city.url }}">{{ city.name }}</a>
{% endif %}
<strong>{{ year.text }}</strong>
{% else %}
{% if country %}
<a href="{{ catalog_url }}{{ filter_object.url }}/">{{ filter_object.name }}</a>
<strong>{{ country.name }}</strong>
{% else %}
{% if city %}
<a href="{{ catalog_url }}{{ filter_object.url }}/">{{ filter_object.name }}</a>
<strong>{{ city.name }}</strong>
{% else %}
<strong>{{ filter_object.name }}</strong>
{% endif %}
{% endif %}
{% endif %}
{% endif %}
</div>
{% endblock %}
{% block page_title %}
<div class="page-title">
<h1>{% trans 'Конференции' %}: <strong>{{ filter_object.name }}</strong></h1>
</div>
{% include 'includes/exposition/catalog_filter_period.html' %}
{% endblock %}
{% block content_list %}
{% include 'includes/conference/conference_list.html' with object_list=object_list %}
{% endblock %}
{% block paginator %}
{% include 'includes/catalog_paginator.html' with page_obj=page_obj %}
{% endblock %}

@ -0,0 +1,42 @@
{% extends 'base_catalog.html' %}
{% load static %}
{% load i18n %}
{% load template_filters %}
{% block style %}
<link rel="stylesheet" href="{% static 'client/css/pages/exposition_by.css' %}">
{% endblock %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<a href="/conference/">{% trans 'Конференции' %}</a>
<strong>{{ title1 }}</strong>
</div>
{% endblock %}
{% block page_title %}
<div class="page-title">
<h1>{{ title2 }}:</h1>
</div>
{% endblock %}
{% block content_list %}
{% for obj in object_list %}
{% set cur_word = obj.name %}
{% if cur_word|slice:":1"|lower != prev_word|slice:":1"|lower and forloop.counter != 1 %}
</ul>
{% endif %}
{% if cur_word|slice:":1"|lower != prev_word|slice:":1"|lower %}
<ul class="leter-list">
<div class="leter"><font size="5">{{ cur_word|slice:":1"|upper }}</font></div>
{% endif %}
<li>
<a href="/conference/{{ catalog }}{{ obj.url }}/">{{ obj.name }}&nbsp;({{ obj.conferences_number }})</a>
</li>
{% set prev_word = obj.name %}
{% endfor %}
{% endblock %}

@ -0,0 +1,24 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<a href="{{ object.catalog }}">{% trans 'Конференции' %}</a>
<a href="{{ object.catalog }}country/{{ object.country.url }}/">{{ object.country }}</a>
<a href="{{ object.catalog }}city/{{ object.city.url }}/">{{ object.city }}</a>
<strong>{{ object.name }}</strong>
</div>
{% endblock %}
{% block page_title %}
{% endblock %}
{% block content_list %}
{% include 'client/includes/conference/conference_object.html' with event=object %}
{% endblock %}
{% block paginator %}
{% endblock %}

@ -0,0 +1,42 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
{% if month %}
<a href="{{ catalog_url }}">{% trans 'Конференции' %}</a>
<a href="{{ year.link }}">{{ year.text }}</a>
<strong>{{ month.text }}</strong>
{% else %}
{% if year %}
<a href="{{ catalog_url }}">{% trans 'Конференции' %}</a>
<strong>{{ year.text }}</strong>
{% else %}
<strong>{% trans 'Конференции' %}</strong>
{% endif %}
{% endif %}
</div>
{% endblock %}
{% block page_title %}
<div class="page-title">
<h1>{% trans 'Конференции' %}</h1>
</div>
{% include 'includes/exposition/catalog_filter_period.html' %}
{% endblock %}
{% block content_list %}
{% include 'includes/conference/conference_list.html' with object_list=object_list %}
{% endblock %}
{% block paginator %}
{% include 'includes/catalog_paginator.html' with page_obj=page_obj %}
{% endblock %}

@ -0,0 +1,25 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<a href="{{ object.catalog }}">{% trans 'Конференции' %}</a>
<a href="{{ object.catalog }}country/{{ object.country.url }}/">{{ object.country }}</a>
<a href="{{ object.catalog }}city/{{ object.city.url }}/">{{ object.city }}</a>
<a href="{{ object.get_permanent_url }}">{{ object.name }}</a>
<strong>{% trans 'Участники' %}</strong>
</div>
{% endblock %}
{% block page_title %}
{% endblock %}
{% block content_list %}
{% include 'includes/exposition/members.html' with object_list=object_list %}
{% endblock %}
{% block paginator %}
{% include 'includes/catalog_paginator.html' with page_obj=page_obj %}
{% endblock %}

@ -0,0 +1,26 @@
{% extends 'base_catalog.html' %}
{% load i18n %}
{% block bread_scrumbs %}
<div class="bread-crumbs">
<a href="/">{% trans 'Главная страница' %}</a>
<a href="{{ object.catalog }}">{% trans 'Конференции' %}</a>
<a href="{{ object.catalog }}country/{{ object.country.url }}/">{{ object.country }}</a>
<a href="{{ object.catalog }}city/{{ object.city.url }}/">{{ object.city }}</a>
<a href="{{ object.get_permanent_url }}">{{ object.name }}</a>
<strong>{% trans 'Посетители' %}</strong>
</div>
{% endblock %}
{% block page_title %}
{% endblock %}
{% block content_list %}
{% include 'includes/exposition/visitors.html' with object_list=object_list %}
{% endblock %}
{% block paginator %}
{% include 'includes/catalog_paginator.html' with page_obj=page_obj %}
{% endblock %}

@ -2,7 +2,7 @@
{% load thumbnail %} {% load thumbnail %}
{% if obj.logo %} {% if obj.logo %}
{% thumbnail obj.logo "100x100" as im %} {% thumbnail obj.logo "100x100" 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 %}

@ -0,0 +1,11 @@
{% load static %}
{% load thumbnail %}
{% if obj.get_blog_preview %}
{% thumbnail obj.get_blog_preview.file_path "220x100" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" class="pic" alt="">
{% endthumbnail %}
{% else %}
<img src="{% static 'client/img/_del-temp/review-1.jpg' %}" class="pic" alt="" />
{% endif %}

@ -1,8 +1,8 @@
{% load static %} {% load static %}
{% load thumbnail %} {% load thumbnail %}
{% if obj.logo %} {% if obj.get_blog_preview %}
{% thumbnail obj.logo "250x180" as im %} {% thumbnail obj.get_blog_preview.file_path "250x180" 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 %}

@ -42,7 +42,8 @@
</span> </span>
{{ hotel.name }} {{ hotel.name }}
</a> </a>
<div class="hb-price">6 500 руб./ночь</div> <div class="hb-price">&nbsp;</div>
<!--<div class="hb-price">6 500 руб./ночь</div>-->
<a class="button blue2 lc icon-bell" href="{{ hotel.url }}?aid={{ book_aid }}" target="_blank">Забронировать</a> <a class="button blue2 lc icon-bell" href="{{ hotel.url }}?aid={{ book_aid }}" target="_blank">Забронировать</a>
</div> </div>
</li> </li>

@ -1,18 +1,5 @@
{% load i18n %} {% load i18n %}
{% load template_filters %} {% load template_filters %}
{% comment %}
{% if user.is_authenticated %} <a class="button blue icon-calendar {% if obj|in_calendar:request.user %}removecalendar {% else %}addcalendar {% endif %}" href="{{ obj.get_calendar_url }}">{% if obj|in_calendar:request.user %}{% trans 'Из расписания' %}{% else %}{% trans 'В расписание' %}{% endif %}</a>
{% if event|in_calendar:user %}
<a style="display:none;" class="button blue icon-calendar addcalendar" href="{{ event.get_calendar_url }}">{% trans 'в расписание' %}</a>
<a class="button blue icon-calendar removecalendar" href="{{ event.get_calendar_url }}">{% trans 'из расписания' %}</a>
{% else %}
<a class="button blue icon-calendar addcalendar" href="{{ event.get_calendar_url }}">{% trans 'в расписание' %}</a>
<a style="display:none;" class="button blue icon-calendar removecalendar" href="{{ event.get_calendar_url }}">{% trans 'из расписания' %}</a>
{% endif %}
{% else %}
<a class="button blue icon-calendar addcalendar" href="{{ event.get_calendar_url }}">{% trans 'в расписание' %}</a>
<a style="display:none;" class="button blue icon-calendar removecalendar" href="{{ event.get_calendar_url }}">{% trans 'из расписания' %}</a>
{% endif %}
{% endcomment %}
<a class="button blue icon-calendar {% if obj|in_calendar:request.user %}removecalendar {% else %}addcalendar {% endif %}" href="{{ event.get_calendar_url }}">{% if obj|in_calendar:request.user %}{% trans 'Из расписания' %}{% else %}{% trans 'В расписание' %}{% endif %}</a>

@ -0,0 +1,129 @@
{% load static %}
{% load i18n %}
{% load template_filters %}
<ul class="cat-list cl-exhibitions">
{% with objects=object_list %}
{% for obj in objects %}
<li class="cl-item {% if obj.canceled %}canceled{% endif %}">
<div class="cl-item-wrap clearfix">
<a href="{{ obj.get_permanent_url }}">
{% if obj.canceled %}
<div class="cancel"></div>
{% else %}
{% if obj.expohit %}
<div class="hit"></div>
{% endif %}
{% endif %}
<div class="cli-pict">
{% with obj=obj %}
{% include 'client/includes/show_logo.html' %}
{% endwith %}
</div>
</a>
<div class="cli-info">
<div class="cli-top clearfix">
{% if obj.quality_label.ufi.is_set %}
<div class="cli-approved">
<img src="{% static 'client/img/approved-logo.png' %}" alt="" title="Approved Event" />
</div>
{% endif %}
<header>
<div class="cli-title"><a href="{{ obj.get_permanent_url }}">{{ obj.name|safe }}</a></div>
</header>
<div class="cli-descr">
{{ obj.main_title|safe }}
</div>
</div>
<div class="cli-bot clearfix">
<div class="cli-date">
{% with obj=obj %}
{% include 'client/includes/show_date_block.html' %}
{% endwith %}
</div>
{% if obj.country %}
<div class="cli-place">
<a href="{{ obj.catalog }}country/{{ obj.country.url }}/">{{ obj.country }}</a>, <a href="{{ obj.catalog }}city/{{ obj.city.url }}/">{{ obj.city }}</a>
{% if obj.place %}
, <a href="/places/{{ obj.place.url }}/">{{ obj.place }}</a>
{% endif %}
</div>
{% endif %}
</div>
</div>
<div class="cli-buttons clearfix">
<div class="cli-m-buttons">
{% include 'client/includes/exposition/services.html' with obj=obj %}
{% include 'client/includes/calendar_button.html' with obj=obj%}
<div class="{% if request.user.is_authenticated%}note-wrap{% else %}note-wrap-disabled{% endif %}">
{% with note=obj|note_by_user:request.user %}
<a class="button green icon-note {% if note %}active{% endif %} note-button" href="/conference/add-note/{{ obj.url }}/">{% trans 'заметка' %}</a>
<div class="note-overlay">
<form action="">
<textarea name="note_text" class="note-text"> {{ note }}</textarea>
</form>
</div>
{% endwith %}
</div>
{% if request.user.is_admin %}
<div class="note-wrap">
<a class="button green " href="/admin/conference/{{ obj.url }}/">{% trans 'изменить' %}</a>
</div>
{% endif %}
<div></div>
</div>
<div class="cli-s-buttons">
{% include 'client/buttons/booking_button.html' with object=obj %}
</div>
</div>
</div>
<footer class="clearfix">
<div class="cli-stats">
{% if obj.visitors %}
<span class="visitors" title="Посетители">{{ obj.visitors }}</span>
{% endif %}
{% if obj.members %}
<span class="participants" title="Участники">{{ obj.members }}</span>
{% endif %}
</div>
<div class="cli-tags">
{% include 'client/includes/exposition/tags.html' with obj=obj %}
</div>
</footer>
</li>
{% endfor %}
{% endwith %}
</ul>
{% block scripts %}
<script src="{% static 'client/js' %}{% if debug %}/{% else %}_min/{% endif %}_modules/block.exposition.list{% if debug %}{% else %}.min{% endif %}.js"></script>
<script>
EXPO.exposition.list.init({
note:{
wrapClass:'note-wrap',
wrapDisabledClass:'note-wrap-disabled',
buttonClass:'note-button',
inputClass:'note-text'
},
addCalendarText:"{% trans 'В расписание' %}",
removeCalendarText:"{% trans 'Из расписания' %}"
});
</script>
{% endblock %}

@ -0,0 +1,396 @@
{% load static %}
{% load i18n %}
{% load thumbnail %}
{% load template_filters %}
{% block page_body %}
<div class="m-article event-page">
<div class="item-wrap event clearfix">
<aside>
{% if event.expohit %}
<div class="hit"></div>
{% endif %}
<div class="i-pict">
{% with obj=event %}
{% include 'client/includes/show_logo.html' %}
{% endwith %}
</div>
<!--
<div class="i-rating" title="Рейтинг: 551">551</div>
-->
<div class="i-stats">
{% if event.visitors %}
<span class="visitors" title="Посетители">{{ event.visitors }}</span>
{% endif %}
{% if event.members %}
<span class="participants" title="Участники">{{ event.members }}</span>
{% endif %}
</div>
<div class="i-discount">
{% if event.discount %}
<a class="discount-button" href="#">{% trans 'Скидка' %} -{{ event.discount }}%</a>
<div class="dsc-text">{{ event.discount_description|safe|linebreaks }}</div>
{% endif %}
</div>
</aside>
<div class="i-info">
<header>
<div class="i-title">
{% if event.main_title %}
{{ event.main_title|safe }} {{ event.name|safe }}
{% else %}
{{ event.name|safe }}
{% endif %}
</div>
</header>
<div class="i-date">
{% with obj=event %}
{% include 'client/includes/show_date_block.html' %}
{% endwith %}
</div>
{% if event.place %}
<div class="i-address">
<header>
<div class="address">
{{ event.place.adress }}
</div>
<div class="show-map"><a class="toggle-map" href="#">{% trans 'Раскрыть карту' %}</a></div>
</header>
<div class="i-map">
<div class="close-map"><a class="toggle-map" href="#">{% trans 'Скрыть карту' %}</a>
</div>
<div class="map-canvas" id="map-canvas" data-coords="{{ event.place.address.lat|stringformat:'f' }},{{ event.place.address.lng|stringformat:'f' }}" ></div>
</div>
</div>
{% endif %}
<hr />
<div class="i-buttons clearfix">
<div class="ib-main">
{% with event=event user=user %}
{% include 'client/includes/visit_button.html' %}
{% endwith %}
{% include 'client/includes/calendar_button.html' with obj=object %}
<div class="{% if request.user.is_authenticated%}note-wrap{% else %}note-wrap-disabled{% endif %}">
{% with note=object|note_by_user:request.user %}
<a class="button green icon-note {% if note %}active{% endif %} note-button" href="/expo/add-note/{{ obj.url }}/">{% trans 'заметка' %}</a>
<div class="note-overlay">
<form action="">
<textarea name="note_text" class="note-text"> {{ note }}</textarea>
</form>
</div>
{% endwith %}
</div>
{% if request.user.is_admin %}
<a class="button green " href="/admin/exposition/{{ object.url }}/">{% trans 'изменить' %}</a>
{% endif %}
</div>
<div class="ib-add"><a class="button blue2 icon-find" href="http://www.booking.com/searchresults.html?aid={{ book_aid }}&city={{ object.city.id }}">{% trans 'Найти отель' %}</a></div>
</div>
<hr />
<div class="i-divs clearfix">
<div class="i-subj">
<ul>
{% with themes=event.theme.all %}
{% for theme in themes %}
<li><a href="{{ object.catalog }}theme/{{ theme.url }}/">{{ theme.name }} ({{ theme.conferences_number }})</a></li>
{% endfor %}
{% endwith %}
</ul>
</div>
<div class="i-tags">
{% with tags=event.tag.all %}
{% for tag in tags %}
<a href="{{ object.catalog }}tag/{{ tag.url }}/">{{ tag.name }}</a>{% if forloop.counter != tags|length %},{% endif %}
{% endfor %}
{% endwith %}
</div>
</div>
</div>
</div>
{% include 'client/includes/exposition/exposition_services.html' %}
{% include 'includes/event_steps.html' with event=event %}
{% if event.get_photos %}
{% with photos=event.get_photos|slice:"5" %}
<hr />
<div class="i-photo-slides">
<div class="sect-title"><a href="#">{% trans 'Фотографии с прошлой выставки' %}</a></div>
<div id="ps-photo-gallery" class="ps-photo-gallery swiper-container">
<ul class="swiper-wrapper">
{% for photo in photos %}
<li class="swiper-slide">
<img src="{{ photo.get_display_url }}" alt="" />
</li>
{% endfor %}
</ul>
<div class="re-controls">
<a class="prev" href="#">&lt;</a>
<a class="next" href="#">&gt;</a>
</div>
</div>
</div>
{% endwith %}
{% endif %}
{% if event.description %}
<div class="i-event-description">
<div class="ied-title">{% trans 'О выставке' %} {{ event.name|safe }}</div>
<div class="ied-text">{{ event.description|safe|linebreaks }}</div>
</div>
<hr />
{% endif %}
<div class="i-event-additional clearfix">
<div class="sect-title">{% trans 'Дополнительная информация' %}</div>
<ul class="e-docs">
{% if event.business_program.exists %}
<li><a href="{{ event.get_permanent_url }}program/">{% trans 'Деловая программа' %}</a></li>
{% endif %}
</ul>
<dl class="add-info">
{% if event.organiser.all|length > 0 %}
<dt>{% trans 'Организатор' %}:</dt>
<dd>
{% with organisers=event.organiser.all %}
{% for organiser in organisers %}
{{ organiser.name }}<br />
{% endfor %}
{% endwith %}
</dd>
{% endif %}
{% if event.web_page %}
<dt>{% trans 'Веб-сайт' %}:</dt>
<dd>
<a target="_blank" href="#" data-type="href" data-hash="1qwer" data-url="{{ event.web_page|base64_encode }}" class="link-encode">{{ event.web_page }}</a>
</dd>
{% endif %}
{% if event.get_audience %}
<dt>{% trans 'Аудитория' %}:</dt>
<dd>
{{ event.get_audience }}
</dd>
{% endif %}
{% if event.get_periodic %}
<dt>{% trans 'Периодичность' %}:</dt>
<dd>{{ event.get_periodic }}</dd>
{% endif %}
{% if event.time %}
<dt>{% trans 'Время работы' %}:</dt>
<dd>{{ event.time|safe }}</dd>
{% endif %}
</dl>
</div>
<hr />
<div class="i-members clearfix">
<div class="im-participants">
{% with companies=event.company.all|slice:":6" %}
{% if companies %}
{# есть участники #}
<header>
<div class="im-title">{% trans 'Участники' %}</div>
<a class="more" href="{{ event.get_permanent_url }}members/">{% trans 'Все участники' %}</a>
</header>
<ul>
{% for company in companies %}
<li>
<a href="{{ company.get_permanent_url }}">
<span class="imp-pict">
{% with obj=company %}
{% include 'includes/show_logo.html' %}
{% endwith %}
</span>
{{ company.name }}
</a>
</li>
{% endfor %}
</ul>
{% else %}
{# нет участников #}
<header>
<div class="im-title">{% trans 'Участники' %}</div>
<p>{% trans 'Привлекайте целевых посетителей на стенд' %}</p>
<!--//todo: обработчик-->
<p><a href="#pw-advertise" class="button icon-up pw-open" >Рекламировать участника</a></p>
</header>
{% endif %}
{% endwith %}
</div>
<div class="im-visitors">
{% with visitors=event.users.all|slice:":17" %}
<header>
<div class="im-title">{% trans 'Посетители' %}</div>
</header>
<ul id="visitors-list">
{% if visitors %}
{# есть посетители #}
{% for user in visitors %}
{% if user == request.user %}
<li class="current"><a href="{{ user.get_permanent_url }}">{{ user.get_full_name }}&nbsp;{% if user.company %}({{ user.company.name }}){% endif %}</a></li>
{% else %}
<li><a href="{{ user.get_permanent_url }}">{{ user.get_full_name }}&nbsp;{% if user.company %}({{ user.company.name }}){% endif %}</a></li>
{% endif %}
{% endfor %}
{% endif %}
</ul>
<a id="somebody" class=" more mb-1em {% if visitors|length > 0 %}{%else%}hidden{% endif %}" href="{{ event.get_permanent_url }}visitors/">{% trans 'Все посетители' %}</a>
{% endwith %}
<p id="nobody" class=" mb-1em {% if event.users.all|length > 0 %}hidden{% else %}{% endif %}">{% trans 'Пока никто не отметился на событии.' %}</p>
{% with event=event user=user %}
{% include 'client/includes/visit_button.html' %}
{% endwith %}
</div>
</div>
<hr/>
{% if event.members or event.visitors or event.foundation_year %}
<div class="e-num-info">
<div class="eni-stats">
{% if event.members %}
<div class="enis-item"><b>{{ event.members }}</b> {% trans 'участников' %}</div>
{% endif %}
{% if event.visitors %}
<div class="enis-item"><b>{{ event.visitors }}</b> {% trans 'посетителей' %}</div>
{% endif %}
{% if event.foundation_year %}
<div class="eni-founded">{% trans 'Основано в' %} <b>{{ event.foundation_year }}</b> {% trans 'году' %}</div>
{% endif %}
</div>
</div>
{% endif %}
</div>
{% include 'client/includes/booking_block.html' with city=event.city place=event.place %}
<hr />
{% if event.get_nearest_events|slice:":6" %}
<div class="e-cat">
<div class="sect-title">{% trans 'Ближайшие выставки по тематике' %} <a href="{{ expo_catalog }}theme/{{ event.theme.all.0.url }}">«{{ event.theme.all.0 }}»</a></div>
<ul class="cat-list cl-exhibitions">
{% for exp in event.get_nearest_events %}
<li class="cl-item">
<div class="cl-item-wrap clearfix">
<a href="{{ exp.get_permanent_url }}">
<div class="cli-pict">
{% with obj=exp %}
{% include 'client/includes/show_logo.html' %}
{% endwith %}
</div>
</a>
<div class="cli-info">
<div class="cli-top clearfix">
{% if exp.approved %}
<div class="cli-approved">
<img src="{% static 'client/img/approved-logo.png' %}" alt="" title="Approved Event" />
</div>
{% endif %}
<header>
<div class="cli-title"><a href="{{ exp.get_permanent_url }}">{{ exp.name|safe }}</a></div>
</header>
<div class="cli-descr">
{{ exp.main_title|safe|linebreaks }}
</div>
<div class="cli-bot clearfix">
<div class="cli-date">
{% with obj=exp %}
{% include 'client/includes/show_date_block.html' %}
{% endwith %}
</div>
<div class="cli-place">
<a href="{{ exp.country.get_permanent_url }}">{{ exp.country }}</a>, <a href="{{ exp.city.get_permanent_url }}">{{ exp.city }}</a>
{% if exp.place %}
, <a href="{{ exp.place.get_permanent_url }}">{{ exp.place }}</a>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
<!--
<div class="abn"><a href="#"><img src="{% static 'client/img/_del-temp/banner-2.gif' %}" alt="" /></a></div>
-->
<div class="e-cat look-also">
<div class="sect-title">{% trans 'Смотрите также:' %}</div>
<a href="{{ event.catalog }}city/{{ event.city.url }}/">{% trans "Конференции" %} {% if request.LANGUAGE_CODE == 'ru' and event.city.inflect %}{{ event.city.inflect }}{% else %}{% trans 'in' %} {{ event.city.name }}{% endif %}</a>
<a href="{{ event.catalog }}country/{{ event.country.url }}/">{% trans "Конференции" %} {% if request.LANGUAGE_CODE == 'ru' and event.country.inflect %}{{ event.country.inflect }}{% else %}{% trans 'in' %} {{ event.country.name }}{% endif %}</a>
<a href="{{ event.catalog }}theme/{{ event.theme.all.0.url }}/country/{{ event.country.url }}/">{% trans "Конференции по тематике " %}&laquo;{{ event.theme.all.0.name|lower }}&raquo; {% if request.LANGUAGE_CODE == 'ru' and event.country.inflect %}{{ event.country.inflect }}{% else %}{% trans 'in' %} {{ event.country.name }}{% endif %}</a>
<a href="{{ event.catalog }}theme/{{ event.theme.all.0.url }}/city/{{ event.city.url }}/">{% trans "Конференции по тематике " %}&laquo;{{ event.theme.all.0.name|lower }}&raquo; {% if request.LANGUAGE_CODE == 'ru' and event.city.inflect %}{{ event.city.inflect }}{% else %}{% trans 'in' %} {{ event.city.name }}{% endif %}</a>
</div>
{% endblock %}
{% block content_text %}
{% endblock %}
{% block popup %}
{% include 'client/popups/advertise_member.html' with form=advertising_form %}
{% endblock %}
{% block scripts %}
<!-- todo: вернуть .min-->
<!--<script src="{% static 'client/js' %}{% if debug %}/{% else %}_min/{% endif %}_modules/page.exposition.object{% if debug %}{% else %}.min{% endif %}.js"></script>-->
<script src="{% static 'client/js/_modules/page.exposition.object.js' %}"></script>
<script>
EXPO.exposition.object.init({
visit:{
activeClass:"visit",
passiveClass:"unvisit",
currentHtml:'<li class="current"><a href="{{ request.user.get_permanent_url }}">{{ request.user.get_full_name }}&nbsp;{% if request.user.company %}({{ request.user.company.name }}){% endif %}</a></li>',
visitorsListId:"visitors-list",
somebodyId:"somebody",
nobodyId:"nobody"
},
note:{
wrapClass:'note-wrap',
wrapDisabledClass:'note-wrap-disabled',
buttonClass:'note-button',
inputClass:'note-text'
},
advertise:{
id:"advert-member-form"
},
addCalendarText:"{% trans 'В расписание' %}",
removeCalendarText:"{% trans 'Из расписания' %}"
});
</script>
{% endblock %}

@ -8,7 +8,7 @@
{% get_date %} {% get_date %}
<div class="p-filter clearfix"> <div class="p-filter clearfix">
<div class="pf-body"> <div class="pf-body">
<div class="pf-label">Период:</div> <div class="pf-label">{% trans 'Период' %}:</div>
{% with path=request.path|without_page now=now %} {% with path=request.path|without_page now=now %}
{% for month in monthes_period %} {% for month in monthes_period %}
<a href="{{ path }}{{ month.date|date:'Y' }}/{{ month.month_url }}/">{{ month.name|lower }} {{ month.date|date:'Y' }}</a>{% if month != monthes_period|last %},{% endif %} <a href="{{ path }}{{ month.date|date:'Y' }}/{{ month.month_url }}/">{{ month.name|lower }} {{ month.date|date:'Y' }}</a>{% if month != monthes_period|last %},{% endif %}
@ -17,7 +17,7 @@
</div> </div>
<div class="ch-dates-range"> <div class="ch-dates-range">
<a class="pw-open" href="#pwPeriod">Указать диапазон дат</a> <a class="pw-open" href="#pwPeriod">{% trans 'Указать диапазон дат' %}</a>
</div> </div>
</div> </div>
{% endif %} {% endif %}

@ -53,10 +53,10 @@
{% if obj.country %} {% if obj.country %}
<div class="cli-place"> <div class="cli-place">
<a href="{{ obj.catalog }}country/{{ obj.country.url }}">{{ obj.country }}</a>, <a href="{{ obj.catalog }}city/{{ obj.city.url }}">{{ obj.city }}</a>, <a href="{{ obj.catalog }}country/{{ obj.country.url }}/">{{ obj.country }}</a>, <a href="{{ obj.catalog }}city/{{ obj.city.url }}/">{{ obj.city }}</a>
{% if obj.place %} {% if obj.place %}
<a href="/places/{{ obj.place.url }}">{{ obj.place }}</a> , <a href="/places/{{ obj.place.url }}/">{{ obj.place }}</a>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}

@ -110,7 +110,7 @@
<div class="i-tags"> <div class="i-tags">
{% with tags=exposition.tag.all %} {% with tags=exposition.tag.all %}
{% for tag in tags %} {% for tag in tags %}
<a href="{{ object.catalog }}tag/{{ tag.url }}/">{{ tag.name }}</a>, <a href="{{ object.catalog }}tag/{{ tag.url }}/">{{ tag.name }}</a>{% if forloop.counter != tags|length %},{% endif %}
{% endfor %} {% endfor %}
{% endwith %} {% endwith %}
@ -323,7 +323,7 @@
<hr /> <hr />
{% if exposition.get_nearest_events|slice:":6" %} {% if exposition.get_nearest_events|slice:":6" %}
<div class="e-cat"> <div class="e-cat">
<div class="sect-title">{% trans 'Ближайшие выставки по тематике' %} <a href="{{ expo_catalog }}theme-{{ exposition.theme.all.0.url }}">«{{ exposition.theme.all.0 }}»</a></div> <div class="sect-title">{% trans 'Ближайшие выставки по тематике' %} <a href="{{ expo_catalog }}theme/{{ exposition.theme.all.0.url }}">«{{ exposition.theme.all.0 }}»</a></div>
<ul class="cat-list cl-exhibitions"> <ul class="cat-list cl-exhibitions">
{% for exp in exposition.get_nearest_events %} {% for exp in exposition.get_nearest_events %}
<li class="cl-item"> <li class="cl-item">

@ -1,5 +1,5 @@
{% with tags=obj.tags %} {% with tags=obj.tags %}
{% for tag in tags %} {% for tag in tags %}
<a href="{{ obj.catalog }}tag/{{ tag.url }}">{{ tag.name }}</a>, <a href="{{ obj.catalog }}tag/{{ tag.url }}">{{ tag.name }}</a>{% if forloop.counter != tags|length %},{% endif %}
{% endfor %} {% endfor %}
{% endwith %} {% endwith %}

@ -0,0 +1,21 @@
{% load i18n %}
{% load static %}
<div class="mp-reviews">
<header>
<div class="mpr-title"><a href="/blogs/">{% trans 'Обзоры и аналитика' %}</a></div>
<div class="more-link"><a class="more" href="/blogs/">{% trans 'Все обзоры' %}</a></div>
</header>
<ul>
{% for blog in blogs %}
<li>
<a href="{{ blog.get_permanent_url }}">
<span class="mpr-pict">
{% include 'client/includes/article/article_on_main_preview.html' with obj=blog %}
</span>
<span class="mpr-text">{{ blog.main_title }}</span>
</a>
</li>
{% endfor %}
</ul>
</div>

@ -3,12 +3,12 @@
<header>{% trans 'Конференции' %}</header> <header>{% trans 'Конференции' %}</header>
<nav> <nav>
<ul> <ul>
<li><a href="/conferences/theme/">{% trans 'По тематикам' %}</a></li> <li><a href="/conference/theme/">{% trans 'По тематикам' %}</a></li>
<li><a href="/conferences/country/">{% trans 'По странам' %}</a></li> <li><a href="/conference/country/">{% trans 'По странам' %}</a></li>
<li><a href="/conferences/city/">{% trans 'По городам' %}</a></li> <li><a href="/conference/city/">{% trans 'По городам' %}</a></li>
<li><a href="/conferences/city/moskva-ru/">{% trans 'Конференции в Москве' %}</a></li> <li><a href="/conference/city/moscow/">{% trans 'Конференции в Москве' %}</a></li>
<li><a href="/conferences/city/sankt-peterburg-ru/">{% trans 'Конференции в Петербурге' %}</a></li> <li><a href="/conference/city/saint-petersburg/">{% trans 'Конференции в Петербурге' %}</a></li>
<li><a href="/conferences/country/russia/">{% trans 'Конференции в России' %}</a></li> <li><a href="/conference/country/russia/">{% trans 'Конференции в России' %}</a></li>
</ul> </ul>
</nav> </nav>
</div> </div>

@ -168,23 +168,7 @@
<div class="mcl"> <div class="mcl">
<div class="mp-reviews-wrap clearfix"> <div class="mp-reviews-wrap clearfix">
<div class="mp-reviews"> {% include 'client/includes/index/blogs.html' with blogs=blogs %}
<header>
<div class="mpr-title"><a href="#">{% trans 'Обзоры и аналитика' %}</a></div>
<div class="more-link"><a class="more" href="/articles/">{% trans 'Все обзоры' %}</a></div>
</header>
<ul>
{% for article in articles %}
<li>
<a href="{{ article.get_permanent_url }}">
<span class="mpr-pict"><img src="{% static 'client/img/_del-temp/review-1.jpg' %}" alt="" /></span>
<span class="mpr-text">{{ article.main_title }}</span>
</a>
</li>
{% endfor %}
</ul>
</div>
<div class="sbnr"> <div class="sbnr">
<div class="sbnr-wrap"><a href="#"><img src="{% static 'client/img/_del-temp/bnrs.jpg' %}" alt="" /></a></div> <div class="sbnr-wrap"><a href="#"><img src="{% static 'client/img/_del-temp/bnrs.jpg' %}" alt="" /></a></div>

@ -77,18 +77,19 @@ class Theme(TranslatableModel):
def expositions_number(self): def expositions_number(self):
return len(Exposition.objects.filter(theme__id=self.id)) return Exposition.objects.filter(theme__id=self.id).count()
def conferences_number(self): def conferences_number(self):
return len(Conference.objects.filter(theme__id=self.id)) return Conference.objects.filter(theme__id=self.id).count()
def seminars_number(self): def seminars_number(self):
return len(Seminar.objects.filter(theme__id=self.id)) return Seminar.objects.filter(theme__id=self.id).count()
def webinars_number(self): def webinars_number(self):
return len(Webinar.objects.filter(theme__id=self.id)) return Webinar.objects.filter(theme__id=self.id).count()
def events_number(self): def events_number(self):
return self.expositions_number() + self.conferences_number() + self.seminars_number() + self.webinars_number() return self.expositions_number() + self.conferences_number() + self.seminars_number() + self.webinars_number()

Loading…
Cancel
Save