示例#1
0
    def check_plugins_versions(self) -> None:
        """ Проверка версий плагинов
        Проверка версий плагинов из списка
        Обращение к WS с запросом версии плагина с помощью метода ws plugin_info:GetInfo

        Возможно два режима проверки: server и client.
        Режим server - проверка версии плагинов на сервере
        Режим client - проверка версии плагинов на клиенте
        """
        # ----------------------------------------
        # ПРОВЕРКА ВХОДНЫХ ДАННЫХ

        tools.check_keys_exist(self._input_data, ["plugins"], 'input_data', True, self._statistic)
        tools.check_types(["plugins"], [self._input_data["plugins"]], [list], self._statistic)
        tools.check_values(["len(plugins)"], [len(self._input_data["plugins"])], [0], ["!="], self._statistic)

        tools.check_keys_exist(self._input_data, ["mode"], 'input_data', True, self._statistic)
        tools.check_types(["mode"], [self._input_data["mode"]], [str], self._statistic)
        tools.check_values(["mode"], [self._input_data["mode"]], [""], ["!="], self._statistic)

        key_names = ['module_name', 'rel_path']
        for plugin in self._input_data["plugins"]:
            tools.check_keys_exist(plugin, key_names, "plugin", True, self._statistic)
            tools.check_types(key_names, [plugin[key_names[0]], plugin[key_names[1]]], [str, str], self._statistic)
            tools.check_values(key_names, [plugin[key_names[0]], plugin[key_names[1]]], ["", ""], ["!=", "!="],
                               self._statistic)
        # ----------------------------------------

        if self._input_data["mode"] == "server":
            ws_client = SoapClient(self._server_ip, self._server_port, self._config, self._statistic)
        elif self._input_data["mode"] == "client":
            ws_client = SoapClient(self._client_ip, self._client_port, self._config, self._statistic)
        else:
            self._statistic.append_error("Недопустимое значение ключа 'mode'. Доступны: client, server",
                                         "ОШИБКА КЛЮЧА JSON", True)

        token = ws_users.server_login(ws_client, self._login, self._password, self._statistic)

        for plugin in self._input_data["plugins"]:
            result: dict = ws_common.get_plugin_info(ws_client, token, plugin['rel_path'], plugin['module_name'],
                                                     self._statistic)
            if result['version'] == "not found module version !":
                self._statistic.append_error(plugin['module_name'], "ОШИБКА ВЕРСИИ МОДУЛЯ")
            if plugin['rel_path'] == "bad rel_path !":
                self._statistic.append_warn("Модуль " + plugin['module_name'] + " " + plugin['rel_path'],
                                            "НЕКОРРЕКТНЫЙ ПУТЬ")

            module_info: str = "Version: " + result['version'] + "\n" + "User: "******"\n" + "Build: " + \
                               result['build'] + "\n"
            self._statistic.append_success(
                "Имя модуля: " + plugin['module_name'] + "\n" + "Путь: " + plugin['rel_path'] + "\n" + module_info,
                "МОДУЛЬ ИНФО")
示例#2
0
def faceva_get_event_image(client: SoapClient, token: str, event: int,
                           time: int, statistic: Statistic) -> dict:
    """Функция выполнения ws метода FaceVA:GetEventImage.

    :param client: объект класса SoapClient для отправки и приема ws запросов;
    :param token: токен соединения;
    :param event: номер события;
    :param time: время события (в unix формате);
    :param statistic: объект класса Statistic для ведения статистики ошибок и предупреждений

    :return: в случае успеха словарь ответа вида:
        {
            "img": "base64 code"
        }
        в случае ошибки словарь вида:
        {
            "result": "error"
        }
    """
    logger = statistic.get_log().get_logger("scripts/ws/analytics")
    logger.info(
        "was called (client: SoapClient, token: str, event: int, time: int, statistic: Statistic)"
    )
    logger.debug("params (client_obj" + token + ", " + str(event) + ", " +
                 str(time) + ", stat_obf)")

    params, sysparams, method = pattern.faceva_get_event_image(
        token, event, time)
    response = client.call_method2(method, params, sysparams, [0])

    statistic.append_info(method + " выполнен успешно!", "WS МЕТОД")

    return response['result'][0]
