# -*- 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, ExpositionDeleteForm, 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, delete_object from functions.views_help import get_referer def exposition_all(request): """ Return list of all expositions with pagination """ return objects_list(request, Exposition, 'exposition_all.html') @login_required def exposition_switch(request, url, action): """ turn on or off exposition take: url as url of exposition action as action what to do('on' or 'off') """ exposition = Exposition.objects.safe_get(url=url) if not exposition: return HttpResponse('error') else: if action == 'on': exposition.on() return HttpResponse('on') elif action == 'off': exposition.off() return HttpResponse('off') else: return HttpResponse('error') @login_required def exposition_copy(request, url): exposition = Exposition.objects.safe_get(url=url) if not exposition: return HttpResponseRedirect(get_referer(request)) else: exposition.clone() return HttpResponseRedirect(get_referer(request)) @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('/admin/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) def exposition_delete(request, url): return delete_object(request, Exposition, ExpositionDeleteForm, url, '/admin/exposition/all') @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('/admin/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('/admin/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)