From 93994fe0d5d0c663fe33956d3626420c73a26052 Mon Sep 17 00:00:00 2001 From: Jolly Date: Thu, 6 Oct 2016 10:20:44 -0700 Subject: [PATCH] Jolly's Lab9 with Email Configuration Setup --- Labs/Lab9/Flask Lab 2.docx | Bin 0 -> 15352 bytes Labs/Lab9/Flask Lab 2.txt | 46 ++++ Labs/Lab9/flaskLab2/.spyderworkspace | Bin 0 -> 50 bytes Labs/Lab9/flaskLab2/app/__init__.py | 4 + Labs/Lab9/flaskLab2/app/__init__.pyc | Bin 0 -> 278 bytes .../app/__pycache__/__init__.cpython-35.pyc | Bin 0 -> 280 bytes .../app/__pycache__/views.cpython-35.pyc | Bin 0 -> 2892 bytes .../Lab9/flaskLab2/app/static/interactions.js | 48 ++++ Labs/Lab9/flaskLab2/app/static/main.css | 225 ++++++++++++++++++ Labs/Lab9/flaskLab2/app/templates/base.html | 33 +++ Labs/Lab9/flaskLab2/app/templates/login.html | 18 ++ .../app/templates/not_authorized.html | 13 + .../app/templates/page_not_found.html | 12 + .../Lab9/flaskLab2/app/templates/results.html | 33 +++ Labs/Lab9/flaskLab2/app/templates/survey.html | 32 +++ Labs/Lab9/flaskLab2/app/views.py | 89 +++++++ Labs/Lab9/flaskLab2/app/views.pyc | Bin 0 -> 2299 bytes Labs/Lab9/flaskLab2/run.py | 3 + 18 files changed, 556 insertions(+) create mode 100644 Labs/Lab9/Flask Lab 2.docx create mode 100644 Labs/Lab9/Flask Lab 2.txt create mode 100755 Labs/Lab9/flaskLab2/.spyderworkspace create mode 100755 Labs/Lab9/flaskLab2/app/__init__.py create mode 100755 Labs/Lab9/flaskLab2/app/__init__.pyc create mode 100644 Labs/Lab9/flaskLab2/app/__pycache__/__init__.cpython-35.pyc create mode 100644 Labs/Lab9/flaskLab2/app/__pycache__/views.cpython-35.pyc create mode 100755 Labs/Lab9/flaskLab2/app/static/interactions.js create mode 100755 Labs/Lab9/flaskLab2/app/static/main.css create mode 100755 Labs/Lab9/flaskLab2/app/templates/base.html create mode 100755 Labs/Lab9/flaskLab2/app/templates/login.html create mode 100755 Labs/Lab9/flaskLab2/app/templates/not_authorized.html create mode 100755 Labs/Lab9/flaskLab2/app/templates/page_not_found.html create mode 100755 Labs/Lab9/flaskLab2/app/templates/results.html create mode 100755 Labs/Lab9/flaskLab2/app/templates/survey.html create mode 100755 Labs/Lab9/flaskLab2/app/views.py create mode 100755 Labs/Lab9/flaskLab2/app/views.pyc create mode 100755 Labs/Lab9/flaskLab2/run.py diff --git a/Labs/Lab9/Flask Lab 2.docx b/Labs/Lab9/Flask Lab 2.docx new file mode 100644 index 0000000000000000000000000000000000000000..61f5f2f0a7dcec64ea3cfcaa8ec25bf15e753801 GIT binary patch literal 15352 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 I{q63500R&5VE_OC literal 0 HcmV?d00001 diff --git a/Labs/Lab9/Flask Lab 2.txt b/Labs/Lab9/Flask Lab 2.txt new file mode 100644 index 0000000..661dc9b --- /dev/null +++ b/Labs/Lab9/Flask Lab 2.txt @@ -0,0 +1,46 @@ +Flask Lab 2 +In this lab weÕll be implementing a simple survey web app using Flask. +The general concepts weÕll be covering are: +* Routing +* Templating +* Passing Parameters +* Sessions +We will walk through this lab in class and for homework you should redesign the questions and the survey and get creative. Also, make the e-mail link work and send the survey results to us! +Requirements +1. Download the flaskLab2.zip file from bCourses>Files>Labs +Creating a login page +2. Open the Ôlogin.htmlÕ template in your text editor +a. Make this file an extension of the Ôbase.htmlÕ template +b. Use the existing form and create form inputs that capture the userÕs name and email +c. Make sure the HTML in this file is replacing the block called ÔcontentÕ in the Ôbase.htmlÕ template +d. Make the form submit to the Ô/loginÕ endpoint +Creating a session +3. Open the Ôviews.pyÕ file in your text editor +a. Find the route for Ô/loginÕ +b. Within the Ôlogin()Õ function, if the request method is POST +i. set the sessionÕs ÔusernameÕ key to whatever the user entered for their username +ii. Redirect the user to the ÔindexÕ route +Extending and reusing content from the Ôbase.htmlÕ template for the Ôsurvey.htmlÕ template +4. Open the Ôsurvey.htmlÕ template in your text editor +a. Make this file an extension of the Ôbase.htmlÕ template +b. The HTML in this file for the form with the id of ÔlogoutÕ is currently replacing the entire contents of the