示例#3
0
def faceva_get_frame(client: SoapClient, token: str, camera: int, time: int,
                     statistic: Statistic) -> dict:
    """Функция выполнения ws метода FaceVA:GetFrame.

    :param client: объект класса SoapClient для отправки и приема ws запросов;
    :param token: токен соединения;
    :param camera: номер камеры;
    :param time: время события (в unix формате);
    :param statistic: объект класса Statistic для ведения статистики ошибок и предупреждений.

    :return: словарь ответа вида:
        {
            "img": "base64 code"
        }
    """
    logger = statistic.get_log().get_logger("scripts/ws/analytics")
    logger.info(
        "was called (client: SoapClient, token: str, event: int, time: int, statistic: Statistic)"
    )
    logger.debug("params (client_obj" + token + ", " + str(camera) + ", " +
                 str(time) + ", stat_obf)")

    params, sysparams, method = pattern.faceva_get_frame(token, camera, time)
    response = client.call_method2(method, params, sysparams, [0])

    return response['result'][0]
示例#4
0
def faceva_delete_person(client: SoapClient, token: str, name: str,
                         statistic: Statistic) -> bool:
    """Функция выполнения ws метода FaceVA:DeletePerson

    :param client: объект класса SoapClient для отправки и приема ws запросов;
    :param token: токен соединения;
    :param name:
    :param statistic:
    :return: флаг успешности операции
    """
    logger = log.get_logger("scripts/ws/analytics")
    logger.info(
        "was called (client: SoapClient, login: str, password: str, name: str, statistic: Statistic)"
    )
    logger.debug("faceva_delete_person(client_obj" + login + ", " + password +
                 ", " + name + ")")

    data = pattern.faceva_delete_person(login, password, name)
    response_json = client.call_method2(data[2], data[0], data[1], True)
    logger.debug("response_json: " + str(response_json))

    tools.check_keys_exist(response_json['result'][0], ['cmd', 'name'],
                           "response_json['result'][0]", True, statistic)
    #tools.check_on_equal_key_values_in_dict(response_json["result"][0], ['cmd', 'name'], ['DeletePerson', name])

    logger.info("ws method FaceVA:DeletePerson was executed successfully!")
    statistic.append_info(method + " выполнен успешно!", "WS МЕТОД")

    return True
示例#5
0
def ptzserver_command_simple(client: SoapClient,
                             key2: str,
                             token: str,
                             statistic: Statistic,
                             stop: bool = False,
                             left: int = 0,
                             right: int = 0,
                             up: int = 0,
                             down: int = 0,
                             zoom_in: int = 0,
                             zoom_out: int = 0,
                             query_all: bool = False,
                             go_to_preset: int = 0,
                             set_preset: int = 0,
                             pan_to: int = -1,
                             tilt_to: int = -1,
                             home: bool = False) -> dict:
    """

    :param client:
    :param key2:
    :param token:
    :param stop:
    :param left:
    :param right:
    :param up:
    :param down:
    :param zoom_in:
    :param zoom_out:
    :param query_all:
    :param go_to_preset:
    :param set_preset:
    :param pan_to:
    :param tilt_to:
    :param home:

    :return:
    """
    logger = statistic.get_log().get_logger("scripts/ws/ptz")
    logger.info(
        "was called (client: SoapClient, key2: str, token: str, statistic: Statistic, stop: bool,\
                             left: int, right: int, up: int, down: int, zoom_in: int, zoom_out: int, query_all: bool,\
                             go_to_preset: int, set_preset: int, pan_to: int, tilt_to: int, home: bool)"
    )
    logger.debug("params (client_obj, " + key2 + ", " + token +
                 ", statistic_obj" + str(stop) + ", " + str(left) + ", " +
                 str(right) + ", " + str(up) + ", " + str(down) + ", " +
                 str(zoom_in) + ", " + str(zoom_out) + ", " + str(query_all) +
                 ", " + str(go_to_preset) + ", " + str(set_preset) + ", " +
                 str(pan_to) + ", " + str(tilt_to) + ", " + str(home) + ")")

    params, sysparams, method = pattern.ptzserver_command_simple(
        key2, token, stop, left, right, up, down, zoom_in, zoom_out, query_all,
        go_to_preset, set_preset, pan_to, tilt_to, home)

    response = client.call_method2(method, params, sysparams, [0])
    logger.info("ws method ptzserver:Command was executed successfully!")
    statistic.append_info("ptzserver:Command выполнен успешно", "WS_МЕТОД")

    return response
