Example #1
0
def check_stops(environnement, coverage):
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info("Vérification des arrets pour le coverage [{}] et sur [{}]".format(coverage, environnement))

    params = json.load(open('../params.json'))
    nav_url = params["environnements"][environnement]["url"]
    nav_key = params["environnements"][environnement]["key"]

    detail_test_result.append(["coverage", "env", "test_datetime", "object_id", "object_type", "test_category", "error", "infos", "error_level", "wkt"])

    load_naming_ref_files("../../Data_scripts/data/audit/reference")
    #on fait les appels par réseau et par ligne pour faire des appels plus petits
    nav_response_network = requests.get(nav_url + "coverage/{}/networks?count=1000".format(coverage), headers={'Authorization': nav_key})
    if nav_response_network.status_code != 200 :
        logger.error (">> l'appel navitia a renvoyé une erreur")
        return
    for a_network in nav_response_network.json()['networks'] :
        nav_response_line = requests.get(nav_url + "coverage/{}/networks/{}/lines/?count=1000".format(coverage, a_network["id"]),
            headers={'Authorization': nav_key})
        if "lines" in nav_response_line.json():
            for a_line in nav_response_line.json()["lines"]:
                check_stops_of_a_line(params, environnement, coverage, "stop_area", a_line["id"])
                check_stops_of_a_line(params, environnement, coverage, "stop_point", a_line["id"])
        else:
            detail_test_result.append([coverage, environnement, datetime.date.today().strftime('%Y%m%d'),
                a_network["id"], "network", "check_stop_point_and_stop_area_name", "network_has_no_line",
                "le réseau {} n'a pas de lignes".format(a_network["name"])
                , "red", ""])
    utils.write_errors_to_file (environnement, coverage, "check_stop_basics", detail_test_result)
    utils.generate_file_summary()
Example #2
0
def check_line_colors(environnement, coverage):
    """Lance la vérification de la présence des couleurs des lignes et du texte associé.
    Dans le cas où les deux couleurs sont présentes, le script vérifie le contraste (accessibilité RGAA).
    """
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info("On teste le coverage [{}] sur l'environnement [{}] ".format(coverage, environnement))

    params = json.load(open('../params.json'))
    assert (environnement in params['environnements']), "L'environnement demandé n'existe pas"
    navitia_url = params['environnements'][environnement]['url']
    navitia_api_key = params['environnements'][environnement]['key']


    detail_test_result =  []
    detail_test_result.append(["coverage", "env", "test_datetime", "object_id", "object_type", "test_category", "error", "infos", "error_level", "wkt"])

    appel_nav_networks = requests.get(navitia_url + "coverage/{}/networks?count=1000".format(coverage), headers={'Authorization': navitia_api_key})
    if appel_nav_networks.status_code != 200 :
        logger.error (">> l'appel navitia a renvoyé une erreur")
        return
    for a_network in appel_nav_networks.json()['networks'] :
        appel_nav = requests.get(navitia_url + "coverage/{}/networks/{}/lines?count=1000&depth=0".format(coverage, a_network['id']), headers={'Authorization': navitia_api_key})
        if appel_nav.json()['pagination']['total_result'] > 1000 :
            logger.error (">> il y a trop de lignes sur le réseau {}, elles n'ont pas toutes été testées".format(a_network['name']))
        if "lines" in appel_nav.json():
            for a_line in appel_nav.json()['lines']:
                color = a_line['color']
                text_color = a_line['text_color']
                if not color or not text_color:
                    message = "il n'y a pas de couleur ou de couleur de texte pour la ligne {} du réseau {}".format(a_line['name'], a_network['name'])
                    result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_line['id'], "line", "couleurs des lignes", "config manquante", message, "red", utils.geojson_to_wkt(a_line['geojson'])]
                    detail_test_result.append(result)
                elif not is_valid_color(color) or not is_valid_color(text_color):
                    message = "la couleur ou la couleur de texte pour la ligne {} du réseau {} est invalide".format(a_line['name'], a_network['name'])
                    result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_line['id'], "line", "couleurs des lignes", "config erronée", message, "red", utils.geojson_to_wkt(a_line['geojson'])]
                    detail_test_result.append(result)
                else :
                    contrast = abs(compute_luminosity(text_color) - compute_luminosity(color))
                    if contrast == 0 :
                        message = "la couleur et la couleur du texte sont identiques pour la ligne {} du réseau {}".format(a_line['name'], a_network['name'])
                        result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_line['id'], "line", "couleurs des lignes", "code de ligne illisible", message, "red", utils.geojson_to_wkt(a_line['geojson'])]
                        detail_test_result.append(result)
                    elif contrast <= 125 :
                        a_better_color = "blanc"
                        if compute_luminosity(color) >= 128 :
                            a_better_color = "noir"
                        message = "il n'y a pas assez de contraste entre la couleur et la couleur du texte pour la ligne {} du réseau {} : du {} serait moins pire".format(a_line['name'], a_network['name'], a_better_color)
                        result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_line['id'], "line", "couleurs des lignes", "code de ligne peu lisible", message, "orange", utils.geojson_to_wkt(a_line['geojson'])]
                        detail_test_result.append(result)

    utils.write_errors_to_file (environnement, coverage, "check_line_colors", detail_test_result)
    utils.generate_file_summary()
