def but2_1(self):
     # Чистым главное окно
     self.central_widget = QWidget()
     self.setCentralWidget(self.central_widget)
     self.sly = QVBoxLayout(self.central_widget)
     self.statusBar().showMessage('')
     fold_id = check_007('all-007')
     if (fold_id == '0'):
         tx_win = 'Попередження про неможливість виконання запущеної команди'
         tx_mes = 'Для створення наборів даних на відповідному порталі Ви маєте спочатку внести в цю програму «Основні' \
                  ' відомості по розпоряднику інформації».\nЦе слід зробити за допомогою виконання відповідної команди' \
                  ' в меню «Налаштування програми».'
         univ_message(tx_win, tx_mes, QMessageBox.Warning)
         main_screen(self)
     st_ms = 'Зачекайте завершення створення наборів даних на порталі'
     start_pbar(self, st_ms)
     metka, dset_reg, id_reg = check_emptiness(self, fold_id)
     if (metka == -1):
         self.pbar.deleteLater()
         main_screen(self)
     if ((len(dset_reg) == 0) and (metka != -1)):
         tx_win = 'Попередження про неможливість виконання запущеної команди'
         tx_mes = 'Для створення наборів даних на відповідному порталі Ви маєте спочатку сформувати спеціальний реєстр' \
                  ' всіх тих наборів даних, які зараз знаходяться у Вашому індивідуальному сховище.\nЦе слід зробити' \
                  ' за допомогою виконання команди «Формування реєстру наборів даних» в меню «Налаштування програми».'
         univ_message(tx_win, tx_mes, QMessageBox.Warning)
         self.pbar.deleteLater()
         main_screen(self)
     if ((len(dset_reg) > 0) and (metka != -1)):
         onlay_dset(self, dset_reg, id_reg)
         self.pbar.deleteLater()
         main_screen(self)
 def mfunc3_6(self):
     # Чистым главное окно
     self.central_widget = QWidget()
     self.setCentralWidget(self.central_widget)
     self.sly = QVBoxLayout(self.central_widget)
     self.statusBar().showMessage('')
     fold_id = check_007('all-007')
     if (fold_id == '0'):
         tx_win = 'Попередження про неможливість виконання запущеної команди'
         tx_mes = 'Для редагування реєстру ресурсів наборів даних Ви маєте спочатку внести в Менджер форматорів «Основні' \
                  ' відомості по розпоряднику інформації».\nЦе можна зробити за допомогою виконання відповідної' \
                  ' команди в меню «Налаштування програми».'
         univ_message(tx_win, tx_mes, QMessageBox.Warning)
         main_screen(self)
     res_reg_open(self, 'all-007', fold_id)
     main_screen(self)
 def mfunc3_5(self):
     # Чистым главное окно
     self.central_widget = QWidget()
     self.setCentralWidget(self.central_widget)
     self.sly = QVBoxLayout(self.central_widget)
     self.statusBar().showMessage('')
     fold_id = check_007('all-007')
     if (fold_id == '0'):
         tx_win = 'Попередження про неможливість виконання запущеної команди'
         tx_mes = 'Для формування реєстру ресурсов наборів даних Ви маєте спочатку внести в програму «Основні' \
                  ' відомості по розпоряднику інформації».\nЦе можна зробити за допомогою виконання відповідної' \
                  ' команди в меню «Налаштування програми».'
         univ_message(tx_win, tx_mes, QMessageBox.Warning)
         main_screen(self)
     st_ms = 'Зачекайте завершення формування реєстру ресурсів наборів даних'
     start_pbar(self, st_ms)
     res_registr(self, 'all-007')
     self.pbar.deleteLater()
     main_screen(self)
 def but2_2(self):
     # Чистым главное окно
     self.central_widget = QWidget()
     self.setCentralWidget(self.central_widget)
     self.sly = QVBoxLayout(self.central_widget)
     self.statusBar().showMessage('')
     fold_id = check_007('all-007')
     if (fold_id == '0'):
         tx_win = 'Попередження про неможливість виконання запущеної команди'
         tx_mes = 'Для опублікування обраних ресурсів на відповідному порталі Ви маєте спочатку внести в цю програму' \
                  ' «Основні відомості по розпоряднику».\nЦе слід зробити за допомогою виконання відповідної' \
                  ' команди в меню «Налаштування програми».'
         univ_message(tx_win, tx_mes, QMessageBox.Warning)
         main_screen(self)
     st_ms = 'Зачекайте завершення процесу публікації ресурсів на порталі'
     start_pbar(self, st_ms)
     onlay_resource(self, fold_id)
     self.pbar.deleteLater()
     main_screen(self)
 def but2_4(self):
     # Чистым главное окно
     self.central_widget = QWidget()
     self.setCentralWidget(self.central_widget)
     self.sly = QVBoxLayout(self.central_widget)
     self.statusBar().showMessage('')
     fold_id = check_007('all-007')
     if (fold_id == '0'):
         tx_win = 'Попередження про неможливість виконання запущеної команди'
         tx_mes = 'Для оновлення ресурсів наборів даних на порталі Ви маєте спочатку:\n1. Внести в цю програму' \
                  ' «Основні відомості по розпоряднику інформації»\nза допомогою відповідної команди в меню «Налаштування програми».' \
                  '\n2. Опублікувати відповідні ресурси наборів даних за допомогою команди «Публікація ресурсів з Форматорів» в меню' \
                  ' «Публікація даних».\n3. Внести бажані зміни в описи ресурсів, які розміщені у Вашому індивідуальному сховище.\n4.' \
                  ' Сформувати спеціальний реєстр ресурсів, котрі розміщені у Вас в вищеназваному сховищі за допомогою команди' \
                  ' «Формування реєстру ресурсів» в меню «Налаштування програми».'
         univ_message(tx_win, tx_mes, QMessageBox.Warning)
         main_screen(self)
     st_ms = 'Зачекайте завершення процесу оновлення ресурсів на порталі'
     start_pbar(self, st_ms)
     upd_resource(self, fold_id)
     self.pbar.deleteLater()
     main_screen(self)
 def but2_3(self):
     # Чистым главное окно
     self.central_widget = QWidget()
     self.setCentralWidget(self.central_widget)
     self.sly = QVBoxLayout(self.central_widget)
     self.statusBar().showMessage('')
     fold_id = check_007('all-007')
     if (fold_id == '0'):
         tx_win = 'Попередження про неможливість виконання запущеної команди'
         tx_mes = 'Для оновлення наборів даних на відповідному порталі Ви маєте спочатку:\n1. Внести в цю програму' \
                  ' «Основні відомості по розпоряднику інформації» за допомогою відповідної команди в меню «Налаштування програми».' \
                  '\n2. Створити відповідні набори даних за допомогою команди «Створення наборів даних» в меню' \
                  ' «Публікація даних».\n3. Внести бажані зміни в ті паспорта необхідних Вам наборів даних, які розміщені' \
                  ' у Вашому індивідуальному сховище.\n4. Сформувати спеціальний реєстр всіх наборів даних, розміщених у' \
                  ' Вас в вищеназваному сховищі за допомогою команди «Формування реєстру наборів даних» в меню «Налаштування програми».'
         univ_message(tx_win, tx_mes, QMessageBox.Warning)
         main_screen(self)
     st_ms = 'Зачекайте завершення прцесу оновлення наборів даних'
     start_pbar(self, st_ms)
     metka, dset_reg, id_reg = check_emptiness(self, fold_id)
     if (metka == -1):
         self.pbar.deleteLater()
         main_screen(self)
     if ((len(dset_reg) == 0) and (metka != -1)):
         tx_win = 'Попередження про неможливість виконання запущеної команди'
         tx_mes = 'Для оновлення наборів даних на відповідному порталі Ви маєте спочатку:\n1. Створити відповідні набори' \
                  ' даних за допомогою команди «Створення наборів даних» в меню «Публікація даних».\n2. Внести бажані зміни' \
                  ' в ті паспорта необхідних Вам наборів даних, які розміщені у Вашому індивідуальному сховище.\n3. Сформувати' \
                  ' спеціальний реєстр всіх наборів даних, розміщених у Вас в вищеназваному сховищі за допомогою' \
                  ' команди «Формування реєстру наборів даних» в меню «Налаштування програми».'
         univ_message(tx_win, tx_mes, QMessageBox.Warning)
         self.pbar.deleteLater()
         main_screen(self)
     if ((len(dset_reg) > 0) and (metka != -1)):
         upd_dset(self, dset_reg, id_reg)
         self.pbar.deleteLater()
         main_screen(self)