示例#6
0
    def listener_pinger_down_servers(self):
        """Тестирование ws метода listener_pinger:get_down_servers.

        Тест циклично с установленной переодичностью опрашивает метод down_servers, затем сравнивает результат с
        эталоном (либо из файла, либо самый первый вызов этого метода), затем по порядку вызывает ws методы
        listener_pinger:get_local_servers для всех серверов из эталона и сравнивает результаты с эталоном.
        """

        ws_client = SoapClient(self._ip, self._port, self._config,
                               self._statistic)
        token = ws_users.server_login(ws_client, self._login, self._password,
                                      self._statistic)

        if self._input_data["template_path"]:
            template_down_servers: dict = tools.open_json_file(
                self._input_data["template_path"], self._statistic)
            template_down_servers = template_down_servers["result"][0]["data"][
                "string"]
            self._statistic.append_info("Получен шаблон из файла...", "ИНФО")
        else:
            template_down_servers: dict = ws_lp.get_down_servers(
                ws_client, token, 1, self._statistic)
            self._statistic.append_info(
                "Получен шаблон из ws istener_pinger:get_down_servers...",
                "ИНФО")

        for iteration in range(self._input_data["iterations"]):
            local_servers: dict = ws_lp.get_local_servers(
                ws_client, token, 1, self._statistic)
            if tools_lp.compare_local_servers(local_servers,
                                              template_down_servers, self._ip,
                                              self._statistic):
                self._statistic.append_success(
                    "ответ ws listener_pinger:get_local_servers корректен!",
                    "СРАВНЕНИЕ")
            else:
                self._statistic.append_error(
                    "ответ ws listener_pinger:get_local_servers некорректен!",
                    "КРИТ", True)

            down_servers: dict = ws_lp.get_down_servers(
                ws_client, token, 1, self._statistic)

            if tools_lp.compare_down_servers(down_servers,
                                             template_down_servers, self._ip,
                                             self._statistic):
                self._statistic.append_success(
                    "ответ ws listener_pinger:get_down_servers корректен!",
                    "СРАВНЕНИЕ")
            else:
                self._statistic.append_error(
                    "ответ ws listener_pinger:get_down_servers некорректен!",
                    "КРИТ", True)

            time.sleep(self._input_data["period"])
示例#7
0
def get_down_servers(client: SoapClient, token: str, direct_access: int,
                     statistic: Statistic) -> dict:
    """WS метод listener_pinger_get_down_servers с проверками существования ключей и типов их значений.

    :param client: объект клиента;
    :param token: токен авторизации;
    :param direct_access: параметр ws метода;
    :param statistic: объект класса Statistic.

    :return: response["result"][0]["data"]["string"]
    """
    logger = statistic.get_log().get_logger("scripts/ws/listener_pinger")
    logger.info(
        "was called (client: SoapClient, token: str, direct_access: int, statistic: Statistic)"
    )
    logger.debug("with params (client_obj, " + token + ", " +
                 str(direct_access) + ", stat_obj)")

    params, sysparams, method = pattern.listener_pinger_get_down_servers(
        token, direct_access)
    response = client.call_method2(method, params, sysparams, [0])

    tools.check_types(["response['result'][0]"], [response["result"][0]],
                      [dict], statistic)

    tools.check_keys_exist(response["result"][0], ['data', 'hash'],
                           'response["result"][0]', False, statistic)
    tools.check_types(
        ['data', 'hash'],
        [response["result"][0]["data"], response["result"][0]["hash"]],
        [dict, str], statistic)

    tools.check_keys_exist(response["result"][0]["data"], ['string'],
                           'response["result"][0]["data"]', False, statistic)
    tools.check_types(["response['result'][0]['data']['string']"],
                      [response["result"][0]["data"]["string"]], [dict],
                      statistic)

    string = response["result"][0]["data"]["string"]
    tools_lp.listener_pinger_keys_verifier(string, statistic)

    for down_server in string["down_servers"]:
        for key in down_server:
            tools_lp.listener_pinger_keys_verifier(down_server[key], statistic)

    logger.info("ws '" + method + "' выполнен успешно!")
    statistic.append_info(method + "' выполнен успешно!", "WS_МЕТОД")

    return response["result"][0]["data"]["string"]
