def show_report(request) -> HttpResponseRedirect: user_id = request.session.get("user_id", None) if user_id is None: return HttpResponseRedirect("/") user = find_user_by_id(user_id) lang = user.chosen_lang if not user.is_survey_finished(): messages.error( request, _("To generate a report you have to finish the survey.") ) return HttpResponseRedirect("/") # check that the redirect is authorised target = request.META.get("HTTP_REFERER", "/") if not can_redirect(target): target = "/" # Generation of the PDF report try: html_report = create_html_report(user, lang, request) pdf_report = makepdf(html_report, lang) except Exception as e: logger.error(e) messages.warning(request, "An error occured when generating the report.") return HttpResponseRedirect(target) # Try to get the email address in case the user wants to send the report try: body_unicode = request.body.decode("utf-8") body = json.loads(body_unicode) email_address = body.get("email-address", None) except Exception as e: logger.error(e) email_address = None if CUSTOM["modules"]["reportEmail"] and email_address: # Send the report via email try: send_report(email_address, pdf_report) except Exception as e: logger.error(e) else: # Return the report in the HTTP answer response = HttpResponse(pdf_report, content_type="application/pdf") response["Content-Disposition"] = "attachment;filename=Report{}_{}.pdf".format( CUSTOM["tool_name"], date.today() ) return response return HttpResponseRedirect(target)
def change_lang(request, lang: str): translation.activate(lang) request.session[settings.LANGUAGE_COOKIE_NAME] = lang user_id = request.session.get("user_id", None) previous_path = request.META.get("HTTP_REFERER", "/") if previous_path.__contains__("/survey/start"): return HttpResponseRedirect("/survey/start") if previous_path.__contains__("/stats/"): return HttpResponseRedirect("/stats/") if previous_path.__contains__("/terms/"): return HttpResponseRedirect("/terms/") if user_id is None: return HttpResponseRedirect("/") user = find_user_by_id(user_id) user.chosen_lang = lang user.save() user = find_user_by_id(user_id) user.chosen_lang = lang user.save() if ( user.is_survey_in_progress() or user.is_survey_under_review() ) and previous_path.__contains__("/survey/question/"): return HttpResponseRedirect(previous_path) if user.is_survey_under_review() and previous_path.__contains__("/survey/review"): return HttpResponseRedirect("/survey/review") if user.is_survey_finished() and previous_path.__contains__("/survey/finish"): return HttpResponseRedirect("/survey/finish") return HttpResponseRedirect("/")
def finish(request): crypter = Fernet(HASH_KEY) user_id = request.session.get("user_id", None) if user_id is None: return HttpResponseRedirect("/") user = find_user_by_id(user_id) if not user.is_survey_finished(): return HttpResponseRedirect("/") lang = user.chosen_lang translation.activate(lang) # make survey readonly and show results. # also needs saving here! # show a "Thank you" and a "get your report" button ( txt_score, bonus_score, sections_data, sections_labels, categories_data, categories_labels, ) = calculateResult(user) recommendations = getRecommendations(user, lang) # To properly display breaking lines \n on html page. for rx in recommendations: recommendations[rx] = [x.replace("\n", "<br>") for x in recommendations[rx]] text_layout = { "title": CUSTOM["tool_name"] + " - " + _("Final summary"), "recommendations": recommendations, "user": user, "userId": str(crypter.encrypt(user_id.encode("utf-8"))), "reportlink": "/survey/report", "txtscore": txt_score, "string_score": str(txt_score), "bonus_score": bonus_score, "sectionsLabels": str(sections_labels), "sectionsData": str(sections_data), "categoriesLabels": str(categories_labels), "categoriesData": str(categories_data), "general_feedback_form": handle_general_feedback(user, request), } return render(request, "survey/finishedSurvey.html", context=text_layout)
def show_report(request, lang): user_id = request.session['user_id'] user = find_user_by_id(user_id) if not user.is_survey_finished(): messages.error( request, _('To generate a report you have to finish the survey.')) return HttpResponseRedirect('/') try: return createAndSendReport(user, lang) except Exception as e: messages.warning(request, e) return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
def change_lang(request, lang: str): if request.session.get('user_id', None) is None: return HttpResponseRedirect('/') user = find_user_by_id(request.session['user_id']) user.choosen_lang = lang user.save() if user.is_survey_in_progress(): return HttpResponseRedirect('/survey/question/' + str(user.current_qindex)) if user.is_survey_under_review(): return HttpResponseRedirect('/survey/review') if user.is_survey_finished(): return HttpResponseRedirect('/survey/finish') return HttpResponseRedirect('/')
def save_general_feedback(request): user_id = request.session['user_id'] user = find_user_by_id(user_id) if not user.is_survey_finished(): return HttpResponseRedirect('/') form = handle_general_feedback(user, request) if user.is_survey_finished(): if form.errors: messages.warning( request, _('Feedback sending errors: ' + form.errors.split(', '))) return HttpResponseRedirect('/survey/finish') if user.is_survey_in_progress(): return HttpResponseRedirect('/survey/question/' + str(user.current_qindex)) if user.is_survey_under_review(): return HttpResponseRedirect('/survey/review') return HttpResponseRedirect('/')
def finish(request): user_id = request.session['user_id'] user = find_user_by_id(user_id) if not user.is_survey_finished(): return HttpResponseRedirect('/') user_lang = user.choosen_lang # make survey readonly and show results. # also needs saving here! # show a "Thank you" and a "get your report" button txt_score, radar_current, sections_list = calculateResult(user, user_lang) diagnostic_email_body = TRANSLATION_UI['report']['request_diagnostic'][ 'email_body'][user_lang] recommendations = getRecommendations(user, user_lang) # To properly display breaking lines \n on html page. for rx in recommendations: recommendations[rx] = [ x.replace("\n", "<br>") for x in recommendations[rx] ] textLayout = { 'title': "Fit4Cybersecurity - " + TRANSLATION_UI['report']['title'][user_lang], 'description': TRANSLATION_UI['report']['description'][user_lang], 'recommendations': recommendations, 'user': user, 'reportlink': "/survey/report", 'txtscore': txt_score, 'chartTitles': str(sections_list), 'chartlabelYou': TRANSLATION_UI['report']['result'][user_lang], 'chartdataYou': str(radar_current), 'min_acceptable_score': MIN_ACCEPTABLE_SCORE, 'available_langs': [lang[0] for lang in LANG_SELECT], 'general_feedback_form': handle_general_feedback(user, request) } add_form_translations(textLayout, user.choosen_lang, 'report') crypter = Fernet(HASH_KEY) textLayout['translations']['request_diagnostic'] = { 'title': TRANSLATION_UI['report']['request_diagnostic']['title'][user_lang], 'description': TRANSLATION_UI['report']['request_diagnostic']['description'] [user_lang], 'service_fee': TRANSLATION_UI['report']['request_diagnostic']['service_fee'] [user_lang], 'email_subject': TRANSLATION_UI['report']['request_diagnostic']['email_subject'] [user_lang], 'email_body': diagnostic_email_body.replace( '{userId}', str(crypter.encrypt(user_id.encode('utf-8')))) } textLayout['translations']['txtdownload'] = TRANSLATION_UI['report'][ 'download'][user_lang] textLayout['translations']['txtreport'] = TRANSLATION_UI['report'][ 'report'][user_lang] textLayout['translations']['general_feedback'] = { 'button': TRANSLATION_UI['report']['general_feedback']['button'][user_lang], 'title': TRANSLATION_UI['report']['general_feedback']['title'][user_lang], 'button_close': TRANSLATION_UI['report']['general_feedback']['button_close'] [user_lang], 'button_send': TRANSLATION_UI['report']['general_feedback']['button_send'][user_lang], } return render(request, 'survey/finishedSurvey.html', context=textLayout)