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

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

  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 сертификата, не смотря на то, что скрипт будет выполнен успешно. Если на проекте или макете отключение допустимо, необходимо кастомизировать конфигурацию.