コード例 #1
0
    def correct_gh_labels(issue, tracker, linked_issues):

        if (not allow_correct_github_labels):
            return 0

        # добавление label-ов
        priority = match_priority_to_gh(linked_issues.priority_id_rm)
        status = match_status_to_gh(linked_issues.status_id_rm)


        # ---------------------------------------- ЗАГРУЗКА ДАННЫХ В ГИТХАБ ----------------------------------------


        issue_title = align_special_symbols(issue['issue_title'])
        issue_body = align_special_symbols(issue['issue_body'])

        issue_templated = issue_github_template.render(
            title=issue_title,
            body=issue_body,
            priority=priority,
            status=status,
            tracker=tracker)
        # кодировка Latin-1 на некоторых задачах приводит к ошибке кодировки в питоне
        issue_templated = issue_templated.encode('utf-8')

        url_gh = make_gh_repos_url(linked_issues.repos_id_gh)

        # добавление issue_id к ссылке
        issue_url_gh = url_gh + '/' + str(linked_issues.issue_num_gh)
        request_result = requests.patch(issue_url_gh,
                                        data=issue_templated,
                                        headers=headers_gh)

        return request_result
コード例 #2
0
    def reject_issue(linked_projects, issue):

        # ----------------------------------------------- ПОДГОТОВКА ----------------------------------------------

        # дополнительная проверка, что проекты связаны
        if (linked_projects.count() == 0):

            error_text = "ERROR: process_payload_from_gh.reject_issue\n" +\
                         "issue " + str(issue['action']) + " in GITHUB, but the project is not linked to REDMINE"

            return PREPARATION_ERR(error_text)

        linked_projects = linked_projects[0]

        project_id_rm = linked_projects.project_id_rm
        repos_id_gh = linked_projects.repos_id_gh
        url_gh = make_gh_repos_url(repos_id_gh)

        linked_issues = linked_projects.get_issue_by_id_gh(issue['issue_id'])

        # дополнительная проверка, что issue связаны
        if (linked_issues.count() == 0):

            error_text = "ERROR: process_payload_from_gh.reject_issue\n" +\
                         "issue " + str(issue['action']) + " in GITHUB, but it's not linked to REDMINE"

            return PREPARATION_ERR(error_text)

        linked_issues = linked_issues[0]

        # обновляем информацию в таблице
        update_linked_issues(
            linked_issues,
            linked_issues.tracker_id_rm,
            status_ids_rm[4],  # 4 - rejected
            linked_issues.priority_id_rm,
            False)

        # ------------------------------------------ ОБРАБОТКА ФРАЗЫ БОТА -----------------------------------------

        #title = '[From Github] ' + issue['issue_title']
        title = issue['issue_title']

        # проверяем, если автор issue - бот
        if (chk_if_gh_user_is_our_bot(issue['issue_author_id'])):
            issue_body = del_bot_phrase(
                issue['issue_body'])  # удаляем фразу бота

        else:
            issue_body = add_bot_phrase(issue,
                                        'issue_body')  # добавляем фразу бота

        comment_body = add_bot_phrase(
            issue, 'comment_body_action'
        )  # добавляем фразу бота в комментарий к действию

        # обработка спец. символов
        title = align_special_symbols(title)
        issue_body = align_special_symbols(issue_body)
        comment_body = align_special_symbols(comment_body)

        # --------------------------------------- ЗАГРУЗКА ДАННЫХ В РЕДМАЙН ----------------------------------------

        issue_templated = issue_redmine_template.render(
            project_id=project_id_rm,
            issue_id=linked_issues.issue_id_rm,
            tracker_id=linked_issues.tracker_id_rm,
            status_id=status_ids_rm[4],  # 4 - rejected
            priority_id=linked_issues.priority_id_rm,
            subject=title,
            description=issue_body,
            notes=comment_body)

        # кодировка Latin-1 на некоторых задачах приводит к ошибке кодировки в питоне
        issue_templated = issue_templated.encode('utf-8')

        issue_url_rm = url_rm.replace(
            '.json', '/' + str(linked_issues.issue_id_rm) + '.json')
        request_result = requests.put(issue_url_rm,
                                      data=issue_templated,
                                      headers=headers_rm)

        # удаление linked_issues из базы данных
        linked_issues.delete()

        # ДЕБАГГИНГ
        log_issue_gh(request_result, issue, linked_issues,
                     linked_projects.project_id_rm)

        return request_result