Example #3
0
def check_lines(environnement, coverage):
    """Lance la vérification de la présence des codes et noms des lignes et qu'ils ne sont pas identiques.
    """
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info("Vérification des lignes pour le coverage [{}] et sur l'environnement [{}]".format(coverage, environnement))

    params = json.load(open('../params.json'))
    assert (environnement in params['environnements']), "L'environnement demandé n'existe pas"
    navitia_url = params['environnements'][environnement]['url']
    navitia_api_key = params['environnements'][environnement]['key']

    #pour éviter les gros appels, on fait un appel par réseau
    nav_response_network = requests.get(navitia_url + "coverage/{}/networks?count=1000".format(coverage), headers={'Authorization': navitia_api_key})
    if nav_response_network.status_code != 200 :
        logger.error(">> l'appel navitia a renvoyé une erreur")
        return
    errors = []
    errors.append(["coverage", "env", "test_datetime", "object_id", "object_type", "test_category", "error", "infos", "error_level", "wkt"])
    for a_network in nav_response_network.json()['networks'] :
        nav_response_line = requests.get(navitia_url + "coverage/{}/networks/{}/lines/?count=1000".format(coverage, a_network["id"]),
            headers={'Authorization': navitia_api_key})
        if "lines" in nav_response_line.json():
            for a_line in nav_response_line.json()['lines']:
                if a_line["code"].strip() == "":
                    errors.append([coverage, environnement, datetime.date.today().strftime('%Y%m%d'),
                        a_line["id"], "line", "check_line_name_and_code", "no_line_code", '"' + a_line["name"].replace('"', '""')+'"', "orange",
                        utils.geojson_to_wkt(a_line['geojson'])])
                if a_line["name"].strip() == "":
                    errors.append([coverage, environnement, datetime.date.today().strftime('%Y%m%d'),
                        a_line["id"], "line", "check_line_name_and_code", "no_line_name", a_line["code"], "red",
                        utils.geojson_to_wkt(a_line['geojson'])])
                if a_line["name"].strip() and (a_line["name"].strip() == a_line["code"].strip()):
                    errors.append([coverage, environnement, datetime.date.today().strftime('%Y%m%d'),
                        a_line["id"], "line", "check_line_name_and_code", "line_code_and_name_identical", a_line["code"], "orange",
                        utils.geojson_to_wkt(a_line['geojson'])])
        else:
            errors.append([coverage, environnement, datetime.date.today().strftime('%Y%m%d'),
                a_network["id"], "network", "check_line_name_and_code", "network_has_no_line",
                "le réseau {} n'a pas de lignes".format(a_network["name"])
                , "red", ""])
    utils.write_errors_to_file (environnement, coverage, "check_line_name_and_code", errors)
    utils.generate_file_summary()
Example #4
0
def check_stops(environnement, coverage):
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info("Vérification des arrets pour le coverage [{}] et sur [{}]".format(coverage, environnement))

    params = json.load(open('../params.json'))
    nav_url = params["environnements"][environnement]["url"]
    nav_key = params["environnements"][environnement]["key"]

    detail_test_result.append(["coverage", "env", "test_datetime", "object_id", "object_type", "test_category", "error", "infos", "error_level", "wkt"])

    load_naming_ref_files("../../Data_scripts/data/audit/reference")
    #on fait les appels par réseau et par ligne pour faire des appels plus petits
    nav_response_network = requests.get(nav_url + "coverage/{}/networks?count=1000".format(coverage), headers={'Authorization': nav_key})
    if nav_response_network.status_code != 200 :
        logger.error (">> l'appel navitia a renvoyé une erreur")
        return
    for a_network in nav_response_network.json()['networks'] :
        nav_response_line = requests.get(nav_url + "coverage/{}/networks/{}/lines/?count=1000".format(coverage, a_network["id"]),
            headers={'Authorization': nav_key})
        if "lines" in nav_response_line.json():
            if nav_response_line.json()["pagination"]['total_result'] > 1000 :
                detail_test_result.append([coverage, environnement, datetime.date.today().strftime('%Y%m%d'),
                    a_network["id"], "network", "check_stop_point_and_stop_area_name", "network_has_too_many_line",
                    "le réseau {} a trop de lignes, elles n'ont pas toutes été testées".format(a_network["name"])
                    , "red", ""])
            for a_line in nav_response_line.json()["lines"]:
                check_stops_of_a_line(params, environnement, coverage, "stop_area", a_line["id"])
                check_stops_of_a_line(params, environnement, coverage, "stop_point", a_line["id"])
        else:
            detail_test_result.append([coverage, environnement, datetime.date.today().strftime('%Y%m%d'),
                a_network["id"], "network", "check_stop_point_and_stop_area_name", "network_has_no_line",
                "le réseau {} n'a pas de lignes".format(a_network["name"])
                , "red", ""])
    utils.write_errors_to_file (environnement, coverage, "check_stop_basics", detail_test_result)
    utils.generate_file_summary()
