Esempio n. 1
0
def award_brief(framework_slug, lot_slug, brief_id):
    get_framework_and_lot(
        framework_slug,
        lot_slug,
        data_api_client,
        allowed_statuses=['live', 'expired'],
        must_allow_brief=True,
    )
    brief = data_api_client.get_brief(brief_id)["briefs"]

    if not is_brief_correct(brief,
                            framework_slug,
                            lot_slug,
                            current_user.id,
                            allowed_statuses=['closed']):
        abort(404)

    brief_responses = data_api_client.find_brief_responses(
        brief['id'], status="submitted,pending-awarded")['briefResponses']
    if not brief_responses:
        return redirect(
            url_for(".view_brief_responses",
                    framework_slug=brief['frameworkSlug'],
                    lot_slug=brief['lotSlug'],
                    brief_id=brief['id']))

    form = AwardedBriefResponseForm(brief_responses)
    form_options = form.brief_response.govuk_options

    if form.validate_on_submit():
        try:
            data_api_client.update_brief_award_brief_response(
                brief_id, form.data['brief_response'],
                current_user.email_address)
        except HTTPError:
            abort(500, "Unexpected API error when awarding brief response")

        return redirect(
            url_for(".award_brief_details",
                    framework_slug=brief['frameworkSlug'],
                    lot_slug=brief['lotSlug'],
                    brief_id=brief['id'],
                    brief_response_id=form.data['brief_response']))

    pending_brief_responses = list(
        filter(lambda x: x.get('awardDetails', {}).get('pending'),
               brief_responses))
    form['brief_response'].data = pending_brief_responses[0][
        "id"] if pending_brief_responses else None
    errors = get_errors_from_wtform(form)

    return render_template("buyers/award.html",
                           brief=brief,
                           form=form,
                           form_options=form_options,
                           errors=errors), 200 if not errors else 400
def view_brief_responses(framework_slug, lot_slug, brief_id):
    get_framework_and_lot(
        framework_slug,
        lot_slug,
        data_api_client,
        allowed_statuses=['live', 'expired'],
        must_allow_brief=True,
    )
    brief = data_api_client.get_brief(brief_id)["briefs"]

    if not is_brief_correct(brief,
                            framework_slug,
                            lot_slug,
                            current_user.id,
                            allowed_statuses=CLOSED_PUBLISHED_BRIEF_STATUSES):
        abort(404)

    brief_responses = data_api_client.find_brief_responses(
        brief_id)['briefResponses']

    brief_responses_required_evidence = (
        None if not brief_responses else
        not is_legacy_brief_response(brief_responses[0], brief=brief))

    counter = Counter()

    for response in brief_responses:
        counter[all(response['essentialRequirements'])] += 1

    return render_template(
        "buyers/brief_responses.html",
        response_counts={
            "failed": counter[False],
            "eligible": counter[True]
        },
        brief_responses_required_evidence=brief_responses_required_evidence,
        brief=brief), 200
