# -*- 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.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 # from models import Seminar, Statistic from forms import SeminarCreateForm, SeminarChangeForm, SeminarDeleteForm, StatisticForm, SeminarFilterForm 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 seminar_all(request): """ Return list of all seminars with pagination """ return objects_list(request, Seminar, 'seminar_all.html') @login_required def seminar_switch(request, url, action): """ turn on or off seminar take: url as url of seminar action as action what to do('on' or 'off') """ seminar = Seminar.objects.safe_get(url=url) if not seminar: return HttpResponse('error') else: if action == 'on': seminar.on() return HttpResponse('on') elif action == 'off': seminar.off() return HttpResponse('off') else: return HttpResponse('error') @login_required def seminar_copy(request, url): seminar = Seminar.objects.safe_get(url=url) if not seminar: return HttpResponseRedirect(get_referer(request)) else: seminar.clone() return HttpResponseRedirect(get_referer(request)) @login_required def seminar_add(request): """ Returns form of seminar and post it on the server. If form is posted redirect on the page of all seminars. """ # 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 = SeminarCreateForm(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(): seminar = 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.seminar = seminar statistic.save() return HttpResponseRedirect('/admin/seminar/all') else: form = SeminarCreateForm(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('seminar_add.html', args) def seminar_delete(request, url): return delete_object(request, Seminar, SeminarDeleteForm, url, '/admin/seminar/all') @login_required def seminar_change(request, url): """ Return form of seminar and fill it with existing Seminar object data. If form of seminar is posted redirect on the page of all seminars. """ try: #check if seminar_id exists else redirect to the list of seminars seminar = Seminar.objects.get(url=url) file_form = FileModelForm(initial={'model': 'seminar.Seminar'}) except: return HttpResponseRedirect('/admin/seminar/all') if request.POST: StatisticFormSet = formset_factory(StatisticForm) form = SeminarChangeForm(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'])] #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(): seminar = form.save(getattr(seminar, 'id')) #delete old halls Statistic.objects.filter(seminar=getattr(seminar, '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.seminar = seminar statistic.save() return HttpResponseRedirect('/admin/seminar/all') else: #initial StatisticFormSet StatisticFormSet = modelformset_factory(Statistic, form=StatisticForm, exclude=('seminar',)) #fill form with data from database data = {'web_page':seminar.web_page, 'foundation_year': seminar.foundation_year, 'data_begin':seminar.data_begin, 'data_end':seminar.data_end, 'currency':seminar.currency, 'tax':seminar.tax, 'min_price':seminar.min_price, 'link':seminar.link, 'max_price':seminar.max_price, 'address':seminar.address, 'seminar_id':seminar.id, 'expohit': seminar.expohit, 'discount': seminar.discount, 'canceled': seminar.canceled, 'moved': seminar.moved, 'visitors': seminar.visitors, 'members': seminar.members, 'quality_label': [item for item, bool in seminar.quality_label if bool==True]} if seminar.country: data['country'] = seminar.country.id if seminar.city: data['city'] = seminar.city.id data['theme'] = [item.id for item in seminar.theme.all()] data['tag'] = [item.id for item in seminar.tag.all()] #data from translated fields for code, name in settings.LANGUAGES: obj = Seminar._meta.translations_model.objects.get(language_code = code,master__id=getattr(seminar, 'id')) #access to translated fields data['name_%s' % code] = obj.name data['programm_%s' % code] = obj.programm data['main_title_%s' % code] = obj.main_title 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 = SeminarChangeForm(initial=data) form.fields['city'].widget.attrs['data-init-text'] = seminar.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(seminar=getattr(seminar, '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(seminar), object_id=getattr(seminar, 'id')) args['obj_id'] = getattr(seminar, 'id') return render_to_response('seminar_add.html', args) class SeminarListView(AdminListView): template_name = 'c_admin/seminar/seminar_list.html' form_class = SeminarFilterForm model = Seminar