#!/usr/bin/env python # # Copyright 2014 Jun Woo Park. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import datetime import jinja2 import json import hashlib import logging import model import os import random import webapp2 from google.appengine.ext import ndb JINJA_ENVIRONMENT = jinja2.Environment( loader=jinja2.FileSystemLoader(os.path.dirname(__file__)), extensions=["jinja2.ext.autoescape"], autoescape=True) TEMPLATE_PATH_PREFIX = "html/" SECRET_KEY = "3KVZFLT9ZB" class Handler1(webapp2.RequestHandler): def get(self): template = JINJA_ENVIRONMENT.get_template( TEMPLATE_PATH_PREFIX + "1.html") self.response.write(template.render()) class GenericSurveyHandler(webapp2.RequestHandler): def custom_processing(self, survey_data, template_args, received_args): return True def post(self): # parse form_id form_id = self.request.get("form_id") form_verification = self.request.get("form_verification") form_hash = hashlib.sha256(SECRET_KEY + str(form_id)).hexdigest() if form_verification != form_hash: self.response.headers["Content-Type"] = "text/plain" self.response.write("Form validation wrong. Please start again.") return # retrieve data key = ndb.Key(urlsafe=form_id) survey_data = key.get() if not survey_data: self.response.headers["Content-Type"] = "text/plain" self.response.write("Data not stored. Please start again.") return # Parse Input Data data_dict = {} received_args = self.request.arguments() received_args.remove("form_id") received_args.remove("form_verification") try: for argument_name in ( self._string_args + self._float_args + self._integer_args + self._boolean_args + self._multiple_args): if (not self._arg_optional and argument_name not in received_args): logging.debug("%s not in the request: %s" % ( argument_name, received_args)) self.response.headers["Content-Type"] = "text/plain" self.response.write( "Something went wrong. Please start again.") return if argument_name in received_args: data = self.request.get(argument_name) received_args.remove(argument_name) if argument_name in self._float_args: data_dict[argument_name] = float(data) elif argument_name in self._integer_args: data_dict[argument_name] = int(data) elif argument_name in self._boolean_args: data_dict[argument_name] = bool(data) elif argument_name in self._multiple_args: data = self.request.get_all(argument_name) data_dict[argument_name] = ",".join(data) else: data_dict[argument_name] = data except ValueError: logging.debug("ValueError:") for arg in self.request.arguments(): logging.debug("%s=%s" % (arg, self.request.get(arg))) self.response.headers["Content-Type"] = "text/plain" self.response.write( "Something went wrong. Please start again.") return template_args = { "form_id": form_id, "form_verification": form_verification, } result = self.custom_processing( survey_data, template_args, received_args) if received_args or not result: logging.debug("Remaining args: %s", received_args) for arg in self.request.arguments(): logging.debug("%s=%s" % (arg, self.request.get(arg))) self.response.headers["Content-Type"] = "text/plain" self.response.write( "Something went wrong. Please start again.") return survey_data.populate(**data_dict) survey_data.put() template = JINJA_ENVIRONMENT.get_template(self._template_file_path) self.response.write(template.render(template_args)) class Handler2(webapp2.RequestHandler): def post(self): # parse input email_address = self.request.get("email_address") # generate form-id survey_data = model.SurveyData(email_address=email_address) survey_data_key = survey_data.put() form_id = survey_data_key.urlsafe() form_hash = hashlib.sha256(SECRET_KEY + form_id).hexdigest() logging.debug("form_id generated: %s" % form_id) logging.debug("form_hash: %s" % form_hash) # populate template_args template_args = { "form_id": form_id, "form_verification": form_hash } template = JINJA_ENVIRONMENT.get_template( TEMPLATE_PATH_PREFIX + "2.html") self.response.write(template.render(template_args)) class Handler3(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "3.html" _string_args = ["q1a", "q1b", "q3d"] _float_args = ["q2a", "q2b"] _integer_args = ["q3a1m", "q3a1f", "q3a2m", "q3a2f", "q3a3m", "q3a3f", "q3a4m", "q3a4f", "q3a5m", "q3a5f"] _boolean_args = ["q3b", "q3c"] _multiple_args = [] _arg_optional = False class Handler4(GenericSurveyHandler): def custom_processing(self, survey_data, template_args, received_args): img_list = ["image/A.png", "image/B.png", "image/C.png", "image/D.png", "image/E.png", "image/F.png"] random.shuffle(img_list) template_args["img_rows"] = [img_list[0:3], img_list[3:6]] if self.request.get("q4b1") == "on": survey_data.q4b1 = True received_args.remove("q4b1") received_args.remove("q4b2") received_args.remove("q4b3") return True else: survey_data.q4b1 = False if ("q4b2" in received_args and "q4b3" in received_args): survey_data.q4b2 = float(self.request.get("q4b2")) survey_data.q4b3 = float(self.request.get("q4b3")) received_args.remove("q4b2") received_args.remove("q4b3") return True return False _template_file_path = TEMPLATE_PATH_PREFIX + "4.html" _string_args = ["q4a", "q5a", "q5d"] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = ["q5b", "q5c"] _arg_optional = False class Handler5_1(GenericSurveyHandler): def custom_processing(self, survey_data, template_args, received_args): q7b_ans = self.request.get_all("q7b") for i in xrange(len(q7b_ans)): if q7b_ans[i] in ["non_generator", "portable_generator", "standby_generator"]: q7b_ans[i] = (q7b_ans[i] + "(" + self.request.get(q7b_ans[i]) + ")") if (len(q7b_ans)): received_args.remove("q7b") for argument_name in ["non_generator", "portable_generator", "standby_generator"]: received_args.remove(argument_name) survey_data.q7b = ",".join(q7b_ans) return True _template_file_path = TEMPLATE_PATH_PREFIX + "5-1.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = ["q7a"] _multiple_args = ["q6"] _arg_optional = False class Handler5_2(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "5-2.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler5_3(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "5-3.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler5_4(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "5-4.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler6(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "6.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class HandlerSummerNormal(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "summer_normal.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler10(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "10.html" _string_args = ["summermorning", "summerlunch", "summerevening", "summerlatenight", "summerdata"] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class HandlerSummerOutage(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "summer_w_outage.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler15(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "15.html" _string_args = ["summermorninglimited", "summerlunchlimited", "summereveninglimited", "summerlatenightlimited", "summerdatalimited"] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler16(GenericSurveyHandler): def custom_processing(self, survey_data, template_args, received_args): template_args["summer_usage"] = sum(json.loads(survey_data.summerdata)) template_args["data_normal"] = survey_data.summerdata template_args["data_limited"] = survey_data.summerdatalimited return True _template_file_path = TEMPLATE_PATH_PREFIX + "16.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler17(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "17.html" _string_args = [] _float_args = ["summer1full", "summer1limited", "summer2full", "summer2limited", "summer3full", "summer3limited"] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = True class HandlerWinterNormal(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "winter_normal.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler21(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "21.html" _string_args = ["wintermorning", "winterlunch", "winterevening", "winterlatenight", "winterdata"] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class HandlerWinterOutage(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "winter_w_outage.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler25(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "25.html" _string_args = ["wintermorninglimited", "winterlunchlimited", "wintereveninglimited", "winterlatenightlimited", "winterdatalimited"] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler26(GenericSurveyHandler): def custom_processing(self, survey_data, template_args, received_args): template_args["winter_usage"] = sum(json.loads(survey_data.winterdata)) template_args["data_normal"] = survey_data.winterdata template_args["data_limited"] = survey_data.winterdatalimited return True _template_file_path = TEMPLATE_PATH_PREFIX + "26.html" _string_args = [] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False class Handler27(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "27.html" _string_args = [] _float_args = ["winter1full", "winter1limited", "winter2full", "winter2limited", "winter3full", "winter3limited"] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = True class Handler28(GenericSurveyHandler): _template_file_path = TEMPLATE_PATH_PREFIX + "28.html" _string_args = ["bg2"] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = ["bg1"] _arg_optional = False class HandlerFinish(GenericSurveyHandler): def custom_processing(self, survey_data, template_args, received_args): argument_names = {"starbucks": "starbucks_address", "amazon": "amazon_address", "paypal": "paypal_address"} argument_name = argument_names[self.request.get("reward_type")] survey_data.reward_address = self.request.get(argument_name) survey_data.end_date = datetime.datetime.now() for value in argument_names.values(): logging.debug("Current received_args: %s", received_args) logging.debug("Trying to delete: %s", value) received_args.remove(value) return True _template_file_path = TEMPLATE_PATH_PREFIX + "finish.html" _string_args = ["reward_type"] _float_args = [] _integer_args = [] _boolean_args = [] _multiple_args = [] _arg_optional = False # for input_string_arg in input_string_args: # data_dict[input_string_arg] = self.request.get(input_string_arg) # for input_float_arg in input_float_args: # data_dict[input_float_arg] = float( # self.request.get(input_float_arg)) # for input_integer_arg in input_integer_args: # data_dict[input_integer_arg] = int( # self.request.get(input_integer_arg)) # for input_boolean_arg in input_boolean_args: # data_dict[input_boolean_arg] = bool( # self.request.get(input_boolean_arg)) # for input_multiple_arg in input_multiple_args: # data_dict[input_arg] = ",".join( # self.request.get_all(input_multiple_arg)) # survey_data.populate(data_dict) # survey_data.put() # # populate template_args # template_args = { # "form_id": form_id # } # template = JINJA_ENVIRONMENT.get_template("html/3.html") # self.response.write(template.render(template_args)) # class Handler28(webapp2.RequestHandler): # def post(self): # # parse form_id # form_id = self.request.get("form_id") # # retrieve data # survey_data = model.SurveyData.get_by_id(form_id) # if not survey_data: # self.response.headers["Content-Type"] = "text/plain" # self.response.write("Something went wrong. Please start again.") # return # # parse input data # data_dict = {} # _string_args = ["reward_type", "reward_address"] # _float_args = [] # _integer_args = [] # _boolean_args = [] # _multiple_args = [] # for input_string_arg in input_string_args: # data_dict[input_string_arg] = self.request.get(input_string_arg) # for input_float_arg in input_float_args: # data_dict[input_float_arg] = float( # self.request.get(input_float_arg)) # for input_integer_arg in input_integer_args: # data_dict[input_integer_arg] = int( # self.request.get(input_integer_arg)) # for input_boolean_arg in input_boolean_args: # data_dict[input_boolean_arg] = bool( # self.request.get(input_boolean_arg)) # for input_multiple_arg in input_multiple_args: # data_dict[input_arg] = ",".join( # self.request.get_all(input_multiple_arg)) # survey_data.populate(data_dict) # survey_data.put() # # populate template_args # template_args = { # "form_id": form_id # } # template = JINJA_ENVIRONMENT.get_template("html/3.html") # self.response.write(template.render(template_args)) # class HandlerSummerNormal(webapp2.RequestHandler): # def post(self): # # parse form_id # form_id = self.request.get("form_id") # # retrieve data # survey_data = model.SurveyData.get_by_id(form_id) # if not survey_data: # self.response.headers["Content-Type"] = "text/plain" # self.response.write("Something went wrong. Please start again.") # return # # parse input data # data_dict = {} # _string_args = [] # _float_args = [] # _integer_args = [] # _boolean_args = [] # _multiple_args = [] # for input_string_arg in input_string_args: # data_dict[input_string_arg] = self.request.get(input_string_arg) # for input_float_arg in input_float_args: # data_dict[input_float_arg] = float( # self.request.get(input_float_arg)) # for input_integer_arg in input_integer_args: # data_dict[input_integer_arg] = int( # self.request.get(input_integer_arg)) # for input_boolean_arg in input_boolean_args: # data_dict[input_boolean_arg] = bool( # self.request.get(input_boolean_arg)) # for input_multiple_arg in input_multiple_args: # data_dict[input_arg] = ",".join( # self.request.get_all(input_multiple_arg)) # survey_data.populate(data_dict) # survey_data.put() # # populate template_args # template_args = { # "form_id": form_id # } # template = JINJA_ENVIRONMENT.get_template("html/3.html") # self.response.write(template.render(template_args)) # class HandlerSummerWOutage(webapp2.RequestHandler): # def post(self): # # parse form_id # form_id = self.request.get("form_id") # # retrieve data # survey_data = model.SurveyData.get_by_id(form_id) # if not survey_data: # self.response.headers["Content-Type"] = "text/plain" # self.response.write("Something went wrong. Please start again.") # return # # parse input data # data_dict = {} # _string_args = [] # _float_args = [] # _integer_args = [] # _boolean_args = [] # _multiple_args = [] # for input_string_arg in input_string_args: # data_dict[input_string_arg] = self.request.get(input_string_arg) # for input_float_arg in input_float_args: # data_dict[input_float_arg] = float( # self.request.get(input_float_arg)) # for input_integer_arg in input_integer_args: # data_dict[input_integer_arg] = int( # self.request.get(input_integer_arg)) # for input_boolean_arg in input_boolean_args: # data_dict[input_boolean_arg] = bool( # self.request.get(input_boolean_arg)) # for input_multiple_arg in input_multiple_args: # data_dict[input_arg] = ",".join( # self.request.get_all(input_multiple_arg)) # survey_data.populate(data_dict) # survey_data.put() # # populate template_args # template_args = { # "form_id": form_id # } # template = JINJA_ENVIRONMENT.get_template("html/3.html") # self.response.write(template.render(template_args)) # class HandlerWinterNormal(webapp2.RequestHandler): # def post(self): # # parse form_id # form_id = self.request.get("form_id") # # retrieve data # survey_data = model.SurveyData.get_by_id(form_id) # if not survey_data: # self.response.headers["Content-Type"] = "text/plain" # self.response.write("Something went wrong. Please start again.") # return # # parse input data # data_dict = {} # _string_args = [] # _float_args = [] # _integer_args = [] # _boolean_args = [] # _multiple_args = [] # for input_string_arg in input_string_args: # data_dict[input_string_arg] = self.request.get(input_string_arg) # for input_float_arg in input_float_args: # data_dict[input_float_arg] = float( # self.request.get(input_float_arg)) # for input_integer_arg in input_integer_args: # data_dict[input_integer_arg] = int( # self.request.get(input_integer_arg)) # for input_boolean_arg in input_boolean_args: # data_dict[input_boolean_arg] = bool( # self.request.get(input_boolean_arg)) # for input_multiple_arg in input_multiple_args: # data_dict[input_arg] = ",".join( # self.request.get_all(input_multiple_arg)) # survey_data.populate(data_dict) # survey_data.put() # # populate template_args # template_args = { # "form_id": form_id # } # template = JINJA_ENVIRONMENT.get_template("html/3.html") # self.response.write(template.render(template_args)) # class HandlerWinterWOutage(webapp2.RequestHandler): # def post(self): # # parse form_id # form_id = self.request.get("form_id") # # retrieve data # survey_data = model.SurveyData.get_by_id(form_id) # if not survey_data: # self.response.headers["Content-Type"] = "text/plain" # self.response.write("Something went wrong. Please start again.") # return # # parse input data # data_dict = {} # _string_args = [] # _float_args = [] # _integer_args = [] # _boolean_args = [] # _multiple_args = [] # for input_string_arg in input_string_args: # data_dict[input_string_arg] = self.request.get(input_string_arg) # for input_float_arg in input_float_args: # data_dict[input_float_arg] = float( # self.request.get(input_float_arg)) # for input_integer_arg in input_integer_args: # data_dict[input_integer_arg] = int( # self.request.get(input_integer_arg)) # for input_boolean_arg in input_boolean_args: # data_dict[input_boolean_arg] = bool( # self.request.get(input_boolean_arg)) # for input_multiple_arg in input_multiple_args: # data_dict[input_arg] = ",".join( # self.request.get_all(input_multiple_arg)) # survey_data.populate(data_dict) # survey_data.put() # # populate template_args # template_args = { # "form_id": form_id # } # template = JINJA_ENVIRONMENT.get_template("html/3.html") # self.response.write(template.render(template_args))