Пример #1
0
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)
Пример #2
0
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("/")
Пример #3
0
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)
Пример #4
0
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', '/'))
Пример #5
0
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('/')
Пример #6
0
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('/')
Пример #7
0
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)