def edit_contact_details(respondent_id):
    edit_contact_details_form = EditContactDetailsForm(form=request.form)
    if not edit_contact_details_form.validate():
        contact_details = party_controller.get_respondent_by_party_id(
            respondent_id)

        return render_template('edit-contact-details.html',
                               form=edit_contact_details_form,
                               tab='respondents',
                               respondent_id=respondent_id,
                               errors=edit_contact_details_form.errors,
                               respondent_details=contact_details)

    logger.info('Updating respondent details', respondent_id=respondent_id)
    form = request.form
    contact_details_changed = party_controller.update_contact_details(
        respondent_id, form)

    if 'emailAddress' in contact_details_changed:
        flash(
            f'Contact details changed and verification email sent to {form.get("email")}'
        )
    elif len(contact_details_changed) > 0:
        flash('Contact details changed')
    else:
        flash('No updates were necessary')

    return redirect(
        url_for('respondent_bp.respondent_details',
                respondent_id=respondent_id,
                message_key='details_changed'))
示例#2
0
def edit_contact_details(ru_ref, respondent_id):
    edit_contact_details_form = EditContactDetailsForm(form=request.form)
    if not edit_contact_details_form.validate():
        contact_details = party_controller.get_respondent_by_party_id(respondent_id)

        return render_template(
            "edit-contact-details.html",
            form=edit_contact_details_form,
            tab="reporting_units",
            ru_ref=ru_ref,
            respondent_id=respondent_id,
            errors=edit_contact_details_form.errors,
            respondent_details=contact_details,
        )

    logger.info("Updating respondent details", ru_ref=ru_ref, respondent_id=respondent_id)
    form = request.form
    contact_details_changed = party_controller.update_contact_details(respondent_id, form, ru_ref)

    if "emailAddress" in contact_details_changed:
        flash(f'Contact details changed and verification email sent to {form.get("email")}')
    elif len(contact_details_changed) > 0:
        flash("Contact details changed")
    else:
        flash("No updates were necessary")

    return redirect(url_for("reporting_unit_bp.view_reporting_unit", ru_ref=ru_ref))
示例#3
0
def undo_delete_respondent(respondent_id):
    respondent = party_controller.get_respondent_by_party_id(respondent_id)

    if request.method == 'POST':
        respondent_controllers.undo_delete_respondent_account_by_username(
            respondent['emailAddress'])
        flash('The respondent’s account has been reactivated.', 'success')
        return redirect(
            url_for(
                'respondent_bp.respondent_details',
                respondent_id=respondent_id,
            ))
    breadcrumbs = [{
        "url": '/respondents',
        "text": 'Respondents'
    }, {
        "text": f"{respondent['emailAddress']}",
        "url": f"/respondents/respondent-details/{respondent_id}"
    }, {
        "text": 'Cancel Delete'
    }, {}]
    return render_template('delete-respondent.html',
                           respondent_details=respondent,
                           delete=False,
                           breadcrumbs=breadcrumbs)
def respondent_details(respondent_id):

    respondent = party_controller.get_respondent_by_party_id(respondent_id)
    enrolments = party_controller.get_respondent_enrolments(respondent)

    breadcrumbs = [{
        "text": "Respondents",
        "url": "/respondents"
    }, {
        "text": f"{respondent['emailAddress']}"
    }]

    respondent['status'] = respondent['status'].title()

    info = request.args.get('info')
    if request.args.get('enrolment_changed'):
        flash('Enrolment status changed', 'information')
    if request.args.get('account_status_changed'):
        flash('Account status changed', 'information')
    elif info:
        flash(info, 'information')

    return render_template('respondent.html',
                           respondent=respondent,
                           enrolments=enrolments,
                           breadcrumbs=breadcrumbs)
示例#5
0
def get_respondent_enrolments_from_thread(thread: dict) -> list[dict]:
    if thread["messages"][0]["from_internal"]:
        party_id = thread["messages"][0]["msg_to"][0]
    else:
        party_id = thread["messages"][0]["msg_from"]
    respondent = party_controller.get_respondent_by_party_id(party_id)
    enrolments = party_controller.get_respondent_enrolments(respondent)
    reporting_units = [enrolment["business"] for enrolment in enrolments]
    return reporting_units
