remotes/origin/1203
kotzilla 12 years ago
parent 1cd024f6a9
commit befbbd4459
  1. 4
      country/models.py
  2. 82
      exposition/admin.py
  3. 8
      exposition/admin_urls.py
  4. 46
      exposition/forms.py
  5. 48
      exposition/management/commands/convert_expo_logo.py
  6. 57
      exposition/models.py
  7. 46
      functions/admin_views.py
  8. 11
      functions/model_mixin.py
  9. 20
      place_exposition/admin.py
  10. 2
      place_exposition/admin_urls.py
  11. 12
      place_exposition/management/commands/convert_logo.py
  12. 4
      settings/views.py
  13. 0
      static/admin/js/pages/place_exposition.js
  14. 1
      static/custom_js/event_switcher.js
  15. 1
      static/custom_js/file_post_ajax.js
  16. 319
      static/custom_js/main.js
  17. 1
      static/custom_js/make_select.js
  18. 1
      static/custom_js/select_tag.js
  19. 1
      static/custom_js/timetable_post.js
  20. 679
      templates/admin/exposition/exposition.html
  21. 34
      templates/admin/includes/photogallery.html
  22. 36
      templates/admin/place_exposition/place_exposition.html
  23. 8
      templates/client/includes/event_object.html
  24. 2
      theme/models.py

@ -69,7 +69,7 @@ class Area(TranslatableModel):
return Exposition.objects.filter(country__in=countries) return Exposition.objects.filter(country__in=countries)
def get_sub_categories(self): def get_sub_categories(self):
objects = [{'name':item.name, 'id':item.id} for item in self.countries()] objects = [{'text':item.name, 'id':item.id, 'name':'co', 'sub':True} for item in self.countries()]
return objects return objects
@ -162,7 +162,7 @@ class Country(TranslatableModel):
.filter(exposition_city__city__isnull=False, translations__language_code=lang, country=self).distinct() .filter(exposition_city__city__isnull=False, translations__language_code=lang, country=self).distinct()
def get_sub_categories(self): def get_sub_categories(self):
objects = [{'name':item.name, 'id':item.id} for item in self.active_cities()] objects = [{'text':item.name, 'id':item.id, 'name':'ci', 'sub': False} for item in self.active_cities()]
return objects return objects

@ -14,12 +14,13 @@ from theme.models import Tag
from city.models import City from city.models import City
from file.models import FileModel, TmpFile from file.models import FileModel, TmpFile
from file.forms import FileModelForm from file.forms import FileModelForm
from photologue.forms import PhotoForm
# python # python
import random import random
# custom views # custom views
from functions.custom_views import objects_list, delete_object from functions.custom_views import objects_list, delete_object
from functions.views_help import get_referer from functions.views_help import get_referer
from functions.admin_views import AdminListView from functions.admin_views import AdminListView, AdminView, upload_photo
def exposition_all(request): def exposition_all(request):
@ -232,7 +233,84 @@ def exposition_change(request, url):
return render_to_response('exposition_add.html', args) return render_to_response('exposition_add.html', args)
class ExpositionView(AdminView):
form_class = ExpositionCreateForm
model = Exposition
success_url = 'admin/exposition/all/'
template_name = 'admin/exposition/exposition.html'
def get_form(self, form_class):
if self.request.POST:
return super(ExpositionView, 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, 'periodic':obj.periodic,
'min_area':obj.min_area, 'currency':obj.currency, 'tax':obj.tax,
'price_day':obj.price_day, 'price_all':obj.price_all, 'price_catalog':obj.price_catalog,
'price_day_bar':obj.price_day_bar, 'price_all_bar':obj.price_all_bar,
'min_closed_area':obj.min_closed_area, 'max_closed_area':obj.max_closed_area,
'min_closed_equipped_area':obj.min_closed_equipped_area,
'max_closed_equipped_area':obj.max_closed_equipped_area,
'min_stand_size':obj.min_stand_size, 'application_deadline':obj.application_deadline,
'min_open_area':obj.min_open_area, 'max_open_area':obj.max_open_area,
'registration_payment':obj.registration_payment, 'exposition_id':obj.id,
'expohit': obj.expohit, 'discount': obj.discount,
'canceled': obj.canceled, 'moved': obj.moved, 'logo': obj.logo,
'visitors': obj.visitors, 'members': obj.members,
'audience':[item for item, bool in obj.audience if bool==True],
'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] = trans_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['products_%s' % code] = trans_obj.products
data['discount_description_%s' % code] = trans_obj.discount_description
data['stat_countries_%s' % code] = trans_obj.stat_countries
data['pre_condition_%s' % code] = trans_obj.pre_condition
data['stand_condition_%s' % code] = trans_obj.stand_condition
data['visit_note_%s' % code] = trans_obj.visit_note
data['participation_note_%s' % code] = trans_obj.participation_note
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.filter(theme__in=data['theme'])]
return form
else:
return form_class()
def get_context_data(self, **kwargs):
context = super(ExpositionView, self).get_context_data(**kwargs)
obj = self.set_obj()
context['photo_form'] = PhotoForm()
context['timetable_form'] = TimeTableForm()
context['timetables'] = TimeTable.objects.filter(exposition=obj)
return context
class ExpositionListView(AdminListView): class ExpositionListView(AdminListView):
template_name = 'admin/exposition/exposition_list.html' template_name = 'admin/exposition/exposition_list.html'
form_class = ExpositionFilterForm form_class = ExpositionFilterForm
model = Exposition model = Exposition
def upload_exposition_photo(request, expo_id):
return upload_photo(request, expo_id, Exposition)

@ -1,12 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from admin import ExpositionListView from admin import ExpositionListView, ExpositionView
urlpatterns = patterns('exposition.admin', urlpatterns = patterns('exposition.admin',
url(r'^upload-photo/(?P<expo_id>.*)/$', 'upload_exposition_photo'),
url(r'^add.*/$', 'exposition_add'), url(r'^add.*/$', 'exposition_add'),
url(r'^delete/(?P<url>.*)/$', 'exposition_delete'), url(r'^delete/(?P<url>.*)/$', 'exposition_delete'),
url(r'^change/(?P<url>.*)/$', 'exposition_change'), url(r'^change/(?P<url>.*)/$', 'exposition_change'),
url(r'^all/$', ExpositionListView.as_view()), url(r'^all/$', ExpositionListView.as_view()),
url(r'^switch/(?P<url>.*)/(?P<action>.*)$', 'exposition_switch'), url(r'^switch/(?P<url>.*)/(?P<action>.*)$', 'exposition_switch'),
url(r'^copy/(?P<url>.*)$', 'exposition_copy'), url(r'^copy/(?P<url>.*)$', 'exposition_copy'),
url(r'^$', ExpositionView.as_view()),
url(r'^(?P<url>.*)/$', ExpositionView.as_view()),
) )

