def build_collection_exercise_details(short_name, period):
    survey = survey_controllers.get_survey_by_shortname(short_name)
    survey_id = survey["id"]
    exercises = collection_exercise_controllers.get_collection_exercises_by_survey(survey_id)
    exercise = get_collection_exercise_by_period(exercises, period)
    if not exercise:
        logger.error("Failed to find collection exercise by period", short_name=short_name, period=period)
        abort(404)
    collection_exercise_id = exercise["id"]
    survey["shortName"] = format_short_name(survey["shortName"])
    full_exercise = collection_exercise_controllers.get_collection_exercise_by_id(collection_exercise_id)
    exercise_events = collection_exercise_controllers.get_collection_exercise_events_by_id(collection_exercise_id)
    collection_instruments = collection_instrument_controllers.get_collection_instruments_by_classifier(
        collection_exercise_id=collection_exercise_id, survey_id=survey_id
    )

    eq_ci_selectors = collection_instrument_controllers.get_collection_instruments_by_classifier(
        ci_type="EQ", survey_id=survey_id
    )

    summary_id = collection_exercise_controllers.get_linked_sample_summary_id(collection_exercise_id)
    sample_summary = sample_controllers.get_sample_summary(summary_id) if summary_id else None
    ci_classifiers = survey_controllers.get_survey_ci_classifier(survey_id)

    return {
        "survey": survey,
        "collection_exercise": full_exercise,
        "events": convert_events_to_new_format(exercise_events),
        "collection_instruments": collection_instruments,
        "eq_ci_selectors": eq_ci_selectors,
        "sample_summary": _format_sample_summary(sample_summary),
        "ci_classifiers": ci_classifiers,
    }
Exemple #2
0
def get_response_statuses(ru_ref, error=None):
    logger.info("Retrieving response statuses", ru_ref=ru_ref)
    short_name = request.args.get("survey")
    period = request.args.get("period")

    completed_respondent = ""

    survey = survey_controllers.get_survey_by_shortname(short_name)

    exercises = collection_exercise_controllers.get_collection_exercises_by_survey(
        survey["id"])
    exercise = collection_exercise_controllers.get_collection_exercise_from_list(
        exercises, period)

    reporting_unit = party_controller.get_business_by_ru_ref(ru_ref)

    statuses = case_controller.get_available_case_group_statuses_direct(
        exercise["id"], ru_ref)
    available_statuses = {
        event: map_ce_response_status(status)
        for event, status in statuses.items()
        if case_controller.is_allowed_status(status)
    }

    case_groups = case_controller.get_case_groups_by_business_party_id(
        reporting_unit["id"])
    case_group = case_controller.get_case_group_by_collection_exercise(
        case_groups, exercise["id"])
    case_group_status = case_group["caseGroupStatus"]
    case_id = get_case_by_case_group_id(case_group["id"]).get("id")
    is_complete = case_group_status in COMPLETE_STATE
    completed_timestamp = get_timestamp_for_completed_case_event(
        case_id) if is_complete else None
    case_events = get_case_events_by_case_id(case_id=case_id)

    if case_group_status == "COMPLETE":
        case_event = get_case_event_for_seft_or_eq(case_events)
        completed_respondent = get_user_from_case_events(case_event)

    return render_template(
        "response-status.html",
        ru_ref=ru_ref,
        ru_name=reporting_unit["name"],
        trading_as=reporting_unit["trading_as"],
        survey_short_name=format_short_name(survey["shortName"]),
        survey_ref=survey["surveyRef"],
        ce_period=period,
        statuses=available_statuses,
        case_group_status=map_ce_response_status(case_group_status),
        case_group_id=case_group["id"],
        error=error,
        is_complete=is_complete,
        completed_timestamp=completed_timestamp,
        completed_respondent=completed_respondent,
    )
def get_survey(short_name):
    survey = get_survey_by_shortname(short_name)
    logger.info('Getting survey details',
                short_name=short_name,
                survey_id=survey['id'])

    # Format survey shortName
    survey['shortName'] = format_short_name(survey['shortName'])

    logger.info('Successfully retrieved survey details',
                short_name=short_name,
                survey_id=survey['id'])
    return survey