def confirm_change_respondent_status(party_id):
    respondent = party_controller.get_respondent_by_party_id(party_id)
    return render_template('confirm-respondent-status-change.html',
                           respondent_id=respondent['id'],
                           first_name=respondent['firstName'],
                           last_name=respondent['lastName'],
                           email_address=respondent['emailAddress'],
                           change_flag=request.args['change_flag'],
                           tab='respondents')
示例#7
0
def confirm_change_respondent_status(ru_ref):
    respondent = get_respondent_by_party_id(request.args['party_id'])
    return render_template('confirm-respondent-status-change.html',
                           ru_ref=ru_ref,
                           respondent_id=respondent['id'],
                           first_name=respondent['firstName'],
                           last_name=respondent['lastName'],
                           email_address=respondent['emailAddress'],
                           change_flag=request.args['change_flag'],
                           tab=request.args['tab'])
示例#8
0
def get_user_from_case_events(case_events):
    first_case_event = len(case_events) - 1
    if case_events[first_case_event]['metadata']:
        try:
            respondent = get_respondent_by_party_id(case_events[first_case_event]['metadata']['partyId'])
        except KeyError:
            logger.info('There was no partyId in case event', case_event=case_events[first_case_event])
            return ''
        respondent_name = respondent.get('firstName') + ' ' + respondent.get('lastName')
        return respondent_name
    else:
        return ''
示例#9
0
def confirm_change_respondent_status(ru_ref):
    respondent = party_controller.get_respondent_by_party_id(request.args["party_id"])
    return render_template(
        "confirm-respondent-status-change.html",
        ru_ref=ru_ref,
        respondent_id=respondent["id"],
        first_name=respondent["firstName"],
        last_name=respondent["lastName"],
        email_address=respondent["emailAddress"],
        change_flag=request.args["change_flag"],
        tab=request.args["tab"],
    )
示例#10
0
def view_contact_details(ru_ref, respondent_id):
    respondent_details = party_controller.get_respondent_by_party_id(respondent_id)

    form = EditContactDetailsForm(form=request.form, default_values=respondent_details)

    return render_template(
        "edit-contact-details.html",
        ru_ref=ru_ref,
        respondent_details=respondent_details,
        form=form,
        tab="reporting_units",
    )
def view_resend_verification(respondent_id):
    logger.info("Re-send verification email requested",
                respondent_id=respondent_id)
    respondent = party_controller.get_respondent_by_party_id(respondent_id)
    email = respondent[
        'pendingEmailAddress'] if 'pendingEmailAddress' in respondent else respondent[
            'emailAddress']

    return render_template('re-send-verification-email.html',
                           respondent_id=respondent_id,
                           email=email,
                           tab='respondents')
def view_contact_details(respondent_id):
    respondent_details = party_controller.get_respondent_by_party_id(
        respondent_id)

    form = EditContactDetailsForm(form=request.form,
                                  default_values=respondent_details)

    return render_template('edit-contact-details.html',
                           respondent_details=respondent_details,
                           form=form,
                           tab='respondents',
                           respondent_id=respondent_id)
def get_user_from_case_events(case_events):
    first_case_event = len(case_events) - 1
    if case_events[first_case_event]['metadata']:
        try:
            respondent = get_respondent_by_party_id(
                case_events[first_case_event]['metadata']['partyId'])
        except KeyError:
            logger.info('There was no partyId in case event',
                        case_event=case_events[first_case_event])
            return ''
        if not respondent:
            return 'Respondent does not exists in the system. This may be due to the GDPR retention policy.'
        return respondent.get('firstName') + ' ' + respondent.get('lastName')
    else:
        return ''
示例#14
0
def get_user_from_case_events(case_events):
    first_case_event = len(case_events) - 1
    if case_events[first_case_event]["metadata"]:
        try:
            respondent = get_respondent_by_party_id(
                case_events[first_case_event]["metadata"]["partyId"])
        except KeyError:
            logger.info("There was no partyId in case event",
                        case_event=case_events[first_case_event])
            return ""
        if not respondent:
            return "Respondent does not exists in the system. This may be due to the GDPR retention policy."
        return respondent.get("firstName") + " " + respondent.get("lastName")
    else:
        return ""
