#!/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)
Exemple #2
0
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)
        
Exemple #4
0
    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"]:
Exemple #5
0
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:
Exemple #6
0
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"]) + "' (" +
Exemple #10
0
#!/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)
Exemple #11
0
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(
Exemple #15
0
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"
            )
Exemple #16
0
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)
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"])
    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)
Exemple #19
0
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"
Exemple #21
0

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"])
Exemple #22
0
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"]
Exemple #23
0
# -*- 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)
Exemple #24
0
# -*- 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)