Exemple #4
0
def get_survey(short_name: str) -> dict:
    survey = get_survey_by_shortname(short_name)
    logger.info("Getting survey details",
                short_name=short_name,
                survey_id=survey["id"])

    # Format survey shortName
    survey["shortName"] = format_short_name(survey["shortName"])

    logger.info("Successfully retrieved survey details",
                short_name=short_name,
                survey_id=survey["id"])
    return survey
def get_surveys_list():
    logger.info('Retrieving surveys list')
    url = f'{app.config["SURVEY_URL"]}/surveys/surveytype/Business'
    response = requests.get(url, auth=app.config['SURVEY_AUTH'])

    if response.status_code == 204:
        logger.info('No surveys found in survey service')
        return []

    try:
        response.raise_for_status()
    except HTTPError:
        logger.error('Error retrieving the survey list')
        raise ApiError(response)

    logger.info('Successfully retrieved surveys list')
    survey_list = response.json()
    # Format survey shortName
    for survey in survey_list:
        survey['shortName'] = format_short_name(survey['shortName'])
    # Order List by surveyRef
    return sorted(survey_list, key=lambda k: k['surveyRef'])
Exemple #6
0
def view_selected_survey(selected_survey):  # noqa: C901

    displayed_short_name = format_short_name(selected_survey)
    session['messages_survey_selection'] = selected_survey
    breadcrumbs = [{"text": displayed_short_name + " Messages"}]

    try:
        if selected_survey == 'FDI':
            survey_id = _get_FDI_survey_id()
        elif selected_survey == 'Vacancies':
            survey_id = _get_vacancies_survey_ids()
        else:
            survey_id = _get_survey_id(selected_survey)

        page = request.args.get('page', default=1, type=int)
        limit = request.args.get('limit', default=10, type=int)
        flash_message = request.args.get('flash_message', default="", type=str)
        conversation_tab = request.args.get('conversation_tab', default='open')
        ru_ref_filter = request.args.get('ru_ref_filter', default='')
        business_id_filter = request.args.get('business_id_filter', default='')

        form = SecureMessageRuFilterForm()

        if form.validate_on_submit():
            new_ru_ref = form.ru_ref_filter.data
            if new_ru_ref and new_ru_ref != ru_ref_filter:
                business_id_filter, ru_resolution_error = _try_get_party_id_from_filter_ru(
                    new_ru_ref)
                if business_id_filter:
                    ru_ref_filter = new_ru_ref
                else:
                    ru_ref_filter = ''
                    flash_message = ru_resolution_error

        form.ru_ref_filter.data = ru_ref_filter

        tab_counts = _get_tab_counts(business_id_filter, conversation_tab,
                                     ru_ref_filter, survey_id)

        recalculated_page = _calculate_page(page, limit, tab_counts['current'])

        if recalculated_page != page:
            return redirect(
                url_for("messages_bp.view_selected_survey",
                        conversation_tab=conversation_tab,
                        selected_survey=selected_survey,
                        page=recalculated_page,
                        ru_ref_filter=ru_ref_filter,
                        business_id_filter=business_id_filter))

        messages = [
            _refine(message)
            for message in message_controllers.get_thread_list(
                survey_id, business_id_filter, conversation_tab, page, limit)
        ]

        pagination = Pagination(page=page,
                                per_page=limit,
                                total=tab_counts['current'],
                                record_name='messages',
                                prev_label='Previous',
                                next_label='Next',
                                outer_window=0,
                                format_total=True,
                                format_number=True,
                                show_single_page=False)

        if flash_message:
            flash(flash_message)

        return render_template("messages.html",
                               form=form,
                               page=page,
                               breadcrumbs=breadcrumbs,
                               messages=messages,
                               selected_survey=selected_survey,
                               displayed_short_name=displayed_short_name,
                               pagination=pagination,
                               change_survey=True,
                               conversation_tab=conversation_tab,
                               business_id_filter=business_id_filter,
                               ru_ref_filter=ru_ref_filter,
                               tab_titles=_get_tab_titles(
                                   tab_counts, ru_ref_filter))

    except TypeError:
        logger.error("Failed to retrieve survey id", exc_info=True)
        return render_template("messages.html",
                               form=form,
                               breadcrumbs=breadcrumbs,
                               selected_survey=selected_survey,
                               displayed_short_name=displayed_short_name,
                               response_error=True,
                               tab_titles=_get_tab_titles())
    except NoMessagesError:
        logger.error("Failed to retrieve messages", exc_info=True)
        return render_template("messages.html",
                               form=form,
                               breadcrumbs=breadcrumbs,
                               response_error=True,
                               selected_survey=selected_survey,
                               displayed_short_name=displayed_short_name,
                               tab_titles=_get_tab_titles())
