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 post_comment(linked_issues, issue, url_gh):

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

        # нет комментария
        if (issue['comment_body'] == ''):
            comment_body = add_bot_phrase(
                issue, 'comment_body_action')  # добавляем фразу бота
        else:
            comment_body = add_bot_phrase(
                issue, 'comment_body')  # добавляем фразу бота

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

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

        comment_templated = comment_github_template.render(body=comment_body)

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

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

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

        #занесение в базу данных информации о том, что комментарии связаны
        posted_comment = json.loads(request_result.text)
        linked_comments = linked_issues.add_comment(issue['comment_id'],
                                                    posted_comment['id'])

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

        return request_result
예제 #3
0
    def edit_comment(linked_projects, issue):


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



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

            error_text = "ERROR: process_comment_payload_from_gh.edit_comment\n" +\
                         "comment " + 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

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

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

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

            return PREPARATION_ERR(error_text)

        linked_issues = linked_issues[0]

        linked_comments = linked_issues.get_comment_by_id_gh(issue['comment_id'])

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

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

            return PREPARATION_ERR(error_text)

        linked_comments = linked_comments[0]


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


        # проверяем, если автор 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')

        # если изменил свой комментарий
        if (issue['sender_id'] == issue['comment_author_id']):
            comment_body = add_bot_phrase(issue, 'comment_edit')            # добавляем фразу бота

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

        # обработка спец. символов
        issue_title = align_special_symbols(issue['issue_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,
            priority_id=linked_issues.priority_id_rm,
            subject=issue_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)


        # ------------------------------------------ СОХРАНЕНИЕ ДАННЫХ --------------------------------------------
        # (делаем привязку комментариев после получения веб-хука от редмайна)


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

        return request_result
    def post_issue(linked_projects, issue):


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


        project_id_rm = linked_projects.project_id_rm

        # настройка label-ов
        priority_id_rm = priority_ids_rm[0]

        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]

        if (issue['state'] == 'closed'):
            status_id_rm = status_ids_rm[5]     # статус "закрытый"
            is_opened = False

        else:
            status_id_rm = status_ids_rm[0]     # статус по умолчанию
            is_opened = True


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


        #title = '[From Github] ' + 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)


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


        issue_templated = issue_redmine_template.render(
            project_id=project_id_rm,
            tracker_id=tracker_id_rm,
            status_id=status_id_rm,
            priority_id=priority_id_rm,
            subject=title,
            description=issue_body)

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

        request_result = requests.post(url_rm,
                                       data=issue_templated,
                                       headers=headers_rm)


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


        posted_issue = json.loads(request_result.text)

        # занесение в базу данных информацию о том, что данные issues связаны
        linked_issues = Linked_Issues.objects.create_linked_issues(
            posted_issue['issue']['id'],    # id issue в редмайне
            issue['issue_id'],              # id issue в гитхабе
            issue['repos_id'],              # id репозитория в гитхабе
            issue['issue_number'],          # номер issue  в репозитории гитхаба
            tracker_id_rm,                  # id трекера в редмайне
            status_id_rm,                   # id статуса в редмайне
            priority_id_rm,                 # id приоритета в редмайне
            is_opened)                      # закрыт / открыт

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

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


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

        result = {}
        result['request_result'] = request_result
        result['linked_issues'] = linked_issues

        return result
    def post_comment(linked_projects, linked_issues, comment):


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


        # проверяем, если автор комментария - наш бот
        if (chk_if_gh_user_is_our_bot(comment['comment_author_id'])):

            error_text = prevent_cyclic_comment_gh(comment)
            return HttpResponse(error_text, status=200)


        project_id_rm = linked_projects.project_id_rm


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


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

        else:
            issue_body = add_bot_phrase(comment, 'issue_body')

        comment_body = add_bot_phrase(comment, 'comment_body')    # добавляем фразу бота

        # обработка спец. символов
        issue_title = align_special_symbols(comment['issue_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,
            priority_id=linked_issues.priority_id_rm,
            subject=issue_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_comment_gh(request_result, comment, linked_issues)

        if (request_result.status_code == 200):
            request_result.status_code = 201

        return request_result
    def label_issue(linked_projects, issue):

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

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

            error_text = "ERROR: process_payload_from_gh.label_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

        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.label_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]

        priority_id_rm = None
        status_id_rm = None
        tracker_id_rm = None
        incorrect_labels = False
        labels = issue['labels']
        for label in labels:

            label_gh = match_label_to_rm(label['name'])

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

                if (label_gh['type'] == 'Priority'):

                    if (priority_id_rm == None):

                        priority_id_rm = label_gh['id_rm']

                        if (priority_id_rm != linked_issues.priority_id_rm):
                            incorrect_labels = True

                    else:
                        incorrect_labels = True

                elif (label_gh['type'] == 'Status'):

                    if (status_id_rm == None):

                        status_id_rm = label_gh['id_rm']

                        if (status_id_rm != linked_issues.status_id_rm):
                            incorrect_labels = True

                    else:
                        incorrect_labels = True

                elif (label_gh['type'] == 'Tracker'):

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

                    # пользователь выбрал новый трекер, но не удалил старый -> выбираем новый
                    else:
                        if (tracker_id_rm == linked_issues.tracker_id_rm):
                            tracker_id_rm = label_gh['id_rm']

        # проверяем, был ли изменён трекер
        if (tracker_id_rm == None):
            tracker_id_rm = linked_issues.tracker_id_rm

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

        #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)

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

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

        if (request_result.status_code != 200):

            # сообщаем об ошибке
            error_text = "ERROR: process_payload_from_gh.label_issue\n" +\
                         "Encountered some error while trying to correct labels in Github"

            return LOGICAL_ERR(error_text)

        # TODO: похоже, он не успевает изменить linked_issues.tracker_id_rm: вебхуки приходят почти одновременно
        # проверяем, был ли изменён трекер и предотвращаем множественную отправку сообщений в гитхаб
        if ((tracker_id_rm != linked_issues.tracker_id_rm) &
            (issue['action'] == 'labeled')):

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

            issue_templated = issue_redmine_template.render(
                project_id=project_id_rm,
                issue_id=linked_issues.issue_id_rm,
                tracker_id=tracker_id_rm,
                status_id=linked_issues.status_id_rm,
                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)

        # проверяем, корректные ли label-ы
        if (incorrect_labels):

            # сообщаем об ошибке
            error_text = "ERROR: process_payload_from_gh.label_issue\n" +\
                         "incorrect labels in GITHUB"

            return LOGICAL_ERR(error_text)

        else:

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

            return request_result
    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
    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
    def post_issue(linked_projects, issue):

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

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

            error_text = "ERROR: process_payload_from_gh.post_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

        # настройка label-ов
        tracker_id_rm = None
        status_id_rm = status_ids_rm[0]
        priority_id_rm = priority_ids_rm[0]

        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]

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

        #title = '[From Github] ' + 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)

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

        issue_templated = issue_redmine_template.render(
            project_id=project_id_rm,
            tracker_id=tracker_id_rm,
            status_id=status_id_rm,
            priority_id=priority_id_rm,
            subject=title,
            description=issue_body)

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

        request_result = requests.post(url_rm,
                                       data=issue_templated,
                                       headers=headers_rm)

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

        posted_issue = json.loads(request_result.text)

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

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

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

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

        return request_result
예제 #10
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
예제 #11
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