Beispiel #7
0
def upd_resource(self, fold_id):
    # fold_id - ID папки, по которой нам необходимо найти данные
    # id1_reg - ID файла registerFormatter
    # id2_reg - ID файла resourceRegistryFormatter
    # res_reg - Массив информации из реестра ресурсов наборов данных
    # fin_res - Массив информации по выбранным ресурсам, которые следует опубликовать на портале
    res_new = []  # Массив обновленных значений реестра ресурсов наборов данных
    m_ds = []  # Массив для папок и ID наборов данных, уже созданных на портале
    res_reg = [
    ]  # Сведения о ресурсах наборах данных, которые находятся в реестре
    fin_res = [
    ]  # Итоговый результат данных, которые будут использованы для публикации ресурсов
    msg2 = QMessageBox()
    msg2.setIcon(QMessageBox.Information)
    msg2.setWindowTitle(
        'Інформація про призначення команди щодо оновлення ресурсів наборів даних'
    )
    msg2.setWindowIcon(QIcon('profile\logo.png'))
    msg2.setText(
        'Слід мати на увазі, що дана команда оновлює лише описи вибраних ресурсів, але не змінює самі ресурси,'
        ' Тому, якщо Ви хочете розмістити в наборі додатковий ресурс, наприклад, з даними за новий період, то'
        ' Вам слід вскористатися командою «Публікація ресурсів з Форматорів» в меню «Публікація даних».'
    )
    msg2.setInformativeText(
        'Якщо ж Ви хочете змінити назву будь-якого ресурсу (наприклад, поміняти List2019 на List2019-2020)'
        ' або змінити його опис, то дана команда якраз для цього і призначена. Але, потрібно пам\'ятати,'
        ' що попередньо, крім зміни опису ресурсу необхідно ще й оновити відповідний реєстр за допомогою'
        ' команди «Формування реєстру ресурсів» в меню «Налаштування програми».'
    )
    okButton2 = msg2.addButton(' Продовжувати виконання команди ',
                               QMessageBox.AcceptRole)
    msg2.addButton(' Вийти з команди ', QMessageBox.RejectRole)
    msg2.exec()
    if (msg2.clickedButton() != okButton2): return
    self.pbar.setValue(10)
    searh1 = "'" + fold_id + "'" + ' in parents'  # Формирование строки для поиска всех файлов в заданной папке
    results = self.pers_account.files().list(
        fields="nextPageToken, files(id, name)", q=searh1).execute()
    fnumb = len(results.get('files', []))
    for f in range(fnumb):
        f_name = results.get('files', [])[f]['name']
        if (f_name == 'registerFormatter'):
            id1_reg = results.get('files', [])[f]['id']
            name1_reg = f_name
        if (f_name == 'resourceRegistryFormatter'):
            id2_reg = results.get('files', [])[f]['id']
            name2_reg = f_name
    # Формируем массив со сведениями об уже имеющихся ID в реестре наборов данных
    pers_sheet = work_sheet()
    cell_range = 'Register!A2:C'
    result = pers_sheet.spreadsheets().values().get(
        spreadsheetId=id1_reg, range=cell_range).execute()
    values = result.get('values', [])
    for st in values:
        m_ds.append(dict(A=st[0], B=st[1], C=st[2]))
    # Формируем массив со сведениями об уже имеющихся данных в реестре ресурсов наборов данных
    cell_range = 'ResourceRegistry!A2:G'
    result = pers_sheet.spreadsheets().values().get(
        spreadsheetId=id2_reg, range=cell_range).execute()
    values = result.get('values', [])
    for st in values:
        res_reg.append(
            dict(A=st[0], B=st[1], C=st[2], D=st[3], E=st[4], F=st[5],
                 G=st[6]))
    if (len(res_reg) == 0):
        tx_win = 'Попередження про неможливість виконання запущеної команди'
        tx_mes = 'Для оновлення ресурсів наборів даних на порталі Ви маєте спочатку:\n1. Опублікувати відповідні' \
                 ' ресурси наборів даних за допомогою команди «Публікація ресурсів з Форматорів» в меню «Публікація даних».\n2.' \
                 ' Внести бажані зміни в ті описи ресурсів наборів даних, які розміщені у Вашому індивідуальному сховище.\n3.' \
                 ' Сформувати спеціальний реєстр всіх ресурсів наборів даних, розміщених у Вас в вищеназваному сховищі за допомогою' \
                 ' команди «Формування реєстру ресурсів» в меню «Налаштування програми».'
        univ_message(tx_win, tx_mes, QMessageBox.Warning)
        return
    for sp1 in self.act_l:
        for sp2 in m_ds:
            if (sp2['A'] == sp1['folder']):
                if (sp2['B'] == 'null'):
                    tx_win = 'Попередження про неможливість виконання запущеної команди'
                    tx_mes = 'На жаль, обрані Вами ресурси для набору даних:\n\n- ' + sp2['C'] +\
                             '\n\nне можуть бути опубліковані через відсутність набору на порталі, або через те, що у' \
                             ' реєстрі наборів даних немає його ID.\n\nДля вирішення проблеми Вам необхідно за допомогою' \
                             ' відповідних команд даної програми або клонувати потрібний набір на портал, або відредагувати' \
                             ' реєстр наборів даних, внісши в нього ID для необхідного набору'
                    univ_message(tx_win, tx_mes, QMessageBox.Warning)
                    return
                for sp3 in res_reg:
                    if ((sp3['A'] == sp2['A']) and (sp1['file'] == sp3['D'])):
                        if (sp3['C'] == 'null'):
                            tx_win = 'Попередження про неможливість виконання запущеної команди'
                            tx_mes = 'У Вас поки що немає на порталі такого ресурсу, як:\n\n - ' + sp3['E'] +\
                                     '\n\nТому, оновлення вищеназваного ресурсу зараз неможливо.'
                            univ_message(tx_win, tx_mes, QMessageBox.Warning)
                            return
                        st1 = sp3['D'] + 'Formatter'
                        fin_res.append(
                            dict(A=sp3['A'],
                                 B=sp2['B'],
                                 C=sp3['C'],
                                 D1=sp3['D'],
                                 D2=st1,
                                 E=sp3['E'],
                                 F=sp3['F'],
                                 G=sp3['G'],
                                 url='url'))
    self.pbar.setValue(20)
    l1 = len(fin_res)
    fold1 = 'fold'
    pb_step = round(60 / l1)
    pb = 20
    for i in range(l1):
        pb = pb + pb_step
        self.pbar.setValue(pb)
        fold = fin_res[i]['A']
        fil_name = fin_res[i]['D2']
        if (fold != fold1):
            for f in self.isx_list:
                if (f['folder'] == fold):
                    fold_id = f['id']
                    fold1 = fold
                    break
        searh1 = "'" + fold_id + "'" + ' in parents'  # Формирование строки для поиска всех файлов в заданной папке
        results = self.pers_account.files().list(
            fields="nextPageToken, files(id, name)", q=searh1).execute()
        fnumb = len(results.get('files', []))
        for f in range(fnumb):
            f_n = results.get('files', [])[f]['name']
            if (f_n == fil_name):
                file_id = results.get('files', [])[f]['id']
                sh_met = pers_sheet.spreadsheets().get(
                    spreadsheetId=file_id).execute()
                properties = sh_met.get('sheets')
                for item in properties:
                    title = item.get("properties").get('title')
                    titl1 = title.lower()
                    titl2 = fin_res[i]['D1'].lower()
                    if (titl1 == titl2):
                        sheet_id = item.get("properties").get('sheetId')
                        st_url = 'https://docs.google.com/spreadsheets/d/' + file_id + '/export?format=csv&id=' + \
                                 file_id + '&gid=' + str(sheet_id)
                        fin_res[i]['url'] = st_url
                        break
    mas1 = init_dil1()  # Подтягиваем основные данные распорядителя информации
    key_api = mas1['key_api_steward']
    path = mas1['baseLinkWebsite'] + '/api/3/action/resource_update'
    l1 = len(fin_res)
    self.pbar.setValue(90)
    for i in range(l1):
        data = {
            'id': fin_res[i]['C'],
            'url': fin_res[i]['url'],
            'name': fin_res[i]['E'],
            'description': fin_res[i]['F'],
            'format': 'CSV',
        }
        headers = {'X-CKAN-API-Key': key_api}
        response = requests.post(path, data=data, headers=headers)
        response_dict = json.loads(response.content)
        flag = response_dict['success']
        if (flag):
            l2 = len(res_reg)
            for j in range(l2):
                if ((res_reg[j]['A'] == fin_res[i]['A'])
                        and (res_reg[j]['D'] == fin_res[i]['D1'])):
                    rs1 = response_dict['result']
                    res_reg[j]['B'] = fin_res[i]['B']
                    res_reg[j]['C'] = rs1['id']
    for rs2 in res_reg:
        if (rs2['B'] == 'null'): rs2['B'] = ''
        if (rs2['C'] == 'null'): rs2['C'] = ''
        if (rs2['D'] == 'null'): rs2['D'] = ''
        if (rs2['E'] == 'null'): rs2['E'] = ''
        if (rs2['F'] == 'null'): rs2['F'] = ''
        if (rs2['G'] == 'null'): rs2['G'] = ''
        m_rs = [
            rs2['A'], rs2['B'], rs2['C'], rs2['D'], rs2['E'], rs2['F'],
            rs2['G']
        ]
        res_new.append(m_rs)
    cell_range = 'Введення даних!A3:G'
    self.pbar.setValue(100)
    # pers_sheet = work_sheet()
    response = pers_sheet.spreadsheets().values().clear(
        spreadsheetId=id2_reg, range=cell_range).execute()
    cell_range = 'Введення даних!A3:G' + str(2 + len(res_new))
    zn = {'values': res_new}
    response = pers_sheet.spreadsheets().values().update(
        spreadsheetId=id2_reg,
        range=cell_range,
        valueInputOption='RAW',
        body=zn).execute()
    return
