from django.shortcuts import render from django.forms import modelformset_factory from django.http import HttpResponse from formtools.wizard.views import CookieWizardView from django.core.mail import send_mail, BadHeaderError from django.conf import settings from django.template.loader import get_template from django.template import Context # from django.contrib.sites.models import Site from .forms import ProjectForm, VolunteerForm, LibraryForm, IFGForm,\ HonoraryCertificateForm, InternForm from .models import Project, TYPE_CHOICES, Library from .settings import URLPREFIX, IF_EMAIL def authorize(request, choice, pk): '''If IF grant a support they click a link in a mail which leads here. We write the granted field in the database here and set a timestamp.''' # TODO: write a timestamp which is needed to determine time of next mail if choice in ('BIB', 'ELIT', 'SOFT'): Library.set_granted(pk,True) return HttpResponse(f"AUTHORIZED! choice: {choice}, pk: {pk}") else: return HttpResponse('ERROR! UNKNWON CHOICE TYPE!') def deny(request, choice, pk): '''If IF denies a support they click a link in a mail which leads here We write the granted field in the database here.''' if choice in ('BIB', 'ELIT', 'SOFT'): Library.set_granted(pk,False) return HttpResponse(f"DENIED! choice: {choice}, pk: {pk}") else: return HttpResponse('ERROR! UNKNWON CHOICE TYPE!') def project(request): # return HttpResponse("Hello, world. You're at the input form") # ProjectFormSet = modelformset_factory(Project, fields='__all__') if request.method == 'POST': print('POST detected') form = ProjectForm(request.POST, request.FILES) if form.is_valid(): print('form valid') form.save() # do something. else: print("form not valid") else: print form = ProjectForm() return render(request, 'input/project.html', {'form': form}) def accreditation(request): pass def travel(request): pass def certificate(request): pass def done(request): return HttpResponse("Your data is save now.") def extern(request): return HttpResponse("The world out there is large and dangerous") class InternView(CookieWizardView): '''This View is for the WMDE-employees only''' template_name = 'input/extern.html' form_list = [InternForm, ProjectForm] def get_form(self, step=None, data=None, files=None): if step is None: step = self.steps.current print ("get_form() step " + step) if step == '1': prev_data = self.get_cleaned_data_for_step('0') choice = prev_data.get('choice') if choice == 'HON': print ('Ehrenamtsbescheinigung detected!') form = HonoraryCertificateForm(data) else: print('ERROR! UNKNOWN FORMTYPE!') else: form = super().get_form(step, data, files) return form def done(self, form_list, **kwargs): print('ExternView.done() reached') # gather data from all forms data = {} for form in form_list: data = {**data, **form.cleaned_data} print(data) # write data to database form = form.save(commit=False) # we have to copy the data from the first form here # this is ugly code. how can we copy this without explicit writing? # i found no way to access the ModelForm.Meta.exclude-tupel form.realname = data['realname'] form.username = data['username'] form.email = data['email'] form.save() return done(self.request) class ExternView(CookieWizardView): '''This View is for Volunteers''' template_name = "input/extern.html" form_list = [VolunteerForm, LibraryForm] def get_form(self, step=None, data=None, files=None): if step is None: step = self.steps.current print ("get_form() step " + step) if step == '1': prev_data = self.get_cleaned_data_for_step('0') choice = prev_data.get('choice') if choice == 'IFG': print ('IFG detected!') form = IFGForm(data) elif choice in ('BIB', 'SOFT', 'ELIT'): print ('one of the famous three detected!') for (k,v) in TYPE_CHOICES: if k == choice: break form = LibraryForm(data) form.fields['library'].label = v else: print('ERROR! UNKNOWN FORMTYPE!') else: form = super().get_form(step, data, files) return form def done(self, form_list, **kwargs): print('ExternView.done() reached') # gather data from all forms data = {} for form in form_list: data = {**data, **form.cleaned_data} print(data) # write data to database form = form.save(commit=False) # we have to copy the data from the first form here # this is ugly code. how can we copy this without explicit writing? # i found no way to access the ModelForm.Meta.exclude-tupel form.realname = data['realname'] form.username = data['username'] form.email = data['email'] # write type of form in some cases if data['choice'] in ('BIB', 'ELIT', 'SOFT'): form.type = data['choice'] form.save() # add some data to context for mail templates data['pk'] = form.pk data['urlprefix'] = URLPREFIX # we need to send the following mails here: context = { 'data': data } try: # - mail with entered data to the Volunteer mail_template = get_template('input/ifg_volunteer_mail.txt') send_mail( 'form filled', mail_template.render(context), IF_EMAIL, [form.email], fail_silently=False, ) # - mail to IF with link to accept/decline mail_template = get_template('input/if_mail.txt') send_mail( 'form filled', mail_template.render(context), IF_EMAIL, [IF_EMAIL], fail_silently=False, ) except BadHeaderError: return HttpResponse('Invalid header found.') return done(self.request)