Example #5
0
def test_all_bss_for_realtime_on_stands(environnement, coverage, *insee_filter):
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info("Test du temps réel de la dispo VLS pour le coverage [{}] et sur l'environnement [{}]".format(coverage, environnement))

    params = json.load(open('../params.json'))
    assert (environnement in params['environnements']), "L'environnement demandé n'existe pas"
    navitia_url = params['environnements'][environnement]['url']
    navitia_api_key = params['environnements'][environnement]['key']

    total_nb_tests = 0
    test_result = {}
    test_result['POI hors périmètre'] = 0
    test_result['POI non paramétré'] = 0
    test_result['POI mal paramétré'] = 0
    test_result['POI paramétré mais ko'] = 0
    test_result['POI ok'] = 0
    test_result['non testé'] = 0

    detail_test_result =  []
    detail_test_result.append(["coverage", "env", "test_datetime", "object_id", "object_type", "test_category", "error", "infos", "error_level", "wkt"])

    appel_nav_url = navitia_url + "coverage/{}/poi_types/poi_type:amenity:bicycle_rental/pois?count=900".format(coverage)
    appel_nav = requests.get(appel_nav_url, headers={'Authorization': navitia_api_key})
    #TODO : gérer la pagination de manière plus fine, sur des gros coverage, on peut avoir plus de POIs

    if appel_nav.status_code != 200 :
        logger.error (">> l'appel navitia a renvoyé une erreur : " + appel_nav_url)
        return

    if appel_nav.json()['pagination']['total_result'] > 200 :
        test_result['non testé'] += appel_nav.json()['pagination']['total_result'] - 900
        message = "Il y a trop de POIs, ils n'ont pas tous été testés"
        result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), coverage, "coverage", "temps réel VLS", "évo du script à prévoir", message, "red", ""  ]
        detail_test_result.append(result)
        logger.error(message)

    pois = appel_nav.json()['pois']
    for a_poi in pois :
        if (total_nb_tests % 100) == 0:
            logger.info("Verification du VLS {} sur {}".format(str(total_nb_tests), str(len(pois))))
        total_nb_tests += 1
        if insee_filter:
            if a_poi['administrative_regions'][0]['insee'] not in insee_filter :
                test_result['POI hors périmètre'] += 1
                continue

        if len(a_poi['properties']) == 0 :
            result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_poi['id'], "poi", "temps réel VLS", "config manquante", "Pas de propriétés sur ce VLS", "orange", "POINT({} {})".format(a_poi['coord']['lon'],a_poi['coord']['lat'] )  ]
            detail_test_result.append(result)
            test_result['POI non paramétré'] += 1
        else :
            if not "operator" in a_poi['properties'] or not "network" in a_poi['properties'] or not "ref" in a_poi['properties']:
                result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_poi['id'], "poi", "temps réel VLS", "config manquante", "Il manque operator, network ou ref sur ce VLS", "orange", "POINT({} {})".format(a_poi['coord']['lon'],a_poi['coord']['lat'] )  ]
                detail_test_result.append(result)
                test_result['POI mal paramétré'] += 1
                continue
            else :
                if not "stands" in a_poi :
                    result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_poi['id'], "poi", "temps réel VLS", "temps réel ko", "la config a l'air ok, mais ça ne fonctionne pas", "red", "POINT({} {})".format(a_poi['coord']['lon'],a_poi['coord']['lat'] )  ]
                    detail_test_result.append(result)
                    test_result['POI paramétré mais ko'] += 1
                elif a_poi['stands'] is None :
                    result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_poi['id'], "poi", "temps réel VLS", "temps réel ko", "la config a l'air ok, mais le webservice tiers renvoit n'importe quoi", "red", "POINT({} {})".format(a_poi['coord']['lon'],a_poi['coord']['lat'] )  ]
                    detail_test_result.append(result)
                    test_result['POI paramétré mais ko'] += 1
                else :
                    test_result['POI ok'] += 1

    logger.info("Résultat des tests : ")
    logger.info(">> {} cas de tests".format(total_nb_tests))
    logger.info(">> {} VLS pas paramétrés du tout".format(test_result['POI non paramétré']))
    logger.info(">> {} VLS avec des paramètres manquants".format(test_result["POI mal paramétré"]))
    logger.info(">> {} VLS en erreur quoique bien paramétrés".format(test_result['POI paramétré mais ko']))
    logger.info(">> {} VLS ignorés car hors périmètre".format(test_result['POI hors périmètre']))
    logger.info(">> {} VLS qui fonctionnent".format(test_result['POI ok']))

    utils.write_errors_to_file (environnement, coverage, "check_realtime_on_bss", detail_test_result)
    utils.generate_file_summary()