Esempio n. 3
0
def get_brief_by_id(framework_slug, brief_id):
    briefs = data_api_client.get_brief(brief_id)
    brief = briefs.get('briefs')
    if brief['lotSlug'] in ['rfx', 'atm', 'specialist', 'training2']:
        return redirect('/2/%s/opportunities/%s' % (framework_slug, brief_id), 301)
    if brief['status'] not in ['live', 'closed']:
        if (
            not current_user.is_authenticated or
            (brief['users'] and brief['users'][0]['id'] != current_user.id) or
            current_user.id not in [tb.get('userId') for tb in brief.get('teamBriefs', [])]
        ):
            abort(404, "Opportunity '{}' can not be found".format(brief_id))

    if current_user.is_authenticated and current_user.role == 'supplier':
        brief_responses = data_api_client.find_brief_responses(
            brief_id, current_user.supplier_code)["briefResponses"]
        selected_for_brief = _is_supplier_selected_for_brief(brief)
    else:
        brief_responses = None
        selected_for_brief = False

    brief['clarificationQuestions'] = [
        dict(question, number=index+1)
        for index, question in enumerate(brief['clarificationQuestions'])
    ]

    brief_content = content_loader.get_builder(framework_slug, 'display_brief').filter(
        brief
    )

    sections = brief_content.summary(brief)
    unanswered_required, unanswered_optional = count_unanswered_questions(sections)

    brief_of_current_user = False
    if not current_user.is_anonymous and len(brief.get('users')) > 0:
        brief_of_current_user = brief['users'][0]['id'] == current_user.id

    is_restricted_brief = brief.get('sellerSelector', '') in ('someSellers', 'oneSeller')

    brief_published_date = brief['dates'].get('published_date', None)
    feature_date = current_app.config['MULTI_CANDIDATE_PUBLISHED_DATE']

    published_date = pendulum.parse(brief_published_date) if brief_published_date else feature_date.subtract(days=1)
    application_url = "/2/brief/{}/respond".format(brief['id'])
    application_specialist_url = application_url
    application_specialist_submitted_url = None

    if published_date >= feature_date:
        application_specialist_url = "/2/brief/{}/specialist/respond".format(brief['id'])
        application_specialist_submitted_url = "/2/brief/{}/specialist/respond/submitted".format(brief['id'])

    application_training_url = "/2/brief/{}/training/respond".format(brief['id'])

    add_case_study_url = None

    profile_application_status = None
    supplier = None
    unassessed_domains = {}
    assessed_domains = {}
    profile_url = None
    supplier_assessments = {}
    supplier_framework = None

    if current_user.is_authenticated:
        if current_user.supplier_code is not None:
            supplier = data_api_client.get_supplier(
                current_user.supplier_code
            ).get('supplier', None)

        profile_application_id = current_user.application_id

        if supplier is not None:
            profile_url = '/supplier/{}'.format(supplier.get('code'))
            assessed_domains = supplier.get('domains').get('assessed', None)
            unassessed_domains = supplier.get('domains').get('unassessed', None)
            legacy_domains = supplier.get('domains').get('legacy', None)

            if profile_application_id is None:
                profile_application_id = supplier.get('application_id', None)

            supplier_code = supplier.get('code')
            supplier_assessments = data_api_client.req.assessments().supplier(supplier_code).get()

            if len(legacy_domains) != 0:
                for i in range(len(legacy_domains)):
                    supplier_assessments['assessed'].append(legacy_domains[i])

            supplier_framework_ids = supplier.get('frameworks')
            for i in range(len(supplier_framework_ids)):
                if supplier.get('frameworks')[i].get('framework_id') == 7:
                    supplier_framework = 'digital-marketplace'
            if supplier_framework is None:
                supplier_framework = 'digital-service-professionals'

        if profile_application_id is not None:
            try:
                profile_application = data_api_client.req.applications(profile_application_id).get()

                if unassessed_domains is None:
                    unassessed_domains = profile_application.get(
                        'application').get('supplier').get('domains', None).get('unassessed', None)
                if assessed_domains is None:
                    assessed_domains = profile_application.get(
                        'application').get('supplier').get('domains', None).get('assessed', None)

                profile_application_status = profile_application.get('application').get('status', None)
                if profile_application.get('application').get('type') == 'edit':
                    profile_application_status = 'approved'

            except APIError:
                pass
            except HTTPError:
                pass

    domain_id = None
    if brief.get('areaOfExpertise'):
        current_domain = data_api_client.req.domain(brief['areaOfExpertise']).get()
        domain_id = current_domain['domain']['id']
    elif brief['lotSlug'] == 'training':
        domain_id = 15  # training

    return render_template_with_csrf(
        'brief.html',
        add_case_study_url=add_case_study_url,
        application_url=application_url,
        application_specialist_url=application_specialist_url,
        application_specialist_submitted_url=application_specialist_submitted_url,
        application_training_url=application_training_url,
        assessed_domains=assessed_domains,
        brief=brief,
        brief_responses=brief_responses,
        brief_of_current_user=brief_of_current_user,
        content=brief_content,
        domain_id=domain_id,
        is_restricted_brief=is_restricted_brief,
        selected_for_brief=selected_for_brief,
        profile_application_status=profile_application_status,
        profile_url=profile_url,
        unassessed_domains=unassessed_domains,
        supplier_assessments=supplier_assessments,
        supplier_framework=supplier_framework,
        unanswered_required=unanswered_required,
        training_domain_name='Training, Learning and Development'
    )