コード例 #3
0
    def edit_issue(linked_projects, issue):

        # ----------------------------------------------- ПОДГОТОВКА -----------------------------------------------

        # дополнительная проверка, что проекты связаны
        if (linked_projects.count() == 0):

            error_text = "ERROR: process_payload_from_rm.edit_issue\n" +\
                         "issue " + str(issue['action']) + " in REDMINE, but the project is not linked to GITHUB"

            return PREPARATION_ERR(error_text)

        linked_projects = linked_projects[0]

        repos_id_gh = linked_projects.repos_id_gh
        url_gh = make_gh_repos_url(repos_id_gh)

        linked_issues = linked_projects.get_issue_by_id_rm(issue['issue_id'])

        # дополнительная проверка, что issue связаны
        if (linked_issues.count() == 0):

            error_text = "ERROR: process_payload_from_rm.edit_issue\n" +\
                         "issue " + str(issue['action']) + " in REDMINE, but it's not linked to GITHUB"

            return PREPARATION_ERR(error_text)

        linked_issues = linked_issues[0]

        # добавление label-ов
        state_gh = "opened"  # открыть / закрыть issue
        tracker = match_tracker_to_gh(issue['tracker_id'])
        priority = match_priority_to_gh(issue['priority_id'])

        if (issue['status_id'] != linked_issues.status_id_rm):
            status = match_status_to_gh(issue['status_id'])

            if (status == 'Status: closed'):
                status = match_status_to_gh(
                    linked_issues.status_id_rm
                )  # не меняем статус (нет label-а closed)
                state_gh = 'closed'

            elif (status == 'Status: rejected'):
                state_gh = 'closed'
        else:
            status = match_status_to_gh(linked_issues.status_id_rm)

        post_comment(linked_issues, issue,
                     url_gh)  # ОТПРАВЛЯЕМ КОММЕНТАРИЙ В ГИТХАБ

        # ----------------------------------------- ОБРАБОТКА ФРАЗЫ БОТА -------------------------------------------

        #title = '[From Redmine (edited)] ' + issue['issue_title']
        title = issue['issue_title']

        # проверяем, если автор issue - бот
        if (chk_if_rm_user_is_our_bot(issue['issue_author_id'])):
            issue_body = del_bot_phrase(
                issue['issue_body'])  # удаляем фразу бота

        else:
            issue_body = add_bot_phrase(issue,
                                        'issue_body')  # добавляем фразу бота

        # обработка спец. символов
        title = align_special_symbols(title)
        issue_body = align_special_symbols(issue_body)

        # ---------------------------------------- ЗАГРУЗКА ДАННЫХ В ГИТХАБ ----------------------------------------

        issue_templated = issue_github_template.render(title=title,
                                                       body=issue_body,
                                                       state=state_gh,
                                                       priority=priority,
                                                       status=status,
                                                       tracker=tracker)
        # кодировка Latin-1 на некоторых задачах приводит к ошибке кодировки в питоне
        issue_templated = issue_templated.encode('utf-8')

        # добавление issue_id к ссылке
        issue_url_gh = url_gh + '/' + str(linked_issues.issue_num_gh)
        request_result = requests.patch(issue_url_gh,
                                        data=issue_templated,
                                        headers=headers)

        # ------------------------------------------ СОХРАНЕНИЕ ДАННЫХ --------------------------------------------

        # обновляем информацию в таблице
        update_linked_issues(linked_issues, issue)

        # ДЕБАГГИНГ
        log_issue_edit_rm(request_result, issue, linked_issues)

        return request_result