Example #6
0
def test_all_bss_for_realtime_on_stands(environnement, coverage,
                                        *insee_filter):
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info(
        "Test du temps réel de la dispo VLS pour le coverage [{}] et sur l'environnement [{}]"
        .format(coverage, environnement))

    params = json.load(open('../params.json'))
    assert (
        environnement
        in params['environnements']), "L'environnement demandé n'existe pas"
    navitia_url = params['environnements'][environnement]['url']
    navitia_api_key = params['environnements'][environnement]['key']

    total_nb_tests = 0
    test_result = {}
    test_result['POI hors périmètre'] = 0
    test_result['POI non paramétré'] = 0
    test_result['POI mal paramétré'] = 0
    test_result['POI paramétré mais ko'] = 0
    test_result['POI ok'] = 0
    test_result['non testé'] = 0

    detail_test_result = []
    detail_test_result.append([
        "coverage", "env", "test_datetime", "object_id", "object_type",
        "test_category", "error", "infos", "error_level", "wkt"
    ])

    appel_nav_url = navitia_url + "coverage/{}/poi_types/poi_type:amenity:bicycle_rental/pois?count=900".format(
        coverage)
    appel_nav = requests.get(appel_nav_url,
                             headers={'Authorization': navitia_api_key})
    #TODO : gérer la pagination de manière plus fine, sur des gros coverage, on peut avoir plus de POIs

    if appel_nav.status_code != 200:
        logger.error(">> l'appel navitia a renvoyé une erreur : " +
                     appel_nav_url)
        return

    if appel_nav.json()['pagination']['total_result'] > 200:
        test_result['non testé'] += appel_nav.json(
        )['pagination']['total_result'] - 900
        message = "Il y a trop de POIs, ils n'ont pas tous été testés"
        result = [
            coverage, environnement,
            datetime.date.today().strftime('%Y%m%d'), coverage, "coverage",
            "temps réel VLS", "évo du script à prévoir", message, "red", ""
        ]
        detail_test_result.append(result)
        logger.error(message)

    pois = appel_nav.json()['pois']
    for a_poi in pois:
        if (total_nb_tests % 100) == 0:
            logger.info("Verification du VLS {} sur {}".format(
                str(total_nb_tests), str(len(pois))))
        total_nb_tests += 1
        if insee_filter:
            if a_poi['administrative_regions'][0]['insee'] not in insee_filter:
                test_result['POI hors périmètre'] += 1
                continue

        if len(a_poi['properties']) == 0:
            result = [
                coverage, environnement,
                datetime.date.today().strftime('%Y%m%d'), a_poi['id'], "poi",
                "temps réel VLS", "config manquante",
                "Pas de propriétés sur ce VLS", "orange",
                "POINT({} {})".format(a_poi['coord']['lon'],
                                      a_poi['coord']['lat'])
            ]
            detail_test_result.append(result)
            test_result['POI non paramétré'] += 1
        else:
            if not "operator" in a_poi['properties'] or not "network" in a_poi[
                    'properties'] or not "ref" in a_poi['properties']:
                result = [
                    coverage, environnement,
                    datetime.date.today().strftime('%Y%m%d'), a_poi['id'],
                    "poi", "temps réel VLS", "config manquante",
                    "Il manque operator, network ou ref sur ce VLS", "orange",
                    "POINT({} {})".format(a_poi['coord']['lon'],
                                          a_poi['coord']['lat'])
                ]
                detail_test_result.append(result)
                test_result['POI mal paramétré'] += 1
                continue
            else:
                if not "stands" in a_poi:
                    result = [
                        coverage, environnement,
                        datetime.date.today().strftime('%Y%m%d'), a_poi['id'],
                        "poi", "temps réel VLS", "temps réel ko",
                        "la config a l'air ok, mais ça ne fonctionne pas",
                        "red", "POINT({} {})".format(a_poi['coord']['lon'],
                                                     a_poi['coord']['lat'])
                    ]
                    detail_test_result.append(result)
                    test_result['POI paramétré mais ko'] += 1
                elif a_poi['stands'] is None:
                    result = [
                        coverage, environnement,
                        datetime.date.today().strftime('%Y%m%d'), a_poi['id'],
                        "poi", "temps réel VLS", "temps réel ko",
                        "la config a l'air ok, mais le webservice tiers renvoit n'importe quoi",
                        "red", "POINT({} {})".format(a_poi['coord']['lon'],
                                                     a_poi['coord']['lat'])
                    ]
                    detail_test_result.append(result)
                    test_result['POI paramétré mais ko'] += 1
                else:
                    test_result['POI ok'] += 1

    logger.info("Résultat des tests : ")
    logger.info(">> {} cas de tests".format(total_nb_tests))
    logger.info(">> {} VLS pas paramétrés du tout".format(
        test_result['POI non paramétré']))
    logger.info(">> {} VLS avec des paramètres manquants".format(
        test_result["POI mal paramétré"]))
    logger.info(">> {} VLS en erreur quoique bien paramétrés".format(
        test_result['POI paramétré mais ko']))
    logger.info(">> {} VLS ignorés car hors périmètre".format(
        test_result['POI hors périmètre']))
    logger.info(">> {} VLS qui fonctionnent".format(test_result['POI ok']))

    utils.write_errors_to_file(environnement, coverage,
                               "check_realtime_on_bss", detail_test_result)
    utils.generate_file_summary()
