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. 83
      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. 156
      conference/models.py
  12. 75
      conference/urls.py
  13. 432
      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. 52
      proj/settings.py
  24. 17
      settings/admin.py
  25. 2
      settings/admin_urls.py
  26. 27
      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 theme.models import Tag
from file.models import FileModel, TmpFile
from file.forms import FileModelForm
from file.forms import FileModelForm, FileForm
#custom views
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):
context = super(BlogView, self).get_context_data(**kwargs)
self.set_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
return context

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import copy
from django.db import models
from django.contrib.contenttypes import generic
from django.utils.translation import ugettext_lazy as _
from django.utils.timezone import now
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
class ArticleManager(TranslationManager):
def safe_get(self, **kwargs):
model = self.model
@ -91,6 +93,10 @@ class Article(TranslatableModel):
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):
return self.lazy_translation_getter('main_title', self.pk)
@ -196,9 +202,17 @@ class Article(TranslatableModel):
def get_permanent_url(self):
if self.type == 1:
return '/blogs/%s'%self.slug
return '/blogs/%s/'%self.slug
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 functions.signal_handlers import post_save_handler

@ -7,6 +7,6 @@ urlpatterns = patterns('',
url(r'blogs/$', BlogList.as_view()),
url(r'news/page/(?P<page>\d+)/$', NewsList.as_view()),
url(r'news/$', NewsList.as_view()),
url(r'blogs/(?P<slug>.*)$', BlogDetail.as_view()),
url(r'news/(?P<slug>.*)$', NewsDetail.as_view()),
url(r'blogs/(?P<slug>.*)/$', BlogDetail.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 place_exposition.models import PlaceExposition
from organiser.models import Organiser
from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
# custom functions
from functions.db import db_table_exists
from functions.signal_handlers import post_save_handler
@ -86,7 +89,19 @@ class City(TranslatableModel):
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):
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 city.models import City
from file.models import FileModel, TmpFile
from file.forms import FileModelForm
from file.forms import FileModelForm, FileForm
from photologue.forms import PhotoForm
#python
import random
#custom views
from functions.custom_views import objects_list, delete_object
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):
@ -214,7 +215,83 @@ def conference_change(request, url):
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):
template_name = 'admin/conference/conference_list.html'
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 -*-
from django.conf.urls import patterns, include, url
from admin import ConferenceListView
from admin import ConferenceListView, ConferenceView
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'^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'^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.core.validators import validate_email, URLValidator
#models
from models import Conference, TimeTable, CURRENCY, Statistic
from models import Conference, TimeTable, CURRENCY, Statistic, BIT_AUDIENCE
from country.models import Country
from city.models import City
from theme.models import Theme
from theme.models import Theme, Tag
from organiser.models import Organiser
from accounts.models import User
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.admin_forms import AdminFilterForm
places = [(item.id, item.name) for item in PlaceConference.objects.language().all()]
places.insert(0,('', 'Не выбрано'))
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
"""
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]
data_begin = forms.DateField(label='Дата начала')
data_end = forms.DateField(label='Дата окночания')
data_begin = forms.DateField(label=u'Дата начала', input_formats=['%Y-%m-%d', '%d.%m.%Y'])
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()])
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all())
place = forms.ModelChoiceField(label='Место проведения', queryset=PlaceConference.objects.all(),
empty_label='', required=False)
theme = forms.MultipleChoiceField(label='Тематики',
choices=[(item.id, item.name) for item in Theme.objects.language().all()])
place = forms.ChoiceField(label=u'Место проведения', required=False,
choices=places)
#creates select input with empty choices cause it will be filled with ajax
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)
link = forms.CharField(label='Линк на регистрацию', required=False)
@ -61,9 +81,7 @@ class ConferenceCreateForm(forms.Form):
quality_label = forms.MultipleChoiceField(label='Тип', required=False,
choices=[('ufi', 'UFI'), ('rsva', 'РСВЯ'), ('exporating', 'ExpoRating')],
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())
@ -99,14 +117,8 @@ class ConferenceCreateForm(forms.Form):
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, id=None):
def save(self, obj=None):
"""
changes Conference model object with id = id
N/A add new Conference model object
@ -115,15 +127,18 @@ class ConferenceCreateForm(forms.Form):
"""
data = self.cleaned_data
#create new conference object or get exists
if not id:
if not obj:
conference = Conference()
else:
conference = Conference.objects.get(id=id)
conference = obj
conference.theme.clear()
conference.tag.clear()
#simple fields
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_end = data['data_end']
conference.link = data['link']
@ -141,6 +156,7 @@ class ConferenceCreateForm(forms.Form):
conference.expohit = data['expohit']
conference.canceled = data['canceled']
conference.moved = data['moved']
conference.periodic = data['periodic']
# generates bitfield
flag = 0
if data['quality_label']:
@ -148,6 +164,12 @@ class ConferenceCreateForm(forms.Form):
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'):
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'])
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_with_signal(Conference, conference, data)
#fill manytomany fields
for item in data['theme']:
conference.theme.add(item.id)#.id cause select uses queryset
conference.theme.add(*data['theme'])
conference.tag.add(*Tag.objects.filter(id__in=data['tag']))
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()
#save files
check_tmp_files(conference, data['key'])
return conference
def clean(self):
@ -186,6 +206,19 @@ class ConferenceCreateForm(forms.Form):
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):
"""
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 -*-
from django.utils.translation import ugettext as _
from django.db import models
from django.db.models.signals import post_save, pre_save
from django.contrib.contenttypes import generic
from exposition.manager import ClientManager
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
import copy
from bitfield import BitField
@ -12,11 +16,14 @@ from functions.db import db_table_exists
from functions.custom_fields import EnumField
from functions.models_methods import ExpoManager
from functions.model_mixin import EventMixin, ExpoMixin
from functions.models_methods import hvad_to_dict
# 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 []
from django.conf import settings
CURRENCY = ('RUB', 'USD', 'EUR')
CURRENCY = settings.CURRENCY
BIT_AUDIENCE = settings.BIT_AUDIENCE
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
"""
catalog = '/conference/'
catalog_name = _(u'Конференции:')
# type of event
event_type = 'conf'
#set manager of this model
objects = ExpoManager()
enable = ClientManager()
url = models.SlugField(unique=True)
url = models.SlugField(unique=True, max_length=255)
data_begin = models.DateField(verbose_name='Дата начала')
data_end = models.DateField(verbose_name='Дата окончания')
services = BitField(flags=flags)
#relations
country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT)
city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT)
country = models.ForeignKey('country.Country', 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='Место проведения',
blank=True, null=True, on_delete=models.PROTECT, related_name='conference_place')
theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики',
@ -48,15 +60,20 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
blank=True, null=True, related_name='conference_companies')
users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки',
blank=True, null=True, related_name='conference_users')
#!service has bitfield uncomment when country data will be filled
services = BitField(flags=flags)
#service = models.ManyToManyField('service.Service', verbose_name='Услуги', blank=True, null=True)
photogallery = models.ForeignKey('photologue.Gallery', blank=True, null=True)
logo = models.ImageField(verbose_name='Logo', upload_to='conference/logo/', blank=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)
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)
#
currency = EnumField(values=CURRENCY, default='RUB')
currency = EnumField(values=CURRENCY, default='USD')
tax = models.BooleanField(verbose_name='Налог', default=1)
min_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)
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
foundation_year = 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
def get_catalog_url(self):
return '/conferences/'
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 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
return '/conference/'
def get_audience(self):
checked = [item for item, bool in self.audience if bool==True]
audience = []
for k, v in BIT_AUDIENCE:
for item in checked:
if item == k:
audience.append(v)
return ', '.join(audience)
def get_calendar_url(self):
return '/conference-add-calendar/%s/'%self.id
@ -153,12 +140,51 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
def get_visit_url(self):
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')
year = models.PositiveIntegerField(verbose_name='Год')
members = models.PositiveIntegerField(verbose_name='Посетители')
visitors = models.PositiveIntegerField(verbose_name='Участники')
members = models.PositiveIntegerField(verbose_name='Посетители', blank=True, null=True)
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):
@ -166,13 +192,27 @@ class TimeTable(TranslatableModel):
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='Начало')
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
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)
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 -*-
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('',
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/$', ConferenceView.as_view()),
#
url(r'conference/add-note/(?P<slug>.*)/$', 'conference.views.add_note'),
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-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 -*-
from django.http import HttpResponse
from models import Conference
from functions.custom_views import ExpoListView
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/'
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
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
class ConferenceView(ExpoListView):
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
template_name = 'event_catalog.html'
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):
args = {'success': False}
@ -14,38 +370,32 @@ def conference_add_calendar(request, id):
if user.is_authenticated():
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)
args['success'] = True
else:
args['not_authorized'] = True
args['in'] = 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:
args['not_authorized'] = True
args['success'] = True
return HttpResponse(json.dumps(args), content_type='application/json')
def conference_visit(request, id):
args = {'success': False}
user = request.user
if user.is_authenticated():
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)
args['success'] = True
args['in'] = True
args['success'] = True
else:
args['not_authorized'] = True
@ -53,18 +403,34 @@ def conference_visit(request, id):
return HttpResponse(json.dumps(args), content_type='application/json')
def conference_unvisit(request, id):
def add_note(request, slug):
args = {'success': False}
user = request.user
if user.is_authenticated():
conf = Conference.objects.safe_get(id=id)
if conf:
conf.users.remove(user)
else:
args['not_authorized'] = True
args['success'] = True
return HttpResponse(json.dumps(args), content_type='application/json')
if request.user.is_authenticated():
if request.GET:
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:
args['not_authorized'] = True
args['success'] = True
return HttpResponse(json.dumps(args), content_type='application/json')

@ -13,6 +13,9 @@ from service.models import Service
from exposition.models import Exposition
from place_exposition.models import PlaceExposition
from organiser.models import Organiser
from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
# func
from functions.custom_fields import EnumField
from functions.db import db_table_exists
@ -164,6 +167,18 @@ class Country(TranslatableModel):
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):
lang = translation.get_language()
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.insert(0,('', 'Не выбрано'))
class ExpositionCreateForm(forms.Form):
"""
Create Exposition form for creating exposition
@ -80,10 +82,6 @@ class ExpositionCreateForm(forms.Form):
application_deadline = forms.DateField(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)
tax = forms.BooleanField(label=u'Налог включен', initial=True, required=False)
min_closed_area = forms.CharField(label=u'Минимальная цена закрытой НЕ оборудованной площади', required=False)
@ -227,6 +225,8 @@ class ExpositionCreateForm(forms.Form):
if data.get('place'):
exposition.place = PlaceExposition.objects.get(id=data['place'])
else:
exposition.place = None
# fill translated fields and save object
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)]
labels = [label for label in row_list[0]]
existing = 0
for row_number, row in enumerate(row_list[1246:]):
for row_number, row in enumerate(row_list[1:]):
#print(row_number)
if row[0] != '':

