def test_attributes_are_correctly_set(self): service = Service( self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) self.assertEquals(service.attributes[0]['name'], 'Support') self.assertEquals(len(service.attributes), 30) self.assertEquals(len(list(service.attributes[0]['rows'])), 5)
def test_the_support_attribute_group_is_not_there_if_no_attributes(self): del self.fixture['openStandardsSupported'] service = Service( self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) for group in service.attributes: if group['name'] == 'Open standards': self.fail("Support group should not be found")
def test_only_attributes_with_a_valid_type_are_added_to_groups(self): invalidValue = (u'Manuals provided', u'CMS training') self.fixture['onboardingGuidance'] = invalidValue service = Service(self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) for group in service.attributes: if ( (group['name'] == 'External interface protection') and ('onboardingGuidance' in group) ): self.fail("Attribute with tuple value should not be in group")
def test_only_attributes_with_a_valid_type_are_added_to_groups(self): invalidValue = ('Manuals provided', 'CMS training') self.fixture['onboardingGuidance'] = invalidValue service = Service(self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) for group in service.attributes: if ( (group['name'] == 'External interface protection') and ('onboardingGuidance' in group) ): self.fail("Attribute with tuple value should not be in group")
def test_attributes_with_assurance_for_a_list_value_has_a_caveat(self): service = Service(self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) for group in service.attributes: if group['name'] == 'Asset protection and resilience': for row in group['rows']: # list with bespoke assurance caveat if row.label == 'Data management location': self.assertIn( u'independent validation of assertion', row.assurance )
def test_attributes_with_assurance_for_a_list_value_has_a_caveat(self): service = Service(self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) for group in service.attributes: if group['name'] == 'Asset protection and resilience': for row in group['rows']: # list with bespoke assurance caveat if row.label == 'Data management location': self.assertIn( 'independent validation of assertion', row.assurance )
def get_service_by_id(service_id): try: service = data_api_client.get_service(service_id) if service is None: abort(404, "Service ID '{}' can not be found".format(service_id)) if service['services']['frameworkStatus'] not in ("live", "expired"): abort(404, "Service ID '{}' can not be found".format(service_id)) service_data = service['services'] service_view_data = Service( service_data, content_loader.get_builder('g-cloud-6', 'display_service').filter(service_data)) try: # get supplier data and add contact info to service object supplier = data_api_client.get_supplier( service_data['supplierCode']) supplier_data = supplier['suppliers'] service_view_data.meta.set_contact_attribute( supplier_data['contactInformation'][0].get('contactName'), supplier_data['contactInformation'][0].get('phoneNumber'), supplier_data['contactInformation'][0].get('email')) except HTTPError as e: abort(e.status_code) date_formatter = DateFormatter(current_app.config['DM_TIMEZONE']) service_unavailability_information = None status_code = 200 if service['serviceMadeUnavailableAuditEvent'] is not None: service_unavailability_information = { 'date': date_formatter.dateformat( service['serviceMadeUnavailableAuditEvent']['createdAt']), 'type': service['serviceMadeUnavailableAuditEvent']['type'] } # mark the resource as unavailable in the headers status_code = 410 return render_template('service.html', service=service_view_data, service_unavailability_information= service_unavailability_information, lot=service_view_data.lot.lower(), lot_label=get_label_for_lot_param( service_view_data.lot.lower())), status_code except AuthException: abort(500, "Application error") except KeyError: abort(404, "Service ID '%s' can not be found" % service_id) except HTTPError as e: abort(e.status_code)
def get_service_by_id(service_id): try: service = data_api_client.get_service(service_id) if service is None: abort(404, "Service ID '{}' can not be found".format(service_id)) if service['services']['frameworkStatus'] not in ("live", "expired"): abort(404, "Service ID '{}' can not be found".format(service_id)) service_data = service['services'] service_view_data = Service( service_data, content_loader.get_builder('inoket-1', 'display_service').filter( service_data ) ) try: # get supplier data and add contact info to service object supplier = data_api_client.get_supplier( service_data['supplierId'] ) supplier_data = supplier['suppliers'] service_view_data.meta.set_contact_attribute( supplier_data['contactInformation'][0].get('contactName'), supplier_data['contactInformation'][0].get('phoneNumber'), supplier_data['contactInformation'][0].get('email') ) except HTTPError as e: abort(e.status_code) service_unavailability_information = None status_code = 200 if service['serviceMadeUnavailableAuditEvent'] is not None: service_unavailability_information = { 'date': dateformat(service['serviceMadeUnavailableAuditEvent']['createdAt']), 'type': service['serviceMadeUnavailableAuditEvent']['type'] } # mark the resource as unavailable in the headers status_code = 410 return render_template( 'service.html', service=service_view_data, service_unavailability_information=service_unavailability_information, lot=service_view_data.lot.lower(), lot_label=get_label_for_lot_param(service_view_data.lot.lower()), service_id=service_id), status_code except AuthException: abort(500, "Application error") except KeyError: abort(404, "Service ID '%s' can not be found" % service_id) except HTTPError as e: abort(e.status_code)
def test_attributes_with_assurance_in_the_fields_add_it_correctly(self): service = Service( self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) for group in service.attributes: if group['name'] == 'Data-in-transit protection': for row in group['rows']: # string with bespoke assurance caveat if row.label == 'Data protection between services': self.assertEqual(row.value, [u'No encryption']) self.assertEqual( row.assurance, u'independent validation of assertion') # string with standard assurance caveat if row.label == 'Data protection within service': self.assertEqual(row.value, [u'No encryption'])
def test_attributes_are_correctly_set(self): service = Service( self.fixture, content_loader.get_builder('g-cloud-6', 'display_service') ) self.assertEquals( service.attributes[0]['name'], 'Support' ) self.assertEquals( len(service.attributes), 30 ) self.assertEquals( len(list(service.attributes[0]['rows'])), 5 )
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']: abort(404, "Opportunity '{}' can not be found".format(brief_id)) brief['clarificationQuestions'] = [ dict(question, number=index+1) for index, question in enumerate(brief['clarificationQuestions']) ] brief_content = content_loader.get_builder('digital-outcomes-and-specialists', 'display_brief').filter( brief ) return render_template( 'brief.html', brief=brief, content=brief_content )
def test_attributes_with_assurance_in_the_fields_add_it_correctly(self): service = Service(self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) for group in service.attributes: if group['name'] == 'Data-in-transit protection': for row in group['rows']: # string with bespoke assurance caveat if row.label == 'Data protection between services': self.assertEqual( row.value, [u'No encryption'] ) self.assertEqual( row.assurance, u'independent validation of assertion' ) # string with standard assurance caveat if row.label == 'Data protection within service': self.assertEqual( row.value, [u'No encryption'] )
def search(): content_builder = content_loader.get_builder('inoket-1', 'search_filters') filters = filters_for_lot( get_lot_from_request(request), content_builder ) response = search_api_client.search_services( index='inoket-1', **build_search_query(request, filters, content_builder) ) search_results_obj = SearchResults(response) pagination_config = pagination( search_results_obj.total, current_app.config["DM_SEARCH_PAGE_SIZE"], get_page_from_request(request) ) search_summary = SearchSummary( response['meta']['total'], clean_request_args(request.args, filters), filters ) set_filter_states(filters, request) current_lot = get_lot_from_request(request) services_to_return = search_results_obj.search_results postcode = request.args.get('by_distance') if postcode: #Â FIXME # Here we're using the data_api_client to avoid forking the dmapiclient library and creating a new one just for local search. response = data_api_client._post("{}/order-by-distance".format(current_app.config['DM_GEO_API_URL']), { 'from_location': postcode, 'services': [s['id'] for s in search_results_obj.search_results] }) locations = response['locations'] for l in locations: matching_services = [x for x in search_results_obj.search_results if x['id'] == l['service_id']] if len(matching_services) > 0: l['distance'] = round(l['distance'], 2) l.update(matching_services[0]) else: del l services_to_return = locations return render_template( 'search.html', current_lot=current_lot, current_lot_label=get_label_for_lot_param(current_lot) if current_lot else None, filters=filters, lots=LOTS, pagination=pagination_config, search_keywords=get_keywords_from_request(request), search_query=query_args_for_pagination(request.args), services=services_to_return, summary=search_summary.markup(), title='Search results', total=search_results_obj.total )
def test_Service_works_if_serviceBenefits_is_not_set(self): del self.fixture['serviceBenefits'] self.service = Service(self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) self.assertFalse(hasattr(self.service, 'benefits'))
def setUp(self): self.fixture = _get_fixture_data() self.fixture = self.fixture['services'] self.service = Service( self.fixture, content_loader.get_builder('g-cloud-6', 'display_service') )
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)
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' )
import json import unittest from flask import Markup from mock import Mock from werkzeug.datastructures import MultiDict from app.presenters.search_presenters import filters_for_lot from app.presenters.search_results import SearchResults from app.presenters.search_summary import SearchSummary, \ SummaryRules, SummaryFragment from app import content_loader filter_groups = filters_for_lot( "saas", content_loader.get_builder('g-cloud-6', 'search_filters') ) def _get_fixture_data(): test_root = os.path.abspath( os.path.join(os.path.dirname(__file__), "..") ) fixture_path = os.path.join( test_root, 'fixtures', 'search_results_fixture.json' ) with open(fixture_path) as fixture_file: return json.load(fixture_file) def _get_fixture_multiple_pages_data():
import os import json import unittest from flask import Markup from mock import Mock from werkzeug.datastructures import MultiDict from app.presenters.search_presenters import filters_for_lot from app.presenters.search_results import SearchResults from app.presenters.search_summary import SearchSummary, \ SummaryRules, SummaryFragment from app import content_loader filter_groups = filters_for_lot( "saas", content_loader.get_builder('g-cloud-6', 'search_filters')) def _get_fixture_data(): test_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) fixture_path = os.path.join(test_root, 'fixtures', 'search_results_fixture.json') with open(fixture_path) as fixture_file: return json.load(fixture_file) def _get_fixture_multiple_pages_data(): test_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) fixture_path = os.path.join(test_root, 'fixtures', 'search_results_multiple_pages_fixture.json') with open(fixture_path) as fixture_file: return json.load(fixture_file)
def test_the_support_attribute_group_is_not_there_if_no_attributes(self): del self.fixture['openStandardsSupported'] service = Service(self.fixture, content_loader.get_builder('g-cloud-6', 'display_service')) for group in service.attributes: if group['name'] == 'Open standards': self.fail("Support group should not be found")