def get_brief_by_id(framework_slug, brief_id):
    briefs = data_api_client.get_brief(brief_id)
    brief = briefs.get('briefs')
    if brief['lotSlug'] in ['rfx', 'atm']:
        return redirect('/2/%s/opportunities/%s' % (framework_slug, brief_id), 301)
    if brief['status'] not in ['live', 'closed']:
        if not current_user.is_authenticated or brief['users'][0]['id'] != current_user.id:
            abort(404, "Opportunity '{}' can not be found".format(brief_id))

    if current_user.is_authenticated and current_user.role == 'supplier':
        brief_responses = data_api_client.find_brief_responses(
            brief_id, current_user.supplier_code)["briefResponses"]
        selected_for_brief = _is_supplier_selected_for_brief(brief)
    else:
        brief_responses = None
        selected_for_brief = False

    brief['clarificationQuestions'] = [
        dict(question, number=index+1)
        for index, question in enumerate(brief['clarificationQuestions'])
    ]

    brief_content = content_loader.get_builder(framework_slug, 'display_brief').filter(
        brief
    )

    sections = brief_content.summary(brief)
    unanswered_required, unanswered_optional = count_unanswered_questions(sections)

    brief_of_current_user = False
    if not current_user.is_anonymous and len(brief.get('users')) > 0:
        brief_of_current_user = brief['users'][0]['id'] == current_user.id

    is_restricted_brief = brief.get('sellerSelector', '') in ('someSellers', 'oneSeller')

    brief_published_date = brief['dates'].get('published_date', None)
    feature_date = current_app.config['MULTI_CANDIDATE_PUBLISHED_DATE']

    published_date = pendulum.parse(brief_published_date) if brief_published_date else feature_date.subtract(days=1)
    application_url = "/2/brief/{}/respond".format(brief['id'])
    application_specialist_url = application_url
    application_specialist_submitted_url = None

    if published_date >= feature_date:
        application_specialist_url = "/2/brief/{}/specialist/respond".format(brief['id'])
        application_specialist_submitted_url = "/2/brief/{}/specialist/respond/submitted".format(brief['id'])

    application_training_url = "/2/brief/{}/training/respond".format(brief['id'])

    add_case_study_url = None

    profile_application_status = None
    supplier = None
    unassessed_domains = {}
    assessed_domains = {}
    profile_url = None
    supplier_assessments = {}
    supplier_framework = None

    if current_user.is_authenticated:
        if current_user.supplier_code is not None:
            supplier = data_api_client.get_supplier(
                current_user.supplier_code
            ).get('supplier', None)

        profile_application_id = current_user.application_id

        if supplier is not None:
            profile_url = '/supplier/{}'.format(supplier.get('code'))
            assessed_domains = supplier.get('domains').get('assessed', None)
            unassessed_domains = supplier.get('domains').get('unassessed', None)
            legacy_domains = supplier.get('domains').get('legacy', None)

            if profile_application_id is None:
                profile_application_id = supplier.get('application_id', None)

            supplier_code = supplier.get('code')
            supplier_assessments = data_api_client.req.assessments().supplier(supplier_code).get()

            if len(legacy_domains) != 0:
                for i in range(len(legacy_domains)):
                    supplier_assessments['assessed'].append(legacy_domains[i])

            supplier_framework_ids = supplier.get('frameworks')
            for i in range(len(supplier_framework_ids)):
                if supplier.get('frameworks')[i].get('framework_id') == 7:
                    supplier_framework = 'digital-marketplace'
            if supplier_framework is None:
                supplier_framework = 'digital-service-professionals'

        if profile_application_id is not None:
            try:
                profile_application = data_api_client.req.applications(profile_application_id).get()

                if unassessed_domains is None:
                    unassessed_domains = profile_application.get(
                        'application').get('supplier').get('domains', None).get('unassessed', None)
                if assessed_domains is None:
                    assessed_domains = profile_application.get(
                        'application').get('supplier').get('domains', None).get('assessed', None)

                profile_application_status = profile_application.get('application').get('status', None)
                if profile_application.get('application').get('type') == 'edit':
                    profile_application_status = 'approved'

            except APIError:
                pass
            except HTTPError:
                pass

    domain_id = None
    if brief.get('areaOfExpertise'):
        current_domain = data_api_client.req.domain(brief['areaOfExpertise']).get()
        domain_id = current_domain['domain']['id']
    elif brief['lotSlug'] == 'training':
        domain_id = 15  # training

    return render_template_with_csrf(
        'brief.html',
        add_case_study_url=add_case_study_url,
        application_url=application_url,
        application_specialist_url=application_specialist_url,
        application_specialist_submitted_url=application_specialist_submitted_url,
        application_training_url=application_training_url,
        assessed_domains=assessed_domains,
        brief=brief,
        brief_responses=brief_responses,
        brief_of_current_user=brief_of_current_user,
        content=brief_content,
        domain_id=domain_id,
        is_restricted_brief=is_restricted_brief,
        selected_for_brief=selected_for_brief,
        profile_application_status=profile_application_status,
        profile_url=profile_url,
        unassessed_domains=unassessed_domains,
        supplier_assessments=supplier_assessments,
        supplier_framework=supplier_framework,
        unanswered_required=unanswered_required,
        training_domain_name='Training, Learning and Development'
    )