示例#15
0
def delete_respondent(respondent_id):
    respondent = party_controller.get_respondent_by_party_id(respondent_id)

    if request.method == 'POST':
        respondent_controllers.delete_respondent_account_by_username(
            respondent['emailAddress'])
        return redirect(
            url_for('respondent_bp.respondent_home',
                    success_panel='The account is pending deletion '
                    'and will be deleted by the end the day.'))
    breadcrumbs = [{
        "url": '/respondents',
        "text": 'Respondents'
    }, {
        "text": f"{respondent['emailAddress']}",
        "url": f"/respondents/respondent-details/{respondent_id}"
    }, {
        "text": 'Delete'
    }, {}]

    return render_template('delete-respondent.html',
                           respondent_details=respondent,
                           delete=True,
                           breadcrumbs=breadcrumbs)
示例#16
0
def view_reporting_unit(ru_ref):
    logger.info("Gathering data to view reporting unit", ru_ref=ru_ref)
    # Make some initial calls to retrieve some data we'll need
    reporting_unit = party_controller.get_party_by_ru_ref(ru_ref)

    cases = case_controller.get_cases_by_business_party_id(
        reporting_unit['id'])

    case_groups = case_controller.get_case_groups_by_business_party_id(
        reporting_unit['id'])

    # Get all collection exercises for retrieved case groups
    collection_exercise_ids = {
        case_group['collectionExerciseId']
        for case_group in case_groups
    }
    collection_exercises = [
        get_collection_exercise_by_id(ce_id)
        for ce_id in collection_exercise_ids
    ]

    # Add extra collection exercise details and filter by live date
    now = datetime.now(timezone.utc)
    live_collection_exercises = [
        add_collection_exercise_details(ce, reporting_unit, case_groups)
        for ce in collection_exercises
        if parse_date(ce['scheduledStartDateTime']) < now
    ]

    # Get all related surveys for gathered collection exercises
    survey_ids = {
        collection_exercise['surveyId']
        for collection_exercise in live_collection_exercises
    }
    surveys = [get_survey_by_id(survey_id) for survey_id in survey_ids]

    # Get all respondents for the given ru
    respondents = [
        party_controller.get_respondent_by_party_id(respondent['partyId'])
        for respondent in reporting_unit.get('associations')
    ]

    # Link collection exercises and respondents to appropriate surveys
    linked_surveys = [
        survey_with_respondents_and_exercises(survey, respondents,
                                              live_collection_exercises,
                                              ru_ref) for survey in surveys
    ]
    sorted_linked_surveys = sorted(linked_surveys,
                                   key=lambda survey: survey['surveyRef'])

    # Add latest active iac code to surveys
    surveys_with_latest_case = [{
        **survey, "case":
        get_latest_case_with_ce(cases, survey['collection_exercises'])
    } for survey in sorted_linked_surveys]

    # Generate appropriate info message is necessary
    # TODO Standardise how the info messages are generated
    survey_arg = request.args.get('survey')
    period_arg = request.args.get('period')
    if survey_arg and period_arg:
        survey = next(
            filter(lambda s: s['shortName'] == survey_arg,
                   sorted_linked_surveys))
        collection_exercise = next(
            filter(lambda s: s['exerciseRef'] == period_arg,
                   survey['collection_exercises']))
        new_status = collection_exercise['responseStatus']
        flash(
            f'Response status for {survey["surveyRef"]} {survey["shortName"]}'
            f' period {period_arg} changed to {new_status}')

    info = request.args.get('info')
    if request.args.get('enrolment_changed'):
        flash('Enrolment status changed', 'information')
    if request.args.get('account_status_changed'):
        flash('Account status changed', 'information')
    elif info:
        flash(info, 'information')

    breadcrumbs = [{
        "text": "Reporting units",
        "url": "/reporting-units"
    }, {
        "text": f"{ru_ref}"
    }]
    logger.info("Successfully gathered data to view reporting unit",
                ru_ref=ru_ref)
    return render_template('reporting-unit.html',
                           ru_ref=ru_ref,
                           ru=reporting_unit,
                           surveys=surveys_with_latest_case,
                           breadcrumbs=breadcrumbs)
示例#17
0
def view_resend_verification(ru_ref, party_id):
    logger.info("Re-send verification email requested", ru_ref=ru_ref, party_id=party_id)
    respondent = party_controller.get_respondent_by_party_id(party_id)
    email = respondent["pendingEmailAddress"] if "pendingEmailAddress" in respondent else respondent["emailAddress"]

    return render_template("re-send-verification-email.html", ru_ref=ru_ref, email=email, tab="reporting_units")