示例#8
0
def ptzserver_list_profiles(client: SoapClient, token: str,
                            statistic: Statistic) -> list:
    logger = statistic.get_log().get_logger("scripts/ws/ptz")
    logger.info(
        "was called (client: SoapClient, token: str, statistic: Statistic)")
    logger.debug("with params (client_obj, " + token + ", stat_obj)")

    params, sysparams, method = pattern.ptzserver_list_profiles(token)
    response = client.call_method2(method, params, sysparams, [0])

    logger.info("ws method " + method + " was executed successfully!")
    statistic.append_info(method + " выполнен успешно!", "WS_МЕТОД")

    if not response["result"] or response["result"] == [{}]:
        statistic.append_error("Список PTZ камер пуст!", "НЕТ PTZ КАМЕР")
        return []

    return response["result"]
示例#9
0
def faceva_get_data_base(client: SoapClient, token: str,
                         statistic: Statistic) -> tuple:
    """Функция выполнеия ws метода FaceVA:GetDataBase

    :param client: объект класса SoapClient для отправки и приема ws запросов;
    :param token: токен соединения;
    :param statistic: объект класса Statistic для ведения статистики ошибок и предупреждений.

    :return: список персон, который приходит в ответе в ключе persons вида:
        [
            {
                "id": 26617065162932227,
                "name": Иванов Иван Иванович,
                ["pacs": 1],
                ["category": "category"],
                ["department": "department"],
                ["comment": "comment"],
                ["information": "information"]
            }
        ]
    """
    logger = statistic.get_log().get_logger("scripts/ws/analytics")
    logger.info("was called(client, login, password)")
    logger.debug("with params (client_obj, " + token + ", stat_obj)")

    params, sysparams, method = pattern.faceva_get_data_base(token)
    response_json = client.call_method2(method, params, sysparams, [0])
    result = response_json["result"][0]

    tools.check_keys_exist(result, ['persons'], "result", True, statistic)
    persons = result["persons"]
    tools.check_types(["persons"], [persons], [list], statistic)

    if not persons:
        statistic.append_warn("data base persons", "EMPTY")

    for person in persons:
        tools.check_keys_exist(person, ["id", "name"], 'person', True,
                               statistic)

    logger.info("ws method FaceVA:GetDataBase was executed successfully!")
    statistic.append_info(method + " выполнен успешно!", "WS МЕТОД")

    return tuple(persons)
示例#10
0
 def test_analytic_events(self):
     """Тест строит указанное кол-во графов устройство->микшер->ИВ54сервер->аналитика,
         затем ожидает конца дампа/ави и сравнивает фактичиские события с указанными в data
     """
     analytic_block: dict = tools.open_json_file(self._input_data['json'],
                                                 self._statistic)
     cam_json = graph.create_json_from_profiles(
         self._input_data['server'], analytic_block,
         self._input_data['video_source'], True, self._statistic)
     ws_client = SoapClient(self._server_ip, self._server_port,
                            self._config, self._statistic)
     token: str = ws_users.server_login(ws_client, self._login,
                                        self._password, self._statistic)
     cam_name: str = graph.insert_graphs_to_db(ws_client, token,
                                               self._server_db_path,
                                               cam_json,
                                               self._input_data['server'],
                                               self._input_data['profile'],
                                               1, self._statistic)[0]
     if self._input_data['detector'] == "forget2":
         event_type = 20074
     elif self._input_data['detector'] == "FaceVA":
         event_type = 20013
     else:
         self._statistic.append_error(self._input_data['detector'],
                                      "НЕТ ДЕТЕКТОРА", True)
     cam_info = {
         "server": self._input_data['server'],
         "cam": cam_name,
         "profile": self._input_data['profile']
     }
     analytics.run_events_test(ws_client, token, cam_info,
                               self._input_data['events'],
                               self._input_data['inaccuracy'], event_type,
                               self._input_data['video_source'],
                               self._statistic)