Example #7
0
def test_network_for_realtime_on_stop_schedule(environnement, coverage, *networks):
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info("Vérification des lignes pour le coverage [{}] et sur l'environnement [{}]".format(coverage, environnement))

    if len(networks) == 0:
        logger.error("Au moins un identifiant de réseau doit être passé en paramètre")
        exit()
    params = json.load(open('../params.json'))
    assert (environnement in params['environnements']), "L'environnement demandé n'existe pas"
    navitia_url = params['environnements'][environnement]['url']
    navitia_api_key = params['environnements'][environnement]['key']


    total_nb_tests = 0
    test_result = {}
    test_result['ligne non configurée'] = 0
    test_result['pas horaires du tout'] = 0
    test_result["pas horaires mais c'est normal"] = 0
    test_result['horaires théoriques'] = 0
    test_result['OK'] = 0
    test_result['non testé'] = 0

    detail_test_result =  []
    detail_test_result.append(["coverage", "env", "test_datetime", "object_id", "object_type", "test_category", "error", "infos", "error_level", "wkt"])

    for network in networks:
        appel_nav = requests.get(navitia_url + "coverage/{}/networks/{}/lines?count=0".format(coverage, network), headers={'Authorization': navitia_api_key})
        nb_result = appel_nav.json()['pagination']['total_result']

        appel_nav = requests.get(navitia_url + "coverage/{}/networks/{}/lines?count={}".format(coverage, network, nb_result), headers={'Authorization': navitia_api_key})
        lines = appel_nav.json()['lines']
        for a_line in lines :
            logger.info("Execution du traitement sur le réseau {} et la ligne {}".format(network, a_line["id"]))
            if not "properties" in a_line :
                message = 'pas de configuration temps réel pour la ligne {} ({})'.format(a_line['name'], a_line['id'])
                result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_line['id'], "line", "temps réel mode proxy", "config manquante", message, "green", utils.geojson_to_wkt(a_line['geojson'])  ]
                detail_test_result.append(result)
                test_result['ligne non configurée'] += 1
            else :
                keys = [prop['name'] for prop in a_line['properties']]
                if not "realtime_system" in keys :
                    test_result['ligne non configurée'] += 1
                    message = 'pas de configuration temps réel pour la ligne {} ({})'.format(a_line['name'], a_line['id'])
                    result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_line['id'], "line", "temps réel mode proxy", "config manquante", message, "green", utils.geojson_to_wkt(a_line['geojson'])  ]
                    detail_test_result.append(result)
                    continue

                #je récupère le nombre de stop_points sur ma ligne
                appel_nav = requests.get(navitia_url + "coverage/{}/networks/{}/lines/{}/stop_points?count=200".format(coverage, network, a_line['id']), headers={'Authorization': navitia_api_key})
                if appel_nav.json()['pagination']['total_result'] > 200 :
                    test_result['non testé'] += appel_nav.json()['pagination']['total_result'] - 200
                    message = "Toute la ligne {} ({}) n'a pas été testée car elle a trop d'arrêts".format(a_line['name'], a_line['id'])
                    result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d'), a_line['id'], "line", "temps réel mode proxy", "évo du script à prévoir", message, "red", utils.geojson_to_wkt(a_line['geojson'])  ]
                    detail_test_result.append(result)
                    logger.error(message)

                #je fais un appel grille horaire à l'arrêt pour chaque arrêt de la ligne et je vérifie que j'ai du temps réel
                for a_stop_point in appel_nav.json()['stop_points']:
                    appel_nav = requests.get(navitia_url + "coverage/{}/networks/{}/lines/{}/stop_points/{}/stop_schedules?items_per_schedule=1".format(coverage, network, a_line['id'], a_stop_point['id']), headers={'Authorization': navitia_api_key})
                    for a_schedule in appel_nav.json()['stop_schedules'] :
                        wkt = "POINT({} {})".format(a_schedule['stop_point']["coord"]["lon"], a_schedule['stop_point']["coord"]["lat"])
                        total_nb_tests +=1
                        if len(a_schedule['date_times']) == 0 :
                            if a_schedule['additional_informations'] in ["no_departure_this_day", "partial_terminus", "terminus"] :
                                test_result["pas horaires mais c'est normal"] += 1
                                message = "pas d'horaires aujourd'hui pour l'arrêt {}, la ligne {}, le parcours {} ({}, {}, {})".format(a_schedule['stop_point']['name'], a_schedule['route']['line']['code'],  a_schedule['route']['name'], a_schedule['stop_point']['id'], a_schedule['route']['line']['id'],  a_schedule['route']['id'])
                                result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d')
                                    , a_schedule['stop_point']['id'], "stop_point", "temps réel mode proxy", "pas d'horaires aujourd'hui"
                                    , message
                                    , "green", wkt  ]
                                detail_test_result.append(result)
                            else :
                                message = "pas d'horaires pour l'arrêt {}, la ligne {}, le parcours {} ({}, {}, {})".format(a_schedule['stop_point']['name'], a_schedule['route']['line']['code'],  a_schedule['route']['name'], a_schedule['stop_point']['id'], a_schedule['route']['line']['id'],  a_schedule['route']['id'])
                                result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d')
                                    , a_schedule['stop_point']['id'], "stop_point", "temps réel mode proxy", "pas d'horaires"
                                    , message
                                    , "red", wkt  ]
                                detail_test_result.append(result)
                                test_result['pas horaires du tout'] += 1
                        else :
                            if a_schedule['date_times'][0]['data_freshness'] != "realtime":
                                test_result['horaires théoriques'] += 1
                                message = "pas de temps réel pour l'arrêt {}, la ligne {}, le parcours {} ({}, {}, {})".format(a_schedule['stop_point']['name'], a_schedule['route']['line']['code'],  a_schedule['route']['name'], a_schedule['stop_point']['id'], a_schedule['route']['line']['id'],  a_schedule['route']['id'])
                                result = [coverage, environnement, datetime.date.today().strftime('%Y%m%d')
                                    , a_schedule['stop_point']['id'], "stop_point", "temps réel mode proxy", "horaires théoriques"
                                    , message
                                    , "orange", wkt  ]
                                detail_test_result.append(result)
                            else:
                                test_result['OK'] += 1

    logger.info ("Résultat des tests :")
    logger.info (">> {} cas de tests".format(total_nb_tests))
    logger.info (">> {} ligne(s) sans temps réel configuré".format(test_result['ligne non configurée']))
    logger.info (">> {} cas de services terminés".format(test_result["pas horaires mais c'est normal"]))
    logger.info (">> {} cas où du théorique est renvoyé".format(test_result['horaires théoriques']))
    logger.info (">> {} cas où aucun horaire n'est renvoyé".format(test_result['pas horaires du tout']))
    logger.info (">> {} cas où ça marche !".format(test_result['OK']))
    logger.info (">> au moins {} cas non testés ".format(test_result['non testé']))

    utils.write_errors_to_file (environnement, coverage, "check_realtime_proxy", detail_test_result)
    utils.generate_file_summary()
