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.
 
 
 
 
 
 

309 lines
12 KiB

# -*- coding: utf-8 -*-
import json
from django.shortcuts import render_to_response, get_object_or_404, HttpResponse
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import login_required
from django.forms.formsets import formset_factory
from django.forms.models import modelformset_factory
#models and forms
from forms import ExpositionForm, PlaceExpositionFormDelete, HallForm, PlaceExpositionFilter
from models import PlaceExposition, Hall
from city.models import City
from file.models import FileModel, TmpFile
from file.forms import FileModelForm, FileForm
from photologue.forms import PhotoForm
#python
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, FormView
def exposition_all(request):
"""
Return list of all place_expositions with pagination
"""
return objects_list(request, PlaceExposition, 'place_exposition_all.html')
@login_required
def place_exposition_copy(request, url):
place_exposition = PlaceExposition.objects.safe_get(url=url)
if not place_exposition:
return HttpResponseRedirect(get_referer(request))
else:
place_exposition.clone()
return HttpResponseRedirect(get_referer(request))
@login_required
def exposition_add(request):
"""
Returns form of place_exposition and formset of pavilions and post it on the server.
If forms is posted redirect on the page of all place_expositions.
"""
#formset of HallForm
HallFormSet = formset_factory(HallForm)
if request.POST.get('key'):
key = request.POST['key']
else:
key = random.getrandbits(128)
file_form = FileModelForm(initial={'key': key})
if request.POST:
form = ExpositionForm(request.POST)
#set choices filled by ajax
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=request.POST['country'])]
formset = HallFormSet(request.POST)
if form.is_valid() and formset.is_valid():
place_exposition = form.save()
for item in formset.forms:
#saves forms if its valid and not empty
if item.is_valid() and item.has_changed():
hall = item.save(commit=False)
hall.place_exposition = place_exposition
hall.save()
return HttpResponseRedirect('/admin/place_exposition/all')
else:
form = ExpositionForm(initial={'key': key})
formset = HallFormSet()
args = {}
args.update(csrf(request))
args['languages'] = settings.LANGUAGES
args['form'] = form
args['formset'] = formset
args['file_form'] = file_form
args['files'] = TmpFile.objects.filter(key=key)
return render_to_response('place_exposition_add.html', args)
def exposition_delete(request, url):
return delete_object(request, PlaceExposition, PlaceExpositionFormDelete, url, '/admin/place_exposition/all')
@login_required
def exposition_change(request, url):
"""
Return form of place_expositions and formset of pavilions
and fill it with existing PlaceExposition and Pavilion object data.
If form of conference is posted redirect on the page of all conferences.
"""
try:
#check if exposition_id exists else redirect to the list of place of conference
place = PlaceExposition.objects.get(url=url)
exposition_id = getattr(place, 'id')
file_form = FileModelForm(initial={'model': 'place_exposition.PlaceExposition'})
except:
return HttpResponseRedirect('/admin/place_exposition/all')
if request.POST:
#formset of HallForm
HallFormSet = formset_factory(HallForm)
form = ExpositionForm(request.POST)
#set choices filled by ajax
form.fields['city'].widget.attrs['data-init-text'] =City.objects.get(id=request.POST['city']).name
formset = HallFormSet(request.POST)
if form.is_valid() and formset.is_valid():
place_exposition = form.save(exposition_id)
#delete old halls
Hall.objects.filter(place_exposition=getattr(place, 'id')).delete()
for item in formset.forms:
#saves new halls if its valid and not empty
if item.is_valid() and item.has_changed():
hall = item.save(commit=False)
hall.place_exposition = place_exposition
hall.save()
return HttpResponseRedirect('/admin/place_exposition/all')
else:
#initial HallFormSet
HallFormSet = modelformset_factory(Hall, form=HallForm, exclude=('place_exposition',))
#fill form with data from database
data= {'type': place.type, 'address': place.address,
'phone': place.phone, 'fax': place.fax, 'web_page': place.web_page, 'email': place.email,
'foundation_year': place.foundation_year, 'total_area': place.total_area,
'closed_area': place.closed_area, 'open_area': place.open_area,
'total_pavilions': place.total_pavilions, 'total_halls': place.total_halls, 'wifi':place.wifi,
'bank': place.bank, 'children_room': place.children_room,
'disabled_service': place.disabled_service, 'conference_centre': place.conference_centre,
'business_centre': place.business_centre, 'online_registration': place.online_registration,
'cafe': place.cafe, 'terminals': place.terminals, 'parking': place.parking,
'press_centre': place.press_centre, 'mobile_application': place.mobile_application,
'place_exposition_id':place.id}
if place.country:
data['country'] = place.country.id
data['city'] = place.city.id
#data from translated fields
for code, name in settings.LANGUAGES:
obj = PlaceExposition._meta.translations_model.objects.get(language_code = code,master__id=exposition_id) #access to translated fields
data['name_%s'%code] = obj.name
data['main_title_%s'%code] = obj.main_title
data['description_%s'%code] = obj.description
data['adress_%s'%code] = obj.adress
data['total_year_action_%s'%code] = obj.total_year_action
data['title_%s'%code] = obj.title
data['keywords_%s'%code] = obj.keywords
data['descriptions_%s'%code] = obj.descriptions
form = ExpositionForm(initial=data)
form.fields['city'].widget.attrs['data-init-text'] = place.city.name
#set choices filled by ajax
#form.fields['city'].choices = [(item.id, item.name) for item in City.objects.filter(country=data['country'])]
#get existing halls
halls = Hall.objects.filter(place_exposition=getattr(place, 'id'))
#fill HallFormSet
formset = HallFormSet(queryset=halls)
args = {}
args.update(csrf(request))
args['languages'] = settings.LANGUAGES
args['form'] = form
args['formset'] = formset
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(place),
object_id=getattr(place, 'id'))
args['obj_id'] = exposition_id
args['object'] = place
return render_to_response('place_exposition_add.html', args)
#new----------------------
class PlaceExpositionView(AdminView):
form_class = ExpositionForm
model = PlaceExposition
success_url = '/admin/place_exposition/all/'
template_name = 'c_admin/place_exposition/place_exposition.html'
def get_form(self, form_class):
if self.request.POST:
return super(PlaceExpositionView, self).get_form(form_class)
obj = self.set_obj()
if obj:
data = {'type': obj.type, 'address': obj.address,
'phone': obj.phone, 'fax': obj.fax, 'web_page': obj.web_page, 'email': obj.email,
'foundation_year': obj.foundation_year, 'total_area': obj.total_area,
'closed_area': obj.closed_area, 'open_area': obj.open_area,
'total_pavilions': obj.total_pavilions, 'total_halls': obj.total_halls, 'wifi':obj.wifi,
'bank': obj.bank, 'children_room': obj.children_room,
'disabled_service': obj.disabled_service, 'conference_centre': obj.conference_centre,
'business_centre': obj.business_centre, 'online_registration': obj.online_registration,
'cafe': obj.cafe, 'terminals': obj.terminals, 'parking': obj.parking,
'press_centre': obj.press_centre, 'mobile_application': obj.mobile_application,
'place_exposition_id':obj.id, 'logo': obj.logo}
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['main_title_%s'%code] = trans_obj.main_title
data['description_%s'%code] = trans_obj.description
data['adress_%s'%code] = trans_obj.adress
data['total_year_action_%s'%code] = trans_obj.total_year_action
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
return form
else:
return form_class()
def get_context_data(self, **kwargs):
context = super(PlaceExpositionView, self).get_context_data(**kwargs)
obj = self.set_obj()
if obj:
context['file_form'] = FileForm(initial={'model': 'place_exposition.PlaceExposition'})
files = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(obj),object_id=getattr(obj, 'id'))
context['files'] = files
context['halls'] = list(Hall.objects.language().filter(place_exposition=self.obj))
context['hall_form'] = HallForm()
context['photo_form'] = PhotoForm()
return context
def add_hall(request, place_id):
place = get_object_or_404(PlaceExposition, pk=place_id)
form = HallForm(request.POST)
response = {'success': False}
if form.is_valid():
form.save(place)
response['success'] = True
else:
response.update({'errors':form.errors})
return HttpResponse(json.dumps(response), content_type='application/json')
def delete_hall(request, hall_id):
hall = get_object_or_404(Hall, pk=hall_id)
hall.delete()
response = {'success': True}
return HttpResponse(json.dumps(response), content_type='application/json')
class PlaceExpositionListView(AdminListView):
template_name = 'c_admin/place_exposition/place_exposition_list.html'
form_class = PlaceExpositionFilter
model = PlaceExposition
def upload_place_photo(request, place_id):
return upload_photo(request, place_id, PlaceExposition)
def edit_hall(request, place_url, hall_id):
place = get_object_or_404(PlaceExposition, url=place_url)
hall = get_object_or_404(Hall, id=hall_id)
if request.POST:
form = HallForm(request.POST)
if form.is_valid():
form.save(place, hall_id)
return HttpResponseRedirect('/admin/place_exposition/%s/'%place.url)
else:
data = {'capacity': hall.capacity, 'number': hall.number}
for code, name in settings.LANGUAGES:
trans_obj = Hall._meta.translations_model.objects.get(language_code = code, master__id=hall.id) #access to translated fields
data['name_%s'%code] = trans_obj.name
form = HallForm(initial=data)
context = {'form': form, 'languages': settings.LANGUAGES}
context.update(csrf(request))
return render_to_response('c_admin/place_exposition/hall.html', context)