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
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): # ----------------------------------------------- ПОДГОТОВКА ----------------------------------------------- # дополнительная проверка, что проекты связаны 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
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_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