Beispiel #8
0
def upd_dset(self, dset_reg, id_reg):
    s_set = []  # список для выбранных наборов данны
    dataset = [
    ]  # Массив сведений для создания на портале выбранных наборв данных
    dset_new = []  # Массив обновленных значений реестра наборов данных
    # Формируем список из тех наборов данных, которые были выбраны для дальнейшего их обновления на портале
    n = len(self.isx_list)
    for i in range(self.spisok2.count()):
        name1 = self.spisok2.item(i).text()
        l1 = len(self.full_list)
        for i1 in range(l1):
            if ((self.full_list[i1]['name'] == name1)
                    and (self.full_list[i1]['metka'] != 'groups')):
                s_set.append(dict(folder=self.full_list[i1]['metka']))
                break
    # Формируем все необходимые сведения для обновления выбранных наборов данных на портале
    for st in s_set:
        metka1 = 0
        for rec in dset_reg:
            if (st['folder'] == rec['A']):
                if (rec['B'] == 'null'):
                    tx_win = 'Попередження про неможливість виконання запущеної команди'
                    tx_mes = 'У Вас поки що немає на порталі такого набору даних, як:\n\n - ' + rec['C']\
                             + '\n\nТому, оновлення вищеназваного набору зараз неможливо.'
                    univ_message(tx_win, tx_mes, QMessageBox.Warning)
                    return
                name_str = rec['B']
                title_str = rec['C']
                if (len(title_str) > 254): title_str = title_str[0:253]
                notes_str = rec['D']
                if (len(notes_str) > 400): notes_str = notes_str[0:399]
                tag_str = rec['F']
                if (len(tag_str) > 400): tag_str = notes_str[0:399]
                purp_coll = rec['G']
                if (len(purp_coll) > 400): purp_coll = notes_str[0:399]
                up_fr = rec['E']
                if (up_fr == 'Щодня'): up_fr = 'once a day'
                if (up_fr == 'Щотижня'): up_fr = 'once a week'
                if (up_fr == 'Щомісяця'): up_fr = 'once a month'
                if (up_fr == 'Щокварталу'): up_fr = 'once a quarter'
                if (up_fr == 'Кожні півроку'): up_fr = 'once a half year'
                if (up_fr == 'Щороку'): up_fr = 'once a year'
                if (up_fr == 'Відразу після внесення змін'):
                    up_fr = 'immediately after making changes'
                if (up_fr == 'Більше одного разу на день'):
                    up_fr = 'more than once a day'
                if (up_fr == 'Позапланово'): up_fr = 'unscheduled'
                lang = rec['J']
                if (lang == 'Українська'): lang = 'ua'
                if (lang == 'Російська'): lang = 'ru'
                if (lang == 'Англійська'): lang = 'en'
                if (lang == 'Румунська'): lang = 'ro'
                if (lang == 'Угорська'): lang = 'hu'
                if (lang == 'Болгарська'): lang = 'bg'
                if (lang == 'Польська'): lang = 'pl'
                dataset.append(
                    dict(folder=rec['A'],
                         name=name_str,
                         title=title_str,
                         notes=notes_str,
                         tag=tag_str,
                         maintainer=rec['M'],
                         m_email=rec['N'],
                         purpose_collecting=purp_coll,
                         up_frequency=up_fr,
                         language=lang,
                         publisherIdentifier=rec['L']))
                metka1 = 1
                break
        if (metka1 == 0):
            tx_win = 'Попередження про неможливість виконання запущеної команди'
            tx_mes = 'Деякі вибрані Вами набори даних відсутні у відповідному реєстрі, тому попередньо Вам слід:\n1. Створити' \
                     ' відповідні набори даних за допомогою команди «Створення наборів даних» в меню «Публікація даних».\n2.' \
                     ' Внести бажані зміни в ті паспорта необхідних Вам наборів даних, які розміщені у Вашому індивідуальному' \
                     ' сховище.\n3. Сформувати спеціальний реєстр всіх наборів даних, розміщених у Вас в вищеназваному сховищі' \
                     ' за допомогою команди «Формування реєстру наборів даних» в меню «Налаштування програми».'
            univ_message(tx_win, tx_mes, QMessageBox.Warning)
            return
    # Обновляем выбранные наборы данных на портале
    pb_step = round(80 / len(dataset))
    pb = pb_step
    mas1 = init_dil1()  # Подтягиваем основные данные распорядителя информации
    key_api = mas1['key_api_steward']
    organization = mas1['organization_id']
    path1 = mas1['baseLinkWebsite'] + '/api/3/action/package_update'
    path2 = mas1['baseLinkWebsite'] + '/dataset/'
    l1 = len(dset_reg)
    pers_sheet = work_sheet()
    for d_st in dataset:
        pb = pb + pb_step
        self.pbar.setValue(pb)
        data_dict = {
            'name':
            d_st['name'],
            'title':
            d_st['title'],
            'notes':
            d_st['notes'],
            'tag_string':
            str_valid(d_st['tag']),
            'owner_org':
            organization,
            'maintainer':
            d_st['maintainer'],
            'maintainer_email':
            d_st['m_email'],
            'extras': [{
                'key': 'purpose_of_collecting_information',
                'value': d_st['purpose_collecting']
            }, {
                'key': 'update_frequency',
                'value': d_st['up_frequency']
            }, {
                'key': 'language',
                'value': d_st['language']
            }, {
                'key': 'publisherIdentifier',
                'value': d_st['publisherIdentifier']
            }]
        }
        data = str(json.dumps(data_dict))
        headers = {
            'Authorization': key_api,
            'Content-Type': 'application/json'
        }
        response = requests.post(path1, headers=headers, data=data)
        response_dict = json.loads(response.content)
        flag = response_dict['success']
        if (flag):
            for i in range(l1):
                if (dset_reg[i]['A'] == d_st['folder']):
                    dset_reg[i]['B'] = d_st['name']
                    dset_reg[i]['H'] = path2 + d_st['name']
                    dset_reg[i]['I'] = 'CSV'
    for ds in dset_reg:
        if (ds['B'] == 'null'): ds['B'] = ''
        if (ds['C'] == 'null'): ds['C'] = ''
        if (ds['D'] == 'null'): ds['D'] = ''
        if (ds['E'] == 'null'): ds['E'] = ''
        if (ds['F'] == 'null'): ds['F'] = ''
        if (ds['G'] == 'null'): ds['G'] = ''
        if (ds['H'] == 'null'): ds['H'] = ''
        if (ds['I'] == 'null'): ds['I'] = ''
        if (ds['J'] == 'null'): ds['J'] = ''
        if (ds['K'] == 'null'): ds['K'] = ''
        if (ds['L'] == 'null'): ds['L'] = ''
        if (ds['M'] == 'null'): ds['M'] = ''
        if (ds['N'] == 'null'): ds['N'] = ''
        ds1 = [
            ds['A'], ds['B'], ds['C'], ds['D'], ds['E'], ds['F'], ds['G'],
            ds['H'], ds['I'], ds['J'], ds['K'], ds['L'], ds['M'], ds['N']
        ]
        dset_new.append(ds1)
    self.pbar.setValue(100)
    cell_range = 'Введення даних!A3:N'
    response = pers_sheet.spreadsheets().values().clear(
        spreadsheetId=id_reg, range=cell_range).execute()
    cell_range = 'Введення даних!A3:N' + str(2 + len(dset_new))
    zn = {'values': dset_new}
    response = pers_sheet.spreadsheets().values().update(
        spreadsheetId=id_reg,
        range=cell_range,
        valueInputOption='RAW',
        body=zn).execute()
