/
Примеры скриптов

Примеры скриптов

Примеры построены на основе демо-данных. Для полноценной работы необходимо сначала установить демо-данные.

  1. В следующем примере реализовано:

    1. Получение токена с сервера авторизации;

    2. Перевод данных экземпляра форм, для которого вызван скрипт, в новый статус.

      import json
      import requests
      
      identity_host = 'http://' + parameters['domain'] + '/idsrv/connect/token'
      dc_host = 'http://' + parameters['domain'] + '/datacollection/api'  # API
      login = parameters['userName']  # Логин администратора
      password = '******'  # Пароль администратора
      
      # Идентификатор экземпляра формы
      form_instance_id = parameters['formInstance']['Id']
      
      # Группа показателей 'Mediastore. План продаж'
      # Идентификатор группы показателей
      measure_group_id = 'measureGroup_Plan_prodazh'
      
      # Адрес для работы с элементами группы показателей
      measure_group_elements_url = dc_host + '/measuregroups/' + measure_group_id + '/elements'
      
      # Адрес для работы со статусами экземпляра формы
      form_states_url = dc_host + '/measuregroups/' + measure_group_id + '/forms/' + form_instance_id + '/states'
      
      # Метод для получения header, которые необходимо добавлять в каждый запрос
      def get_headers():
          #  Получение токена
          data = {
              'grant_type': 'password',
              'scope': 'openid profile email roles viewer_api core_logic_facade',
              'password': password,
              'username': login,
              'response_type': 'id_token token'
          }
      
          authorization_headers = {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Authorization': 'Basic cm8uY2xpZW50OmFtV25Cc3B9dipvfTYkSQ=='
          }
      
          authorization_response = requests.post(
              identity_host,
              data=data,
              headers=authorization_headers,
              verify=False)
      
          authorization_json_response = authorization_response.json()
      
          authorization_token = authorization_json_response['access_token']
      
          authorization_headers = {
              'X-API-VERSION': '2.0',
              'Content-Type': 'application/json',
              'Authorization': 'Bearer ' + authorization_token
          }
      
          return authorization_headers
      
      
      query_headers = get_headers()
      
      
      # Получение статуса экземпляра формы
      response = requests.get(form_states_url, headers=query_headers, verify=False)
      
      json_response = response.json()
      
      # Идентификатор текущего статуса = 4
      # Бизнес-процесс 'Утверждение планов' Статус 'Черновик'
      current_state_id = json_response['states'][0]['id']
      
      # Идентификатор нового статуса, в который будет осуществлён перевод данных = 5
      # Бизнес-процесс 'Утверждение планов' Статус 'Готово к проверке'
      new_state_id = 5
      
      # Идентификатор бизнес-процесса = 3
      business_process_id = 3
      
      # Пользовательский комментарий к переводу статуса
      state_comment = 'Переведено из скрипта'
      
      body = {
          'businessProcessId': business_process_id,
          'stateId': new_state_id,
          'comment': state_comment
      }
      
      # Отправка запроса на перевод данных экземпляра формы в новый статус
      requests.put(form_states_url, headers=query_headers, data=json.dumps(body), verify=False)
  2. В следующем скрипте реализовано:

    1. Получение токена с сервера авторизации;

    2. Получение элемента измерения по фильтру;

    3. Создание элемента, в случае его отсутствия.

      import json
      import requests
      
      identity_host = 'http://' + parameters['domain'] + '/idsrv/connect/token'
      dc_host = 'http://' + parameters['domain'] + '/datacollection/api'  # API
      login = parameters['userName']  # Логин администратора
      password = '******'  # Пароль администратора
      
      # Измерение 'Mediastore. Филиалы'
      # Идентификатор измерения
      dimension_id = 'dim_Filiali'
      # Адрес для работы с элементами измерения
      dimension_elements_url = dc_host + '/dimensions/' + dimension_id + '/elements'
      
      
      # Метод для получения header, которые необходимо добавлять в каждый запрос
      def get_headers():
          #  Получение токена
          data = {
              'grant_type': 'password',
              'scope': 'openid profile email roles viewer_api core_logic_facade',
              'password': password,
              'username': login,
              'response_type': 'id_token token'
          }
      
          authorization_headers = {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Authorization': 'Basic cm8uY2xpZW50OmFtV25Cc3B9dipvfTYkSQ=='
          }
      
          authorization_response = requests.post(
              identity_host,
              data=data,
              headers=authorization_headers,
              verify=False)
      
          authorization_json_response = authorization_response.json()
      
          authorization_token = authorization_json_response['access_token']
      
          authorization_headers = {
              'X-API-VERSION': '2.0',
              'Content-Type': 'application/json',
              'Authorization': 'Bearer ' + authorization_token
          }
      
          return authorization_headers
      
      query_headers = get_headers()
      
      # Создание нового элемента измерения 'Mediastore. Филиалы'
      
      # Фильтр для получения необходимых элементов измерения
      # Необходимо получить элементы с наименованием 'Екатеринбург'
      filter_for_element = {
          'type': 'name',  # Фильтрация осуществляется по наименованию элемента
          'value': 'Екатеринбург',  # Наименование элемента сравнивается со строкой 'Екатеринбург'
          'condition': 'equals'  # Наименование элемента должно полностью совпадать с переданной строкой ('Екатеринбург')
      }
      
      # Отправка запроса для получения элементов измерения
      response = requests.get(dimension_elements_url, headers=query_headers, data=json.dumps(filter_for_element), verify=False)
      
      # Получение тела запроса в JSON формате
      json_response = response.json()
      
      # Получение списка элементов измерения
      elements = json_response['elements']
      
      # Если элементов измерения с наименованием 'Екатеринбург' не найдено
      if len(elements) == 0:
          # То необходимо создать новый элемент
      
          # Описание элемента
          new_elements = [
              {
                  'Name': 'Екатеринбург',  # Наименование элемента
                  'Path': [],  # Создать элемент в корне измерения, т.е. элемент не должен находится ни в каком каталоге
                  'Attributes': [{ "AttributeId": "attr_Tip_filiala", "Value": 1 }]  # Атрибут "Тип филиала" соответствует значению справочника с идентификатором 1
              }
          ]
      
          # Отправка запроса на создание элемента
          response = requests.post(dimension_elements_url, headers=query_headers, data=json.dumps(new_elements), verify=False)
      
          # Получение тела запроса в JSON формате
          json_response = response.json()
      
          print('Количество созданных элементов: ' + str(json_response['added']))
      
      
      
      
      
      
  3. В следующем скрипте реализовано:

    1. Получение токена с сервера авторизации;

    2. Получение элементов группы показателей по фильтру;

    3. Создание новых элементов группы показателей из существующих, путём изменения даты (т.е. элементы за 1 квартал 2020 года копируются в элементы за 1 квартал 2021 года) и увеличением значения на 10%.

      import json
      import requests
      
      identity_host = 'http://' + parameters['domain'] + '/idsrv/connect/token'
      dc_host = 'http://' + parameters['domain'] + '/datacollection/api'  # API
      login = parameters['userName']  # Логин администратора
      password = '******'  # Пароль администратора
      
      # Группа показателей 'Mediastore. План продаж'
      # Идентификатор группы показателей
      measure_group_id = 'measureGroup_Plan_prodazh'
      
      # Адрес для работы с элементами группы показателей
      measure_group_elements_url = dc_host + '/measuregroups/' + measure_group_id + '/elements'
      
      # Метод для получения header, которые необходимо добавлять в каждый запрос
      def get_headers():
          #  Получение токена
          data = {
              'grant_type': 'password',
              'scope': 'openid profile email roles viewer_api core_logic_facade',
              'password': password,
              'username': login,
              'response_type': 'id_token token'
          }
      
          authorization_headers = {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Authorization': 'Basic cm8uY2xpZW50OmFtV25Cc3B9dipvfTYkSQ=='
          }
      
          authorization_response = requests.post(
              identity_host,
              data=data,
              headers=authorization_headers,
              verify=False)
      
          authorization_json_response = authorization_response.json()
      
          authorization_token = authorization_json_response['access_token']
      
          authorization_headers = {
              'X-API-VERSION': '2.0',
              'Content-Type': 'application/json',
              'Authorization': 'Bearer ' + authorization_token
          }
      
          return authorization_headers
      
      
      query_headers = get_headers()
      
      # Получение элементов группы показателей
      # Фильтр для получения элементов группы показателей
      # Осуществляется получение элементов за 1 квартал 2020 года
      filter_for_elements = {
          'type': 'calendar',  # Фильтрация осуществляется по календарю
          'value': '2020-01-01',  # Дата элемента группы показателей сравнивается со значением '2020-01-01'
          'condition': 'equals'  # Дата элемента группы показателей должна совпадать с переданным значением
      }
      
      # Отправка запроса для получения элементов группы показателей по фильтру
      response = requests.get(
          measure_group_elements_url,
          headers=query_headers,
          data=json.dumps(filter_for_elements),
          verify=False)
      
      # Получение результата запроса в формате JSON
      json_response = response.json()
      
      # Получение списка элементов из результата
      elements = json_response['elements']
      
      # Список новых элементов группы показателей
      new_elements = []
      
      # Для каждого полученного элемента
      for element in elements:
          # Создание нового элемента, но с новой датой (1 квартал 2021 года)
          new_element = {
              'value': element['value'] * 1.1,
              'dimensions': [],
              'calendars': [
                  {
                      'id': json_response['measureGroup']['calendar']['id'],
                      'name': json_response['measureGroup']['calendar']['name'],
                      'date': '2021-01-01'
                  }
              ],
          }
      
          # Копирование элементов измерений в новый элемент группы показателей
          for coordinate in element['dimensionElements']:
              new_element['dimensions'].append({
                  'id': coordinate['dimensionId'],
                  'elementId': coordinate['elementId']
              })
      
          # Добавление нового элемента в список
          new_elements.append(new_element)
      
      # Если есть хотя бы один элемент для создания
      if len(new_elements) > 0:
          # Отправка новый элементов в DataCollection
          response = requests.post(measure_group_elements_url, headers=query_headers, data=json.dumps(new_elements), verify=False)
      
          json_response = response.json()
      
          print('Количество созданных элементов: ' + str(json_response['created']))
      
      
      
  4. В следующем скрипте реализовано:

    1. Получение токена с сервера авторизации;

    2. Получение элементов группы показателей по фильтру из экземпляра формы;

    3. Обновление комментария у полученных элементов группы показателей.

      import json
      import requests
      import datetime
      
      from datetime import datetime
      
      identity_host = 'http://' + parameters['domain'] + '/idsrv/connect/token'
      dc_host = 'http://' + parameters['domain'] + '/datacollection/api'  # API
      login = parameters['userName']  # Логин администратора
      password = '******'  # Пароль администратора
      
      form_instance = parameters['formInstance']
      
      dimensionUnqiueName_Filiali = form_instance['Circulation']['DimensionElements'][0]['Dimension']['UniqueName']
      dimensionUniqueName_Versii = form_instance['Circulation']['DimensionElements'][1]['Dimension']['UniqueName']
      
      calendarValue = datetime.strptime(form_instance['Circulation']['CalendarFolders'][0]['Folder']['AbsolutelyValue'], '%Y-%m-%dT%H:%M:%SZ')
      
      dimensionValue_Filiali = form_instance['Circulation']['DimensionElements'][0]['Element']['Id']
      dimensionValue_Versii = form_instance['Circulation']['DimensionElements'][1]['Element']['Id']
      
      # Группа показателей 'Mediastore. План продаж'
      # Идентификатор группы показателей
      measure_group_id = 'measureGroup_Plan_prodazh'
      
      # Адрес для работы с элементами группы показателей
      measure_group_elements_url = dc_host + '/measuregroups/' + measure_group_id + '/elements'
      
      # Метод для получения header, которые необходимо добавлять в каждый запрос
      def get_headers():
          #  Получение токена
          data = {
              'grant_type': 'password',
              'scope': 'openid profile email roles viewer_api core_logic_facade',
              'password': password,
              'username': login,
              'response_type': 'id_token token'
          }
      
          authorization_headers = {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Authorization': 'Basic cm8uY2xpZW50OmFtV25Cc3B9dipvfTYkSQ=='
          }
      
          authorization_response = requests.post(
              identity_host,
              data=data,
              headers=authorization_headers,
              verify=False)
      
          authorization_json_response = authorization_response.json()
      
          authorization_token = authorization_json_response['access_token']
      
          authorization_headers = {
              'X-API-VERSION': '2.0',
              'Content-Type': 'application/json',
              'Authorization': 'Bearer ' + authorization_token
          }
      
          return authorization_headers
      
      
      query_headers = get_headers()
      
      # Получение элементов группы показателей
      # Фильтр для получения элементов группы показателей
      filter_for_elements = {
          "operation": "and",
          "filters": [
              {
                  "value": calendarValue.strftime('%Y-%m-%d'), "type": "calendar", "condition": "equals"
              },
              {
                  'type': 'DimensionId',  # Фильтрация осуществляется по элементу измерению
                  'value': dimensionValue_Filiali,  # Идентификатор элемента получается из экземпляра
                  'condition': 'equals',  # Идентификатор элемента измерения должен совпадать с переданным значением,
                  'name': dimensionUnqiueName_Filiali  # Идентификатор измерения, по которому осуществляется фильтрация
              },
              {
                  'type': 'DimensionId',
                  'value': dimensionValue_Versii,
                  'condition': 'equals',
                  'name': dimensionUniqueName_Versii
              }     
          ]
      }
      
      # Отправка запроса для получения элементов группы показателей по фильтру
      response = requests.get(
          measure_group_elements_url,
          headers=query_headers,
          data=json.dumps(filter_for_elements),
          verify=False)
      
      # Получение результата запроса в формате JSON
      json_response = response.json()
      
      # Получение списка элементов из результата
      elements = json_response['elements']
      
      # Список новых элементов группы показателей
      new_elements = []
      
      # Для каждого полученного элемента
      for element in elements:
          # Создание нового элемента, но с пустым значением и новым комментарием
          new_element = {
              'value': element['value'],
              'comment': 'Обновлено из скрипта',
              'mustUpdateComment': True,
              'dimensions': [],
              'calendars': [
                  {
                      'id': json_response['measureGroup']['calendar']['id'],
                      'name': json_response['measureGroup']['calendar']['name'],
                      'date': element['calendar']['date'][:10]
                  }
              ],
          }
      
          # Копирование элементов измерений в новый элемент группы показателей
          for coordinate in element['dimensionElements']:
              new_element['dimensions'].append({
                  'id': coordinate['dimensionId'],
                  'elementId': coordinate['elementId']
              })
      
          # Добавление нового элемента в список
          new_elements.append(new_element)
      
      # Если есть хотя бы один элемент для создания
      if len(new_elements) > 0:
          # Отправка новый элементов в DataCollection
          response = requests.post(measure_group_elements_url, headers=query_headers, data=json.dumps(new_elements), verify=False)
      
          json_response = response.json()
      
          print('Количество созданных элементов: ' + str(json_response['created']))
  5. В следующем скрипте реализовано:
    1. Получение токена с сервера авторизации;

    2. Получение элементов группы показателей из экземпляра формы;

    3. Копирование данных из формы в аналогичную форму другой группы показателей, при условии, что оригинальная форма в статусе "согласовано".

      # Группа pythonMG_master имеет атрибут reconciliation(логическое) для статуса переноса
      # Формы тиражируются по календарю и измерению python_dim_t
      # Общее измерение показателей в обеих группах показателей 
      # Бизнес-процесс с конечным статусом "согласовано"
      
      import json
      import requests
      
      identity_host = 'http://' + parameters['domain'] + '/idsrv/connect/token'
      dc_host = 'http://' + parameters['domain'] + '/datacollection/api'  # API
      login = parameters['userName']  # Логин администратора
      password = '*******'  # Пароль администратора
      CIRCULATION_DIMENSION = 'dim_python_dim_t' #тиражное измерение 
      FINISH_STATE = u'согласовано' #статус формы, для которого работает перенос
      
      # Идентификатор группы показателей
      measure_group_id = 'measureGroup_pythonMG_master' #откуда копируем
      copy_measure_group_id = 'measureGroup_pythonMG_slave' #куда копируем
      form_instance_id = parameters['formInstance']['Id'] #экземпляр текущей формы
      
      # Адреса для работы с элементами группы показателей
      measure_group_elements_url = dc_host + '/measuregroups/' + measure_group_id + '/elements'
      measure_group_attrib_url = dc_host + '/measuregroups/' + measure_group_id + '/attributes'
      copy_measure_group_elements_url = dc_host + '/measuregroups/' + copy_measure_group_id + '/elements'
      form_states_url = dc_host + '/measuregroups/' + measure_group_id + '/forms/' + form_instance_id + '/states'
      
      # Метод для получения header, которые необходимо добавлять в каждый запрос
      def get_headers():
          #  Получение токена
          data = {
              'grant_type': 'password',
              'scope': 'openid profile email roles viewer_api core_logic_facade',
              'password': password,
              'username': login,
              'response_type': 'id_token token'
          }
      
          authorization_headers = {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Authorization': 'Basic cm8uY2xpZW50OmFtV25Cc3B9dipvfTYkSQ=='
          }
          
          authorization_response = requests.post(identity_host,data=data,headers=authorization_headers,verify=False)
          authorization_json_response = authorization_response.json()
          authorization_token = authorization_json_response['access_token']
          
          authorization_headers = {
              'X-API-VERSION': '2.0',
              'Content-Type': 'application/json',
              'Authorization': 'Bearer ' + authorization_token
          }
      
          return authorization_headers
      
      query_headers = get_headers()
      
      # Получение элементов группы показателей
      # Отправка запроса для получения элементов группы показателей по фильтру
      
      response = requests.get(measure_group_elements_url,headers=query_headers,verify=False)
      
      # Получение результата запроса в формате JSON
      json_response = response.json()
      
      # Получение списка элементов и ГП из результата
      elements = json_response['elements']
      measure_group = json_response['measureGroup']
      
      new_elements = []
      old_elements = []
      
      # Получие состояния текущей формы
      response = requests.get(form_states_url, headers=query_headers, verify=False)
      json_response = response.json() 
      
      current_state = ''
      
      #получаем статус формы
      if json_response['states']:
          current_state = json_response['states'][0]['name']
      #получаем дату тиража формы 
      form_date = json_response['form']['coordinates'][0]['value']['id'][:10]
      current_circulation_dim_id = -1
      
      #получение дополнительной координаты из тиража кроме даты (python_dim_t)
      for form_coordinate in json_response['form']['coordinates']:
          if form_coordinate['description']['uniqueName'] == CIRCULATION_DIMENSION :
              current_circulation_dim_id = form_coordinate['value']['id']
      
      #копируем только согласованную форму
      if current_state == FINISH_STATE :
          for element in elements:
              # Добавляем в список элемент, если дата формы и элемента совпали
              # копируются только данные с формы
              
              element_dim_id = -1 
                     
              for dims in element['dimensionElements']:
                  if dims['dimensionId'] == 'dim_python_dim_t':
                      element_dim_id = dims['elementId']
                      
              if element['calendar']['date'][:10] == form_date and current_circulation_dim_id == element_dim_id :
                  new_element = {
                      'value': element['value'],
                      'dimensions': [],
                      'calendars': [
                          {
                              'id': measure_group['calendar']['id'],
                              'name': measure_group['calendar']['name'],
                              'date': element['calendar']['date'][:10]
                          }
                      ],
                      'measure': {
                          'id': element['measureElements'][0]['measureId'],
                          'elementId': element['measureElements'][0]['elementId']
                      }
                  }
                  
                  # Копирование элементов измерений в новый элемент группы показателей
                  for coordinate in element['dimensionElements']:
                      new_element['dimensions'].append({
                          'id': coordinate['dimensionId'],
                          'elementId': coordinate['elementId']
                      })
      
                  
                  old_element = dict(new_element)
                  #устанавливаем атрибут - признак переноса в true
                  old_element['Attributes'] = []
                  old_element['Attributes'].append( 
                          {
                              'Id': 'attr_reconciliation',
                              'value':'true'
                          }
                  )
                  # Добавление нового элемента в список
                  new_elements.append(new_element)
                  old_elements.append(old_element)
                  
          #корректируем старые элементы        
          if len(old_elements) > 0:
             response = requests.post(measure_group_elements_url, headers=query_headers, data=json.dumps(old_elements), verify=False)
          #добавляем новые элементы
          if len(new_elements) > 0:
             response = requests.post(copy_measure_group_elements_url, headers=query_headers, data=json.dumps(new_elements), verify=False)

Примечание – В скриптах отключена проверка HTTPS сертификата для демонстрации логики написания скриптов. На реальных задачах отключение проверки сертификата не рекомендуется.

Примечание – В конфигурации по умолчанию сервис выполнения скриптов будет показывать ошибку при попытке выполнить скрипт с отключенной проверкой HTTPS сертификата, не смотря на то, что скрипт будет выполнен успешно. Если на проекте или макете отключение допустимо, необходимо кастомизировать конфигурацию.

Related content

Примеры скриптов
Примеры скриптов
More like this
Примеры скриптов
Примеры скриптов
More like this
Примеры скриптов
Примеры скриптов
More like this
Примеры скриптов
Примеры скриптов
More like this
Примеры скриптов
Примеры скриптов
More like this
Примеры скриптов
Примеры скриптов
More like this