Example #8
0
def check_line_colors(environnement, coverage):
    """Lance la vérification de la présence des couleurs des lignes et du texte associé.
    Dans le cas où les deux couleurs sont présentes, le script vérifie le contraste (accessibilité RGAA).
    """
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info("On teste le coverage [{}] sur l'environnement [{}] ".format(
        coverage, environnement))

    params = json.load(open('../params.json'))
    assert (
        environnement
        in params['environnements']), "L'environnement demandé n'existe pas"
    navitia_url = params['environnements'][environnement]['url']
    navitia_api_key = params['environnements'][environnement]['key']

    detail_test_result = []
    detail_test_result.append([
        "coverage", "env", "test_datetime", "object_id", "object_type",
        "test_category", "error", "infos", "error_level", "wkt"
    ])

    appel_nav_networks = requests.get(
        navitia_url + "coverage/{}/networks?count=1000".format(coverage),
        headers={'Authorization': navitia_api_key})
    if appel_nav_networks.status_code != 200:
        logger.error(">> l'appel navitia a renvoyé une erreur")
        return
    for a_network in appel_nav_networks.json()['networks']:
        appel_nav = requests.get(
            navitia_url +
            "coverage/{}/networks/{}/lines?count=1000&depth=0".format(
                coverage, a_network['id']),
            headers={'Authorization': navitia_api_key})
        if appel_nav.json()['pagination']['total_result'] > 1000:
            logger.error(
                ">> il y a trop de lignes sur le réseau {}, elles n'ont pas toutes été testées"
                .format(a_network['name']))
        if "lines" in appel_nav.json():
            for a_line in appel_nav.json()['lines']:
                color = a_line['color']
                text_color = a_line['text_color']
                if not color or not text_color:
                    message = "il n'y a pas de couleur ou de couleur de texte pour la ligne {} du réseau {}".format(
                        a_line['name'], a_network['name'])
                    result = [
                        coverage, environnement,
                        datetime.date.today().strftime('%Y%m%d'), a_line['id'],
                        "line", "couleurs des lignes", "config manquante",
                        message, "red",
                        utils.geojson_to_wkt(a_line['geojson'])
                    ]
                    detail_test_result.append(result)
                elif not is_valid_color(color) or not is_valid_color(
                        text_color):
                    message = "la couleur ou la couleur de texte pour la ligne {} du réseau {} est invalide".format(
                        a_line['name'], a_network['name'])
                    result = [
                        coverage, environnement,
                        datetime.date.today().strftime('%Y%m%d'), a_line['id'],
                        "line", "couleurs des lignes", "config erronée",
                        message, "red",
                        utils.geojson_to_wkt(a_line['geojson'])
                    ]
                    detail_test_result.append(result)
                else:
                    contrast = abs(
                        compute_luminosity(text_color) -
                        compute_luminosity(color))
                    if contrast == 0:
                        message = "la couleur et la couleur du texte sont identiques pour la ligne {} du réseau {}".format(
                            a_line['name'], a_network['name'])
                        result = [
                            coverage, environnement,
                            datetime.date.today().strftime('%Y%m%d'),
                            a_line['id'], "line", "couleurs des lignes",
                            "code de ligne illisible", message, "red",
                            utils.geojson_to_wkt(a_line['geojson'])
                        ]
                        detail_test_result.append(result)
                    elif contrast <= 125:
                        a_better_color = "blanc"
                        if compute_luminosity(color) >= 128:
                            a_better_color = "noir"
                        message = "il n'y a pas assez de contraste entre la couleur et la couleur du texte pour la ligne {} du réseau {} : du {} serait moins pire".format(
                            a_line['name'], a_network['name'], a_better_color)
                        result = [
                            coverage, environnement,
                            datetime.date.today().strftime('%Y%m%d'),
                            a_line['id'], "line", "couleurs des lignes",
                            "code de ligne peu lisible", message, "orange",
                            utils.geojson_to_wkt(a_line['geojson'])
                        ]
                        detail_test_result.append(result)

    utils.write_errors_to_file(environnement, coverage, "check_line_colors",
                               detail_test_result)
    utils.generate_file_summary()