コード例 #4
0
    def edit_issue(linked_projects, issue, is_opened):

        # ----------------------------------------------- ПОДГОТОВКА ----------------------------------------------

        # дополнительная проверка, что проекты связаны
        if (linked_projects.count() == 0):

            error_text = "ERROR: process_payload_from_gh.edit_issue\n" +\
                         "issue " + str(issue['action']) + " in GITHUB, but the project is not linked to REDMINE"

            return PREPARATION_ERR(error_text)

        linked_projects = linked_projects[0]

        project_id_rm = linked_projects.project_id_rm
        repos_id_gh = linked_projects.repos_id_gh
        url_gh = make_gh_repos_url(repos_id_gh)

        linked_issues = linked_projects.get_issue_by_id_gh(issue['issue_id'])

        # дополнительная проверка, что issue связаны
        if (linked_issues.count() == 0):

            error_text = "ERROR: process_payload_from_gh.edit_issue\n" +\
                         "issue " + str(issue['action']) + " in GITHUB, but it's not linked to REDMINE"

            return PREPARATION_ERR(error_text)

        linked_issues = linked_issues[0]

        # проверка: что issue был отклонён (запрещаем открывать вновь)
        """
        if (linked_issues.status_id_rm == status_ids_rm[4]):

            if (is_opened == True):

                return close_gh_issue(linked_issues, url_gh)
        """

        # настройка label-ов
        tracker_id_rm = None

        for label in issue['labels']:

            tracker_rm = match_label_to_rm(label['name'])

            # если label известный
            if (tracker_rm != None):

                if (tracker_rm['type'] == 'Tracker'):

                    if (tracker_id_rm == None):
                        tracker_id_rm = tracker_rm['id_rm']

                    # если пользователь выбрал более одного трекера -> значение по умолчанию
                    else:
                        tracker_id_rm = tracker_ids_rm[0]

        # проверяем, был ли установлен трекер
        if (tracker_id_rm == None):
            tracker_id_rm = tracker_ids_rm[0]

        # корректируем label-ы в гитхабе
        tracker = match_tracker_to_gh(linked_issues.tracker_id_rm)
        correct_gh_labels(issue, tracker, linked_issues)

        # обновляем информацию в таблице
        update_linked_issues(linked_issues, tracker_id_rm,
                             linked_issues.status_id_rm,
                             linked_issues.priority_id_rm, is_opened)

        # ------------------------------------------ ОБРАБОТКА ФРАЗЫ БОТА -----------------------------------------

        #title = '[From Github] ' + issue['issue_title']
        title = issue['issue_title']

        # проверяем, если автор issue - бот
        if (chk_if_gh_user_is_our_bot(issue['issue_author_id'])):
            issue_body = del_bot_phrase(
                issue['issue_body'])  # удаляем фразу бота

        else:
            issue_body = add_bot_phrase(issue,
                                        'issue_body')  # добавляем фразу бота

        comment_body = add_bot_phrase(
            issue, 'comment_body_action'
        )  # добавляем фразу бота в комментарий к действию

        # обработка спец. символов
        title = align_special_symbols(title)
        issue_body = align_special_symbols(issue_body)
        comment_body = align_special_symbols(comment_body)

        # --------------------------------------- ЗАГРУЗКА ДАННЫХ В РЕДМАЙН ----------------------------------------

        if (is_opened):
            status_id = linked_issues.status_id_rm

        else:
            status_id = status_ids_rm[5]  # closed

        issue_templated = issue_redmine_template.render(
            project_id=project_id_rm,
            issue_id=linked_issues.issue_id_rm,
            tracker_id=linked_issues.tracker_id_rm,
            status_id=status_id,
            priority_id=linked_issues.priority_id_rm,
            subject=title,
            description=issue_body,
            notes=comment_body)

        # кодировка Latin-1 на некоторых задачах приводит к ошибке кодировки в питоне
        issue_templated = issue_templated.encode('utf-8')

        issue_url_rm = url_rm.replace(
            '.json', '/' + str(linked_issues.issue_id_rm) + '.json')
        request_result = requests.put(issue_url_rm,
                                      data=issue_templated,
                                      headers=headers_rm)

        # ДЕБАГГИНГ
        log_issue_gh(request_result, issue, linked_issues,
                     linked_projects.project_id_rm)

        return request_result
コード例 #5
0
    def post_issue(linked_projects, issue):

        # ----------------------------------------------- ПОДГОТОВКА -----------------------------------------------

        # дополнительная проверка, что проекты связаны
        if (linked_projects.count() == 0):

            error_text = "ERROR: process_payload_from_rm.post_issue\n" +\
                         "issue " + str(issue['action']) + " in REDMINE, but the project is not linked to GITHUB"

            return PREPARATION_ERR(error_text)

        linked_projects = linked_projects[0]

        repos_id_gh = linked_projects.repos_id_gh
        url_gh = make_gh_repos_url(repos_id_gh)

        # ------------------------------------------ ОБРАБОТКА ФРАЗЫ БОТА -----------------------------------------

        #title = '[From Redmine] ' + issue['issue_title']
        title = issue['issue_title']
        issue_body = add_bot_phrase(issue,
                                    'issue_body')  # добавляем фразу бота

        # обработка спец. символов
        title = align_special_symbols(title)
        issue_body = align_special_symbols(issue_body)

        # --------------------------------------- ЗАГРУЗКА ДАННЫХ В ГИТХАБ ----------------------------------------

        # добавление label-ов
        tracker = match_tracker_to_gh(issue['tracker_id'])
        status = match_status_to_gh(issue['status_id'])
        priority = match_priority_to_gh(issue['priority_id'])

        issue_templated = issue_github_template.render(title=title,
                                                       body=issue_body,
                                                       priority=priority,
                                                       status=status,
                                                       tracker=tracker)

        # кодировка Latin-1 на некоторых задачах приводит к ошибке кодировки в питоне
        issue_templated = issue_templated.encode('utf-8')

        request_result = requests.post(url_gh,
                                       data=issue_templated,
                                       headers=headers)

        # ------------------------------------------ СОХРАНЕНИЕ ДАННЫХ --------------------------------------------

        posted_issue = json.loads(request_result.text)

        # занесение в базу данных информацию о том, что данные issues связаны
        linked_issues = Linked_Issues.objects.create_linked_issues(
            issue['issue_id'],  # id issue в редмайне
            posted_issue['id'],  # id issue в гитхабе
            repos_id_gh,  # id репозитория в гитхабе
            posted_issue['number'],  # номер issue  в репозитории гитхаба
            issue['tracker_id'],  # id трекера в редмайне
            issue['status_id'],  # id статуса в редмайне
            issue['priority_id'],  # id приоритета в редмайне
            True)  # открыт

        # добавляем linked_issues в linked_projects
        linked_projects.add_linked_issues(linked_issues)

        # ДЕБАГГИНГ
        log_issue_post_rm(request_result, issue, linked_issues)

        return request_result