示例#11
0
def faceva_update_person(client: SoapClient, token: str, id_: int,
                         pacs_id: int, name: str, category: str, comment: str,
                         information: str, department: str, faces: Tuple[dict],
                         delete_faces: Tuple[dict],
                         statistic: Statistic) -> str:
    """Функция выполнения ws метода FaceVA:UpdatePerson.

    :param client: объект класса SoapClient для отправки и приема ws запросов;
    :param token: токен соединения;
    :param id_: идентификатор персоны в БД;
    :param pacs_id: идентификатор персоны в БД для СКД;
    :param name: ФИО персоны;
    :param category: категория;
    :param comment: комментарий;
    :param information: информация;
    :param department: отдел;
    :param faces: список фото лиц для добавления;
    :param delete_faces: список фото для удаления;
    :param statistic: объект класса Statistic для ведения статистики ошибок и предупреждений.

    :return: идентификатор персоны в базе.
    """
    logger = statistic.get_log().get_logger("scripts/ws/analytics")
    logger.info(
        "was called faceva_update_person(client: SoapClient, login: str, id_: int, pacs_id: int,\
                name: str, category: str, comment: str, information: str, department: str, faces: List[dict], \
                delete_faces: List[dict])")
    logger.debug("faceva_update_person(client_obj" + token + ", " + str(id_) +
                 ", " + str(pacs_id) + ", " + name + ", " + category + ", " +
                 comment + ", " + information + ", " + department + ", " +
                 ", " + str(faces) + ", " + str(delete_faces) + ")")

    params, sysparams, method = pattern.faceva_update_person(
        token, id_, pacs_id, name, category, comment, information, department,
        faces, delete_faces)
    response_json = client.call_method2(method, params, sysparams, [0])

    person = response_json['result'][0]
    key_names = [
        "id", "pacs", "name", "category", "comment", "information",
        "department", "result", "faces"
    ]
    tools.check_keys_exist(person, key_names, "['result'][0]", True, statistic)

    key_names.remove("result")
    key_names.remove("faces")
    key_values = [
        person["id"], person["pacs"], person["name"], person["category"],
        person["comment"], person["information"], person["department"]
    ]
    key_need_values = [
        id_,
        str(pacs_id), name, category, comment, information, department
    ]
    operations = ["==", "==", "==", "==", "==", "==", "=="]
    if id_ == -1:
        key_names.pop(0)
        key_values.pop(0)
        key_need_values.pop(0)
        operations.pop(0)
    tools.check_values(key_names, key_values, key_need_values, operations,
                       statistic)

    tools.check_types(["faces"], [person["faces"]], [list], statistic)

    if not person['faces'] and faces:
        statistic.append_error("Список faces", "НЕТ_ЛИЦ", True)

    for index, face in enumerate(person["faces"]):
        tools.check_keys_exist(face, ["result"], "face", True, statistic)
        if face["result"] == "error":
            tools.check_keys_exist(face, ["reason"], "face", True, statistic)
            statistic.append_error("причина: " + face["reason"], "ПЛОХОЕ_ФОТО",
                                   False)

    logger.info("ws method FaceVA:UpdatePerson was executed successfully!")
    statistic.append_info(method + " выполнен успешно!", "WS МЕТОД")

    return person["id"]