Example #9
0
def test_network_for_realtime_on_stop_schedule(environnement, coverage,
                                               *networks):
    log.init_log("", "")
    logger = logging.getLogger("vipere")
    logger.info(
        "Vérification des lignes pour le coverage [{}] et sur l'environnement [{}]"
        .format(coverage, environnement))

    if len(networks) == 0:
        logger.error(
            "Au moins un identifiant de réseau doit être passé en paramètre")
        exit()
    params = json.load(open('../params.json'))
    assert (
        environnement
        in params['environnements']), "L'environnement demandé n'existe pas"
    navitia_url = params['environnements'][environnement]['url']
    navitia_api_key = params['environnements'][environnement]['key']

    total_nb_tests = 0
    test_result = {}
    test_result['ligne non configurée'] = 0
    test_result['pas horaires du tout'] = 0
    test_result["pas horaires mais c'est normal"] = 0
    test_result['horaires théoriques'] = 0
    test_result['OK'] = 0
    test_result['non testé'] = 0

    detail_test_result = []
    detail_test_result.append([
        "coverage", "env", "test_datetime", "object_id", "object_type",
        "test_category", "error", "infos", "error_level", "wkt"
    ])

    for network in networks:
        appel_nav = requests.get(
            navitia_url +
            "coverage/{}/networks/{}/lines?count=0".format(coverage, network),
            headers={'Authorization': navitia_api_key})
        nb_result = appel_nav.json()['pagination']['total_result']

        appel_nav = requests.get(
            navitia_url + "coverage/{}/networks/{}/lines?count={}".format(
                coverage, network, nb_result),
            headers={'Authorization': navitia_api_key})
        lines = appel_nav.json()['lines']
        for a_line in lines:
            logger.info(
                "Execution du traitement sur le réseau {} et la ligne {}".
                format(network, a_line["id"]))
            if not "properties" in a_line:
                message = 'pas de configuration temps réel pour la ligne {} ({})'.format(
                    a_line['name'], a_line['id'])
                result = [
                    coverage, environnement,
                    datetime.date.today().strftime('%Y%m%d'), a_line['id'],
                    "line", "temps réel mode proxy", "config manquante",
                    message, "green",
                    utils.geojson_to_wkt(a_line['geojson'])
                ]
                detail_test_result.append(result)
                test_result['ligne non configurée'] += 1
            else:
                keys = [prop['name'] for prop in a_line['properties']]
                if not "realtime_system" in keys:
                    test_result['ligne non configurée'] += 1
                    message = 'pas de configuration temps réel pour la ligne {} ({})'.format(
                        a_line['name'], a_line['id'])
                    result = [
                        coverage, environnement,
                        datetime.date.today().strftime('%Y%m%d'), a_line['id'],
                        "line", "temps réel mode proxy", "config manquante",
                        message, "green",
                        utils.geojson_to_wkt(a_line['geojson'])
                    ]
                    detail_test_result.append(result)
                    continue

                #je récupère le nombre de stop_points sur ma ligne
                appel_nav = requests.get(
                    navitia_url +
                    "coverage/{}/networks/{}/lines/{}/stop_points?count=200".
                    format(coverage, network, a_line['id']),
                    headers={'Authorization': navitia_api_key})
                if appel_nav.json()['pagination']['total_result'] > 200:
                    test_result['non testé'] += appel_nav.json(
                    )['pagination']['total_result'] - 200
                    message = "Toute la ligne {} ({}) n'a pas été testée car elle a trop d'arrêts".format(
                        a_line['name'], a_line['id'])
                    result = [
                        coverage, environnement,
                        datetime.date.today().strftime('%Y%m%d'), a_line['id'],
                        "line", "temps réel mode proxy",
                        "évo du script à prévoir", message, "red",
                        utils.geojson_to_wkt(a_line['geojson'])
                    ]
                    detail_test_result.append(result)
                    logger.error(message)

                #je fais un appel grille horaire à l'arrêt pour chaque arrêt de la ligne et je vérifie que j'ai du temps réel
                for a_stop_point in appel_nav.json()['stop_points']:
                    appel_nav = requests.get(
                        navitia_url +
                        "coverage/{}/networks/{}/lines/{}/stop_points/{}/stop_schedules?items_per_schedule=1"
                        .format(coverage, network, a_line['id'],
                                a_stop_point['id']),
                        headers={'Authorization': navitia_api_key})
                    for a_schedule in appel_nav.json()['stop_schedules']:
                        wkt = "POINT({} {})".format(
                            a_schedule['stop_point']["coord"]["lon"],
                            a_schedule['stop_point']["coord"]["lat"])
                        total_nb_tests += 1
                        if len(a_schedule['date_times']) == 0:
                            if a_schedule['additional_informations'] in [
                                    "no_departure_this_day",
                                    "partial_terminus", "terminus"
                            ]:
                                test_result[
                                    "pas horaires mais c'est normal"] += 1
                                message = "pas d'horaires aujourd'hui pour l'arrêt {}, la ligne {}, le parcours {} ({}, {}, {})".format(
                                    a_schedule['stop_point']['name'],
                                    a_schedule['route']['line']['code'],
                                    a_schedule['route']['name'],
                                    a_schedule['stop_point']['id'],
                                    a_schedule['route']['line']['id'],
                                    a_schedule['route']['id'])
                                result = [
                                    coverage, environnement,
                                    datetime.date.today().strftime('%Y%m%d'),
                                    a_schedule['stop_point']['id'],
                                    "stop_point", "temps réel mode proxy",
                                    "pas d'horaires aujourd'hui", message,
                                    "green", wkt
                                ]
                                detail_test_result.append(result)
                            else:
                                message = "pas d'horaires pour l'arrêt {}, la ligne {}, le parcours {} ({}, {}, {})".format(
                                    a_schedule['stop_point']['name'],
                                    a_schedule['route']['line']['code'],
                                    a_schedule['route']['name'],
                                    a_schedule['stop_point']['id'],
                                    a_schedule['route']['line']['id'],
                                    a_schedule['route']['id'])
                                result = [
                                    coverage, environnement,
                                    datetime.date.today().strftime('%Y%m%d'),
                                    a_schedule['stop_point']['id'],
                                    "stop_point", "temps réel mode proxy",
                                    "pas d'horaires", message, "red", wkt
                                ]
                                detail_test_result.append(result)
                                test_result['pas horaires du tout'] += 1
                        else:
                            if a_schedule['date_times'][0][
                                    'data_freshness'] != "realtime":
                                test_result['horaires théoriques'] += 1
                                message = "pas de temps réel pour l'arrêt {}, la ligne {}, le parcours {} ({}, {}, {})".format(
                                    a_schedule['stop_point']['name'],
                                    a_schedule['route']['line']['code'],
                                    a_schedule['route']['name'],
                                    a_schedule['stop_point']['id'],
                                    a_schedule['route']['line']['id'],
                                    a_schedule['route']['id'])
                                result = [
                                    coverage, environnement,
                                    datetime.date.today().strftime('%Y%m%d'),
                                    a_schedule['stop_point']['id'],
                                    "stop_point", "temps réel mode proxy",
                                    "horaires théoriques", message, "orange",
                                    wkt
                                ]
                                detail_test_result.append(result)
                            else:
                                test_result['OK'] += 1

    logger.info("Résultat des tests :")
    logger.info(">> {} cas de tests".format(total_nb_tests))
    logger.info(">> {} ligne(s) sans temps réel configuré".format(
        test_result['ligne non configurée']))
    logger.info(">> {} cas de services terminés".format(
        test_result["pas horaires mais c'est normal"]))
    logger.info(">> {} cas où du théorique est renvoyé".format(
        test_result['horaires théoriques']))
    logger.info(">> {} cas où aucun horaire n'est renvoyé".format(
        test_result['pas horaires du tout']))
    logger.info(">> {} cas où ça marche !".format(test_result['OK']))
    logger.info(">> au moins {} cas non testés ".format(
        test_result['non testé']))

    utils.write_errors_to_file(environnement, coverage, "check_realtime_proxy",
                               detail_test_result)
    utils.generate_file_summary()