You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

142 lines
5.7 KiB

# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.core.context_processors import csrf
from django.conf import settings
from django.forms.formsets import BaseFormSet, formset_factory
from django.forms.models import modelformset_factory
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import login_required
#models and forms
from models import Exposition, TimeTable
from forms import ExpositionChangeForm, ExpositionCreateForm, TimeTableForm
from theme.models import Tag
from city.models import City
from file.models import FileModel, TmpFile
from file.forms import FileModelForm
#python
import random
#custom views
from functions.custom_views import objects_list
def exposition_all(request):
"""
Return list of all expositions with pagination
"""
return objects_list(request, Exposition, 'exposition_all.html')
@login_required
def exposition_add(request):
"""
Returns form of exposition and post it on the server.
If form is posted redirect on the page of all expositions.
"""
#if form would be not valid key must be same
if request.POST.get('key'):
key = request.POST['key']
else:
key = random.getrandbits(128)
file_form = FileModelForm(initial={'key': key})
if request.POST:
form = ExpositionCreateForm(request.POST)
#set choices filled by ajax
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()]
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])]
if form.is_valid():
form.save()
return HttpResponseRedirect('/exposition/all/')
else:
form = ExpositionCreateForm(initial={'key': key})
args = {}
args.update(csrf(request))
args['form'] = form
args['file_form'] = file_form
args['files'] = TmpFile.objects.filter(key=key)
args['languages'] = settings.LANGUAGES
return render_to_response('exposition_add.html', args)
@login_required
def exposition_change(request, url):
"""
Return form of exposition and fill it with existing Exposition object data.
If form of exposition is posted redirect on the page of all expositions.
"""
try:
#check if exposition_id exists else redirect to the list of expositions
exposition = Exposition.objects.get(url=url)
file_form = FileModelForm(initial={'model': 'exposition.Exposition'})
except:
return HttpResponseRedirect('/exposition/all/')
if request.POST:
form = ExpositionChangeForm(request.POST)
#set choices filled by ajax
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()]
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])]
if form.is_valid():
form.save(getattr(exposition, 'id'))
return HttpResponseRedirect('/exposition/all/')
else:
#fill form with data from database
data = {'web_page':exposition.web_page, 'foundation_year': exposition.foundation_year,
'data_begin':exposition.data_begin, 'data_end':exposition.data_end, 'periodic':exposition.periodic,
'audience':exposition.audience, 'min_area':exposition.min_area, 'currency':exposition.currency,
'tax':exposition.tax, 'min_closed_area':exposition.min_closed_area,
'max_closed_area':exposition.max_closed_area, 'min_closed_equipped_area':exposition.min_closed_equipped_area,
'max_closed_equipped_area':exposition.max_closed_equipped_area,
'min_open_area':exposition.min_open_area, 'max_open_area':exposition.max_open_area,
'registration_payment':exposition.registration_payment, 'exposition_id':exposition.id}
if exposition.country:
data['country'] = exposition.country.id
if exposition.city:
data['city'] = exposition.city.id
if exposition.place:
data['place'] = exposition.place.id
data['theme'] = [item.id for item in exposition.theme.all()]
data['tag'] = [item.id for item in exposition.tag.all()]
#data from translated fields
for code, name in settings.LANGUAGES:
obj = Exposition._meta.translations_model.objects.get(language_code = code,master__id=getattr(exposition, 'id')) #access to translated fields
data['name_%s' % code] = obj.name
data['description_%s' % code] = obj.description
data['main_title_%s' % code] = obj.main_title
data['time_%s' % code] = obj.time
data['products_%s' % code] = obj.products
data['title_%s' % code] = obj.title
data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions
#initial form
form = ExpositionChangeForm(initial=data)
#set choices filled by ajax
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])]
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])]
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
args['file_form'] = file_form
#get list of files which connected with specific model object
args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(exposition),
object_id=getattr(exposition, 'id'))
args['obj_id'] = getattr(exposition, 'id')
return render_to_response('exposition_add.html', args)