Beispiel #9
0
def onlay_resource(self, fold_id):
    # fold_id - ID папки, по которой нам необходимо найти данные
    # id1_reg - ID файла registerFormatter
    # id2_reg - ID файла resourceRegistryFormatter
    # res_reg - Массив информации из реестра ресурсов наборов данных
    # fin_res - Массив информации по выбранным ресурсам, которые следует опубликовать на портале
    res_new = []  # Массив обновленных значений реестра ресурсов наборов данных
    m_ds = []  # Массив для папок и ID наборов данных, уже созданных на портале
    res_reg = [
    ]  # Сведения о ресурсах наборах данных, которые находятся в реестре
    fin_res = [
    ]  # Итоговый результат данных, которые будут использованы для публикации ресурсов
    self.msg2, self.okButton2 = create_msg2_2()
    self.msg2.setText(
        'Для того, щоб вибрані Вами ресурси наборів даних можна було опублікувати на відповідному порталі'
        ' використовується інформація, розміщена в спеціальному реєстрі цих ресурсів.'
    )
    self.msg2.exec()
    if (self.msg2.clickedButton() != self.okButton2): return
    self.pbar.setValue(10)
    searh1 = "'" + fold_id + "'" + ' in parents'  # Формирование строки для поиска всех файлов в заданной папке
    results = self.pers_account.files().list(
        fields="nextPageToken, files(id, name)", q=searh1).execute()
    fnumb = len(results.get('files', []))
    for f in range(fnumb):
        f_name = results.get('files', [])[f]['name']
        if (f_name == 'registerFormatter'):
            id1_reg = results.get('files', [])[f]['id']
            name1_reg = f_name
        if (f_name == 'resourceRegistryFormatter'):
            id2_reg = results.get('files', [])[f]['id']
            name2_reg = f_name
    # Формируем массив со сведениями об уже имеющихся ID в реестре наборов данных
    pers_sheet = work_sheet()
    cell_range = 'Register!A2:C'
    result = pers_sheet.spreadsheets().values().get(
        spreadsheetId=id1_reg, range=cell_range).execute()
    values = result.get('values', [])
    for st in values:
        m_ds.append(dict(A=st[0], B=st[1], C=st[2]))
    # Формируем массив со сведениями об уже имеющихся данных в реестре ресурсов наборов данных
    cell_range = 'ResourceRegistry!A2:G'
    result = pers_sheet.spreadsheets().values().get(
        spreadsheetId=id2_reg, range=cell_range).execute()
    values = result.get('values', [])
    for st in values:
        res_reg.append(
            dict(A=st[0], B=st[1], C=st[2], D=st[3], E=st[4], F=st[5],
                 G=st[6]))
    if (len(res_reg) == 0):
        tx_win = 'Попередження про неможливість виконання запущеної команди'
        tx_mes = 'Для опублікування ресурсів наборів даних на відповідному порталі Ви маєте спочатку сформувати' \
                 ' спеціальний реєстр ресурсів всіх тих наборів даних, які зараз знаходяться у Вашому індивідуальному' \
                 ' сховище.\nЦе слід зробити за допомогою виконання команди «Формування реєстру ресурсів» в меню' \
                 ' «Налаштування програми».'
        univ_message(tx_win, tx_mes, QMessageBox.Warning)
        return
    for sp1 in self.act_l:
        for sp2 in m_ds:
            if (sp2['A'] == sp1['folder']):
                if (sp2['B'] == 'null'):
                    tx_win = 'Попередження про неможливість виконання запущеної команди'
                    tx_mes = 'На жаль, обрані Вами ресурси для набору даних:\n\n- ' + sp2['C'] +\
                             '\n\nне можуть бути опубліковані через відсутність набору на порталі, або через те, що у' \
                             ' реєстрі наборів даних немає його ID.\n\nДля вирішення проблеми Вам необхідно за допомогою' \
                             ' відповідних команд даної програми або клонувати потрібний набір на портал, або відредагувати' \
                             ' реєстр наборів даних, внісши в нього ID для необхідного набору'
                    univ_message(tx_win, tx_mes, QMessageBox.Warning)
                    return
                for sp3 in res_reg:
                    if ((sp3['A'] == sp2['A']) and (sp1['file'] == sp3['D'])):
                        if (sp3['C'] != 'null'):
                            msg2 = QMessageBox()
                            msg2.setIcon(QMessageBox.Information)
                            w_titl = 'УВАГА! Визначтесь, що робити з ресурсом: ' + sp3[
                                'E']
                            msg2.setWindowTitle(w_titl)
                            msg2.setWindowIcon(QIcon('profile\logo.png'))
                            text1 = 'На порталі у Вас вже існує ресурс:\n- ' + sp3['E'] + \
                                    '\nТому, якщо Ви виконаєте дану команду без спеціальних попередніх дій, то просто' \
                                    ' отримаєте дублікат вже існуючого ресурсу.'
                            msg2.setText(text1)
                            text2 = 'Щоб цього не сталося, Вам за допомогою команди «Експорт шаблонів» в меню «Формування' \
                                    ' даних» слід спочатку клонувати набір з вищезгаданим ресурсом, змінити стандартну назву' \
                                    ' ресурсу на бажану, а потім тільки публікувати його на порталі за допомогою даної команди.'
                            msg2.setInformativeText(text2)
                            okButton2 = msg2.addButton(
                                ' Скасовуємо цю команду ',
                                QMessageBox.AcceptRole)
                            msg2.addButton(' Вже зроблено. Продовжуємо далі ',
                                           QMessageBox.RejectRole)
                            msg2.exec()
                            if (msg2.clickedButton() == okButton2): return
                        st1 = sp3['D'] + 'Formatter'
                        fin_res.append(
                            dict(A=sp3['A'],
                                 B=sp2['B'],
                                 C=sp3['C'],
                                 D1=sp3['D'],
                                 D2=st1,
                                 E=sp3['E'],
                                 F=sp3['F'],
                                 G=sp3['G'],
                                 url='url'))
    self.pbar.setValue(20)
    l1 = len(fin_res)
    fold1 = 'fold'
    pb_step = round(60 / l1)
    pb = 20
    for i in range(l1):
        pb = pb + pb_step
        self.pbar.setValue(pb)
        fold = fin_res[i]['A']
        fil_name = fin_res[i]['D2']
        if (fold != fold1):
            for f in self.isx_list:
                if (f['folder'] == fold):
                    fold_id = f['id']
                    fold1 = fold
                    break
        searh1 = "'" + fold_id + "'" + ' in parents'  # Формирование строки для поиска всех файлов в заданной папке
        results = self.pers_account.files().list(
            fields="nextPageToken, files(id, name)", q=searh1).execute()
        fnumb = len(results.get('files', []))
        for f in range(fnumb):
            f_n = results.get('files', [])[f]['name']
            if (f_n == fil_name):
                file_id = results.get('files', [])[f]['id']
                sh_met = pers_sheet.spreadsheets().get(
                    spreadsheetId=file_id).execute()
                properties = sh_met.get('sheets')
                for item in properties:
                    title = item.get("properties").get('title')
                    titl1 = title.lower()
                    titl2 = fin_res[i]['D1'].lower()
                    if (titl1 == titl2):
                        sheet_id = item.get("properties").get('sheetId')
                        st_url = 'https://docs.google.com/spreadsheets/d/' + file_id + '/export?format=csv&id=' + \
                                 file_id + '&gid=' + str(sheet_id)
                        fin_res[i]['url'] = st_url
                        break
    mas1 = init_dil1()  # Подтягиваем основные данные распорядителя информации
    key_api = mas1['key_api_steward']
    path = mas1['baseLinkWebsite'] + '/api/3/action/resource_create'
    l1 = len(fin_res)
    self.pbar.setValue(90)
    for i in range(l1):
        data = {
            'package_id': fin_res[i]['B'],
            'url': fin_res[i]['url'],
            'name': fin_res[i]['E'],
            'description': fin_res[i]['F'],
            'format': 'CSV',
        }
        headers = {'X-CKAN-API-Key': key_api}
        response = requests.post(path, data=data, headers=headers)
        response_dict = json.loads(response.content)
        flag = response_dict['success']
        if (flag):
            l2 = len(res_reg)
            for j in range(l2):
                if ((res_reg[j]['A'] == fin_res[i]['A'])
                        and (res_reg[j]['D'] == fin_res[i]['D1'])):
                    rs1 = response_dict['result']
                    res_reg[j]['B'] = fin_res[i]['B']
                    res_reg[j]['C'] = rs1['id']
    for rs2 in res_reg:
        if (rs2['B'] == 'null'): rs2['B'] = ''
        if (rs2['C'] == 'null'): rs2['C'] = ''
        if (rs2['D'] == 'null'): rs2['D'] = ''
        if (rs2['E'] == 'null'): rs2['E'] = ''
        if (rs2['F'] == 'null'): rs2['F'] = ''
        if (rs2['G'] == 'null'): rs2['G'] = ''
        m_rs = [
            rs2['A'], rs2['B'], rs2['C'], rs2['D'], rs2['E'], rs2['F'],
            rs2['G']
        ]
        res_new.append(m_rs)
    cell_range = 'Введення даних!A3:G'
    self.pbar.setValue(100)
    # pers_sheet = work_sheet()
    response = pers_sheet.spreadsheets().values().clear(
        spreadsheetId=id2_reg, range=cell_range).execute()
    cell_range = 'Введення даних!A3:G' + str(2 + len(res_new))
    zn = {'values': res_new}
    response = pers_sheet.spreadsheets().values().update(
        spreadsheetId=id2_reg,
        range=cell_range,
        valueInputOption='RAW',
        body=zn).execute()
    return