tag in the Ôbase.htmlÕ template. Using the super() function, pull in the original contents of the
tag from the Ôbase.htmlÕ template +c. Make sure the HTML in this file from the

and down is replacing the block called ÔcontentÕ in the Ôbase.htmlÕ template +Creating an Ajax request with the userÕs form inputs from Ôsurvey.htmlÕ +5. Open the Ôinteraction.jsÕ script in your text editor +a. Notice that the button from the Ôsurvey.htmlÕ template with the id Ôsubmit-surveyÕ has a click event binding +b. Also notice that there are variable declarations for each of the form input fields +c. Create a $.post() Ajax request within this ÔclickÕ event handler +i. The url for this Ajax request should point to Ôsubmit-surveyÕ +ii. The data parameter of this Ajax request should be an object whose key-value pairs correspond to the variables for each form input field +iii. The success function for this Ajax request should set the innerHTML of document.body.parentNode to the response data object +Rendering the survey results via Flask +6. Go back to the Ôviews.pyÕ file in your text editor +a. Find the route for Ô/submit-surveyÕ +b. YouÕll notice that an empty object has been assigned to the variable name ÔsurveyResponseÕ +c. YouÕll also notice that Ôfe-beforeÕ and Ôfe-afterÕ keys in the ÔsurveyResponseÕ object have been assigned values that correspond to values in the data object we passed in from step 5 above. +i. Assign the keys ÔcolorÕ, ÔfoodÕ, and ÔvacationÕ for the ÔsurveyResponseÕ object to corresponding values from the passed-in data object in a similar fashion +7. You should now be able to do the following: +a. Log into this simple survey web app with a username and email +b. Take the survey +c. See the survey results displayed + diff --git a/Labs/Lab9/flaskLab2/.spyderworkspace b/Labs/Lab9/flaskLab2/.spyderworkspace new file mode 100755 index 0000000000000000000000000000000000000000..be24de3f58bb019a1446608c26e01e2dc4121a3e GIT binary patch literal 50 zcmZo*sx4&H2<0s(%FjwoE{QKlEXgP?WQq-C$xF;lEo6@1WME+MNla2m%SkNGE@Uay F0|1r^4`~1Z literal 0 HcmV?d00001 diff --git a/Labs/Lab9/flaskLab2/app/__init__.py b/Labs/Lab9/flaskLab2/app/__init__.py new file mode 100755 index 0000000..9a4e940 --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/__init__.py @@ -0,0 +1,4 @@ +from flask import Flask + +myapp = Flask(__name__) +from app import views diff --git a/Labs/Lab9/flaskLab2/app/__init__.pyc b/Labs/Lab9/flaskLab2/app/__init__.pyc new file mode 100755 index 0000000000000000000000000000000000000000..4d4e5adeb859807192e959f25c2546b087e0a2ed GIT binary patch literal 278 zcmYjLOA5j;5S_GEL=-%N%dR9_Kd7L%5*LatBrv2lLNTeOiNCe?^D-Vlr$x~r^JZQi z^Je^Kvp(uSHaqx)M|DhTIYCU1fd()PwhWkJpggz}@k`AET>%roHUJj;unH?Ql)NZH zMx6@?W?I_AkDe2Cv5TlUe3``lh-p97D=Kuw9~)o>*Iz zTM^}H&XIF2rpg}NF%wd&tC-8EU2YNNA`p`_afqGlRxTWvV|>zTSh(Bb{Fc{XZ~f0Y AU;qFB literal 0 HcmV?d00001 diff --git a/Labs/Lab9/flaskLab2/app/__pycache__/__init__.cpython-35.pyc b/Labs/Lab9/flaskLab2/app/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c7c65d2f35336e3dd25bdbada62d029edf68b0e GIT binary patch literal 280 zcmX|)&q~BV48}A4ql>uU$#>{MQ}(tXBCaUP;zia&FGICiC_B?BldUpmpT?K*0p{w- zSMX%ogCY6lOG5Zg=kufT?Cbds0KTREBN25a#igK;RA2zCf=YoR1(d*t4C!=Bz+_-^ zsB%zE3QtA$BVSOcnBSV3ccXY~>75^ogDT&SD?b{lYre#K}|C0>uEe bZo77`^?4uS?83TcFm$QJjx)hYa;*LUWywYT literal 0 HcmV?d00001 diff --git a/Labs/Lab9/flaskLab2/app/__pycache__/views.cpython-35.pyc b/Labs/Lab9/flaskLab2/app/__pycache__/views.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2120e3ca07ef40c48b5fb9d7d3061d02e1aaa62b GIT binary patch literal 2892 zcmaJ@TW=fJ5uUwpd6#6#mMq(KD5r@+v^E_hKoKA7sLk-*QP2~q4&=#azDE=^pDJqkUFeF}YwOB9wU4k!#LE>l>hxI$rt z;wpvJ;*3X=8pU-A>l8OAY!qCdCQS;PB%3r|B2l7qhonQjWnRZCG`>M{l|(?IOrk=f zN}@)hPNHEsO%gb@Ok#z^4HBz#PGx9tWS!503fHWnnh&jGA(YASf{@b(=2&w zA-O@~Hi=CVcWC5d%Mo`;+?z{=>kF}8Sta*Le6ZNsSZuZ4)38P2!9wizLhQr$#C}cU zqlMU}6}v;?WBa0Q5}z!#V2@ATcKatzTH7(D_^dyjw#%lhmUW1S|^@T~0`f3F`+OnDE7`Xjmj(`~%S zlwR&UfBn@_Sl@g0^=_}bbNI)d!`YIKv+1Kz4EaZcG!CnF^VPxOQS_}#NVI)^-QDRO z?RKv`b-TM?hRwz1;r_F|o!K3Il4nse>P@14GJ1L})v27wvqw_obJ17Ny4^Pihc9Q1 zPk;CLQ@(a}w)L~qnFXB)9{+j3A>j|8OFpg_xb#yjK=C_^-HhloAoYYYhd=|(o5(-* zGM9wMp?%AsaJu|#5!nUkyX|1#kg4Qas-z#wSzYJq2N-vf#S`OOR&A1wqQr9Ao+{y` zs=^D~(RLKq)!#|2;`Z~K&TA;roo~{~tvF7FT&T!J#r=Xs6ko(RLk^GZ>G(9sV8-`nWhell!d4bb#R-6@A-NX~Z zWNkF%SY{`w(8l{}=g9c44!TDdp|i)Z*w7t-K$ONP7>7<>Qs3G~m&OPcmj`7&6JM}U z!Sxng58M)Es9v90_!W^X?W+x_wE;0D$=I>hwadx_-votm#s@lM;*3U zFD!FJ1G`8LtSfN+kN0t1;M^;4?odSZ4&pXhVENCAz@MJ_Sa zE7$dJyz{J@DuKu_!)x>wMMO@wUEdFH2#l*J>1UWtg!PW5kF^QqO!qF9O+ z>UYcd$Ei3AYZzhCG~%9#*_I!VG0|pg-vI-yB8#ngerNYA(?+ay($}qHDHG^TvR0P1 zX1BgX^MPv69NCtY+X|~X>u0&%)1!9P_N2=Mn*jY5q6Gr#FxL3o!HmxeR27W2A1+y+_gJqoM97k~%V*FjNb1v{+kDU|4SEaa~O37cqTO*e4wx=nWzch$yD^dm;x zfX5tv_>OT~V1Ne=my^vtvO09puDt!(+7y-2OVSKuAJt=_Z`EKpS=i#Qgj6b3*DYK6 z--B|iQ_#!9cZZaWbqr#(x1v C+ibZ2 literal 0 HcmV?d00001 diff --git a/Labs/Lab9/flaskLab2/app/static/interactions.js b/Labs/Lab9/flaskLab2/app/static/interactions.js new file mode 100755 index 0000000..12d61f9 --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/static/interactions.js @@ -0,0 +1,48 @@ +$('#submit-survey').on('click', function submitSurvey() { + var background = $("input[name=background]").val(); + var language = $("input[name=language]").val(); + var course = $("input[name=course]").val(); + var feBefore = $("input[name=front-end-before]").val(); + var feAfter = $("input[name=front-end-after]").val(); + $.post("submit-survey", + {background: background, + language: language, + course: course, + feBefore: feBefore, + feAfter: feAfter}, + function(data) { + $("html").html(data); + }); +}); + +$("#results-email-container").on('click', '#email-results-button', function emailResults() { + $.post("/send_email", + { + "destination_email": $("#visitor-email").val() + }, + function response(data) { + $("#results-email-container").html(data.statusMsg) + }, + "json" + ) + + console.log($(this)); +}); + +$("#site-title-wrapper").on('click', function goHome() { + window.location.href = '/'; +}); + +$(document).ready(function applySliderLabels() { + var currentValue = $("#fe-before").val(); + $("#fe-before").next().html(currentValue); + + currentValue = $("#fe-after").val(); + $("#fe-after").next().html(currentValue); +}); + + +$("input[type='range']").on('change', function updateLabel() { + var currentValue = $(this).val(); + $(this).next().html(currentValue); +}); \ No newline at end of file diff --git a/Labs/Lab9/flaskLab2/app/static/main.css b/Labs/Lab9/flaskLab2/app/static/main.css new file mode 100755 index 0000000..35532a5 --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/static/main.css @@ -0,0 +1,225 @@ +/*----------------- CSS RESET ------------------*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} + +/*----------------- CSS RESET ------------------*/ + +html, body { + background-color: #f9f9f9; + font-family: 'Open Sans', sans-serif; + font-size: 16px; +} + +header { + background-color: #1abc9c; + box-shadow: 0 2px 6px 1px #a7a7a7; + color: #ecf0f1; + height: 5rem; +} + +footer { + background-color: #16a085; + bottom: 0; + color: #ecf0f1; + height: 7rem; + margin-top: 2em; + text-align: center; + width: 100%; +} + +footer p { + height: 7rem; + line-height: 7rem; +} + +h1, h3 { + padding: 4px; +} + +h1 { + font-size: 2rem; + font-weight: bold; +} + +h3 { + font-size: 1.4rem; +} + +a { + text-decoration: none; +} + +input[type="text"], input[type="range"] { + border: 1px solid #bdc3c7; + border-radius: 2px; + margin-left: 1rem; + vertical-align: middle; +} + +input[type=range]{ + -webkit-appearance: none; +} + +input[type=range]::-webkit-slider-thumb { + -webkit-appearance: none; + border: none; + height: 1.2rem; + width: 1.2rem; + border-radius: 50%; + background: #1abc9c; + margin-top: -.5rem; +} + +input[type=range]::-webkit-slider-runnable-track { + background: #ccc; + height: .2rem; +} + +.action-button { + background-color: #1abc9c; + border: none; + border-bottom: 3px solid #16a085; + border-radius: 2px; + color: #ecf0f1; + display: inline-block; + font-size: 1rem; + font-weight: bold; + height: 3rem; + padding: 4px; + width: 6rem; +} + +.action-button:hover { + background-color: #16a085; +} + +#site-title-wrapper { + display: inline-block; + height: 5rem; + width: 15%; +} + +#site-icon-wrapper { + display: inline-block; + margin-left: 1rem; + margin-top: -.5rem; + vertical-align: middle; + width: 2.5rem; +} + +#site-icon-wrapper img { + display: inline-block; + max-height: 100%; + max-width: 100% +} + +#site-title { + display: inline-block; + font-weight: bold; + height: 5rem; + line-height: 5rem; + margin-left: .1rem; +} + +#username { + margin-right: .7rem; +} + +#logout { + float: right; + height: inherit; + line-height: 5rem; + margin-right: 1rem; +} + +#logout-button { + background-color: #ecf0f1; + border-bottom-color: #bdc3c7; + color: #222222; + height: 2.5rem; + width: 5rem; +} + +#logout-button:hover { + background-color: #bdc3c7; +} + +#content { + margin-top: 2rem; + text-align: center; + width: 100%; +} + +.main-container { + background: #ecf0f1; + border-radius: 4px; + box-shadow: 0px 2px 10px 2px #95a5a6; + display: block; + min-height: 50vh; + margin: 2rem 0 0 25%; + padding: 1rem; + text-align: left; + width: 50%; +} + +.survey-item, .result-item, #results-email-container { + box-sizing: border-box; + display: block; + margin: 1.5rem 0; + padding: 4px; +} + +.survey-item span { + font-size: 1rem; + margin-left: 1rem; +} + +#email-results-button, #goHome { + height: 2rem; + line-height: 2rem; + margin-left: 1rem; + text-align: center; +} + diff --git a/Labs/Lab9/flaskLab2/app/templates/base.html b/Labs/Lab9/flaskLab2/app/templates/base.html new file mode 100755 index 0000000..eb802bc --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/templates/base.html @@ -0,0 +1,33 @@ + + + + + + {% block title %}{% endblock %} - Ape Ask + + + + {% block styles %}{% endblock %} + + + + +
+ {% block header %} +
+
+ +
+

Ape Ask

+
+ {% endblock %} +
+
{% block content %}{% endblock %}
+ +
+

© Copyright 2016 Ape Ask, all rights reserved

+
+ + + + \ No newline at end of file diff --git a/Labs/Lab9/flaskLab2/app/templates/login.html b/Labs/Lab9/flaskLab2/app/templates/login.html new file mode 100755 index 0000000..9c9e99a --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/templates/login.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} + +{% block title %} + Login +{% endblock %} + +{% block content %} +

