from django.contrib.formtools.wizard.views import SessionWizardView from django.core.files.storage import FileSystemStorage from django.http import HttpResponseRedirect from django.conf import settings import os from photologue.models import Photo from exposition.models import Exposition, Statistic from functions.form_check import translit_with_separator from accounts.models import User # defining different template for every form TEMPLATES = { '0': 'client/wizard/first_step.html', '1': 'client/wizard/second_step.html', '2': 'client/wizard/third_step.html' } class ExpoWizard(SessionWizardView): "main view that handle all data from 3 forms(steps) and finally create an Exposition" # storing temporary files during upload location = os.path.join(settings.MEDIA_ROOT, 'temp') file_storage = FileSystemStorage(location, settings.MEDIA_URL) SUCCES_URL = "/" def get_template_names(self): return [TEMPLATES[self.steps.current]] def done(self, form_list, **kwargs): # getting data and files upload_logo = form_list[0].cleaned_data.get('logo') upload_images = self.request.FILES.getlist(u'2-attachments') data = self.get_all_cleaned_data() # creating new exposition expo = Exposition.objects.language(self.request.LANGUAGE_CODE).create( name=data.get('name'), data_begin=data.get('date_start'), data_end=data.get('date_end'), main_title=data.get('main_title'), description=data.get('description'), products=data.get('products'), country=data.get('country', 1), city=data.get('city', 1), place=data.get('place', 1), periodic=data.get('periodic'), web_page=data.get('web_site'), logo=data.get('logo'), foundation_year=data.get('found_year'), area=data.get('square'), price_day=data.get('one_day'), price_all=data.get('all_days'), price_day_bar=data.get('pre_one_day'), price_all_bar=data.get('pre_all_days'), min_area=data.get('min_square'), registration_payment=data.get('registration_depos'), application_deadline=data.get('deadline_date'), min_closed_area=data.get('unequiped'), min_open_area=data.get('open_square'), min_closed_equipped_area=data.get('equiped'), url=translit_with_separator(data.get('name')), quality_label=0, audience=0, creator = User.objects.get(id=self.request.user.id) ) # adding photo to gallery photos = [] for i, photo in enumerate(upload_images): photos.append(Photo.objects.language(self.request.LANGUAGE_CODE).create( image=photo, title=data.get(u'pdescr_%i' % i, photo.name)) ) for photo in photos: expo.upload_photo(photo) # many to many relations saving expo.tag = [data.get('tag')] expo.theme = [data.get('theme')] # setting bit fields audience and quality_label self.set_flags(expo, data) expo.save() # ? Statistic.objects.language(self.request.LANGUAGE_CODE).create( exposition=expo, year=data.get('statistic_year'), visitors=data.get('visitors'), members=data.get('partisipants'), countries=data.get('countries'), area=data.get('square') ) # remove temporary files if it has any if upload_logo: self.file_storage.delete(upload_logo.name) if upload_images: for f in upload_images: self.file_storage.delete(f.name) return HttpResponseRedirect(self.SUCCES_URL) def set_flags(self, expo, data): if data['membership1']: expo.quality_label = (expo.quality_label | Exposition.quality_label.exporating) if data['membership2']: expo.quality_label = (expo.quality_label | Exposition.quality_label.rsva) if data['membership3']: expo.quality_label = (expo.quality_label | Exposition.quality_label.ufi) if data['audience1']: expo.audience = (expo.audience | Exposition.audience.experts) if data['audience2']: expo.audience = expo.audience | getattr(Exposition.audience, 'experts and consumers') if data['audience3']: expo.audience = expo.audience | (getattr(Exposition.audience, 'general public')) from wizard.forms import formlist wizard_view = ExpoWizard.as_view(formlist)