示例#12
0
def faceva_get_faces(client: SoapClient, token: str, from_: int,
                     statistic: Statistic) -> Tuple[dict]:
    """Функция выполнения ws метода FaceVA:GetFaces.

    :param client: объект класса SoapClient для отправки и приема ws запросов;
    :param token: токен соединения;
    :param from_: начиная с какого id прислать события
    :param statistic: объект класса Statistic для ведения статистики ошибок и предупреждений

    :return: список словарей с событиями вида:
        [
            {
                "event": 154743,
                "camera": 1955154395,
                "person": "26617065381036041", // если не пустой, значит это СВОЙ, иначе просто обнаруженное лицо.
                "score": 0.939386,
                "time": 1587380094085000,
                "img": "base64"
            },
            ...
            ...
        ]
    """
    logger = statistic.get_log().get_logger("scripts/ws/analytics")
    logger.info(
        "was called (client: SoapClient, token: str, from_: int, statistic: Statistic)"
    )
    logger.debug("params (client_obj" + token + ", " + str(from_) +
                 ", stat_obf)")

    params, sysparams, method = pattern.faceva_get_faces(token, from_)
    response: dict = client.call_method2(method, params, sysparams, [0])

    for index, event in enumerate(response['result']):
        # пришлось написать это условие, так как может быть ситуация: result: [{}],
        # это означает, что событий нет.
        if not event and len(response['result']) == 1:
            break
        key_names = ['event', 'camera', 'rect', 'score', 'time', 'img']
        tools.check_keys_exist(event, key_names, "result[" + str(index) + "]",
                               True, statistic)
        key_values = [
            event['event'], event['camera'], event['rect'], event['score'],
            event['time'], event['img']
        ]
        tools.check_types(key_names, key_values,
                          [int, int, dict, float, int, str], statistic)

        key_names = ['x', 'y', 'w', 'h']
        tools.check_keys_exist(event['rect'], key_names,
                               "result[" + str(index) + "]['rect']", True,
                               statistic)
        key_values = [
            event['rect']['x'], event['rect']['y'], event['rect']['w'],
            event['rect']['h']
        ]
        tools.check_types(key_names, key_values, [int, int, int, int],
                          statistic)

    statistic.append_info(method + " выполнен успешно!", "WS МЕТОД")

    return tuple(response['result'])
示例#13
0
    def listener_pinger_ptz_status(self):
        """Тестирование ws методов listener_pinger:get_down_servers и listener_pinger:get_local_servers с целью
        проверки статусов ptz камер.

        Тест циклично с установленной переодичностью опрашивает методы local_servers и down_servers, проходит по каждым
        потенциально ptz камерам рутового (верхнего) сервера и проверяет статус ptz.

        """
        # ----------------------------------------
        # ПРОВЕРКА ВХОДНЫХ ДАННЫХ
        key_names = ['template_path', 'period', 'iterations']
        tools.check_keys_exist(self._input_data, key_names, 'data', True,
                               self._statistic)
        key_values = [
            self._input_data["template_path"], self._input_data["period"],
            self._input_data["iterations"]
        ]
        tools.check_types(key_names, key_values, [str, int, int],
                          self._statistic)
        # ----------------------------------------

        ws_client = SoapClient(self._ip, self._port, self._config,
                               self._statistic)
        token = ws_users.server_login(ws_client, self._login, self._password,
                                      self._statistic)

        if self._input_data["template_path"]:
            template_ptz_list_profiles: dict = tools.open_json_file(
                self._input_data["template_path"], self._statistic)
            template_ptz_list_profiles: list = template_ptz_list_profiles[
                "result"]
            self._statistic.append_info("Получен шаблон из файла...", "ИНФО")
        else:
            template_ptz_list_profiles: list = ws_ptz.ptzserver_list_profiles(
                ws_client, token, self._statistic)
            if not template_ptz_list_profiles:
                self._statistic.append_error(
                    "Неуспешно... Список PTZ камер пуст!", "ПОЛУЧЕНИЕ ШАБЛОНА",
                    True)
            self._statistic.append_info(
                "Получен шаблон из ws ptzserver:list_profiles...", "ИНФО")

        if not template_ptz_list_profiles:
            self._statistic.append_error("Пустой список камер в шаблоне!",
                                         "ВХ_ДАННЫЕ", True)

        for iteration in range(self._input_data["iterations"]):
            local_servers: dict = ws_lp.get_local_servers(
                ws_client, token, 1, self._statistic)
            if tools_lp.check_ptz_cams(local_servers["cams"],
                                       template_ptz_list_profiles,
                                       self._statistic):
                self._statistic.append_success(
                    "Статусы PTZ в ответе ws listener_pinger:get_local_servers корректны!",
                    "ТЕСТ")
            else:
                self._statistic.append_error(
                    "Статусы PTZ в ответе ws listener_pinger:get_local_servers некорректны!",
                    "КРИТ", True)

            down_servers: dict = ws_lp.get_down_servers(
                ws_client, token, 1, self._statistic)
            if tools_lp.check_ptz_cams(down_servers["cams"],
                                       template_ptz_list_profiles,
                                       self._statistic):
                self._statistic.append_success(
                    "Статусы PTZ в ответе ws listener_pinger:get_down_servers корректны!",
                    "ТЕСТ")
            else:
                self._statistic.append_error(
                    "Статусы PTZ в ответе ws listener_pinger:get_down_servers некорректны!",
                    "КРИТ", True)

            time.sleep(self._input_data["period"])