Exemple #7
0
    def test_format_shortname(self):
        from response_operations_ui.common.mappers import format_short_name

        self.assertEqual(format_short_name('QBS'), 'QBS')
        self.assertEqual(format_short_name('Sand&Gravel'), 'Sand & Gravel')
Exemple #8
0
def view_selected_survey(selected_survey):  # noqa: C901

    displayed_short_name = format_short_name(selected_survey)
    session["messages_survey_selection"] = selected_survey
    breadcrumbs = [{"text": displayed_short_name + " Messages"}]

    page = request.args.get("page", default=1, type=int)
    limit = request.args.get("limit", default=10, type=int)
    conversation_tab = request.args.get("conversation_tab", default="open")
    ru_ref_filter = request.args.get("ru_ref_filter", default="")
    business_id_filter = request.args.get("business_id_filter", default="")
    category = "SURVEY"

    try:
        if selected_survey == "FDI":
            survey_id = _get_FDI_survey_id()
        elif selected_survey == "Vacancies":
            survey_id = _get_vacancies_survey_ids()
        else:
            survey_id = _get_survey_id(selected_survey)

        form = SecureMessageRuFilterForm()

        if form.validate_on_submit():
            new_ru_ref = form.ru_ref_filter.data
            if new_ru_ref and new_ru_ref != ru_ref_filter:
                business_id_filter, ru_resolution_error = _try_get_party_id_from_filter_ru(new_ru_ref)
                if business_id_filter:
                    ru_ref_filter = new_ru_ref
                else:
                    ru_ref_filter = ""
                    flash(ru_resolution_error)

        form.ru_ref_filter.data = ru_ref_filter

        tab_counts = _get_tab_counts(business_id_filter, conversation_tab, ru_ref_filter, survey_id, category)

        # If the page is higher then possible, redirect users to the highest possible page.
        recalculated_page = _verify_requested_page_is_within_bounds(page, limit, tab_counts["current"])
        if recalculated_page != page:
            return redirect(
                url_for(
                    "messages_bp.view_selected_survey",
                    conversation_tab=conversation_tab,
                    selected_survey=selected_survey,
                    page=recalculated_page,
                    ru_ref_filter=ru_ref_filter,
                    business_id_filter=business_id_filter,
                )
            )

        messages = [
            _refine(message)
            for message in message_controllers.get_thread_list(
                survey_id, business_id_filter, conversation_tab, page, limit, category
            )
        ]

        pagination = _get_pagination_object(page, limit, tab_counts)

        return render_template(
            "messages.html",
            form=form,
            page=page,
            breadcrumbs=breadcrumbs,
            messages=messages,
            selected_survey=selected_survey,
            displayed_short_name=displayed_short_name,
            pagination=pagination,
            change_survey=True,
            conversation_tab=conversation_tab,
            business_id_filter=business_id_filter,
            ru_ref_filter=ru_ref_filter,
            tab_titles=_get_tab_titles(tab_counts, ru_ref_filter),
        )

    except (TypeError, KeyError):
        logger.error("Failed to retrieve messages", exc_info=True)
        return render_template(
            "messages.html",
            form=form,
            breadcrumbs=breadcrumbs,
            selected_survey=selected_survey,
            displayed_short_name=displayed_short_name,
            response_error=True,
            tab_titles=_get_tab_titles(),
        )
Exemple #9
0
    def test_format_shortname(self):
        from response_operations_ui.common.mappers import format_short_name

        self.assertEqual(format_short_name("QBS"), "QBS")
        self.assertEqual(format_short_name("Sand&Gravel"), "Sand & Gravel")