Beispiel #10
0
def onlay_dset(self, dset_reg, id_reg):
    s_set = []  # список для выбранных наборов данны
    st_files = []  # Список стандартных файлов, размещенных на общем диске
    dataset = [
    ]  # Массив сведений для создания на портале выбранных наборв данных
    dset_new = []  # Массив обновленных значений реестра наборов данных
    # Формируем список из тех наборов данных, которые были выбраны для создания их аналогов на портале
    n = len(self.isx_list)
    for i in range(self.spisok2.count()):
        name1 = self.spisok2.item(i).text()
        l1 = len(self.full_list)
        for i1 in range(l1):
            if ((self.full_list[i1]['name'] == name1)
                    and (self.full_list[i1]['metka'] != 'groups')):
                s_set.append(dict(folder=self.full_list[i1]['metka']))
                break
    # Формируем все необходимые сведения для создания выбранных наборов данных на портале
    for st in s_set:
        metka1 = 0
        for rec in dset_reg:
            if (st['folder'] == rec['A']):
                if (rec['B'] != 'null'):
                    tx_win = 'Попередження про неможливість виконання запущеної команди'
                    tx_mes = 'У вас вже існує набір даних:\n\n - ' + rec[
                        'C'] + '\n\nТому дана команда не може бути виконана.'
                    univ_message(tx_win, tx_mes, QMessageBox.Warning)
                    return
                name_str = trans_name(rec['C'])
                title_str = rec['C']
                if (len(title_str) > 254): title_str = title_str[0:253]
                notes_str = rec['D']
                if (len(notes_str) > 400): notes_str = notes_str[0:399]
                tag_str = rec['F']
                if (len(tag_str) > 400): tag_str = notes_str[0:399]
                purp_coll = rec['G']
                if (len(purp_coll) > 400): purp_coll = notes_str[0:399]
                up_fr = rec['E']
                if (up_fr == 'Щодня'): up_fr = 'once a day'
                if (up_fr == 'Щотижня'): up_fr = 'once a week'
                if (up_fr == 'Щомісяця'): up_fr = 'once a month'
                if (up_fr == 'Щокварталу'): up_fr = 'once a quarter'
                if (up_fr == 'Кожні півроку'): up_fr = 'once a half year'
                if (up_fr == 'Щороку'): up_fr = 'once a year'
                if (up_fr == 'Відразу після внесення змін'):
                    up_fr = 'immediately after making changes'
                if (up_fr == 'Більше одного разу на день'):
                    up_fr = 'more than once a day'
                if (up_fr == 'Позапланово'): up_fr = 'unscheduled'
                lang = rec['J']
                if (lang == 'Українська'): lang = 'ua'
                if (lang == 'Російська'): lang = 'ru'
                if (lang == 'Англійська'): lang = 'en'
                if (lang == 'Румунська'): lang = 'ro'
                if (lang == 'Угорська'): lang = 'hu'
                if (lang == 'Болгарська'): lang = 'bg'
                if (lang == 'Польська'): lang = 'pl'
                dataset.append(
                    dict(folder=rec['A'],
                         name=name_str,
                         title=title_str,
                         notes=notes_str,
                         tag=tag_str,
                         maintainer=rec['M'],
                         m_email=rec['N'],
                         purpose_collecting=purp_coll,
                         up_frequency=up_fr,
                         language=lang,
                         publisherIdentifier=rec['L']))
                metka1 = 1
                break
        if (metka1 == 0):
            tx_win = 'Попередження про неможливість виконання запущеної команди'
            tx_mes = 'Деякі вибрані Вами набори даних відсутні у відповідному реєстрі.\nТому, Вам слід попередньо оновити' \
                     ' цей реєстр за допомогою команди «Формування реєстру наборів даних» у меню «Налаштування програми».'
            univ_message(tx_win, tx_mes, QMessageBox.Warning)
            return
    # Создаем на портале ноборы данных и публикуем подготовленные для этих наборов паспорта
    pb_step = round(80 / len(dataset))
    pb = pb_step
    mas1 = init_dil1()  # Подтягиваем основные данные распорядителя информации
    key_api = mas1['key_api_steward']
    organization = mas1['organization_id']
    path1 = mas1['baseLinkWebsite'] + '/api/3/action/package_create'
    path2 = mas1['baseLinkWebsite'] + '/dataset/'
    path3 = mas1['baseLinkWebsite'] + '/api/3/action/resource_create'
    l1 = len(dset_reg)
    with open('profile\standard_dataset_files.csv', 'r',
              encoding='utf-8') as f_csv:
        reader = csv.DictReader(f_csv, delimiter=',')
        for line in reader:
            st_files.append(
                dict(folder=line['folder'],
                     type=line['file_type'],
                     file=line['file_name'],
                     description=line['file_description']))
    pers_sheet = work_sheet()
    for d_st in dataset:
        pb = pb + pb_step
        self.pbar.setValue(pb)
        data_dict = {
            'name':
            d_st['name'],
            'title':
            d_st['title'],
            'notes':
            d_st['notes'],
            'tag_string':
            str_valid(d_st['tag']),
            'owner_org':
            organization,
            'maintainer':
            d_st['maintainer'],
            'maintainer_email':
            d_st['m_email'],
            'extras': [{
                'key': 'purpose_of_collecting_information',
                'value': d_st['purpose_collecting']
            }, {
                'key': 'update_frequency',
                'value': d_st['up_frequency']
            }, {
                'key': 'language',
                'value': d_st['language']
            }, {
                'key': 'publisherIdentifier',
                'value': d_st['publisherIdentifier']
            }]
        }
        data = str(json.dumps(data_dict))
        headers = {
            'Authorization': key_api,
            'Content-Type': 'application/json'
        }
        response = requests.post(path1, headers=headers, data=data)
        response_dict = json.loads(response.content)
        flag = response_dict['success']
        if (flag):
            for i in range(l1):
                if (dset_reg[i]['A'] == d_st['folder']):
                    dset_reg[i]['B'] = d_st['name']
                    dset_reg[i]['H'] = path2 + d_st['name']
                    dset_reg[i]['I'] = 'CSV'
        for row1 in st_files:
            if ((row1['folder'] == d_st['folder'])
                    and row1['type'] == 'структура ресурсів'):
                fold = row1['folder']
                fil_name = row1['file']
                fil_descr = row1['description']
                for row2 in self.isx_list:
                    if (row2['folder'] == fold):
                        fold_id = row2['id']
                        searh1 = "'" + fold_id + "'" + ' in parents'  # Формирование строки для поиска всех файлов в заданной папке
                        results = self.pers_account.files().list(
                            fields="nextPageToken, files(id, name)",
                            q=searh1).execute()
                        fnumb = len(results.get('files', []))
                        for f in range(fnumb):
                            f_n = results.get('files', [])[f]['name']
                            if (f_n == fil_name):
                                file_id = results.get('files', [])[f]['id']
                                sh_met = pers_sheet.spreadsheets().get(
                                    spreadsheetId=file_id).execute()
                                properties = sh_met.get('sheets')
                                sheet_id = properties[0].get("properties").get(
                                    'sheetId')
                                st_url = 'https://docs.google.com/spreadsheets/d/' + file_id + '/export?format=csv&id=' + \
                                         file_id + '&gid=' + str(sheet_id)
                                data = {
                                    'package_id': d_st['name'],
                                    "url": st_url,
                                    'name': fil_name,
                                    'description': fil_descr,
                                    'format': 'CSV',
                                }
                                headers = {'X-CKAN-API-Key': key_api}
                                response1 = requests.post(path3,
                                                          data=data,
                                                          headers=headers)
                                break
    for ds in dset_reg:
        if (ds['B'] == 'null'): ds['B'] = ''
        if (ds['C'] == 'null'): ds['C'] = ''
        if (ds['D'] == 'null'): ds['D'] = ''
        if (ds['E'] == 'null'): ds['E'] = ''
        if (ds['F'] == 'null'): ds['F'] = ''
        if (ds['G'] == 'null'): ds['G'] = ''
        if (ds['H'] == 'null'): ds['H'] = ''
        if (ds['I'] == 'null'): ds['I'] = ''
        if (ds['J'] == 'null'): ds['J'] = ''
        if (ds['K'] == 'null'): ds['K'] = ''
        if (ds['L'] == 'null'): ds['L'] = ''
        if (ds['M'] == 'null'): ds['M'] = ''
        if (ds['N'] == 'null'): ds['N'] = ''
        ds1 = [
            ds['A'], ds['B'], ds['C'], ds['D'], ds['E'], ds['F'], ds['G'],
            ds['H'], ds['I'], ds['J'], ds['K'], ds['L'], ds['M'], ds['N']
        ]
        dset_new.append(ds1)
    self.pbar.setValue(100)
    cell_range = 'Введення даних!A3:N'
    response = pers_sheet.spreadsheets().values().clear(
        spreadsheetId=id_reg, range=cell_range).execute()
    cell_range = 'Введення даних!A3:N' + str(2 + len(dset_new))
    zn = {'values': dset_new}
    response = pers_sheet.spreadsheets().values().update(
        spreadsheetId=id_reg,
        range=cell_range,
        valueInputOption='RAW',
        body=zn).execute()