#!/usr/bin/python # -*- coding: UTF-8 -*- import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "programs" #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online(credentials=credentials, resource_type=PARENT_RESOURCE, fields="id,name", param_filter="filter=programStages:empty") for program in metadata_resources[PARENT_RESOURCE]: url_api = utils.get_url_api(server_url, PARENT_RESOURCE, program["id"]) url_ui = utils.get_url_maintenance(server_url, PARENT_RESOURCE, program["id"]) message = f"The program '{program['name']}' ({program['id']}) has NOT stages. See {url_ui} or {url_api}" logger.error(message)
import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ # DE-MQ-2: The name/shortName/formName SHOULD not contains "Number of" or "number of" PARENT_RESOURCE = "dataElements" for n in ["name", "shortName"]: #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PARENT_RESOURCE, fields="id," + n, param_filter="filter=" + n + ":ilike:number of") for de in metadata_resources[PARENT_RESOURCE]: metadata_url = server_url + PARENT_RESOURCE + "/" + de["id"] message = f"DataElement contains the words 'number of' ({de['id']}) {n}='{de[n]}'" logger.error(message)
import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PROGRAM_STAGES = "programStages" metadata_resources = utils.get_resources_from_online(credentials=credentials, resource_type=PROGRAM_STAGES, fields="name,id,program[id,name],programStageDataElements[dataElement],programStageSections[dataElements]", param_filter="filter=formType:eq:SECTION&filter=program:!null") programs_data = {} for programStage in metadata_resources[PROGRAM_STAGES]: program_uid = programStage["program"]["id"] program_name = programStage["program"]["name"] programStage_uid = programStage["id"] programStage_name = programStage["name"] programStageDataElements = [x["dataElement"]["id"] for x in programStage["programStageDataElements"]] programStageSectionsDE = list() for pss in programStage["programStageSections"]: programStageSectionsDE = programStageSectionsDE + [x["id"] for x in pss["dataElements"]] a = set(programStageDataElements) b = set(programStageSectionsDE)
credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "dataElements" #retrieve all metadata_resources fields = "id,name,optionSetValue,valueType,optionSet[id,name,valueType,options[code]]" metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PARENT_RESOURCE, fields=fields, param_filter="filter=optionSetValue:eq:true") for dataElement in metadata_resources[PARENT_RESOURCE]: metadata_url = server_url + PARENT_RESOURCE + "/" + dataElement[ "id"] + "?fields=" + fields de_valuetype = dataElement["valueType"] optionSet = dataElement["optionSet"] if de_valuetype != dataElement["optionSet"]["valueType"]: message = f"The dataElement '{dataElement['name']}' ({dataElement['id']}) value type ({dataElement['valueType']}) is different than the value type ({optionSet['valueType']}) of the optionSet '{optionSet['name']}' ({optionSet['id']}). See {metadata_url}" logger.warn(message) for option in dataElement["optionSet"]["options"]:
import os import re if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ #retrieve all metadata_resources program_rules = utils.get_resources_from_online( credentials=credentials, resource_type="programRules", fields="id,name,program[id,name],condition") prv_not_boolean = utils.get_resources_from_online( credentials=credentials, resource_type="programRuleVariables", fields= "name,id,programRuleVariableSourceType,program,dataElement[valueType],trackedEntityAttribute[valueType]", param_filter= "filter=dataElement.valueType:!in:[TRUE_ONLY,BOOLEAN]&filter=trackedEntityAttribute.valueType:!in:[TRUE_ONLY,BOOLEAN]&filter=programRuleVariableSourceType:neq:CALCULATED_VALUE" ) prv_not_boolean = prv_not_boolean["programRuleVariables"] #print(f"Number of program rules {len(program_rules['programRules'])}") for pr in program_rules["programRules"]: if "condition" not in pr:
import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) ############################################################################ PROGRAMS = "programs" metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PROGRAMS, fields= "name,id,programStages[programStageDataElements[dataElement[id,name]]]", param_filter=None) programs_data = {} for program in metadata_resources[PROGRAMS]: programs_data[program["id"]] = { "name": program["name"], "dataElements": [] } for ps in program["programStages"]: for psde in ps["programStageDataElements"]: programs_data[program["id"]]["dataElements"].append( psde["dataElement"]["id"]) PROGRAM_RULES = "programRules"
if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "optionSets" #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PARENT_RESOURCE, fields="id,name,options[sortOrder]") for optionSet in metadata_resources[PARENT_RESOURCE]: size = len(optionSet["options"]) sortOrders = [x["sortOrder"] for x in optionSet["options"]] sortOrders = sorted(sortOrders) metadata_url = server_url + PARENT_RESOURCE + "/" + optionSet[ "id"] + "?fields=*,options[*]" #check condition #check if each optionSet has at least 2 options if (size <= 1): message = "The optionSet '" + str(optionSet["name"]) + "' (" + str( optionSet["id"] ) + ") has one or less options. See " + metadata_url
if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "programRules" #retrieve all metadata_resources program_rules_without_condition = utils.get_resources_from_online(credentials=credentials, resource_type=PARENT_RESOURCE, fields="id,name,program[name],programRuleActions[id,programRuleActionType,content,data,dataElement[valueType],trackedEntityAttribute[valueType]]", param_filter="filter=programRuleActions.programRuleActionType:in:[ASSIGN,DISPLAYTEXT,DISPLAYKEYVALUEPAIR,SHOWWARNING,SHOWERROR,WARNINGONCOMPLETE,ERRORONCOMPLETE]&filter=programRuleActions.data:!null") for resource in program_rules_without_condition[PARENT_RESOURCE]: metadata_url = server_url+PARENT_RESOURCE+"/"+resource["id"] for pra in resource["programRuleActions"]: if ("data" in pra) and ("true" not in pra["data"] and "false" not in pra["data"] and "{" not in pra["data"] and "d2" not in pra["data"]) and (pra["data"][0] != "'" or pra["data"][-1] != "'" or pra["data"].count("'") != 2): if (pra["programRuleActionType"] in ["DISPLAYTEXT", "DISPLAYKEYVALUEPAIR", "SHOWWARNING", "SHOWERROR", "WARNINGONCOMPLETE", "ERRORONCOMPLETE"]) : message = f"PRA-MQ-2 - Missing '' in assignment text of a Program Rule Action. The Program Rule '{resource['name']}' ({resource['id']}) from Program '{resource['program']['name']}'. PRA uid='{pra['id']}' actionType={pra['programRuleActionType']} data={pra['data']}" logger.error(message) elif pra["programRuleActionType"] in ["ASSIGN"]: if "dataElement" in pra: if pra['dataElement']['valueType'] in ["TEXT", "LONG_TEXT"]: message = f"PRA-MQ-2 - Missing '' in assignment text of a Program Rule Action. The Program Rule '{resource['name']}' ({resource['id']}) from Program '{resource['program']['name']}'. PRA uid='{pra['id']}' actionType={pra['programRuleActionType']} dataElement.valueType={pra['dataElement']['valueType']} data={pra['data']}" logger.error(message) elif "trackedEntityAttribute" in pra:
credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "organisationUnits" OPENING_DATE = "openingDate" CLOSED_DATE = "closedDate" #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PARENT_RESOURCE, fields="id,name,openingDate,closedDate", param_filter="filter=closedDate:!null") #check condition #check if each organization unit has coherent dates for orgUnit in metadata_resources[PARENT_RESOURCE]: closedDate = datetime.strptime(orgUnit[CLOSED_DATE], "%Y-%m-%dT%H:%M:%S.%f") openingDate = datetime.strptime(orgUnit[OPENING_DATE], "%Y-%m-%dT%H:%M:%S.%f") metadata_url = server_url + PARENT_RESOURCE + "/" + orgUnit["id"] if closedDate > datetime.now(): logger.error( "The organisationUnit '" + str(orgUnit["name"]) + "' (" +
#!/usr/bin/python # -*- coding: UTF-8 -*- import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ resource_types = ["reportTables", "eventReports", "eventCharts", "dashboards", "maps", "visualizations"] #visualizations in > 2.33 for resource_type in resource_types: #retrieve all metadata_resources response = utils.get_resources_from_online(credentials=credentials, resource_type=resource_type, fields='id,name', param_filter=None) for resource in response[resource_type]: metadata_url = server_url + resource_type + "/" + resource["id"] r = utils.check_OK(credentials, metadata_url) if not r["valid"]: message = f"The {resource_type} '{resource['name']}' ({resource['id']}) returns {r['response'].json()}. See {metadata_url}" logger.error(message)
if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ RESOURCE_TYPE = "programRuleVariables" #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields="id,name", param_filter=None) for resource in metadata_resources[RESOURCE_TYPE]: forbidden = ["and", "or", "not"] # (dhis version >= 2.34) #update for inicio de linea y fin de linea if any([" "+substring+" " in resource["name"] for substring in forbidden]) or \ any([resource["name"].startswith(substring+" ") for substring in forbidden]) or \ any([resource["name"].endswith(" "+substring) for substring in forbidden]): metadata_url = server_url + RESOURCE_TYPE + "/" + resource["id"] message = "The PRV '" + str(resource["name"]) + "' (" + str( resource["id"] ) + ") contains 'and/or/not'. See " + metadata_url
"indicatorGroupSets": "indicatorGroups", "organisationUnitGroupSets": "organisationUnitGroups", "optionSets": "options", "legendSets": "legends", "dataElementGroupSets": "dataElementGroups", "categoryOptionGroupSets": "categoryOptionGroups", "dataSets": "dataSetElements", # "colorSets": "colors", "optionGroupSets": "optionGroups" } for k,v in groups.items(): #retrieve all metadata_resources response = utils.get_resources_from_online(credentials=credentials, resource_type=k, fields="id,name,"+v+"::size", param_filter=None) for group in response[k]: #check condition if (group[v] <= 1): metadata_url = server_url+k+"/"+group["id"] message = "The "+ k +" '"+ str(group["name"]) + "' (" + str(group["id"]) + ") has not the expected number of "+v + " (size obtained="+str(group[v])+"). See "+metadata_url logger.error(message) expected_one = { "dataElements" : "dataSetElements", } for k,v in expected_one.items(): #retrieve all metadata_resources
import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) ############################################################################ PROGRAMS = "programs" metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PROGRAMS, fields= "name,id,programTrackedEntityAttributes[trackedEntityAttribute[id,name]],trackedEntityType[id,name,trackedEntityTypeAttributes[trackedEntityAttribute[id,name]]]", param_filter=None) programs_data = {} for program in metadata_resources[PROGRAMS]: program_uid = program["id"] programs_data[program_uid] = {"name": program["name"], "teas": []} teas = program["programTrackedEntityAttributes"] if "trackedEntityType" in program: teas = teas + program["trackedEntityType"][ "trackedEntityTypeAttributes"] for tea in teas: programs_data[program_uid]["teas"].append( tea["trackedEntityAttribute"]["id"])
if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ # Program Rule expression (condition) RESOURCE_TYPE = "programRules" metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields="id,name", param_filter="filter=condition:like:program_stage_name") for resource in metadata_resources[RESOURCE_TYPE]: url_ui = utils.get_url_maintenance(server_url, RESOURCE_TYPE, resource['id']) message = f"The PR '{resource['name']}' ({resource['id']}) contains 'program_stage_name' in the filter. See {url_ui}" logger.error(message) ############################################################################ # Program Rule Action expression RESOURCE_TYPE = "programRuleActions" metadata_resources = utils.get_resources_from_online(
def main(): credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ################################################################################ # since 2.29 RESOURCE_TYPE = "indicators" logger.info(f"Processing resource type: {RESOURCE_TYPE}") try: response = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields='id,name,numerator,denominator', param_filter=None) except Exception as e: logger.error(f"Error while processing resource type: {RESOURCE_TYPE}") logger.error(e) response[RESOURCE_TYPE] = {} for resource in response[RESOURCE_TYPE]: logger.debug(f"Check I={resource['id']}") url_ui = utils.get_url_maintenance(server_url, RESOURCE_TYPE, resource['id']) EXPRESSION_NAME = "numerator" validation_numerator = utils.validate_expression( credentials, RESOURCE_TYPE, "expression", expression=resource[EXPRESSION_NAME]) if validation_numerator: logger.error( f"Expression problem. Double check the numerator of the I '{resource['name']}' ({resource['id']}). Response {validation_numerator.json()}. See {url_ui}" ) EXPRESSION_NAME = "denominator" validation_denominator = utils.validate_expression( credentials, RESOURCE_TYPE, "expression", expression=resource[EXPRESSION_NAME]) if validation_denominator: logger.error( f"Expression problem. Double check the denominator of the I '{resource['name']}' ({resource['id']}). Response {validation_denominator.json()}. See {url_ui}" ) ################################################################################ # since 2.29 RESOURCE_TYPE = "programIndicators" logger.info(f"Processing resource type: {RESOURCE_TYPE}") try: response = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields='id,name,expression,filter,program[id,name]', param_filter=None) except Exception as e: logger.error(f"Error while processing resource type: {RESOURCE_TYPE}") logger.error(e) response[RESOURCE_TYPE] = {} for resource in response[RESOURCE_TYPE]: logger.debug(f"Check PI={resource['id']}") EXPRESSION_NAME = "expression" if EXPRESSION_NAME in resource: validation_expression = utils.validate_expression( credentials, RESOURCE_TYPE, EXPRESSION_NAME, expression=resource[EXPRESSION_NAME]) if validation_expression: logger.error( f"Expression problem. Double check the expression of the PI '{resource['name']}' ({resource['id']}) from Program '{resource['program']['name']}' ({resource['program']['id']}). Response {validation_expression.json()}" ) else: logger.error( f"PI '{resource['name']}' ({resource['id']}) from Program '{resource['program']['name']}' ({resource['program']['id']}) without expression" ) EXPRESSION_NAME = "filter" if EXPRESSION_NAME in resource: validation_filter = utils.validate_expression( credentials, RESOURCE_TYPE, EXPRESSION_NAME, expression=resource[EXPRESSION_NAME]) if validation_filter: logger.error( f"Expression problem. Double check the filter of the PI '{resource['name']}' ({resource['id']}) from Program '{resource['program']['name']}' ({resource['program']['id']}). Response {validation_filter.json()}" ) ################################################################################ # since 2.35 dhis2_version = utils.get_dhis2_version(credentials) dhis2_version_detail = int(dhis2_version.split(".")[1]) if dhis2_version_detail >= 35: RESOURCE_TYPE = "programRules" EXPRESSION_NAME = "condition" logger.info(f"Processing resource type: {RESOURCE_TYPE}") try: response = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields='id,name,program[id,name],condition,data', param_filter=None) except Exception as e: logger.error( f"Error while processing resource type: {RESOURCE_TYPE}") logger.error(e) response[RESOURCE_TYPE] = {} for resource in response[RESOURCE_TYPE]: logger.debug(f"Check PR={resource['id']}") validation_condition = utils.validate_pr_expression( credentials, RESOURCE_TYPE, EXPRESSION_NAME, program_id=resource['program']['id'], expression=resource[EXPRESSION_NAME]) if validation_condition: logger.error( f"Expression problem. Double check the {EXPRESSION_NAME} of the PR '{resource['name']}' ({resource['id']}) from Program '{resource['program']['name']}' ({resource['program']['id']}). Response {validation_condition.json()}" ) else: logger.info( f"Skip Program Rules validation because the dhis2 version instance is lower than 2.35 ({dhis2_version})" ) # since 2.37 if dhis2_version_detail >= 37: RESOURCE_TYPE = "programRuleActions" EXPRESSION_NAME = "data" logger.info(f"Processing resource type: {RESOURCE_TYPE}") try: response = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields='id,name,programRule[id,name,program[id,name]],data', param_filter=None) except Exception as e: logger.error( f"Error while processing resource type: {RESOURCE_TYPE}") logger.error(e) response[RESOURCE_TYPE] = {} for resource in response[RESOURCE_TYPE]: logger.debug(f"Check PRA={resource['id']}") if EXPRESSION_NAME in resource: validation_rule_action = utils.validate_pra_expression( credentials, RESOURCE_TYPE, EXPRESSION_NAME, program_id=resource['programRule']['program']['id'], expression=resource[EXPRESSION_NAME]) if validation_rule_action is not None: logger.error( f"Expression problem. Double check the PRA ({resource['id']}) of PR '{resource['programRule']['name']}' ({resource['programRule']['id']}) from Program '{resource['programRule']['program']['name']}' ({resource['programRule']['program']['id']}). Response {validation_rule_action.json()}" ) else: logger.info( f"Skip Program Rules Actions validation because the dhis2 version instance is lower than 2.37 ({dhis2_version})" ) ################################################################################ # since 2.29 RESOURCE_TYPE = "predictors" EXPRESSION_NAME = "expression" # from generator logger.info(f"Processing resource type: {RESOURCE_TYPE}") try: response = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields='id,name,generator[expression],sampleSkipTest[expression]', param_filter=None) except Exception as e: logger.error(f"Error while processing resource type: {RESOURCE_TYPE}") logger.error(e) response[RESOURCE_TYPE] = {} for resource in response[RESOURCE_TYPE]: logger.debug(f"Check PREDICTOR={resource['id']}") validation_expression_generator = utils.validate_expression( credentials, RESOURCE_TYPE, "expression", expression=resource["generator"][EXPRESSION_NAME]) if validation_expression_generator: logger.error( f"Expression problem. Double check the generator {EXPRESSION_NAME} of the Predictor '{resource['name']}' ({resource['id']}). Response {validation_expression_generator.json()}" ) if "sampleSkipTest" in resource: validation_expression_sampleSkipTest = utils.validate_expression( credentials, RESOURCE_TYPE, "expression", expression=resource["sampleSkipTest"][EXPRESSION_NAME]) if validation_expression_sampleSkipTest: logger.error( f"Expression problem. Double check the sampleSkipTest {EXPRESSION_NAME} of the Predictor '{resource['name']}' ({resource['id']}). Response {validation_expression_sampleSkipTest.json()}" ) ################################################################################ # since 2.29 RESOURCE_TYPE = "validationRules" logger.info(f"Processing resource type: {RESOURCE_TYPE}") try: response = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields='id,name,leftSide[expression],rightSide[expression]', param_filter=None) except Exception as e: logger.error(f"Error while processing resource type: {RESOURCE_TYPE}") logger.error(e) response[RESOURCE_TYPE] = {} for resource in response[RESOURCE_TYPE]: logger.debug(f"Check VR={resource['id']}") EXPRESSION_NAME = "leftSide" if EXPRESSION_NAME in resource: validation_expression = utils.validate_expression( credentials, RESOURCE_TYPE, "expression", expression=resource[EXPRESSION_NAME]['expression']) if validation_expression: logger.error( f"Expression problem. Double check the leftSide expression of the VR '{resource['name']}' ({resource['id']}). Response {validation_expression.json()}" ) else: logger.error( f"VR '{resource['name']}' ({resource['id']}) without leftSide expression" ) EXPRESSION_NAME = "rightSide" if EXPRESSION_NAME in resource: validation_filter = utils.validate_expression( credentials, RESOURCE_TYPE, "expression", expression=resource[EXPRESSION_NAME]['expression']) if validation_filter: logger.error( f"Expression problem. Double check the rightSide expression of the VR '{resource['name']}' ({resource['id']}). Response {validation_expression.json()}" ) else: logger.error( f"VR '{resource['name']}' ({resource['id']}) without rightSide expression" )
if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "optionSets" #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PARENT_RESOURCE, fields="id,name,options[name,code]", param_filter=None) for optionSet in metadata_resources[PARENT_RESOURCE]: metadata_url = server_url + PARENT_RESOURCE + "/" + optionSet[ "id"] + "?fields=*,options[*]" #check condition # all option's names that belong to a optionSet MUST be unique names = [o["name"] for o in optionSet["options"]] if len(names) != len(set(names)): d = Counter(names) res = ["'" + k + "'" for k, v in d.items() if v > 1] message = f"There are options in the optionSet '{optionSet['name']}' ({optionSet['id']}) with the same name. The duplicated names are ({', '.join(res)}). See {metadata_url}" logger.error(message)
credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "programs" CHILD_RESOURCE = "trackedEntityType" # Watch out singular and plural. #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PARENT_RESOURCE, fields="id,name,trackedEntityType", param_filter="filter=programType:eq:WITHOUT_REGISTRATION") #check condition #check if a program without registration (Event program) is associated (unexpectedly) to a Tracked Entity Type for program in metadata_resources[PARENT_RESOURCE]: if CHILD_RESOURCE in program: metadata_url = server_url + PARENT_RESOURCE + "/" + program["id"] message = "The event (without registration) program " + str( program["name"] ) + "' (" + str( program["id"] ) + ") is associated to a Tracked Entity Type. See " + metadata_url logger.error(message)
if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ OUG_SET = "organisationUnitGroupSets" OU_GROUP = "organisationUnitGroups" OU = "organisationUnits" #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online(credentials=credentials, resource_type=OUG_SET, fields="id,name,organisationUnitGroups[*]") for oug_set in metadata_resources[OUG_SET]: logger.debug(f"Procession OUG SET '{oug_set['name']}' ({oug_set['id']})") names = {} ous_in_oug_set = [] ous_by_oug = {} if not oug_set[OU_GROUP]: #if empty continue for ougroup in oug_set[OU_GROUP]: org_group = utils.get_resource_from_online(credentials=credentials, resource_type=OU_GROUP, resource_uid=ougroup["id"], fields="id,name,organisationUnits[id,name]") names[org_group["id"]] = org_group["name"] org_units_in_this_ougroup = [ou["id"] for ou in org_group[OU]]
import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) ############################################################################ PROGRAMS = "programs" metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PROGRAMS, fields= "name,id,programStages[programStageDataElements[dataElement[id,name]]]", param_filter=None) programs_data = {} for program in metadata_resources[PROGRAMS]: programs_data[program["id"]] = { "name": program["name"], "dataElements": [] } for ps in program["programStages"]: for psde in ps["programStageDataElements"]: programs_data[program["id"]]["dataElements"].append( psde["dataElement"]["id"]) PROGRAM_RULE_VBLES = "programRuleVariables"
def is_valid_code(code): return PATTERN_CODE.search(code) if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) ############################################################################ server_url = credentials["server"] RESOURCE_TYPE = "options" #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=RESOURCE_TYPE, fields="id,name,code") for resource in metadata_resources[RESOURCE_TYPE]: if not is_valid_code(resource["code"]): metadata_url = server_url + RESOURCE_TYPE + "/" + resource["id"] message = f"The option code='{resource['code']}' (name='{resource['name']}' uid={resource['id']}) has an invalid code. See {metadata_url}" logger.error(message) else: pass #logging.debug(resource["code"])
if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCES = ["eventReports", "eventCharts"] for PARENT_RESOURCE in PARENT_RESOURCES: #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online( credentials=credentials, resource_type=PARENT_RESOURCE) logger.info( f'Retrieved {len(metadata_resources[PARENT_RESOURCE])} {PARENT_RESOURCE}' ) for eventReportChart in metadata_resources[PARENT_RESOURCE]: flag = False issues = [] metadata_url = server_url + PARENT_RESOURCE + "/" + eventReportChart[ "id"] + "?fields=*,options[*]" if (len(eventReportChart["dataElementDimensions"]) > 0): for dataElementDimension in eventReportChart[ "dataElementDimensions"]: if "filter" in dataElementDimension: filter_dhis2 = dataElementDimension["filter"]
# -*- coding: UTF-8 -*- import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "options" CHILD_RESOURCE = "optionSet" # Watch out singular and plural. #retrieve all metadata_resources metadata_resources = utils.get_resources_from_online(credentials=credentials, resource_type=PARENT_RESOURCE, fields="id,name", param_filter="filter="+CHILD_RESOURCE+":null") #check condition #check if all options are associated to an optionSet for resource in metadata_resources[PARENT_RESOURCE]: if (not CHILD_RESOURCE in resource): metadata_url = server_url+PARENT_RESOURCE+"/"+resource["id"] message = "The option '"+ str(resource["name"]) + "' (" + str(resource["id"]) + ") is NOT associated to an optionSet. See "+metadata_url logger.error(message)
# -*- coding: UTF-8 -*- import utils import os if __name__ == "__main__": credentials = utils.get_credentials() check_name = os.path.basename(__file__).replace(".py", "") logger = utils.get_logger(credentials, check_name) server_url = credentials["server"] ############################################################################ PARENT_RESOURCE = "programRules" #retrieve all metadata_resources program_rules_without_condition = utils.get_resources_from_online( credentials=credentials, resource_type=PARENT_RESOURCE, fields="id,name,program[name],condition", param_filter="filter=condition:null") #check condition #check if all programStageSections are associated to a programStage for resource in program_rules_without_condition[PARENT_RESOURCE]: metadata_url = server_url + PARENT_RESOURCE + "/" + resource["id"] message = f"The Program Rule '{resource['name']}' ({resource['id']}) from Program '{resource['program']['name']}' has not condition. See {metadata_url}" logger.error(message)