Esempio n. 5
0
def get_brief_by_id(framework_family, brief_id):
    frameworks = data_api_client.find_frameworks()['frameworks']
    frameworks = [
        framework for framework in frameworks
        if framework['framework'] == framework_family
    ]
    framework = get_latest_live_framework_or_404(frameworks, framework_family)

    abort_if_not_further_competition_framework(framework)

    briefs = data_api_client.get_brief(brief_id)
    brief = briefs.get('briefs')

    if brief['status'] not in PUBLISHED_BRIEF_STATUSES or brief['framework'][
            'family'] != framework_family:
        abort(404, "Opportunity '{}' can not be found".format(brief_id))

    brief_responses = data_api_client.find_brief_responses(
        brief_id=brief_id,
        status=",".join(ALL_BRIEF_RESPONSE_STATUSES),
        with_data=False,
    ).get('briefResponses')

    winning_response, winning_supplier_size = None, None
    if brief['status'] == 'awarded':
        winning_response = next(
            response for response in brief_responses
            if response["id"] == brief['awardedBriefResponseId'])
        winning_supplier_size = format_winning_supplier_size(
            winning_response["supplierOrganisationSize"])

    brief_responses_stats = count_brief_responses_by_size_and_status(
        brief_responses)

    if brief['status'] not in PUBLISHED_BRIEF_STATUSES or brief['framework'][
            'family'] != framework_family:
        abort(404, "Opportunity '{}' can not be found".format(brief_id))
    try:
        has_supplier_responded_to_brief = (current_user.supplier_id in [
            res['supplierId'] for res in brief_responses
            if res["status"] in COMPLETED_BRIEF_RESPONSE_STATUSES
        ])
    except AttributeError:
        has_supplier_responded_to_brief = False

    # Get Q&A in format suitable for govukSummaryList
    for index, question in enumerate(brief['clarificationQuestions']):
        question["key"] = {
            "html":
            f"{str(index + 1)}. "
            f"{text_to_html(question['question'], format_links=True, preserve_line_breaks=True)}"
        }
        question["value"] = {
            "html":
            text_to_html(question["answer"],
                         format_links=True,
                         preserve_line_breaks=True)
        }

    brief_content = content_loader.get_manifest(brief['frameworkSlug'],
                                                'display_brief').filter(brief)

    # Get attributes in format suitable for govukSummaryList
    brief_summary = brief_content.summary(brief)
    for section in brief_summary:
        section.summary_list = to_summary_list_rows(section.questions,
                                                    format_links=True,
                                                    filter_empty=False)

    return render_template(
        'brief.html',
        brief=brief,
        brief_responses_stats=brief_responses_stats,
        content=brief_content,
        brief_content_summary=brief_summary,
        has_supplier_responded_to_brief=has_supplier_responded_to_brief,
        winning_response=winning_response,
        winning_supplier_size=winning_supplier_size,
    )
