remotes/origin/1203
kotzilla 11 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)
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
@ -162,7 +162,7 @@ class Country(TranslatableModel):
.filter(exposition_city__city__isnull=False, translations__language_code=lang, country=self).distinct()
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

@ -14,12 +14,13 @@ from theme.models import Tag
from city.models import City
from file.models import FileModel, TmpFile
from file.forms import FileModelForm
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 exposition_all(request):
@ -232,7 +233,84 @@ def exposition_change(request, url):
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):
template_name = 'admin/exposition/exposition_list.html'
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 -*-
from django.conf.urls import patterns, include, url
from admin import ExpositionListView
from admin import ExpositionListView, ExpositionView
urlpatterns = patterns('exposition.admin',
url(r'^upload-photo/(?P<expo_id>.*)/$', 'upload_exposition_photo'),
url(r'^add.*/$', 'exposition_add'),
url(r'^delete/(?P<url>.*)/$', 'exposition_delete'),
url(r'^change/(?P<url>.*)/$', 'exposition_change'),
url(r'^all/$', ExpositionListView.as_view()),
url(r'^switch/(?P<url>.*)/(?P<action>.*)$', 'exposition_switch'),
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
#models
from models import Exposition, TimeTable, TmpTimeTable, AUDIENCE1, CURRENCY, Statistic, BIT_AUDIENCE
from theme.models import Tag
from country.models import Country
from theme.models import Theme
from organiser.models import Organiser
@ -42,6 +43,7 @@ class ExpositionCreateForm(forms.Form):
data_begin = 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)
company = forms.ModelMultipleChoiceField(label=u'Компании', queryset=Company.objects.all(), required=False)
@ -51,7 +53,8 @@ class ExpositionCreateForm(forms.Form):
empty_label='', required=False)
#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=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)
audience = forms.MultipleChoiceField(label=u'Аудитория', choices=public, initial='', required=False)
@ -103,7 +106,8 @@ class ExpositionCreateForm(forms.Form):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
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'Краткое описание',
required=False, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label=u'Описание',
@ -114,6 +118,17 @@ class ExpositionCreateForm(forms.Form):
required=False, widget=CKEditorWidget)
self.fields['discount_description_%s' % code] = forms.CharField(label=u'Описание скидки',
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
self.fields['title_%s' % code] = forms.CharField(label=u'Meta title', required=False, max_length=255,
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)
def save(self, id=None):
def save(self, obj=None):
"""
change Exposition model object with id = id
N/A add new Exposition model object
@ -135,17 +150,19 @@ class ExpositionCreateForm(forms.Form):
form.save() - if add exposition
"""
data = self.cleaned_data
if not id:
if not obj:
exposition = Exposition()
else:
exposition = Exposition.objects.get(id=id)
exposition = obj
exposition.theme.clear()
exposition.tag.clear()
exposition.organiser.clear()
exposition.company.clear()
#simple fields
exposition.url = translit_with_separator(data['name_ru'].strip()).lower()
exposition.logo = data['logo']
exposition.data_begin = data['data_begin']
exposition.data_end = data['data_end']
exposition.periodic = data['periodic']
@ -205,9 +222,9 @@ class ExpositionCreateForm(forms.Form):
#fill manytomany fields
for item in data['theme']:
exposition.theme.add(item.id)#.id cause select uses queryset
for item in data['tag']:
exposition.tag.add(item)
exposition.tag.add(*Tag.objects.filter(id__in=data['tag']))
#for item in data['tag']:
# exposition.tag.add(item)
# uses because in the next loop data will be overwritten
for item in data['organiser']:
exposition.organiser.add(item)
@ -234,6 +251,19 @@ class ExpositionCreateForm(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,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 -*-
import copy, datetime
from django.db import models
from django.db.models.signals import post_save, pre_save
from django.utils.translation import ugettext as _
from django.conf import settings
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
import copy, datetime
from django.contrib.contenttypes import generic
from bitfield import BitField
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.models_methods import ExpoManager
from functions.model_mixin import EventMixin, ExpoMixin
from functions.translate import fill_with_signal
from photologue.models import Gallery
AUDIENCE1 = ((None,_(u'Не выбрано')),
('experts', _(u'Специалисты')),
@ -65,7 +69,9 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
blank=True, null=True, related_name='exposition_companies')
users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки',
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'])
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),
discount_description = 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
title = 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)
price_day = models.PositiveIntegerField(verbose_name='Стоимость билета 1 день', 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_all_bar = 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)
min_closed_area = models.PositiveIntegerField(verbose_name='Минимальная цена закрытой НЕ оборудованной площади',
@ -131,6 +148,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
max_open_area = models.PositiveIntegerField(verbose_name='Максимальная цена открытой площади',
blank=True, null=True)
registration_payment = models.PositiveIntegerField(verbose_name='Регистрационный взнос', blank=True, null=True)
# примечание
# statistic
@ -143,6 +161,40 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
def __unicode__(self):
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):
names = [tr.name for tr in self.translations.all()]
return names
@ -157,6 +209,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
return ', '.join(audience)
def get_periodic(self):
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 года'),

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

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

@ -22,6 +22,7 @@ import random
#custom fields
from functions.custom_views import objects_list, delete_object
from functions.views_help import get_referer
from functions.admin_views import AdminView, AdminListView, upload_photo
def exposition_all(request):
@ -194,7 +195,7 @@ def exposition_change(request, url):
#test----------------------
from functions.admin_views import AdminView, AdminListView
class PlaceExpositionView(AdminView):
@ -276,18 +277,5 @@ class PlaceExpositionListView(AdminListView):
def upload_photo(request, place_id):
place = get_object_or_404(PlaceExposition, pk=place_id)
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')
def upload_place_photo(request, place_id):
return upload_photo(request, place_id, PlaceExposition)

@ -6,7 +6,7 @@ urlpatterns = patterns('place_exposition.admin',
#url(r'^all/$', 'exposition_all'),
url(r'^add-hall/(?P<place_id>.*)/$', 'add_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'^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
from django.conf import settings
from django.utils import translation
from django.core.management.base import BaseCommand, CommandError
from place_exposition.models import PlaceExposition
def handle_place(place):
logo = place.get_logo()
translation.activate('en')

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

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

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

@ -34,6 +34,57 @@ function deletePhoto(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(){
$('#photo_form').on('submit', function(e){
@ -74,5 +125,271 @@ $(document).ready(function(){
$.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(){
//$('#id_city').attr('disabled', true)

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

@ -1,3 +1,4 @@
//replace
$(document).ready(function(){
$('#timetable_form').on('submit', function(e){//submit(function(){
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/formset_add.js' %}"></script>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/place_city_ajax.js' %}"></script>
@ -371,40 +372,7 @@
</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 %}
<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>
{% include 'admin/includes/photogallery.html' with object=object %}
<div class="box span8">
<div class="box-header well">

@ -113,14 +113,17 @@
{% include 'includes/event_steps.html' with event=exposition filter=filter %}
{% if exposition.get_photos %}
{% with photos=exposition.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 exposition.get_photos %}
<li class="swiper-slide"><a class="open-photo" href="#"><img src="{{ photo.file_path.url }}" alt="" /></a></li>
{% for photo in photos %}
<li class="swiper-slide">
<img src="{{ photo.get_display_url }}" alt="" />
</li>
{% endfor %}
</ul>
<div class="re-controls">
@ -129,6 +132,7 @@
</div>
</div>
</div>
{% endwith %}
{% endif %}
{% if exposition.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()
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
def clone(self):

Loading…
Cancel
Save