示例#14
0
    def test_faceva_get_event(self):
        """Тест проверяет ws метод FaceVA:GetEvent.
        Тест может работать в двух режимах: skd_mode = True - используются только ws методы лиц, то есть точно также,
        как и вызвает их СКД; skd_mode = False - за эталон берутся события системы и сравниваются с событиями от лиц,
        таким образом проверяются возможные пропуски.

        max_counts_event - кол-во событий для проверки, при достижении которых тест должен завершиться.
        event_getting_timeout - как часто запрашивать события, в случае если они не были найдены.

        """
        ws_client = SoapClient(self._server_ip, self._server_port,
                               self._config, self._statistic)
        token: str = ws_users.server_login(ws_client, self._login,
                                           self._password, self._statistic)
        current_time = ws_common.get_current_server_time(
            ws_client, token, self._statistic)

        events_count = 0
        last_event_time = current_time
        last_event_id = 0
        from_event = 0
        while True:
            if self._input_data['skd_mode']:
                events: Tuple[dict] = ws_analytics.faceva_get_event(
                    ws_client, token, from_event, self._statistic)
            else:
                events: Tuple[dict] = ws_ewriter.select(
                    ws_client, token, last_event_time, None, None, [20013],
                    None, None, None, self._statistic)
                events: list = list(events)
                events.reverse()

            if not events or len(events) == 1 and events[0] == {}:
                time.sleep(self._input_data['event_getting_timeout'])
                continue
            events: tuple = tuple(events)
            self._statistic.append_info("Получены события", "ИНФО")

            for index, event in enumerate(events):
                events_count += 1
                if self._input_data['skd_mode'] is False:
                    # пропускаем старые (уже проверенные) события
                    if event['evtid'] <= last_event_id:
                        events_count -= 1
                        continue

                    faceva_events: Tuple[dict] = ws_analytics.faceva_get_event(
                        ws_client, token, 0, self._statistic)
                    index_faceva_event = tools.get_dict_by_keys_values(
                        faceva_events, ('event', ), (event['evtid'], ))

                    if index_faceva_event < 0:
                        self._statistic.append_error(
                            "Нет события: " + str(event['evtid']) + "!",
                            "КРИТ", True)

                    person_id = faceva_events[index_faceva_event]['person']
                    persons = ws_analytics.faceva_get_data_base(
                        ws_client, token, self._statistic)
                    index_person = tools.get_dict_by_keys_values(
                        persons, ('id', ), (person_id, ))

                    if index_person < 0:
                        self._statistic.append_error(
                            "В базе нет id: " + str(person_id) + "!", "КРИТ",
                            True)

                    person_name = persons[index_person]['name']

                    if event['evtcomment'].find(person_name) < 0:
                        self._statistic.append_error(
                            "ФИО персоны не совпадают в событии " +
                            str(event['evtid']) + "!", "НЕВАЛИД ЗНАЧ", False)

                    event_id = faceva_events[index_faceva_event]['event']
                    time_ = faceva_events[index_faceva_event]['time']
                    camera = faceva_events[index_faceva_event]['camera']

                    event_time: str = event['evttime']
                    date_event_time = tools.get_date_from_str(event_time)
                    last_event_time = str(
                        tools.convert_time_to_gtc(date_event_time))[:-3]
                    last_event_id = event_id
                else:
                    event_id = event['event']
                    time_ = event['time']
                    camera = event['camera']
                    from_event = event_id

                # Проверка получения кадра по событию.
                # Выполнение ws метода FaceVA:GetFrame
                ws_result = ws_analytics.faceva_get_frame(
                    ws_client, token, camera, time_, self._statistic)
                if tools.check_keys_exist(ws_result, ['img'], 'result[0]',
                                          False, self._statistic) is False:
                    self._statistic.append_error(
                        "По событию " + str(event_id) + "!",
                        "ОТСУТСТВУЕТ КАДР", True)
                elif not ws_result['img']:
                    self._statistic.append_error(
                        "По событию " + str(event_id) + "!",
                        "ОТСУТСТВУЕТ КАДР", True)
                else:
                    self._statistic.append_success(
                        "По событию '" + str(event_id) + "'!", "ПОЛУЧЕН КАДР")

                # Проверка получения картинки по событию.
                # Выполнение ws метода FaceVA:GetEventImage
                ws_result = ws_analytics.faceva_get_event_image(
                    ws_client, token, event_id, time_, self._statistic)
                if tools.check_keys_exist(ws_result, ['img'], 'result[0]',
                                          False, self._statistic) is False:
                    self._statistic.append_error(
                        "По событию " + str(event_id) + "!",
                        "ОТСУТСТВУЕТ КАРТИНКА", True)
                elif not ws_result['img']:
                    self._statistic.append_error(
                        "По событию " + str(event_id) + "!",
                        "ОТСУТСТВУЕТ КАРТИНКА", True)
                else:
                    self._statistic.append_success(
                        "По событию " + str(event_id) + "!",
                        "ПОЛУЧЕНА КАРТИНКА")

                if events_count >= self._input_data['max_count_events']:
                    break
            if events_count >= self._input_data['max_count_events']:
                break