Hi There! Welcome to Ape Ask, the leading online survey site.

+
+

Let's get you logged in

+
+
+{% endblock %} \ No newline at end of file diff --git a/Labs/Lab9/flaskLab2/app/templates/not_authorized.html b/Labs/Lab9/flaskLab2/app/templates/not_authorized.html new file mode 100755 index 0000000..99a0c25 --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/templates/not_authorized.html @@ -0,0 +1,13 @@ + + + + + Oops! + + +

Uh Oh! You're not authorized

+ +
+ Take me back home, already! + + \ No newline at end of file diff --git a/Labs/Lab9/flaskLab2/app/templates/page_not_found.html b/Labs/Lab9/flaskLab2/app/templates/page_not_found.html new file mode 100755 index 0000000..dadcc99 --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/templates/page_not_found.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %} + Oops! +{% endblock %} + +{% block content %} +

Oh, Pooh Bear! You're stuck because we don't have that page for you.

+ +
+ Go back! +{% endblock %} \ No newline at end of file diff --git a/Labs/Lab9/flaskLab2/app/templates/results.html b/Labs/Lab9/flaskLab2/app/templates/results.html new file mode 100755 index 0000000..c6437f8 --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/templates/results.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} + +{% block title %} + Survey +{% endblock %} + +{% block header %} + {{ super() }} +
+ Logged in as {{ name }} + +
+{% endblock %} + +{% block content %} +