Esempio n. 6
0
def get_brief_by_id(framework_slug, brief_id):
    briefs = data_api_client.get_brief(brief_id)
    brief = briefs.get('briefs')
    if brief['status'] not in ['live', 'closed']:
        if not current_user.is_authenticated or brief['users'][0][
                'id'] != current_user.id:
            abort(404, "Opportunity '{}' can not be found".format(brief_id))

    if current_user.is_authenticated and current_user.role == 'supplier':
        brief_responses = data_api_client.find_brief_responses(
            brief_id, current_user.supplier_code)["briefResponses"]
    else:
        brief_responses = None

    brief['clarificationQuestions'] = [
        dict(question, number=index + 1)
        for index, question in enumerate(brief['clarificationQuestions'])
    ]

    brief_content = content_loader.get_builder(framework_slug,
                                               'display_brief').filter(brief)

    brief_of_current_user = False
    if not current_user.is_anonymous and len(brief.get('users')) > 0:
        brief_of_current_user = brief['users'][0]['id'] == current_user.id

    is_restricted_brief = brief.get('sellerSelector',
                                    '') in ('someSellers', 'oneSeller')

    application_url = "/sellers/opportunities/{}/responses/create".format(
        brief['id'])
    add_case_study_url = None

    profile_application_status = None
    supplier = None
    unassessed_domains = {}
    assessed_domains = {}
    profile_url = None
    supplier_assessments = {}
    supplier_framework = None

    if current_user.is_authenticated:
        if current_user.supplier_code is not None:
            supplier = data_api_client.get_supplier(
                current_user.supplier_code).get('supplier', None)

        profile_application_id = current_user.application_id

        if supplier is not None:
            profile_url = '/supplier/{}'.format(supplier.get('code'))
            assessed_domains = supplier.get('domains').get('assessed', None)
            unassessed_domains = supplier.get('domains').get(
                'unassessed', None)
            legacy_domains = supplier.get('domains').get('legacy', None)

            if profile_application_id is None:
                profile_application_id = supplier.get('application_id', None)

            supplier_code = supplier.get('code')
            supplier_assessments = data_api_client.req.assessments().supplier(
                supplier_code).get()

            if len(legacy_domains) != 0:
                for i in range(len(legacy_domains)):
                    supplier_assessments['assessed'].append(legacy_domains[i])

            supplier_framework_ids = supplier.get('frameworks')
            for i in range(len(supplier_framework_ids)):
                if supplier.get('frameworks')[i].get('framework_id') == 7:
                    supplier_framework = 'digital-marketplace'
            if supplier_framework is None:
                supplier_framework = 'digital-service-professionals'

        if profile_application_id is not None:
            try:
                profile_application = data_api_client.req.applications(
                    profile_application_id).get()

                if unassessed_domains is None:
                    unassessed_domains = profile_application.get(
                        'application').get('supplier').get(
                            'domains', None).get('unassessed', None)
                if assessed_domains is None:
                    assessed_domains = profile_application.get(
                        'application').get('supplier').get(
                            'domains', None).get('assessed', None)

                profile_application_status = profile_application.get(
                    'application').get('status', None)
                if profile_application.get('application').get(
                        'type') == 'edit':
                    profile_application_status = 'approved'

            except APIError:
                pass
            except HTTPError:
                pass

    domain_id = None
    if brief.get('areaOfExpertise'):
        current_domain = data_api_client.req.domain(
            brief['areaOfExpertise']).get()
        domain_id = current_domain['domain']['id']

    return render_template_with_csrf(
        'brief.html',
        add_case_study_url=add_case_study_url,
        application_url=application_url,
        assessed_domains=assessed_domains,
        brief=brief,
        brief_responses=brief_responses,
        brief_of_current_user=brief_of_current_user,
        content=brief_content,
        domain_id=domain_id,
        is_restricted_brief=is_restricted_brief,
        profile_application_status=profile_application_status,
        profile_url=profile_url,
        show_pdf_link=brief['status'] in ['live', 'closed'],
        unassessed_domains=unassessed_domains,
        supplier_assessments=supplier_assessments,
        supplier_framework=supplier_framework)