示例#15
0
    def test_faceva_update_person(self):
        """Тест проверяет работу ws метода FaceVA:UpdatePerson.

            Тест добавляет с помощью этого ws метода персон из указанной директории, в которой находятся папки,
            имена которых являются ФИО персоны, а внутри каждой папки фотографии этой персоны. После каждого добавления
            вызывается метода FaceVA:GetDataBase с целью фактической проверки добавления человека.
        """
        ws_client = SoapClient(self._server_ip, self._server_port,
                               self._config, self._statistic)
        token = ws_users.server_login(ws_client, self._login, self._password,
                                      self._statistic)

        # получение текущего списка людей в БД
        old_persons_db = ws_analytics.faceva_get_data_base(
            ws_client, self._login, self._statistic)
        persons_dir = tools.get_dirs(self._input_data["persons_dir"])

        for person in persons_dir:
            name: str = person
            category: str = str(random.randint(0, 100000))
            comment: str = random.choice([
                "На больничном", "Удаленная работа", "Полная ставка",
                "Пол ставки", "Фрилансер"
            ])
            information: str = random.choice([
                "Программист", "Тестировщик", "Директор",
                "Начальник отдела тестирования", "Менеджер по продажам"
            ])
            department: str = random.choice(
                ["Тестирования", "Разработки ПО", "Продаж", "Кадров"])
            person_photos: Tuple[str] = tools.get_files(
                self._input_data["persons_dir"] + "/" + person)
            photo_paths = []
            for person_photo in person_photos:
                photo_paths.append(self._input_data["persons_dir"] + "/" +
                                   person + "/" + person_photo)
            photos_base64: Tuple[str] = tools.get_photos_base64(
                tuple(photo_paths))
            faces = []
            for photo_base64 in photos_base64:
                faces.append({"img": str(photo_base64)})
            while True:
                pacs_id: int = random.randint(0, 1000)
                if tools.get_dict_by_keys_values(old_persons_db, ("pacs", ),
                                                 (pacs_id, )) == -1:
                    break

            person_id = ws_analytics.faceva_update_person(
                ws_client, token, -1, pacs_id, name, category, comment,
                information, department, faces, [], self._statistic)
            current_persons_db = ws_analytics.faceva_get_data_base(
                ws_client, token, self._statistic)

            key_names = ("id", "name", "pacs", "category", "comment",
                         "information", "department")
            key_values = (person_id, name, pacs_id, category, comment,
                          information, department)
            if tools.get_dict_by_keys_values(current_persons_db, key_names,
                                             key_values) == -1:
                self._statistic.append_error(name, "ПЕРСОНА НЕ ДОБАВЛЕНА",
                                             True)

            self._statistic.append_success(name, "ПЕРСОНА ДОБАВЛЕНА")
            """# запуск удаления