from django.shortcuts import render, redirect, get_object_or_404 from django.http import HttpResponse from django.utils.html import strip_tags from django.template import loader from django.contrib.auth.decorators import login_required from django.core import serializers from django.core.mail import EmailMultiAlternatives, send_mail from django.conf import settings from email.mime.image import MIMEImage import csv from .forms import PollForm from .models import Response from .choices import * # Create your views here. def results(request): responseID = request.session.get('_response') if not responseID: return redirect('/') response = get_object_or_404(Response, id=responseID) scores = dict(zip([field.verbose_name for field in Response._meta.get_fields()][4:-2], list(serializers.serialize("python", [response])[0]['fields'].values())[3:-2])) context = { 'response': response, 'scores': scores } html_message = loader.render_to_string('drive/email_template.html', context=context) plain_message = strip_tags(html_message) email = EmailMultiAlternatives( 'DRIVE Pipeline Poll Results', plain_message, settings.EMAIL_HOST_USER, [response.email] ) email.attach_alternative(html_message, "text/html") with open(f'{settings.BASE_DIR}{response.results.url}', 'rb') as f: image_data = f.read() image = MIMEImage(image_data) image.add_header('Content-ID', '') email.attach(image) email.send(fail_silently=False) return render(request, 'drive/results.html', context=context) def index(request): form = PollForm() if request.method=='POST': form = PollForm(request.POST) if form.is_valid(): data = form.cleaned_data decision_score = round(sum([DECISION_WEIGHT[i] for i in range(len(DECISION_QUESTIONS)) if data[f'd{i}'] == 'n/a' or data[f'd{i}'] == 'complete'])/sum(DECISION_WEIGHT)*100) it_score = round(sum([DECISION_IT_WEIGHT[i] for i in range(len(DECISION_IT_QUESTIONS)) if data[f'dit{i}'] == 'n/a' or data[f'dit{i}'] == 'complete'])/sum(DECISION_IT_WEIGHT)*100) legal_score = round(sum([DECISION_LEGAL_WEIGHT[i] for i in range(len(DECISION_LEGAL_QUESTIONS)) if data[f'dl{i}'] == 'n/a' or data[f'dl{i}'] == 'complete'])/sum(DECISION_LEGAL_WEIGHT)*100) resources_score = round(sum([RESOURCES_WEIGHT[i] for i in range(len(RESOURCES_QUESTIONS)) if data[f'r{i}'] == 'n/a' or data[f'r{i}'] == 'complete'])/sum(RESOURCES_WEIGHT)*100) impact_score = round(sum([IMPACT_WEIGHT[i] for i in range(len(IMPACT_QUESTIONS)) if data[f'i{i}'] == 'n/a' or data[f'i{i}'] == 'complete'])/sum(IMPACT_WEIGHT)*100) velocity_score = round(sum([VELOCITY_WEIGHT[i] for i in range(len(VELOCITY_QUESTIONS)) if data[f'v{i}'] == 'n/a' or data[f'v{i}'] == 'complete'])/sum(VELOCITY_WEIGHT)*100) expectations_score = round(sum([EXPECTATIONS_WEIGHT[i] for i in range(len(EXPECTATIONS_QUESTIONS)) if data[f'e{i}'] == 'n/a' or data[f'e{i}'] == 'complete'])/sum(EXPECTATIONS_WEIGHT)*100) scores = [decision_score, it_score, legal_score, resources_score, impact_score, velocity_score, expectations_score] overall = round(sum(scores)/len(scores)) response = Response( first_name=data['first_name'], last_name=data['last_name'], email=data['email'], expectations=expectations_score, velocity=velocity_score, impact=impact_score, resources=resources_score, decision=decision_score, decision_it=it_score, decision_legal=legal_score, overall=overall, ) response.save() response.save() request.session['_response'] = response.id return redirect('results') context = { 'form': form } return render(request, 'drive/index.html', context=context) @login_required def export (request): # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="response_data.csv"' writer = csv.writer(response) data = serializers.serialize("python", Response.objects.all()) writer.writerow([field.verbose_name for field in Response._meta.get_fields()][1:-2]) for i in data: writer.writerow(list(i['fields'].values())) return response