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.
 
 
 
 
 
 

214 lines
8.4 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 Conference, TimeTable, Statistic
from forms import ConferenceChangeForm, ConferenceCreateForm, ConferenceDeleteForm, TimeTableForm, StatisticForm
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 conference_all(request):
"""
Return list of all conferences with pagination
"""
return objects_list(request, Conference, 'conference_all.html')
@login_required
def conference_switch(request, url, action):
"""
turn on or off conference
take:
url as url of conference
action as action what to do('on' or 'off')
"""
conference = Conference.objects.safe_get(url=url)
if not conference:
return HttpResponse('error')
else:
if action == 'on':
conference.on()
return HttpResponse('on')
elif action == 'off':
conference.off()
return HttpResponse('off')
else:
return HttpResponse('error')
@login_required
def conference_copy(request, url):
conference = Conference.objects.safe_get(url=url)
if not conference:
return HttpResponseRedirect(get_referer(request))
else:
conference.clone()
return HttpResponseRedirect(get_referer(request))
@login_required
def conference_add(request):
"""
Returns form of conference and post it on the server.
If form is posted redirect on the page of all conferences.
"""
# formset of StatisticForm
StatisticFormSet = formset_factory(StatisticForm)
#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 = ConferenceCreateForm(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'])]
#
formset_statistic = StatisticFormSet(request.POST)
if form.is_valid() and formset_statistic.is_valid():
conference = form.save()
for item in formset_statistic.forms:
#saves forms if its valid and not empty
if item.is_valid() and item.has_changed():
statistic = item.save(commit=False)
statistic.conference = conference
statistic.save()
return HttpResponseRedirect('/admin/conference/all/')
else:
form = ConferenceCreateForm(initial={'key': key})
formset_statistic = StatisticFormSet()
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
args['file_form'] = file_form
args['files'] = TmpFile.objects.filter(key=key)
args['formset_statistic'] = formset_statistic
return render_to_response('conference_add.html', args)
def conference_delete(request, url):
return delete_object(request, Conference, ConferenceDeleteForm, url, '/admin/conference/all')
@login_required
def conference_change(request, url):
"""
Return form of conference and fill it with existing Conference object data.
If form of conference is posted redirect on the page of all conferences.
"""
try:
#check if conference_id exists else redirect to the list of conferences
conference = Conference.objects.get(url=url)
file_form = FileModelForm(initial={'model': 'city.City'})
except:
return HttpResponseRedirect('/admin/conference/all/')
if request.POST:
StatisticFormSet = formset_factory(StatisticForm)
form = ConferenceChangeForm(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'])]
formset_statistic = StatisticFormSet(request.POST)
if form.is_valid() and formset_statistic.is_valid():
conference = form.save(getattr(conference, 'id'))
#delete old halls
Statistic.objects.filter(conference=getattr(conference, 'id')).delete()
for item in formset_statistic.forms:
#saves new statistic if its valid and not empty
if item.is_valid() and item.has_changed():
statistic = item.save(commit=False)
statistic.conference = conference
statistic.save()
return HttpResponseRedirect('/admin/conference/all/')
else:
#initial StatisticFormSet
StatisticFormSet = modelformset_factory(Statistic, form=StatisticForm, exclude=('conference',))
#fill form with data from database
data = {'web_page':conference.web_page, 'foundation_year': conference.foundation_year,
'data_begin':conference.data_begin, 'data_end':conference.data_end, 'currency':conference.currency,
'tax':conference.tax, 'min_price':conference.min_price, 'max_price':conference.max_price,
'link':conference.link, 'conference_id':conference.id, 'expohit': conference.expohit,
'discount': conference.discount,'canceled': conference.canceled, 'moved': conference.moved,
'visitors': conference.visitors, 'members': conference.members,
'quality_label': [item for item, bool in conference.quality_label if bool==True]}
if conference.country:
data['country'] = conference.country.id
if conference.city:
data['city'] = conference.city.id
if conference.place:
data['place'] = conference.place.id
data['theme'] = [item.id for item in conference.theme.all()]
data['tag'] = [item.id for item in conference.tag.all()]
#data from translated fields
for code, name in settings.LANGUAGES:
obj = Conference._meta.translations_model.objects.get(language_code = code,master__id=getattr(conference, '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['main_themes_%s' % code] = obj.main_themes
data['discount_description_%s' % code] = obj.discount_description
data['title_%s' % code] = obj.title
data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions
#initial form
form = ConferenceChangeForm(initial=data)
form.fields['city'].widget.attrs['data-init-text'] = conference.city.name
#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'])]
#get existing statistic
statistic = Statistic.objects.filter(conference=getattr(conference, 'id'))
#fill HallFormSet
formset_statistic = StatisticFormSet(queryset=statistic)
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
args['file_form'] = file_form
args['formset_statistic'] = formset_statistic
#get list of files which connected with specific model object
args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(conference), object_id=getattr(conference, 'id'))
args['obj_id'] = getattr(conference, 'id')
return render_to_response('conference_add.html', args)