def but3_2(self):
     j = check3_2(self)
     if (j == 0):
         mas1 = init_dil1()  # Подтягиваем основные данные распорядителя информации
         mas1['key_api_steward'] = self.linEd1.text()
         mas1['organization_id'] = self.linEd2.text()
         mas1['publisherName'] = self.linEd3.text()
         mas1['publisherNameRod'] = self.linEd4.text()
         mas1['publisherNameTvor'] = self.linEd5.text()
         mas1['publisherNameDat'] = self.linEd6.text()
         mas1['publisherNameVin'] = self.linEd7.text()
         mas1['publisherTerritory'] = self.linEd8.text()
         mas1['publisherTerritoryRod'] = self.linEd9.text()
         data_us = json.dumps(mas1, indent=2, ensure_ascii=False)
         with open('profile\data_users.json', 'w', encoding='utf-8') as file:
             file.write(data_us)
             file.close()
         main_screen(self)
示例#2
0
def check_set(self, s_set):
    # s_set - список выбранных наборов, которые нужно дабавить в индивидуальное хранилеще пользователя
    # Формируем список актуальных (имеющихся в индивидуальном хранилище) наборов пользователя
    mas1 = init_dil1()  # Подтягиваем основные данные распорядителя информации
    root_folder = mas1['license']  # Определяем корневую папку индивидуального хранилища пользователя
    # root_id - ID для корневой папки индивидуального хранилища польователя
    a_set = []  # Фактичкски имеющщеся в индивидуальном хранилище пользователя наборы данных
    pers_account = connect_storage()
    results = pers_account.files().list(fields="nextPageToken, files(id, name)", q="mimeType = 'application/vnd.google-apps.folder'").execute()
    fnumb = len(results.get('files', []))
    for f in range(fnumb):
        if (results.get('files', [])[f]['name']== root_folder):
            root_id = results.get('files', [])[f]['id']
        else:
            a_set.append(dict(id=results.get('files', [])[f]['id'], folder=results.get('files', [])[f]['name']))
    # Делаем отсев вожможных совпадений в актуальном и в сформированном пользователем списке наборов данных
    del_set = []  # Список дублируемых в пользовательском хранилище наборов, подлежащих удалению в s_set
    l1 = len(a_set)
    l2 = len(s_set)
    for i in range(l1):
        for j in range(l2):
            if (a_set[i]['folder'] == s_set[j]['folder']):
                info1 = 'У Вас в індивідуальному сховище вже є набір даних: \n' + '«' + s_set[j]['set'] + '»'
                self.msg2.setText(info1)
                self.msg2.exec()
                if (self.msg2.clickedButton() == self.okButton2): # удаляем набор из списка
                    del_set.append(s_set[j])
                else: # Удаляем набор их индиваидуального хранилища
                    try:
                        pers_account.files().delete(fileId=a_set[i]['id']).execute()
                    except errors.HttpError as error:
                        if error.resp.status in [403, 503]:
                            time.sleep(5)
    # Удаляем продублированные в пользовательском хранилище наборы из списка s_set
    l1 = len(del_set)
    if (l1 > 0):
        for n in del_set:
            s_set.remove(n)
    return s_set, pers_account, root_id