@ -19,6 +19,8 @@ from functions.model_mixin import EventMixin, ExpoMixin
from functions.translate import fill_with_signal
from photologue.models import Gallery
from import_xls.model_utils import ExpoImportManager
from functions.models_methods import hvad_to_dict
AUDIENCE1 = ((None,_(u'Не выбрано')),
('experts', _(u'Специалисты')),
@ -28,11 +30,10 @@ AUDIENCE1 = ((None,_(u'Не выбрано')),
AUDIENCE = (None,'experts', 'experts and consumers', 'general public')
BIT_AUDIENCE = (('experts', _(u'Специалисты')), ('experts and consumers', _(u'Специалисты и потребители')),
('general public', _(u'Широкая публика')))
BIT_AUDIENCE = settings.BIT_AUDIENCE
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
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 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):
exposition = models.ForeignKey(Exposition, related_name='statistic')
@ -343,10 +302,6 @@ class Statistic(TranslatableModel):
return hvad_to_dict(self)
from django.core import serializers
from functions.models_methods import hvad_to_dict
class TimeTable(TranslatableModel):
"""
TimeTable for business program
@ -389,32 +344,7 @@ class TmpTimeTable(TranslatableModel):
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)
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'),
# search
url(r'expo/search/', ExpositionSearchView.as_view()),
#url(r'expo/search/', 'exposition.views.search_test'),
# country catalog

@ -19,6 +19,7 @@ from country.models import Country
from city.models import City
from theme.models import Theme, Tag
from note.models import Note
from service.order_forms import AdvertiseForm
from functions.search_forms import ExpositionSearchForm
from functions.custom_views import ExpoSearchView
@ -85,20 +86,6 @@ class ExpositionSearchView(ExpoSearchView):
search_form = ExpositionSearchForm
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):
args = {'success': False}
@ -132,12 +119,6 @@ def exposition_visit(request, id):
args['in'] = True
args['success'] = True
"""
if exp:
exp.users.add(user)
args['success'] = True
"""
else:
args['not_authorized'] = True
args['success'] = True
@ -145,7 +126,7 @@ def exposition_visit(request, id):
return HttpResponse(json.dumps(args), content_type='application/json')
#------------------------------------------------------------------------------
from service.order_forms import AdvertiseForm
class ExpoDetail(DetailView):
model = Exposition
slug_field = 'url'
@ -273,12 +254,7 @@ class ExpoList(ListView):
context['month'] = self.month
return context
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'Декабрь')}}
MONTHES = settings.MONTHES
class ExpoCatalog(ListView):
model = Exposition

@ -339,15 +339,18 @@ event_sett = {
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'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'Теги':{u'field': u'tag', u'func': to_tag, u'method': True},
#u'Организатор №1':{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'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'audience', u'func': to_audience},
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'time', u'func': unicode},
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 city.models import City
from theme.models import Tag
from article.models import Article
from django.db.models.loading import get_model
def admin_home(request):
return render_to_response('base.html')
@ -39,6 +41,24 @@ def ajax_tag(request):
else:
#request empty - send empty array
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):
"""

@ -45,6 +45,7 @@ urlpatterns = required(
url(r'^ajax_delete_file/', 'proj.admin.ajax_delete_file'),
url(r'^ajax_city/', 'proj.admin.ajax_city'),
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'^tinymce/', include('tinymce.urls')),

@ -26,6 +26,7 @@ DATABASES = {
'PORT': '',
}
}
'''
CACHES = {
'default': {
@ -76,10 +77,9 @@ USE_L10N = True
# If you set this to False, Django will not use timezone-aware datetimes.
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/')#'/home/kotzilla/Documents/qwer/proj/media/'
CKEDITOR_UPLOAD_PATH = os.path.join(SITE_ROOT, 'media/upload')#'/home/kotzilla/Documents/qwer/proj/media/upload'
MEDIA_ROOT = os.path.join(SITE_ROOT, 'media/')
CKEDITOR_UPLOAD_PATH = os.path.join(SITE_ROOT, 'media/upload')
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/'
# 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')
# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = '/static/'
# Additional locations of static files
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
@ -135,7 +111,7 @@ STATICFILES_FINDERS = (
# 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'
# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
@ -346,7 +322,7 @@ INSTALLED_APPS = (
'bitfield',
'djutils',
'pytils',
'pymorphy',
#'pymorphy',
'password_reset',
#'social_auth',
'social.apps.django_app.default',
@ -418,4 +394,16 @@ except ImportError, e:
ADMIN_PAGINATION = 20
CLIENT_PAGINATION = 15
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 -*-
import json
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.core.context_processors import csrf
@ -56,6 +57,7 @@ from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
from theme.models import Theme
from article.models import Article
import datetime
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)
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)
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,
'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))
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/themes/$', 'handle_themes'),
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'),
)

@ -146,20 +146,33 @@ class MainPagePhotoreport(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):
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)
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):
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):
data = self.cleaned_data
articles = data['articles']
articles.update(main_page=1)
def save(self):
pass
articles = data['article']
Article.objects.blogs().exclude(id__in=[item.id for item in articles]).update(main_page=0)
articles.update(main_page=1)

@ -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
$('#id_tag').select2({

@ -18,7 +18,7 @@
{% block body %}
<form method="post" class="form-horizontal" name="form2" id="form2"enctype="multipart/form-data"> {% csrf_token %}
<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-header well">
@ -88,6 +88,39 @@
{# descriptions #}
{% include 'admin/forms/multilang.html' with field='descriptions' form=form languages=languages %}
</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 class="controls">
@ -96,4 +129,6 @@
</div>
</fieldset>
</form>
{% include 'admin/includes/file_form.html' with file_form=file_form object=article %}
{% 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 %}
{# Uses multilang.html template for translated fields #}
<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>

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

@ -17,7 +17,7 @@
<div class="m-article cl-news blog_block">
<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>
<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 }}

@ -44,7 +44,7 @@
{% include 'includes/article/article_preview.html' with obj=blog %}
<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>
</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 %}
{% 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="">
{% endthumbnail %}
{% 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 thumbnail %}
{% if obj.logo %}
{% thumbnail obj.logo "250x180" as im %}
{% if obj.get_blog_preview %}
{% thumbnail obj.get_blog_preview.file_path "250x180" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}" class="pic" alt="">
{% endthumbnail %}
{% else %}

@ -42,7 +42,8 @@
</span>
{{ hotel.name }}
</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>
</div>
</li>

@ -1,18 +1,5 @@
{% load i18n %}
{% load template_filters %}
{% comment %}
{% if user.is_authenticated %}
{% 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>
<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>

@ -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 %}
<div class="p-filter clearfix">
<div class="pf-body">
<div class="pf-label">Период:</div>
<div class="pf-label">{% trans 'Период' %}:</div>
{% with path=request.path|without_page now=now %}
{% 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 %}
@ -17,7 +17,7 @@
</div>
<div class="ch-dates-range">
<a class="pw-open" href="#pwPeriod">Указать диапазон дат</a>
<a class="pw-open" href="#pwPeriod">{% trans 'Указать диапазон дат' %}</a>
</div>
</div>
{% endif %}

@ -53,10 +53,10 @@
{% 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>,
<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>
, <a href="/places/{{ obj.place.url }}/">{{ obj.place }}</a>
{% endif %}
</div>
{% endif %}

@ -110,7 +110,7 @@
<div class="i-tags">
{% with tags=exposition.tag.all %}
{% 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 %}
{% endwith %}
@ -323,7 +323,7 @@
<hr />
{% if exposition.get_nearest_events|slice:":6" %}
<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">
{% for exp in exposition.get_nearest_events %}
<li class="cl-item">

@ -1,5 +1,5 @@
{% with tags=obj.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 %}
{% 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>
<nav>
<ul>
<li><a href="/conferences/theme/">{% trans 'По тематикам' %}</a></li>
<li><a href="/conferences/country/">{% trans 'По странам' %}</a></li>
<li><a href="/conferences/city/">{% trans 'По городам' %}</a></li>
<li><a href="/conferences/city/moskva-ru/">{% trans 'Конференции в Москве' %}</a></li>
<li><a href="/conferences/city/sankt-peterburg-ru/">{% trans 'Конференции в Петербурге' %}</a></li>
<li><a href="/conferences/country/russia/">{% trans 'Конференции в России' %}</a></li>
<li><a href="/conference/theme/">{% trans 'По тематикам' %}</a></li>
<li><a href="/conference/country/">{% trans 'По странам' %}</a></li>
<li><a href="/conference/city/">{% trans 'По городам' %}</a></li>
<li><a href="/conference/city/moscow/">{% trans 'Конференции в Москве' %}</a></li>
<li><a href="/conference/city/saint-petersburg/">{% trans 'Конференции в Петербурге' %}</a></li>
<li><a href="/conference/country/russia/">{% trans 'Конференции в России' %}</a></li>
</ul>
</nav>
</div>

@ -168,23 +168,7 @@
<div class="mcl">
<div class="mp-reviews-wrap clearfix">
<div class="mp-reviews">
<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>
{% include 'client/includes/index/blogs.html' with blogs=blogs %}
<div class="sbnr">
<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):
return len(Exposition.objects.filter(theme__id=self.id))
return Exposition.objects.filter(theme__id=self.id).count()
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):
return len(Seminar.objects.filter(theme__id=self.id))
return Seminar.objects.filter(theme__id=self.id).count()
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):
return self.expositions_number() + self.conferences_number() + self.seminars_number() + self.webinars_number()

Loading…
Cancel
Save