# -*- 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, ConferenceFilterForm 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 from functions.admin_views import AdminListView 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) class ConferenceListView(AdminListView): template_name = 'admin/conference/conference_list.html' form_class = ConferenceFilterForm model = Conference