Great news - your results are in! Check it out...

+
+

Here are some of your favorite things

+ Your background was {{ surveyResponse['background']}} + Your favorite programming language is {{ surveyResponse['language']}} + Your favorite course is {{ surveyResponse['course']}} + +

Wow! Your front end skillz are getting sharp!

+ Before IO Lab, your front end skillz were at a {{ surveyResponse['fe-before']}} + But in just a few short weeks of IO Lab, your front end skillz are now a {{ surveyResponse['fe-after']}} + +
+ Want your survey results emailed to you? If so, please enter your email: + + Yes! +
+
+{% endblock %} \ No newline at end of file diff --git a/Labs/Lab9/flaskLab2/app/templates/survey.html b/Labs/Lab9/flaskLab2/app/templates/survey.html new file mode 100755 index 0000000..037584e --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/templates/survey.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} + +{% block title %} + Survey +{% endblock %} + + +{% block header %} +{{ super() }} +
+ Logged in as {{ name }} + +
+{% endblock %} + +{% block content %} +

A Little Survey About You

+
+

Some of your favorites

+ + + + +

Let's look at your front end skillz progression

+ + + + +
+{% endblock %} \ No newline at end of file diff --git a/Labs/Lab9/flaskLab2/app/views.py b/Labs/Lab9/flaskLab2/app/views.py new file mode 100755 index 0000000..bb1356b --- /dev/null +++ b/Labs/Lab9/flaskLab2/app/views.py @@ -0,0 +1,89 @@ +from app import myapp +from flask import request, render_template, session, redirect, url_for, escape, jsonify +from flask_mail import Mail, Message +import os + +myapp.secret_key = os.urandom(24) + +# Setup email. +myapp.config.update(dict( + DEBUG = True, + MAIL_SERVER = 'smtp.gmail.com', + MAIL_PORT = 587, + MAIL_USE_TLS = True, + MAIL_USE_SSL = False, + MAIL_USERNAME = 'shuting_liang@berkeley.edu', + MAIL_PASSWORD = '17011701Lst!', +)) + +mail = Mail(myapp) + +@myapp.route('/') +@myapp.route('/index') +def index(): + username = '' + if 'username' in session: + username = escape(session['username']) + return render_template('survey.html', name=username) + else: + return render_template('login.html') + +@myapp.route('/login', methods=['GET', 'POST']) +def login(): + if request.method == 'POST': + session['username'] = request.form.get("username") + session['email'] = request.form.get("email") + return redirect(url_for('index')) + + +@myapp.route('/logout') +def logout(): + session.pop('username', None) + session.pop('email', None) + return redirect(url_for('index')) + +@myapp.route('/submit-survey', methods=['GET', 'POST']) +def submitSurvey(): + username = '' + email = '' + if 'username' in session: + username = escape(session['username']) # a global variable + email = escape(session['email']) + surveyResponse = {} + surveyResponse['background'] = request.form.get('background') + surveyResponse['language'] = request.form.get('language') + surveyResponse['course'] = request.form.get('course') + surveyResponse['fe-before'] = request.form.get('feBefore') + surveyResponse['fe-after'] = request.form.get('feAfter') + session['email_content'] = render_template('results.html', name=username, email=email, surveyResponse=surveyResponse) + + return session['email_content'] + else: + return render_template('login.html') + +@myapp.route('/send_email', methods=['GET', 'POST']) +def sendEmail(): + # check if session['email_content'] still exists before attempting to send. + + if (request.form.get('destination_email')): + recipient_list = [] + recipient_list.append(request.form.get('destination_email')) + + if (session.get('email_content')): + email_content = session['email_content'] + else: + email_content = "Oops, session timed out!" + + msg = Message(body=email_content, recipients=recipient_list, subject="Your survey results") + + mail.send(msg) + + ResultMsg = "Your email has been sent to " + request.form.get("destination_email") + else: + ResultMsg = "Failed to send email!" + + return jsonify(statusMsg=ResultMsg) + +@myapp.errorhandler(404) +def page_not_found(error): + return render_template('page_not_found.html'), 404 \ No newline at end of file diff --git a/Labs/Lab9/flaskLab2/app/views.pyc b/Labs/Lab9/flaskLab2/app/views.pyc new file mode 100755 index 0000000000000000000000000000000000000000..259c8d15006dc6248a0b27530dcff389a33fa068 GIT binary patch literal 2299 zcmcIlOK&4Z5U%cV{79U{&I+`!Aoj2aUpBEo;(%6Ym$2f33>q&8jVxIcPdgcVUQD;c zM#`STPvA#!Z*QJef3p2_-l9jr@#OBaYpOU7QUZj*teJx z{42_caz&9M#cNHOraYi1pu9m*gYqqkwkU5>)TF#cQH%06MQy)3psYhthfIeS+mtlu zN|8}C-QjuBrDSWZVY$h2(xP991^h?5n{91MI+Wms9Xi!8sieE!7VT~J?8@=IjedWl z-@kLVx7pK^J$*|0a`s@OKcFO_@!$b4NZ;Z!P>>vBlV8MDHE8m(g{d|_uZ(qWU*sY& z_0*ZX%3^24ZjH5RS-7^?le9K7Cx%s>P3L9p_$Fg#ab-s7L&%O_IYnEt^z-$_F7MJs$u#*qr7Vk_KHenrh5z0eg%rjwON-4qzkuwz8%! z;@sFBEbOX2Hy4LzF3%jlDu!(cS$Uckq8|iUhBC3Mp~fU2g&meK{A53ebo|BS2i$Kb zCv{N|r^DfJ^0l!`S5}iaGp{G##wU;GS!|aRU^_Wa%`f(_x)8Vp0tVXh`xG=)SM^j+ zdw|3rfipMmtW2z9kG^^NO5FbbyYZ_TpW+W2jxp>@Oo)2{rYTx#s$a+w=m0vL$JaBq z3w)voplERR0jB4rhmh$o3imKe(BiMj<1`ByL_s(d-Y`PmLGcS|&pmVuZphc%04CCX zQ4?JHxYu%SN$=~v>MP4Q9>G?w++AFTFka&Vid<<@>ouTQuLD8^pw$|N0S7RW=tHgm zA2u2Cy}@=(i+~ouMd)z}v>IT{wN{FbwOhBf((72;ysd39 zvaD_2)^;}9ZD>Km9YXg*StAjb@OYO`T&ZBpwmshK`Ng&gTkhJ>WEGDGL#T+GWd zk@`Q6XR+Hfs=4{ffTYH9Ezix<6In@}&CQFsLn-sEu*9=;YKd(3O*5b35` zHyYK{?<@St{E<$7gOf9Mlm|CGAyE$kSOXpbd@yLP(P7!|k>#I|Dn2#SqI78Zt0EDI zl)S>F?1Km}RI!`(en@=A61M&306#xJL literal 0 HcmV?d00001 diff --git a/Labs/Lab9/flaskLab2/run.py b/Labs/Lab9/flaskLab2/run.py new file mode 100755 index 0000000..dae9904 --- /dev/null +++ b/Labs/Lab9/flaskLab2/run.py @@ -0,0 +1,3 @@ +#!flask/bin/python +from app import myapp +myapp.run(debug=True,host='0.0.0.0')