@ -8,6 +8,7 @@ from django.forms.util import ErrorList
from django.core.validators import validate_email, URLValidator from django.core.validators import validate_email, URLValidator
#models #models
from models import Exposition, TimeTable, TmpTimeTable, AUDIENCE1, CURRENCY, Statistic, BIT_AUDIENCE from models import Exposition, TimeTable, TmpTimeTable, AUDIENCE1, CURRENCY, Statistic, BIT_AUDIENCE
from theme.models import Tag
from country.models import Country from country.models import Country
from theme.models import Theme from theme.models import Theme
from organiser.models import Organiser from organiser.models import Organiser
@ -42,6 +43,7 @@ class ExpositionCreateForm(forms.Form):
data_begin = forms.DateField(label=u'Дата начала') data_begin = forms.DateField(label=u'Дата начала')
data_end = forms.DateField(label=u'Дата окночания') data_end = forms.DateField(label=u'Дата окночания')
logo = forms.ImageField(label='Logo', required=False)
organiser = forms.ModelMultipleChoiceField(label=u'Организаторы', queryset=Organiser.objects.all(), required=False) organiser = forms.ModelMultipleChoiceField(label=u'Организаторы', queryset=Organiser.objects.all(), required=False)
company = forms.ModelMultipleChoiceField(label=u'Компании', queryset=Company.objects.all(), required=False) company = forms.ModelMultipleChoiceField(label=u'Компании', queryset=Company.objects.all(), required=False)
@ -51,7 +53,8 @@ class ExpositionCreateForm(forms.Form):
empty_label='', required=False) empty_label='', required=False)
#creates select input with empty choices cause it will be filled with ajax #creates select input with empty choices cause it will be filled with ajax
city = forms.CharField(label=u'Город', widget=forms.HiddenInput()) city = forms.CharField(label=u'Город', widget=forms.HiddenInput())
tag = forms.MultipleChoiceField(label=u'Теги', required=False) tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(), required=False)
#tag = forms.MultipleChoiceField(label=u'Теги', required=False)
periodic = forms.ChoiceField(label=u'Периодичность', choices=PERIODIC, required=False) periodic = forms.ChoiceField(label=u'Периодичность', choices=PERIODIC, required=False)
audience = forms.MultipleChoiceField(label=u'Аудитория', choices=public, initial='', required=False) audience = forms.MultipleChoiceField(label=u'Аудитория', choices=public, initial='', required=False)
@ -103,7 +106,8 @@ class ExpositionCreateForm(forms.Form):
# uses enumerate for detect iteration number # uses enumerate for detect iteration number
# first iteration is a default lang so it required fields # first iteration is a default lang so it required fields
required = True if lid == 0 else False required = True if lid == 0 else False
self.fields['name_%s' % code] = forms.CharField(label=u'Название', required=required) self.fields['name_%s' % code] = forms.CharField(label=u'Название', required=required,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['main_title_%s' % code] = forms.CharField(label=u'Краткое описание', self.fields['main_title_%s' % code] = forms.CharField(label=u'Краткое описание',
required=False, widget=CKEditorWidget) required=False, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label=u'Описание', self.fields['description_%s' % code] = forms.CharField(label=u'Описание',
@ -114,6 +118,17 @@ class ExpositionCreateForm(forms.Form):
required=False, widget=CKEditorWidget) required=False, widget=CKEditorWidget)
self.fields['discount_description_%s' % code] = forms.CharField(label=u'Описание скидки', self.fields['discount_description_%s' % code] = forms.CharField(label=u'Описание скидки',
required=False, widget=CKEditorWidget) required=False, widget=CKEditorWidget)
self.fields['stat_countries_%s' % code] = forms.CharField(label=u'Участвующие страны',
required=False, widget=CKEditorWidget)
self.fields['pre_condition_%s' % code] = forms.CharField(label=u'Условия предварительной регистрации',required=False,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['stand_condition_%s' % code] = forms.CharField(label=u'Условия регистрации на стойке',required=False,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['visit_note_%s' % code] = forms.CharField(label=u'Примечание по посещению',required=False,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['participation_note_%s' % code] = forms.CharField(label=u'Примечание по участии',required=False,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
#meta data #meta data
self.fields['title_%s' % code] = forms.CharField(label=u'Meta title', required=False, max_length=255, self.fields['title_%s' % code] = forms.CharField(label=u'Meta title', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'})) widget=forms.TextInput(attrs={'style':'width: 550px'}))
@ -127,7 +142,7 @@ class ExpositionCreateForm(forms.Form):
#self.fields['service'] = forms.MultipleChoiceField(label='Услуги', choices=services, required=False) #self.fields['service'] = forms.MultipleChoiceField(label='Услуги', choices=services, required=False)
def save(self, id=None): def save(self, obj=None):
""" """
change Exposition model object with id = id change Exposition model object with id = id
N/A add new Exposition model object N/A add new Exposition model object
@ -135,17 +150,19 @@ class ExpositionCreateForm(forms.Form):
form.save() - if add exposition form.save() - if add exposition
""" """
data = self.cleaned_data data = self.cleaned_data
if not id: if not obj:
exposition = Exposition() exposition = Exposition()
else: else:
exposition = Exposition.objects.get(id=id) exposition = obj
exposition.theme.clear() exposition.theme.clear()
exposition.tag.clear() exposition.tag.clear()
exposition.organiser.clear() exposition.organiser.clear()
exposition.company.clear() exposition.company.clear()
#simple fields #simple fields
exposition.url = translit_with_separator(data['name_ru'].strip()).lower() exposition.url = translit_with_separator(data['name_ru'].strip()).lower()
exposition.logo = data['logo']
exposition.data_begin = data['data_begin'] exposition.data_begin = data['data_begin']
exposition.data_end = data['data_end'] exposition.data_end = data['data_end']
exposition.periodic = data['periodic'] exposition.periodic = data['periodic']
@ -205,9 +222,9 @@ class ExpositionCreateForm(forms.Form):
#fill manytomany fields #fill manytomany fields
for item in data['theme']: for item in data['theme']:
exposition.theme.add(item.id)#.id cause select uses queryset exposition.theme.add(item.id)#.id cause select uses queryset
exposition.tag.add(*Tag.objects.filter(id__in=data['tag']))
for item in data['tag']: #for item in data['tag']:
exposition.tag.add(item) # exposition.tag.add(item)
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
for item in data['organiser']: for item in data['organiser']:
exposition.organiser.add(item) exposition.organiser.add(item)
@ -234,6 +251,19 @@ class ExpositionCreateForm(forms.Form):
return self.cleaned_data return self.cleaned_data
def clean_tag(self):
tags = self.cleaned_data.get('tag')
if tags:
res = []
for id in tags.split(','):
try:
res.append(int(id))
except:
continue
return res
else:
return []
def clean_web_page(self): def clean_web_page(self):
""" """
checking web_page checking web_page

@ -0,0 +1,48 @@
from django.core.management.base import BaseCommand, CommandError
from exposition.models import Exposition
from django.contrib.sites.models import Site
from photologue.models import Gallery, Photo
from file.models import FileModel
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
import urllib2
from django.conf import settings
from django.utils import translation
def handle_expo(item):
logo = item.get_logo()
translation.activate('en')
domain = 'http://hit.expomap.ru'
url = domain+logo.file_path.url
file_name = url.split('/')[-1]
download_to = settings.MEDIA_ROOT+'exposition/logo/'+file_name
try:
response = urllib2.urlopen(url, timeout=5)
except:
print('download error')
return None
with open(download_to,'wb') as f:
f.write(response.read())
f.close()
file_name = 'exposition/logo/'+file_name
item.logo = file_name
item.save()
class Command(BaseCommand):
def handle(self, *args, **options):
for exposition in Exposition.objects.all('en'):
if exposition.files.filter(purpose='logo').exists():
handle_expo(exposition)
print(exposition)

@ -1,9 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import copy, datetime
from django.db import models from django.db import models
from django.db.models.signals import post_save, pre_save from django.db.models.signals import post_save, pre_save
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.conf import settings
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
import copy, datetime
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from bitfield import BitField from bitfield import BitField
from service.models import Service from service.models import Service
@ -15,6 +17,8 @@ from functions.custom_fields import EnumField
from functions.signal_handlers import post_save_handler, pre_save_handler from functions.signal_handlers import post_save_handler, pre_save_handler
from functions.models_methods import ExpoManager from functions.models_methods import ExpoManager
from functions.model_mixin import EventMixin, ExpoMixin from functions.model_mixin import EventMixin, ExpoMixin
from functions.translate import fill_with_signal
from photologue.models import Gallery
AUDIENCE1 = ((None,_(u'Не выбрано')), AUDIENCE1 = ((None,_(u'Не выбрано')),
('experts', _(u'Специалисты')), ('experts', _(u'Специалисты')),
@ -65,7 +69,9 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
blank=True, null=True, related_name='exposition_companies') blank=True, null=True, related_name='exposition_companies')
users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки', users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки',
blank=True, null=True, related_name='exposition_users') blank=True, null=True, related_name='exposition_users')
#photogallery = models.ForeignKey('photologue.Gallery', blank=True, null=True) photogallery = models.ForeignKey('photologue.Gallery', blank=True, null=True)
logo = models.ImageField(verbose_name='Logo', upload_to='exposition/logo/', blank=True)
rating = models.IntegerField(default=0)
quality_label = BitField(flags=['ufi', 'rsva', 'exporating']) quality_label = BitField(flags=['ufi', 'rsva', 'exporating'])
visitors = models.PositiveIntegerField(verbose_name='Посетители', blank=True, null=True) visitors = models.PositiveIntegerField(verbose_name='Посетители', blank=True, null=True)
@ -93,6 +99,14 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
products = models.TextField(verbose_name='Экспонируемые продукты', blank=True), products = models.TextField(verbose_name='Экспонируемые продукты', blank=True),
discount_description = models.TextField(verbose_name='Описание скидки', blank=True), discount_description = models.TextField(verbose_name='Описание скидки', blank=True),
time = models.TextField(verbose_name='Время работы', blank=True), time = models.TextField(verbose_name='Время работы', blank=True),
# visit and particaption data
stat_countries = models.TextField(verbose_name='Участвующие страны', blank=True),
pre_condition = models.CharField(verbose_name='Условия предварительной регистрации', max_length=255, blank=True),
stand_condition = models.CharField(verbose_name='Условия регистрации на стойке', max_length=255, blank=True),
visit_note = models.CharField(verbose_name='Примечание по посещению', max_length=255, blank=True),
participation_note = models.CharField(verbose_name='Примечание по участии', max_length=255, blank=True),
#-----meta data #-----meta data
title = models.CharField(max_length=250), title = models.CharField(max_length=250),
descriptions = models.CharField(max_length=250), descriptions = models.CharField(max_length=250),
@ -114,8 +128,11 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
min_stand_size = models.PositiveIntegerField(verbose_name='Минимальный размер стэнда', blank=True, null=True) min_stand_size = models.PositiveIntegerField(verbose_name='Минимальный размер стэнда', blank=True, null=True)
price_day = models.PositiveIntegerField(verbose_name='Стоимость билета 1 день', blank=True, null=True) price_day = models.PositiveIntegerField(verbose_name='Стоимость билета 1 день', blank=True, null=True)
price_all = models.PositiveIntegerField(verbose_name='Стоимость билета все дни', blank=True, null=True) price_all = models.PositiveIntegerField(verbose_name='Стоимость билета все дни', blank=True, null=True)
# Условие
price_day_bar = models.PositiveIntegerField(verbose_name='Стоимость на стойке 1 день', blank=True, null=True) price_day_bar = models.PositiveIntegerField(verbose_name='Стоимость на стойке 1 день', blank=True, null=True)
price_all_bar = models.PositiveIntegerField(verbose_name='Стоимость на стойке все дни', blank=True, null=True) price_all_bar = models.PositiveIntegerField(verbose_name='Стоимость на стойке все дни', blank=True, null=True)
# условие
# примечание
price_catalog = models.PositiveIntegerField(verbose_name='Стоимость каталога', blank=True, null=True) price_catalog = models.PositiveIntegerField(verbose_name='Стоимость каталога', blank=True, null=True)
tax = models.BooleanField(verbose_name='Налог', default=1) tax = models.BooleanField(verbose_name='Налог', default=1)
min_closed_area = models.PositiveIntegerField(verbose_name='Минимальная цена закрытой НЕ оборудованной площади', min_closed_area = models.PositiveIntegerField(verbose_name='Минимальная цена закрытой НЕ оборудованной площади',
@ -131,6 +148,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
max_open_area = models.PositiveIntegerField(verbose_name='Максимальная цена открытой площади', max_open_area = models.PositiveIntegerField(verbose_name='Максимальная цена открытой площади',
blank=True, null=True) blank=True, null=True)
registration_payment = models.PositiveIntegerField(verbose_name='Регистрационный взнос', blank=True, null=True) registration_payment = models.PositiveIntegerField(verbose_name='Регистрационный взнос', blank=True, null=True)
# примечание
# statistic # statistic
@ -143,6 +161,40 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk)) return self.lazy_translation_getter('name', unicode(self.pk))
def upload_photo_url(self):
return '/admin/exposition/upload-photo/%s/'%self.id
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()
fill_with_signal(Gallery, gallery, data)
self.photogallery = gallery
self.save()
return gallery
def upload_photo(self, photo ,gallery=None):
"""
uploading photo to gallery
"""
if gallery is None:
gallery = self.get_gallery()
gallery.photos.add(photo)
def get_index_text(self): def get_index_text(self):
names = [tr.name for tr in self.translations.all()] names = [tr.name for tr in self.translations.all()]
return names return names
@ -157,6 +209,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
return ', '.join(audience) return ', '.join(audience)
def get_periodic(self): def get_periodic(self):
periodic = {0: '', 1.0: _(u'Ежегодно'), 2.0: _(u'2 раза в год'), 3.0: _(u'3 раза в год'), periodic = {0: '', 1.0: _(u'Ежегодно'), 2.0: _(u'2 раза в год'), 3.0: _(u'3 раза в год'),
4.0: _(u'4 раза в год'), 5.0: _(u'5 раз в год'), 0.5: _(u'Раз в 2 года'), 4.0: _(u'4 раза в год'), 5.0: _(u'5 раз в год'), 0.5: _(u'Раз в 2 года'),

@ -1,13 +1,17 @@
from django.views.generic import FormView, ListView import json
from django.shortcuts import render_to_response, get_object_or_404 from django.views.generic import FormView
from django.shortcuts import render_to_response, get_object_or_404, HttpResponse, Http404
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.conf import settings from django.conf import settings
from photologue.forms import PhotoForm
class AdminView(FormView): class AdminView(FormView):
obj = None obj = None
def set_obj(self): def set_obj(self):
url = self.kwargs.get('url') url = self.kwargs.get('url')
#rewrwe
if url: if url:
obj = get_object_or_404(self.model, url=url) obj = get_object_or_404(self.model, url=url)
self.obj = obj self.obj = obj
@ -118,27 +122,23 @@ class AdminListView(FormView):
context['object_list'] = result context['object_list'] = result
return context return context
def upload_photo(request, id, Model):
"""
uploading photo to some instance of Model
instance must have upload_photo method, which download photo
""" """
class AdminListView(ListView): obj = get_object_or_404(Model, pk=id)
model = None if request.POST:
paginate_by = settings.ADMIN_PAGINATION response = {'success': False}
template_name = None form = PhotoForm(request.POST, request.FILES)
filter_form = None if form.is_valid():
photo = form.save()
def get_queryset(self): obj.upload_photo(photo)
response['success'] = True
if self.filter_form is None:
return super(AdminListView, self).get_queryset()
else: else:
form = self.filter_form(self.request.GET) response.update({'errors':form.errors})
if form.is_valid():
result = form.filter()
return result
else:
return super(AdminListView, self).get_queryset()
def get_context_data(self, **kwargs): return HttpResponse(json.dumps(response), content_type='application/json')
context = super(AdminListView, self).get_context_data(self, **kwargs) else:
context = return HttpResponse('not post')
"""

@ -33,11 +33,13 @@ class EventMixin(object):
return url return url
def get_logo(self): def get_logo(self):
return self.logo
"""
logo = self.files.filter(purpose='logo') logo = self.files.filter(purpose='logo')
if logo: if logo:
return logo[0] return logo[0]
return logo return logo
"""
def get_preview(self): def get_preview(self):
@ -47,8 +49,15 @@ class EventMixin(object):
return preview return preview
def get_photos(self): def get_photos(self):
if self.photogallery:
return self.photogallery.photos.language().all()
else:
return None
"""
photos = self.files.filter(purpose='photo') photos = self.files.filter(purpose='photo')
return photos return photos
"""
def on(self): def on(self):
self.is_published = True self.is_published = True

@ -22,6 +22,7 @@ import random
#custom fields #custom fields
from functions.custom_views import objects_list, delete_object from functions.custom_views import objects_list, delete_object
from functions.views_help import get_referer from functions.views_help import get_referer
from functions.admin_views import AdminView, AdminListView, upload_photo
def exposition_all(request): def exposition_all(request):
@ -194,7 +195,7 @@ def exposition_change(request, url):
#test---------------------- #test----------------------
from functions.admin_views import AdminView, AdminListView
class PlaceExpositionView(AdminView): class PlaceExpositionView(AdminView):
@ -276,18 +277,5 @@ class PlaceExpositionListView(AdminListView):
def upload_photo(request, place_id): def upload_place_photo(request, place_id):
place = get_object_or_404(PlaceExposition, pk=place_id) return upload_photo(request, place_id, PlaceExposition)
if request.POST:
response = {'success': False}
form = PhotoForm(request.POST, request.FILES)
if form.is_valid():
photo = form.save()
place.upload_photo(photo)
response['success'] = True
else:
response.update({'errors':form.errors})
return HttpResponse(json.dumps(response), content_type='application/json')
else:
return HttpResponse('not post')

@ -6,7 +6,7 @@ urlpatterns = patterns('place_exposition.admin',
#url(r'^all/$', 'exposition_all'), #url(r'^all/$', 'exposition_all'),
url(r'^add-hall/(?P<place_id>.*)/$', 'add_hall'), url(r'^add-hall/(?P<place_id>.*)/$', 'add_hall'),
url(r'^delete-hall/(?P<hall_id>.*)/$', 'delete_hall'), url(r'^delete-hall/(?P<hall_id>.*)/$', 'delete_hall'),
url(r'^upload-photo/(?P<place_id>.*)/$', 'upload_photo'), url(r'^upload-photo/(?P<place_id>.*)/$', 'upload_place_photo'),
url(r'^all/$', PlaceExpositionListView.as_view()), url(r'^all/$', PlaceExpositionListView.as_view()),
url(r'^add.*/$', 'exposition_add'), url(r'^add.*/$', 'exposition_add'),

@ -1,14 +1,10 @@
from django.core.management.base import BaseCommand, CommandError
from place_exposition.models import PlaceExposition
from django.contrib.sites.models import Site
from photologue.models import Gallery, Photo
from file.models import FileModel
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
import urllib2 import urllib2
from django.conf import settings from django.conf import settings
from django.utils import translation from django.utils import translation
from django.core.management.base import BaseCommand, CommandError
from place_exposition.models import PlaceExposition
def handle_place(place): def handle_place(place):
logo = place.get_logo() logo = place.get_logo()
translation.activate('en') translation.activate('en')

@ -21,8 +21,8 @@ def sub_category(request):
model = categorie['model'] model = categorie['model']
obj = get_object_or_404(model, pk=categorie_id) obj = get_object_or_404(model, pk=categorie_id)
objects = obj.get_sub_categories() objects = obj.get_sub_categories()
response = {'sub_categories': objects, 'sub':categorie['sub'], 'sub_name': categorie['sub_categorie_name']} #response = {'sub_categories': objects, 'sub':categorie['sub'], 'sub_name': categorie['sub_categorie_name']}
return HttpResponse(json.dumps(response), content_type='application/json') return HttpResponse(json.dumps(objects), content_type='application/json')
else: else:
raise Http404 raise Http404

@ -1,3 +1,4 @@
// replace
$(document).ready(function(){ $(document).ready(function(){
$('.on').click(function(){ $('.on').click(function(){

@ -1,3 +1,4 @@
//replace
$(document).ready(function(){ $(document).ready(function(){
$('.delete_file').click(function(){ $('.delete_file').click(function(){
var url = '/admin/ajax_delete_file/'; var url = '/admin/ajax_delete_file/';

@ -34,6 +34,57 @@ function deletePhoto(data){
console.log(data); console.log(data);
} }
} }
function postSuccess(data, textStatus, jqXHR){
//console.log(data);
//$('#close').click();
if (data.indexOf("<form")+1){
$('#form_body').html(data);
}
else
{
$('#file_list table tbody').html(data);
$('#close').click();
}
}
//function for progress bar
function progressHandlingFunction(e){
if(e.lengthComputable){
$('progress').attr({value:e.loaded,max:e.total});
}
}
function removeTimeTable(data, obj){
console.log(data);
console.log(obj);
obj.parent().remove();
if ('id' in data){
console.log('success')
}
else{
console.log('error')
}
}
function postTimetable(data, textStatus){
if (data instanceof Object){
console.log(data);
$.each(data, function(field_name, errors){
$('#id_'+field_name).parent().parent().addClass('error');
})
}
else{
$('#timetable_wrap table tbody').html(data);
$('#timetable_form')[0].reset();
$('#timetable_form .control-group').removeClass('error');
$('#close_timetable').click();
}
}
$(document).ready(function(){ $(document).ready(function(){
$('#photo_form').on('submit', function(e){ $('#photo_form').on('submit', function(e){
@ -74,5 +125,271 @@ $(document).ready(function(){
$.get(url, deletePhoto); $.get(url, deletePhoto);
}); });
}); $('.delete_file').click(function(e){
e.preventDefault()
var url = '/admin/ajax_delete_file/';
$this = $(this);
$.get(
url, {'id': $(this).attr("value")}, function(j){
if (j = 'success'){
$this.parent().parent().remove();
}
else{
console.log('error');
}
});//end get
});//end delete
$('#file_form').submit(function(){
var fileData = new FormData($(this)[0]);//file (request.FILES)
var formData = $(this).serialize();// another data (request.POST)
//check if object is new
if ($('#obj_id').val() != '') {
var url = '/admin/ajax_post_file/'+$('#obj_id').val()+'/';
}
else {
var url = '/admin/ajax_post_file/'
}
$.ajax({
url: url, //server script to process data
type: 'POST',
xhr: function() { // custom xhr
var myXhr = $.ajaxSettings.xhr();
if(myXhr.upload){ // check if upload property exists
myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
}
return myXhr;
},
//Ajax events
success: postSuccess,
error: function(){ alert('error'); },
// Form data
data: (formData, fileData),
//Options to tell JQuery not to process data or worry about content-type
cache: false,
contentType: false,
processData: false
});//end ajax
return false;
});//end submit
//------------------on of events----------------
$('.on').click(function(){
var url = $(this).attr('href')
var $this = $(this)
$.get(
url, function(data){
if (data == 'on'){
$this.hide();
$this.siblings('.off').show();
}
});//end get
return false;
});
$('.off').click(function(){
var url = $(this).attr('href')
var $this = $(this)
$.get(
url, function(data){
if (data == 'off'){
$this.hide();
$this.siblings('.on').show();
}
}
)
return false;
});
// end on-of events
$('select').select2({
width: 'element',
allowClear: true
});//end select
$('#id_city').select2({
placeholder: "Search city",
width: 'element',
ajax: {
url: "/admin/city/search/",
dataType: "json",
quietMillis: 200,
data: function(term, page, country){
var country = $('#id_country').val()
return {term: term,
page: page,
country: country};
},
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 id= $(element).val();
var text = $(element).attr('data-init-text');
callback({id: id, text:text});
}
});
// selects
$('#id_tag').select2({
placeholder: "Search tag",
width: '550px',
multiple: true,
ajax: {
url: "/admin/theme/tag/search/",
dataType: "json",
quietMillis: 200,
multiple: true,
data: function(term, page, theme){
var theme = $('#id_theme').serialize();
return {term: term,
page: page,
theme: theme};
},
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 data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
}
});
// end selects
/*
*/
// theme change
$('#id_theme').change(function(){
$.get(
"/admin/ajax_tag/", {'id': $(this).serialize()}, function(data){
var optionValues = [];
var getValues = [];
var selectedValues = []
//push values sended from server in array
$.each(data, function(i, elem){
getValues.push(elem[0].toString())
});
//delete options if they aren't in getvalues
//otherwise push it in array
//also push in array already selected values
$('#id_tag option').each(function() {
var check = $.inArray($(this), getValues);
if ($(this).is(':selected') ){
selectedValues.push($(this).val())
}
if (check == -1){
$(this).remove()
}
else{
optionValues.push($(this).val());
}
});
//generate new options
//old options unchanged
var html = ''
$.each(data, function(i, elem){
var check = $.inArray(elem[0].toString(), optionValues);
if (check == -1){
html += '<option value="';
html += elem[0];
html += '">';
html += elem[1];
html += '</option>';
}
});
$('#id_tag').append(html);
//select previous selected values
$('#id_tag option').each(function() {
var check = $.inArray($(this).val(), selectedValues)
if (check != -1){
$(this).attr('selected', 'selected');
}
});
});//end get
});//end change
$('#timetable_form').on('submit', function(e){//submit(function(){
e.preventDefault();
tinyMCE.triggerSave();
var formData = $(this).serialize();
if ($('#obj_id').val() != '') {
var url = '/admin/ajax_post_timetable/'+$('#obj_id').val()+'/';
}
else {
var url = '/admin/ajax_post_timetable/'
}
$.ajax({
url: url, //server script to process data
type: 'GET',
//Ajax events
success: postTimetable,
error: function(){ alert('error'); },
// Form data
data: formData,
//Options to tell JQuery not to process data or worry about content-type
cache: false,
contentType: false,
processData: false
});//end ajax
return false;
}); // end submit
$('.remove_timetable').on('click', function(e){
e.preventDefault();
$this = $(this);
console.log('111');
var url = '/admin/ajax_delete_timetable/'
var id = $(this).val();
$.get(url, {'id': id}, function(data){
if ('id' in data){
$this.parent().parent().remove();
}
});
});
});

@ -1,3 +1,4 @@
//replace
$(document).ready(function(){ $(document).ready(function(){
//$('#id_city').attr('disabled', true) //$('#id_city').attr('disabled', true)

@ -1,3 +1,4 @@
// replace
$(document).ready(function(){ $(document).ready(function(){
$('#id_theme').change(function(){ $('#id_theme').change(function(){
$.get( $.get(

@ -1,3 +1,4 @@
//replace
$(document).ready(function(){ $(document).ready(function(){
$('#timetable_form').on('submit', function(e){//submit(function(){ $('#timetable_form').on('submit', function(e){//submit(function(){
e.preventDefault(); e.preventDefault();

@ -0,0 +1,679 @@
{% 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 %}
{# 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 %}выставку</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="add-on">
<i data-time-icon="icon-time" data-date-icon="icon-calendar"></i>
</span>
<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>
{# logo #}
<div class="control-group {% if form.logo.errors %}error{% endif %}">
<label class="control-label">{{ form.logo.label }}:</label>
<div class="controls">{{ form.logo }}
<span class="help-inline">{{ form.logo.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">
{# description #}
{% with field='description' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# periodic #}
<div class="control-group {% if form.periodic.errors %}error{% endif %}">
<label class="control-label">{{ form.periodic.label }}:</label>
<div class="controls">{{ form.periodic }}
<span class="help-inline">{{ form.periodic.errors }}</span>
</div>
</div>
{# audience #}
<div class="control-group {% if form.audience.errors %}error{% endif %}">
<label class="control-label">{{ form.audience.label }}:</label>
<div class="controls">{{ form.audience }}
<span class="help-inline">{{ form.audience.errors }}</span>
</div>
</div>
{# 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>
{# products #}
{% with field='products' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# time #}
{% with field='time' 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">
{# 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>
{# application_deadline #}
<div class="control-group {% if form.application_deadline.errors %}error{% endif %}">
<label class="control-label">{{ form.application_deadline.label }}:</label>
<div class="controls">{{ form.application_deadline }}
<span class="help-inline">{{ form.application_deadline.errors }}</span>
</div>
</div>
{# min_stand_size #}
<div class="control-group {% if form.min_stand_size.errors %}error{% endif %}">
<label class="control-label">{{ form.min_stand_size.label }}:</label>
<div class="controls">{{ form.min_stand_size }}
<span class="help-inline">{{ form.min_stand_size.errors }}</span>
</div>
</div>
{# price_day #}
<div class="control-group {% if form.price_day.errors %}error{% endif %}">
<label class="control-label">{{ form.price_day.label }}:</label>
<div class="controls">{{ form.price_day }}
<span class="help-inline">{{ form.price_day.errors }}</span>
</div>
</div>
{# price_all #}
<div class="control-group {% if form.price_all.errors %}error{% endif %}">
<label class="control-label">{{ form.price_all.label }}:</label>
<div class="controls">{{ form.price_all }}
<span class="help-inline">{{ form.price_all.errors }}</span>
</div>
</div>
{% include 'admin/forms/multilang.html' with field='pre_condition' form=form languages=languages %}
{# price_day_bar #}
<div class="control-group {% if form.price_day_bar.errors %}error{% endif %}">
<label class="control-label">{{ form.price_day_bar.label }}:</label>
<div class="controls">{{ form.price_day_bar }}
<span class="help-inline">{{ form.price_day_bar.errors }}</span>
</div>
</div>
{# price_all_bar #}
<div class="control-group {% if form.price_all_bar.errors %}error{% endif %}">
<label class="control-label">{{ form.price_all_bar.label }}:</label>
<div class="controls">{{ form.price_all_bar }}
<span class="help-inline">{{ form.price_all_bar.errors }}</span>
</div>
</div>
{% include 'admin/forms/multilang.html' with field='stand_condition' form=form languages=languages %}
{# price_catalog #}
<div class="control-group {% if form.price_catalog.errors %}error{% endif %}">
<label class="control-label">{{ form.price_catalog.label }}:</label>
<div class="controls">{{ form.price_catalog }}
<span class="help-inline">{{ form.price_catalog.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>
{% include 'admin/forms/multilang.html' with field='visit_note' form=form languages=languages %}
{# min_closed_area #}
<div class="control-group {% if form.min_closed_area.errors %}error{% endif %}">
<label class="control-label">{{ form.min_closed_area.label }}:</label>
<div class="controls">{{ form.min_closed_area }}
<span class="help-inline">{{ form.min_closed_area.errors }}</span>
</div>
</div>
{# max_closed_area #}
<div class="control-group {% if form.max_closed_area.errors %}error{% endif %}">
<label class="control-label">{{ form.max_closed_area.label }}:</label>
<div class="controls">{{ form.max_closed_area }}
<span class="help-inline">{{ form.max_closed_area.errors }}</span>
</div>
</div>
{# min_closed_equipped_area #}
<div class="control-group {% if form.min_closed_equipped_area.errors %}error{% endif %}">
<label class="control-label">{{ form.min_closed_equipped_area.label }}:</label>
<div class="controls">{{ form.min_closed_equipped_area }}
<span class="help-inline">{{ form.min_closed_equipped_area.errors }}</span>
</div>
</div>
{# max_closed_equipped_area #}
<div class="control-group {% if form.max_closed_equipped_area.errors %}error{% endif %}">
<label class="control-label">{{ form.max_closed_equipped_area.label }}:</label>
<div class="controls">{{ form.max_closed_equipped_area }}
<span class="help-inline">{{ form.max_closed_equipped_area.errors }}</span>
</div>
</div>
{# min_open_area #}
<div class="control-group {% if form.min_open_area.errors %}error{% endif %}">
<label class="control-label">{{ form.min_open_area.label }}:</label>
<div class="controls">{{ form.min_open_area }}
<span class="help-inline">{{ form.min_open_area.errors }}</span>
</div>
</div>
{# max_open_area #}
<div class="control-group {% if form.max_open_area.errors %}error{% endif %}">
<label class="control-label">{{ form.max_open_area.label }}:</label>
<div class="controls">{{ form.max_open_area }}
<span class="help-inline">{{ form.max_open_area.errors }}</span>
</div>
</div>
{# min_area #}
<div class="control-group {% if form.min_area.errors %}error{% endif %}">
<label class="control-label">{{ form.min_area.label }}:</label>
<div class="controls">{{ form.min_area }}
<span class="help-inline">{{ form.min_area.errors }}</span>
</div>
</div>
{# registration_payment #}
<div class="control-group {% if form.registration_payment.errors %}error{% endif %}">
<label class="control-label">{{ form.registration_payment.label }}:</label>
<div class="controls">{{ form.registration_payment }}
<span class="help-inline">{{ form.registration_payment.errors }}</span>
</div>
</div>
{% include 'admin/forms/multilang.html' with field='participation_note' form=form languages=languages %}
{# 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 %}
{% include 'admin/forms/multilang.html' with field='stat_countries' form=form languages=languages %}
</div>
</div>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Участники</h2>
</div>
<div class="box-content">
{# organiser #}
<div class="control-group {% if form.organiser.errors %}error{% endif %}">
<label class="control-label">{{ form.organiser.label }}:</label>
<div class="controls">{{ form.organiser }}
<span class="help-inline">{{ form.organiser.errors }}</span>
</div>
</div>
{# company #}
<div class="control-group {% if form.company.errors %}error{% endif %}">
<label class="control-label">{{ form.company.label }}:</label>
<div class="controls">{{ form.company }}
<span class="help-inline">{{ form.company.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">
{% 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>
{# 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 formset_statistic.errors %}
<div class="alert alert-error">
{% for form in formset_statistic.forms %}
{% for key, value in form.errors.items %}
<p>{{ value }}</p>
{% endfor %}
{% endfor %}
</div>
{% endif %}
{# formset of stat #}
{{ formset_statistic.management_form }}
<div id="halls" 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>
</tr>
</thead>
<tbody>
{% for form in formset_statistic.forms %}
<tr class="item" {% if object %}{% else %}style="display: NONE"{% endif %}>
<td>{{ form.year }}</td>
<td>{{ form.visitors }}</td>
<td>{{ form.members }}</td>
<td><a class="delete btn btn-danger" href="#"><i class="icon-trash icon-white"></i> Удалить</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<p style=" padding-left: 20px"><a id="add" class="btn btn-success" href="#"><i class="icon-plus-sign icon-white"></i> Добавить год</a></p>
</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>
{# modal window #}
<div id="popup_wrap">
<div class="modal hide fade" id="myModal" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" id="close">&times;</button>
<h3>Добавить файл</h3>
</div>
<div class="modal-body">
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="file_form" id="file_form" > {% csrf_token %}
{# hidden inputs uses for comparing with Exposition form key#}
{{ file_form.key }}
{{ file_form.model }}
<input type="hidden" id="obj_id" value="{{ object.id }}">
{# file_path #}
<div class="control-group{% if file_form.file_path.errors %}error{% endif %}">
<label class="control-label">{{ file_form.file_path.label }}:</label>
<div class="controls">{{ file_form.file_path }}
<span class="help-inline">{{ file_form.file_path.errors }}</span>
</div>
</div>
{# file purpose #}
<div class="control-group{% if file_form.purpose.errors %}error{% endif %}">
<label class="control-label">{{ file_form.purpose.label }}:</label>
<div class="controls">{{ file_form.purpose }}
<span class="help-inline">{{ file_form.purpose.errors }}</span>
</div>
</div>
{# file_name #}
{% with field='file_name' form=file_form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# file_description #}
{% with field='description' form=file_form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
</div>
<div class="modal-footer">
<div class="controls">
<input class="btn btn-primary" type="submit" value="Добавить">
<input type="reset" class="btn" value="Отменить" data-dismiss="modal">
</form>
</div>
</div>
</div>
<div class="modal hide fade" id="timetableModal" style="width: 800px;">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" id="close_timetable">&times;</button>
<h3>Добавить Программу</h3>
</div>
<form method="get" class="form-horizontal" name="timetable_form" id="timetable_form" > {% csrf_token %}
{# hidden inputs uses for comparing with Exposition form key#}
{{ timetable_form.key }}
<input type="hidden" id="obj_id" value="{{ object.id }}">
<div class="modal-body">
<div class="control-group">
<label class="control-label"><strong>Время:</strong></label>
<div class="controls">
{{ timetable_form.begin }} {{ timetable_form.end }}
</div>
</div>
{% with field='name' form=timetable_form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{% with field='programe' form=timetable_form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
<div>
{% with field='speaker' form=timetable_form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{% with field='place' form=timetable_form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
<!--
<div class="control-group">
<label class="control-label">Организатор:</label>
<div class="controls">
{{ timetable_form.timetable_organiser }}
</div>
</div>
-->
</div>
</div>
<div class="modal-footer">
<div class="controls">
<input class="btn btn-primary" type="submit" value="Добавить">
<input type="reset" class="btn" value="Отменить" data-dismiss="modal">
</div>
</div>
</form>
</div>
</div>
{% include 'admin/includes/photo_form.html' with form=photo_form object=object %}
{% endblock %}

@ -0,0 +1,34 @@
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i>Фотогалерея</h2>
</div>
<div class="box-content">
{% if object %}
<a class="btn btn-success" href="#photopopup" data-toggle="modal"><i class="icon-plus-sign icon-white"></i> Фото</a>
<a href="{{ object.photogallery.admin_url }}" role="button" class="btn btn-info" data-toggle="modal">Просмотреть галерею</a><br><br>
{% else %}
<p>Фото можна добавлять только после введения основных даных</p>
{% endif %}
{% with photos=object.photogallery.photos.all %}
{% for photo in photos %}
<div class="photo" style="float: left;margin-right: 15px;">
<div class="hover">
<a href="{{ photo.get_delete_url }}" class="btn-small btn-danger delete-photo">удалить</a>
</div>
<div>
<a href="/admin/photogallery/photo/{{ photo.slug }}/">
<img src="{{ photo.get_admin_thumbnail_url }}" class="thumbnail" alt="{{ photo.title }}">
</a>
</div>
</div>
{% endfor %}
{% endwith %}
</div>
</div>

@ -25,6 +25,7 @@
<script src="{% static 'custom_js/make_select.js' %}"></script> <script src="{% static 'custom_js/make_select.js' %}"></script>
<script src="{% static 'custom_js/formset_add.js' %}"></script> <script src="{% static 'custom_js/formset_add.js' %}"></script>
{# ajax #} {# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> <script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/place_city_ajax.js' %}"></script> <script src="{% static 'custom_js/place_city_ajax.js' %}"></script>
@ -371,40 +372,7 @@
</div> </div>
</div> </div>
<div class="box span8"> {% include 'admin/includes/photogallery.html' with object=object %}
<div class="box-header well">
<h2><i class="icon-pencil"></i>Фотогалерея</h2>
</div>
<div class="box-content">
{% if object %}
<a class="btn btn-success" href="#photopopup" data-toggle="modal"><i class="icon-plus-sign icon-white"></i> Фото</a>
<a href="{{ object.photogallery.admin_url }}" role="button" class="btn btn-info" data-toggle="modal">Просмотреть галерею</a><br><br>
{% else %}
<p>Фото можна добавлять только после введения основных даных</p>
{% endif %}
{% with photos=object.photogallery.photos.all %}
{% for photo in photos %}
<div class="photo" style="float: left;margin-right: 15px;">
<div class="hover">
<a href="{{ photo.get_delete_url }}" class="btn-small btn-danger delete-photo">удалить</a>
</div>
<div>
<a href="/admin/photogallery/photo/{{ photo.slug }}/">
<img src="{{ photo.get_admin_thumbnail_url }}" class="thumbnail" alt="{{ photo.title }}">
</a>
</div>
</div>
{% endfor %}
{% endwith %}
</div>
</div>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">

@ -113,14 +113,17 @@
{% include 'includes/event_steps.html' with event=exposition filter=filter %} {% include 'includes/event_steps.html' with event=exposition filter=filter %}
{% if exposition.get_photos %} {% if exposition.get_photos %}
{% with photos=exposition.get_photos|slice:"5" %}
<hr /> <hr />
<div class="i-photo-slides"> <div class="i-photo-slides">
<div class="sect-title"><a href="#">{% trans 'Фотографии с прошлой выставки' %}</a></div> <div class="sect-title"><a href="#">{% trans 'Фотографии с прошлой выставки' %}</a></div>
<div id="ps-photo-gallery" class="ps-photo-gallery swiper-container"> <div id="ps-photo-gallery" class="ps-photo-gallery swiper-container">
<ul class="swiper-wrapper"> <ul class="swiper-wrapper">
{% for photo in exposition.get_photos %} {% for photo in photos %}
<li class="swiper-slide"><a class="open-photo" href="#"><img src="{{ photo.file_path.url }}" alt="" /></a></li> <li class="swiper-slide">
<img src="{{ photo.get_display_url }}" alt="" />
</li>
{% endfor %} {% endfor %}
</ul> </ul>
<div class="re-controls"> <div class="re-controls">
@ -129,6 +132,7 @@
</div> </div>
</div> </div>
</div> </div>
{% endwith %}
{% endif %} {% endif %}
{% if exposition.description %} {% if exposition.description %}
<div class="i-event-description"> <div class="i-event-description">

@ -64,7 +64,7 @@ class Theme(TranslatableModel):
return self.expositions_number() + self.conferences_number() + self.seminars_number() + self.webinars_number() return self.expositions_number() + self.conferences_number() + self.seminars_number() + self.webinars_number()
def get_sub_categories(self): def get_sub_categories(self):
objects = [{'name':item.name, 'id':item.id} for item in self.tags.language().all()] objects = [{'text':item.name, 'id':item.id, 'name':'tg', 'sub':False} for item in self.tags.language().all()]
return objects return objects
def clone(self): def clone(self):

Loading…
Cancel
Save