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
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' )
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, )
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)