示例#3
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
示例#4
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()
示例#5
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
示例#6
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()
    def __init__(self):
        super().__init__()
        sfont = QtGui.QFont()
        sfont.setPointSize(10)
        font = QtGui.QFont()
        font.setPointSize(11)
        self.setObjectName('MainWindow')
        self.resize(1200, 768)
        self.menubar = QtWidgets.QMenuBar(self)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1200, 21))
        self.menubar.setObjectName('menubar')
        self.setMenuBar(self.menubar)
        self.setFont(font)
        self.statusbar = QtWidgets.QStatusBar(self)
        self.statusbar.setObjectName('statusbar')
        self.statusbar.setFont(sfont)
        self.setStatusBar(self.statusbar)
        self.setWindowIcon(QIcon('profile\logo.png'))
        mas1 = init_dil1()  # Подтягиваем основные данные распорядителя информации
        tx = mas1['publisherNameTvor']
        titl_win = 'Менеджер з оприлюднення відкритих даних наданих «' + tx + '»'
        self.setWindowTitle(titl_win)

        # Создаем систему меню для данной программы
        menubar = self.menuBar()
        # Группа команд "Формирование данных"
        dataGeneration = menubar.addMenu('Формування даних')
        dataGen1 = QAction('Наповнення або оновлення', self)
        dataGen1.setFont(font)
        dataGen1.setShortcut('Ctrl+O')
        dataGen1.setStatusTip('Вибір певного (вже існуючого у розпорядника) набору даних для відкриття в ньому'
                              ' необхідних ресурсів задля їх подальшого наповнення або поновлення')
        dataGen2 = QAction('Експорт шаблонів', self)
        dataGen2.setFont(font)
        dataGen2.setShortcut('Ctrl+E')
        dataGen2.setStatusTip('Експорт із загального диска в індивідуальне сховище розпорядника необхідних шаблонів'
                              ' ресурсів для тих наборів даних, з якими розпорядник надалі планує працювати')
        dataGen3 = QAction('Вихід з програми', self)
        dataGen3.setFont(font)
        dataGen3.setShortcut('Ctrl+Q')
        dataGen3.setStatusTip('Закриття програми зі збереженням всіх внесених змін, як в шаблони ресурсів наборів даних,'
                              ' так і в саму програму')
        dataGen3.triggered.connect(qApp.quit)
        dataGeneration.addAction(dataGen1)
        dataGeneration.addAction(dataGen2)
        dataGeneration.addAction(dataGen3)
        dataGen1.triggered.connect(self.mfunc1_1)
        dataGen2.triggered.connect(self.mfunc1_2)

        # Группа команд "Настройка программы"
        programSetting = menubar.addMenu('Налаштування програми')
        progSet1 = QAction('Загальні відомості по розпоряднику', self)
        progSet1.setFont(font)
        progSet1.setStatusTip(
            'Внесення низки загальних відомостей по розпоряднику інформації задля подальшого спрощення'
            ' розробки різних програм, які мають використовувати його набори відкритих даних')
        progSet2 = QAction('Відомості для оприлюднення даних', self)
        progSet2.setFont(font)
        progSet2.setStatusTip('Внесення, розміщених на порталі data.gov.ua, основних кодів розпорядника, а також інших'
                              ' відомостей, що дозволяють автоматизувати процес оприлюднення наборів даних')
        progSet3 = QAction('Формування реєстру наборів даних', self)
        progSet3.setFont(font)
        progSet3.setStatusTip('Автоматичне формування реєстру з використанням відповідних паспортів для тих наборів'
                              ' даних, які вже повинні були бути розміщені в сховище у розпорядника інформації')
        progSet4 = QAction('Редагування реєстру наборів даних', self)
        progSet4.setFont(font)
        progSet4.setStatusTip('Ручне редагування в Google таблицях, автоматично сформованого за допомогою попередньої'
                              ' команди меню, реєстру наборів даних')
        progSet5 = QAction('Формування реєстру ресурсів', self)
        progSet5.setFont(font)
        progSet5.setStatusTip(
            'Автоматичне формування реєстру з використанням відповідних описів ресурсів для тих наборів'
            ' даних, які вже повинні були бути розміщені в сховище у розпорядника інформації')
        progSet6 = QAction('Редагування реєстру ресурсів', self)
        progSet6.setFont(font)
        progSet6.setStatusTip('Ручне редагування в Google таблицях, автоматично сформованого за допомогою попередньої'
                              ' команди меню, реєстру ресурсів наборів даних')
        separator1 = QAction('', self)
        separator1.setSeparator(True)
        separator2 = QAction('', self)
        separator2.setSeparator(True)
        programSetting.addAction(progSet1)
        programSetting.addAction(progSet2)
        programSetting.addAction(separator1)
        programSetting.addAction(progSet3)
        programSetting.addAction(progSet4)
        programSetting.addAction(separator2)
        programSetting.addAction(progSet5)
        programSetting.addAction(progSet6)
        progSet1.triggered.connect(self.mfunc3_1)
        progSet2.triggered.connect(self.mfunc3_2)
        progSet3.triggered.connect(self.mfunc3_3)
        progSet4.triggered.connect(self.mfunc3_4)
        progSet5.triggered.connect(self.mfunc3_5)
        progSet6.triggered.connect(self.mfunc3_6)

        # Группа команд "Публикация данных"
        dataPublishing = menubar.addMenu('Публікація даних')
        dataPub1 = QAction('Створення наборів даних', self)
        dataPub1.setFont(font)
        dataPub1.setStatusTip('Вибір необхідних наборів даних з подальшим створенням по ним аналогів на Єдиному'
                              ' державному порталі відкритих даних  data.gov.ua')
        dataPub3 = QAction('Оновлення паспортів наборів даних', self)
        dataPub3.setFont(font)
        dataPub3.setStatusTip('Вибір необхідних наборів даних з подальшим перенесенням вмісту їх паспортів в паспорта'
                              ' аналогічних наборів, що розміщені на Єдиному порталі відкритих даних  data.gov.ua')
        dataPub2 = QAction('Публікація ресурсів з Форматорів', self)
        dataPub2.setFont(font)
        dataPub2.setStatusTip('Вибір необхідних, сформованих на основі таблиць Форматорів, ресурсів тих чи інших наборів'
                              ' даних з подальшим їх клонуванням в аналогічні набори, розміщені на порталі data.gov.ua')
        dataPub4 = QAction('Оновлення ресурсів з Форматорів', self)
        dataPub4.setFont(font)
        dataPub4.setStatusTip('Вибір необхідних, сформованих на основі таблиць Форматорів, ресурсів тих чи інших наборів'
                              ' даних з подальшим перенесенням їх описів в аналогічні описи ресурсів на порталі data.gov.ua')
        separator1 = QAction('', self)
        separator1.setSeparator(True)
        dataPublishing.addAction(dataPub1)
        dataPublishing.addAction(dataPub3)
        dataPublishing.addAction(separator1)
        dataPublishing.addAction(dataPub2)
        dataPublishing.addAction(dataPub4)
        dataPub1.triggered.connect(self.mfunc2_1)
        dataPub3.triggered.connect(self.mfunc2_3)
        dataPub2.triggered.connect(self.mfunc2_2)
        dataPub4.triggered.connect(self.mfunc2_4)

        # Группа команд "Справка относительно программы"
        programHelp = menubar.addMenu('Довідка щодо програми')
        progHelp1 = QAction('Про все, що стосується Форматорів', self)
        progHelp1.setFont(font)
        progHelp1.setShortcut('F1')
        progHelp1.setStatusTip('У довідці наведені описи принципів роботи і переваг Форматорів, а також дані роз\'яснення'
                               ' по основним термінам, які використовуються в програмі щодо цих Форматорів')
        progHelp2 = QAction('Загальні відомості про програму', self)
        progHelp2.setFont(font)
        progHelp2.setShortcut('Alt+F1')
        progHelp2.setStatusTip('Довідка надає рекомендації щодо послідовності дій, які зазвичай повинні виконуватися'
                               ' користувачами програми в рамках її експлуатації')
        progHelp3 = QAction('Поширення програми', self)
        progHelp3.setFont(font)
        progHelp3.setStatusTip('У довідці вказані варіанти збереження файлів наборів даних на Google дисках, а також'
                               ' перераховані ті умови, при яких користувачі можуть отримати повнофункціональний варіант програми')
        programHelp.addAction(progHelp1)
        programHelp.addAction(progHelp2)
        programHelp.addAction(progHelp3)
        progHelp1.triggered.connect(self.mfunc4_1)
        progHelp2.triggered.connect(self.mfunc4_2)
        progHelp3.triggered.connect(self.mfunc4_3)

        # Создаем окно предупреждения о длительности процесса клонирования наборов данных
        self.msg1 = create_msg1()
        # Создаем окно сообщений с результатами отсева совпадений в актуальном и в сформированном пользователем
        self.msg2, self.okButton2 = create_msg2()
        # Создаем окно, рекомендующее клонирование как конфигурационных файлов, так и реестров по наборам данных
        self.msg3, self.okButton3 = create_msg3()

        self.initUI()