def test_get_accessible_agencies(database): """ Test listing all the agencies (CGAC and FREC) that are accessible based on permissions given """ cgacs = [CGACFactory(cgac_code=str(i), agency_name="Test Agency " + str(i)) for i in range(3)] frec_cgac = CGACFactory() frecs = [FRECFactory(frec_code=str(i), cgac=frec_cgac) for i in range(3)] cgac_sub_tiers = [SubTierAgencyFactory(sub_tier_agency_code=str(i), cgac=cgacs[i], frec=None, is_frec=False, sub_tier_agency_name="Test Subtier Agency " + str(i)) for i in range(3)] frec_sub_tiers = [SubTierAgencyFactory(sub_tier_agency_code=str(3 + i), cgac=frec_cgac, frec=frecs[i], is_frec=True, sub_tier_agency_name="Test Subtier Agency " + str(3 + i)) for i in range(3)] database.session.add_all(cgacs + [frec_cgac] + frecs + cgac_sub_tiers + frec_sub_tiers) database.session.commit() # Test one CGAC and 2 FRECs, have to decode it because we send it back as a response already results = get_accessible_agencies([cgac_sub_tiers[0]], [frec_sub_tiers[0], frec_sub_tiers[2]]) frec_code_result = {el["frec_code"] for el in results["frec_agency_list"]} frec_name_result = {el["agency_name"] for el in results["frec_agency_list"]} assert len(results["cgac_agency_list"]) == 1 assert len(results["frec_agency_list"]) == 2 assert results["cgac_agency_list"][0]["agency_name"] == cgacs[0].agency_name assert results["cgac_agency_list"][0]["cgac_code"] == cgacs[0].cgac_code assert frec_name_result == {frecs[0].agency_name, frecs[2].agency_name} assert frec_code_result == {frecs[0].frec_code, frecs[2].frec_code} # Test when there are no FRECs results = get_accessible_agencies([cgac_sub_tiers[0]], []) assert len(results["cgac_agency_list"]) == 1 assert len(results["frec_agency_list"]) == 0
def test_get_accessible_agencies(database): """ Test listing all the agencies (CGAC and FREC) that are accessible based on permissions given """ cgacs = [ CGACFactory(cgac_code=str(i), agency_name="Test Agency " + str(i)) for i in range(3) ] frec_cgac = CGACFactory() frecs = [FRECFactory(frec_code=str(i), cgac=frec_cgac) for i in range(3)] cgac_sub_tiers = [ SubTierAgencyFactory(sub_tier_agency_code=str(i), cgac=cgacs[i], frec=None, is_frec=False, sub_tier_agency_name="Test Subtier Agency " + str(i)) for i in range(3) ] frec_sub_tiers = [ SubTierAgencyFactory(sub_tier_agency_code=str(3 + i), cgac=frec_cgac, frec=frecs[i], is_frec=True, sub_tier_agency_name="Test Subtier Agency " + str(3 + i)) for i in range(3) ] database.session.add_all(cgacs + [frec_cgac] + frecs + cgac_sub_tiers + frec_sub_tiers) database.session.commit() # Test one CGAC and 2 FRECs, have to decode it because we send it back as a response already results = get_accessible_agencies([cgac_sub_tiers[0]], [frec_sub_tiers[0], frec_sub_tiers[2]]) frec_code_result = {el["frec_code"] for el in results["frec_agency_list"]} frec_name_result = { el["agency_name"] for el in results["frec_agency_list"] } assert len(results["cgac_agency_list"]) == 1 assert len(results["frec_agency_list"]) == 2 assert results["cgac_agency_list"][0]["agency_name"] == cgacs[ 0].agency_name assert results["cgac_agency_list"][0]["cgac_code"] == cgacs[0].cgac_code assert frec_name_result == {frecs[0].agency_name, frecs[2].agency_name} assert frec_code_result == {frecs[0].frec_code, frecs[2].frec_code} # Test when there are no FRECs results = get_accessible_agencies([cgac_sub_tiers[0]], []) assert len(results["cgac_agency_list"]) == 1 assert len(results["frec_agency_list"]) == 0
def list_agencies(cgac_sub_tiers, frec_sub_tiers): """ Get all agencies the current user has DABS access to. Args: cgac_sub_tiers - List of all CGAC SubTierAgencies generated by the get_dabs_sub_tier_agencies decorator, required to list only sub_tier_agencies that user has DABS permissions for frec_sub_tiers - List of all FREC SubTierAgencies generated by the get_dabs_sub_tier_agencies decorator, required to list only sub_tier_agencies that user has DABS permissions for """ return JsonResponse.create(StatusCode.OK, get_accessible_agencies(cgac_sub_tiers, frec_sub_tiers))
def test_get_accessible_agencies(database): """ Test listing all the agencies (CGAC and FREC) that are accessible based on permissions given """ # The first cgac/frec don't have sub tiers associated, they should still show up when affiliations are present cgacs = [CGACFactory(cgac_code=str(i), agency_name="Test Agency " + str(i)) for i in range(3)] frec_cgac = CGACFactory() frecs = [FRECFactory(frec_code=str(i), cgac=frec_cgac) for i in range(3)] cgac_sub_tiers = [SubTierAgencyFactory(sub_tier_agency_code=str(i), cgac=cgacs[i], frec=None, is_frec=False, sub_tier_agency_name="Test Subtier Agency C" + str(i)) for i in range(1, 3)] frec_sub_tiers = [SubTierAgencyFactory(sub_tier_agency_code=str(3 + i), cgac=frec_cgac, frec=frecs[i], is_frec=True, sub_tier_agency_name="Test Subtier Agency F" + str(i)) for i in range(1, 3)] database.session.add_all(cgacs + [frec_cgac] + frecs + cgac_sub_tiers + frec_sub_tiers) database.session.commit() user = UserFactory(affiliations=[ UserAffiliation(user_affiliation_id=1, cgac=cgacs[0], frec=None, permission_type_id=PERMISSION_TYPE_DICT['writer']), UserAffiliation(user_affiliation_id=2, cgac=None, frec=frecs[1], permission_type_id=PERMISSION_TYPE_DICT['reader']), UserAffiliation(user_affiliation_id=3, cgac=None, frec=frecs[2], permission_type_id=PERMISSION_TYPE_DICT['reader']) ]) database.session.add(user) database.session.commit() g.user = user # Test one CGAC and 2 FRECs, have to decode it because we send it back as a response already results = get_accessible_agencies() frec_code_result = {el["frec_code"] for el in results["frec_agency_list"]} frec_name_result = {el["agency_name"] for el in results["frec_agency_list"]} assert len(results["cgac_agency_list"]) == 1 assert len(results["frec_agency_list"]) == 2 assert results["cgac_agency_list"][0]["agency_name"] == cgacs[0].agency_name assert results["cgac_agency_list"][0]["cgac_code"] == cgacs[0].cgac_code assert frec_name_result == {frecs[1].agency_name, frecs[2].agency_name} assert frec_code_result == {frecs[1].frec_code, frecs[2].frec_code} # Test when user is website admin, should return everything, but only 2 frecs because only 2 of the 3 have the # frec flag user.affiliations = [] user.website_admin = True results = get_accessible_agencies() assert len(results["cgac_agency_list"]) == 3 assert len(results["frec_agency_list"]) == 2
def list_agencies(perm_level, perm_type): """ Get all agencies the current user has DABS access to. """ return JsonResponse.create( StatusCode.OK, get_accessible_agencies(perm_level, perm_type))
def historic_dabs_warning_summary(filters): """ Generate a list of submission summaries appropriate on the filters provided Args: filters: dictionary representing the filters provided to the historic dashboard endpoints Return: JsonResponse of the submission summaries appropriate on the filters provided """ sess = GlobalDB.db().session validate_historic_dashboard_filters(filters, graphs=False) summary_query = sess.query( Submission.submission_id, (Submission.reporting_fiscal_period / 3).label('quarter'), Submission.reporting_fiscal_year.label('fy'), User.name.label('certifier'), case([ (FREC.frec_code.isnot(None), FREC.frec_code), (CGAC.cgac_code.isnot(None), CGAC.cgac_code) ]).label('agency_code'), case([ (FREC.agency_name.isnot(None), FREC.agency_name), (CGAC.agency_name.isnot(None), CGAC.agency_name) ]).label('agency_name') ).join(User, User.user_id == Submission.certifying_user_id).\ outerjoin(CGAC, CGAC.cgac_code == Submission.cgac_code).\ outerjoin(FREC, FREC.frec_code == Submission.frec_code).\ filter(Submission.publish_status_id.in_([PUBLISH_STATUS_DICT['published'], PUBLISH_STATUS_DICT['updated']])).\ filter(Submission.d2_submission.is_(False)) summary_query = apply_historic_dabs_filters(sess, summary_query, filters) # ordering submissions so they all come out in the same order summary_query = summary_query.order_by(Submission.reporting_end_date) # Build list of codes user has access to, use it to fill in the blanks if no subs are found for some agencies user_agencies = get_accessible_agencies() perms = {agency['cgac_code']: agency['agency_name'] for agency in user_agencies['cgac_agency_list']} perms.update({agency['frec_code']: agency['agency_name'] for agency in user_agencies['frec_agency_list']}) perm_codes = list(perms.keys()) # Only care about the codes the user has access to and have requested if perm_codes and filters['agencies']: perm_codes = list(set(perm_codes) & set(filters['agencies'])) # Populate submission lists results = {} for query_result in summary_query.all(): result_dict = { 'submission_id': query_result.submission_id, 'fy': query_result.fy, 'quarter': query_result.quarter, 'certifier': query_result.certifier } if query_result.agency_name in results: results[query_result.agency_name].append(result_dict) else: results[query_result.agency_name] = [result_dict] # Fill in the blanks for perm in perm_codes: if perms[perm] not in results.keys(): results[perms[perm]] = [] # Convert to list for ease of use by frontend response = [{'agency_name': agency_name, 'submissions': submissions} for agency_name, submissions in results.items()] return JsonResponse.create(StatusCode.OK, response)