class IssueAttachment: def __init__(self, config: Optional[BacklogConfigure] = None): self.base_path = 'issues' _config = config if config else None self.rs = RequestSender(_config) def get_list_of_issue_attachments(self, issue_id_or_key: str, ) -> Response: """ 課題添付ファイル一覧の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-list-of-issue-attachments/ :param issue_id_or_key: 課題のID または 課題キー :return: レスポンス """ path = self.base_path + '/{issue_id_or_key}/attachments'.format(issue_id_or_key=issue_id_or_key) return self.rs.send_get_request(path=path, url_param={}) def get_issue_attachment(self, issue_id_or_key: str, attachment_id: int, ) -> Tuple[str, Response]: """ 課題添付ファイルのダウンロード https://developer.nulab.com/ja/docs/backlog/api/2/get-issue-attachment/ :param issue_id_or_key: 課題のID または 課題キー :param attachment_id: 添付ファイルのID :return: 保存されたファイルのPATH """ path = self.base_path + '/{issue_id_or_key}/attachments/{attachment_id}' \ .format(issue_id_or_key=issue_id_or_key, attachment_id=attachment_id) return self.rs.get_file(path, {}) def delete_issue_attachment(self, issue_id_or_key: str, attachment_id: int, ) -> Response: """ 課題添付ファイルの削除 https://developer.nulab.com/ja/docs/backlog/api/2/delete-issue-attachment/ :param issue_id_or_key: 課題のID または 課題キー :param attachment_id: 添付ファイルのID :return: レスポンス """ path = self.base_path + '/{issue_id_or_key}/attachments/{attachment_id}' \ .format(issue_id_or_key=issue_id_or_key, attachment_id=attachment_id) return self.rs.send_delete_request(path=path, request_param={})
class WikiAttachment: def __init__(self, config: Optional[BacklogConfigure] = None): self.base_path = 'wikis' _config = config if config else None self.rs = RequestSender(_config) def attach_file_to_wiki(self, wiki_id: int, attachment_id: Optional[List[int]] = None, ) -> Response: """ Wiki添付ファイルの追加 https://developer.nulab.com/ja/docs/backlog/api/2/attach-file-to-wiki/ :param wiki_id: WikiページのID :param attachment_id: 添付ファイルの送信APIが返すID :return: レスポンス """ path = self.base_path + '/{wiki_id}/attachments'.format(wiki_id=str(wiki_id)) payloads = {} if attachment_id is not None: payloads['attachmentId[]'] = attachment_id return self.rs.send_post_request(path=path, request_param=payloads) def get_wiki_page_attachment(self, wiki_id: int, attachment_id: Optional[int] = None, ) -> Tuple[str, Response]: """ Wiki添付ファイルのダウンロード https://developer.nulab.com/ja/docs/backlog/api/2/get-wiki-page-attachment/ :param wiki_id: WikiページのID :param attachment_id: 添付ファイルのID :return: 保存されたファイルのPATH """ path = self.base_path + '/{wiki_id}/attachments/{attachment_id}'\ .format(wiki_id=str(wiki_id), attachment_id=attachment_id) return self.rs.get_file(path=path, url_param={}) def get_list_of_wiki_attachments(self, wiki_id: int, ) -> Response: """ Wiki添付ファイル一覧の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-list-of-wiki-attachments/ :param wiki_id: WikiページのID :return: レスポンス """ path = self.base_path + '/{wiki_id}/attachments'.format(wiki_id=str(wiki_id)) return self.rs.send_get_request(path=path, url_param={}) def remove_wiki_attachment(self, wiki_id: int, attachment_id: Optional[int] = None, ) -> Response: """ Wiki添付ファイルの削除 https://developer.nulab.com/ja/docs/backlog/api/2/remove-wiki-attachment/ :param wiki_id: WikiページのID :param attachment_id: 添付ファイルのID :return: レスポンス """ path = self.base_path + '/{wiki_id}/attachments/{attachment_id}'\ .format(wiki_id=wiki_id, attachment_id=attachment_id) return self.rs.send_delete_request(path=path, request_param={})
class Project: def __init__(self, config: Optional[BacklogConfigure] = None): self.base_path = 'projects' _config = config if config else None self.rs = RequestSender(_config) def add_project( self, name: str, key: str, chart_enabled: bool, subtasking_enabled: bool, text_formatting_rule: str, project_leader_can_edit_project_leader: Optional[bool] = None, ) -> Response: """ プロジェクトの追加 https://developer.nulab.com/ja/docs/backlog/api/2/add-project/ :param name: プロジェクト名 :param key: プロジェクトキー :param chart_enabled: チャートを使用するかどうか(フリープランでは利用不可) :param project_leader_can_edit_project_leader: プロジェクト管理者も他のプロジェクト管理者を指定可能にする :param subtasking_enabled: 親子課題を使用するかどうか(フリープランでは利用不可) :param text_formatting_rule: テキスト整形のルール backlog または markdown :return: レスポンス """ path = self.base_path if re.match('^[A-Z0-9_]+$', key) is None: raise ValueError('Key は半角英大文字と半角数字とアンダースコアのみが使用できます') if text_formatting_rule not in {'backlog', 'markdown'}: raise ValueError('テキスト整形のルールは backlog または markdownのみが使用できます') # Todo: 契約プランを見て、設定できないものであれば例外を投げる payloads = { 'name': name, 'key': key, 'chartEnabled': chart_enabled, 'subtaskingEnabled': subtasking_enabled, 'textFormattingRule': text_formatting_rule } if project_leader_can_edit_project_leader is not None: payloads[ 'projectLeaderCanEditProjectLeader'] = project_leader_can_edit_project_leader return self.rs.send_post_request(path=path, request_param=payloads) def get_project(self, project_id_or_key: str) -> Response: """ プロジェクト情報の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-project/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :return: レスポンス """ path = self.base_path + '/' + project_id_or_key return self.rs.send_get_request(path=path, url_param={}) def update_project( self, project_id_or_key: str, name: Optional[str] = None, key: Optional[str] = None, chart_enabled: Optional[bool] = None, subtasking_enabled: Optional[bool] = None, project_leader_can_edit_project_leader: Optional[bool] = None, text_formatting_rule: Optional[str] = None, archived: Optional[bool] = None) -> Response: """ プロジェクト情報の更新 https://developer.nulab.com/ja/docs/backlog/api/2/update-project/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param name: プロジェクト名 :param key: プロジェクトキー :param chart_enabled: チャートを使用するかどうか(フリープランでは利用不可) :param subtasking_enabled: 親子課題を使用するかどうか(フリープランでは利用不可) :param project_leader_can_edit_project_leader: プロジェクト管理者も他のプロジェクト管理者を指定可能にする :param text_formatting_rule: テキスト整形のルール backlog または markdown :param archived: プロジェクトの一覧に表示するかどうか :return: レスポンス """ # Todo: 契約プランを見て、設定できないものであれば例外を投げる path = self.base_path + '/' + project_id_or_key payloads = {} if name is not None: payloads['name'] = name if key is not None: if re.match('^[A-Z0-9_]+$', key) is None: raise ValueError('Key は半角英大文字と半角数字とアンダースコアのみが使用できます') payloads['key'] = key if chart_enabled is not None: payloads['chartEnabled'] = chart_enabled if subtasking_enabled is not None: payloads['subtaskingEnabled'] = subtasking_enabled if project_leader_can_edit_project_leader is not None: payloads[ 'projectLeaderCanEditProjectLeader'] = project_leader_can_edit_project_leader if text_formatting_rule is not None: if text_formatting_rule not in ['backlog', 'markdown']: raise ValueError('テキスト整形のルールは backlog または markdownのみが使用できます') payloads['textFormattingRule'] = text_formatting_rule if archived is not None: payloads['archived'] = archived return self.rs.send_patch_request(path=path, request_param=payloads) def delete_project(self, project_id_or_key: str) -> Response: """ プロジェクトの削除 https://developer.nulab.com/ja/docs/backlog/api/2/delete-project/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :return: レスポンス """ path = self.base_path + '/' + project_id_or_key return self.rs.send_delete_request(path=path, request_param={}) def get_project_list(self, archived: Optional[bool] = None, all_projects: Optional[bool] = None) -> Response: """ プロジェクト一覧の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-project-list/ :param archived: 省略された場合は全てのプロジェクト、falseの場合はアーカイブされていないプロジェクト、trueの場合はアーカイブされたプロジェクトを返します。 :param all_projects: ユーザが管理者権限の場合のみ有効なパラメータです。trueの場合はすべてのプロジェクト、falseの場合は参加しているプロジェクトのみを返します。初期値はfalse。 :return: レスポンス """ path = self.base_path payloads = {} if archived is not None: payloads['archived'] = archived if all_projects is not None: payloads['all'] = all_projects return self.rs.send_get_request(path=path, url_param=payloads) def get_project_icon( self, project_id_or_key: Optional[str] = None) -> Tuple[str, Response]: """ プロジェクトアイコンの取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-project-icon/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/image'.format( project_id_or_key=project_id_or_key) return self.rs.get_file(path=path, url_param={}) def get_project_recent_updates( self, project_id_or_key: str, activity_type_id: Optional[List[int]] = None, min_id: Optional[int] = None, max_id: Optional[int] = None, count: Optional[int] = 20, order: Optional[str] = 'desc', update_type: Optional[int] = None, ) -> Response: """ プロジェクトの最近の活動の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-project-recent-updates/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param activity_type_id: type(1-26) :param min_id: 最小ID :param max_id: 最大ID :param count: 取得上限(1-100) 指定が無い場合は20 :param order: “asc”または”desc” 指定が無い場合は”desc” :param update_type: 最近の更新の種別:(1)課題の追加 (2)課題の更新 (3)課題にコメント (4)課題の削除 (5)Wikiを追加 (6)Wikiを更新 (7)Wikiを削除 (8)共有ファイルを追加 (9)共有ファイルを更新(10)共有ファイルを削除 (11)Subversionコミット (12)GITプッシュ (13)GITリポジトリ作成 (14)課題をまとめて更新 (15)ユーザーがプロジェクトに参加 (16)ユーザーがプロジェクトから脱退 (17)コメントにお知らせを追加 (18)プルリクエストの追加 (19)プルリクエストの更新 (20)プルリクエストにコメント (21)プルリクエストの削除 (22)マイルストーンの追加 (23)マイルストーンの更新 (24)マイルストーンの削除 (25)グループがプロジェクトに参加 (26)グループがプロジェクトから脱退 :return: レスポンス """ path = self.base_path + '/' + project_id_or_key payloads = {} if activity_type_id is not None: payloads['activityTypeId[]'] = activity_type_id if min_id is not None: payloads['minId'] = min_id if max_id is not None: payloads['maxId'] = max_id if count is not None: if not 1 <= count <= 100: raise ValueError('count(取得上限)は1-100の範囲で指定してください') payloads['count'] = count if order is not None: if order not in {'desc', 'asc'}: raise ValueError('order は desc または asc のみが使用できます') payloads['order'] = order if update_type is not None: payloads['type'] = update_type return self.rs.send_get_request(path=path, url_param=payloads) def get_project_user_list( self, project_id_or_key: str, exclude_group_members: Optional[bool] = None) -> Response: """ プロジェクトユーザー一覧の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-project-user-list/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param exclude_group_members: グループを介してプロジェクトに参加しているメンバーを除く :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/users'.format( project_id_or_key=project_id_or_key) payloads = {} if exclude_group_members is not None: payloads['excludeGroupMembers'] = exclude_group_members return self.rs.send_get_request(path=path, url_param=payloads) def add_project_user(self, project_id_or_key: str, user_id: int) -> Response: """ プロジェクトユーザーの追加 https://developer.nulab.com/ja/docs/backlog/api/2/add-project-user/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param user_id: 追加するユーザーのID :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/users'.format( project_id_or_key=project_id_or_key) payloads = {} if user_id is not None: payloads['userId'] = user_id return self.rs.send_post_request(path=path, request_param=payloads) def get_list_of_project_administrators(self, project_id_or_key: str) -> Response: """ プロジェクト管理者一覧の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-list-of-project-administrators/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/administrators'.format( project_id_or_key=project_id_or_key) return self.rs.send_delete_request(path=path, request_param={}) def delete_project_user(self, project_id_or_key: str, user_id: int) -> Response: """ プロジェクトユーザーの削除 https://developer.nulab.com/ja/docs/backlog/api/2/delete-project-user/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param user_id: 削除するユーザーのID :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/users'.format( project_id_or_key=project_id_or_key) payloads = {'userId': user_id} return self.rs.send_delete_request(path=path, request_param=payloads) def add_project_administrator(self, project_id_or_key: str, user_id: int) -> Response: """ プロジェクト管理者の追加 https://developer.nulab.com/ja/docs/backlog/api/2/add-project-administrator/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param user_id: 追加するユーザーのID :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/administrators'.format( project_id_or_key=project_id_or_key) payloads = {'userId': user_id} return self.rs.send_post_request(path=path, request_param=payloads) def delete_project_administrator(self, project_id_or_key: str, user_id: int) -> Response: """ プロジェクト管理者の削除 https://developer.nulab.com/ja/docs/backlog/api/2/delete-project-administrator/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param user_id: 削除するユーザーのID :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/administrators'.format( project_id_or_key=project_id_or_key) payloads = {'userId': user_id} return self.rs.send_delete_request(path=path, request_param=payloads)
class Space: def __init__(self, config: Optional[BacklogConfigure] = None): self.base_path = 'space' _config = config if config else None self.rs = RequestSender(_config) def get_space(self) -> Response: """ スペース情報の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-space/ :return: レスポンス """ path = self.base_path return self.rs.send_get_request(path=path, url_param={}) def get_recent_updates( self, activity_type_id: Optional[List[int]] = None, min_id: Optional[int] = None, max_id: Optional[int] = None, count: Optional[int] = 20, order: Optional[str] = 'desc', ) -> Response: """ 最近の更新の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-recent-updates/ :param activity_type_id: type(1-26) :param min_id: 最小ID :param max_id: 最大ID :param count: 取得上限(1-100) 指定が無い場合は20 :param order: “asc”または”desc” 指定が無い場合は”desc” :return: レスポンス """ path = self.base_path + '/activities' payloads = {} if activity_type_id is not None: payloads['activityTypeId[]'] = activity_type_id if min_id is not None: payloads['minId'] = min_id if max_id is not None: payloads['maxId'] = max_id if count is not None: if not 1 <= count <= 100: raise ValueError('count(取得上限)は1-100の範囲で指定してください') if order is not None: if order not in {'desc', 'asc'}: raise ValueError('order は desc または asc のみが使用できます') payloads['order'] = order return self.rs.send_get_request(path=path, url_param=payloads) def get_space_logo(self) -> Tuple[str, Response]: """ スペースアイコン画像の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-space-logo/ :return: レスポンス """ path = self.base_path + '/image' return self.rs.get_file(path=path, url_param={}) def get_space_notification(self) -> Response: """ スペースのお知らせの取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-space-notification/ :return: レスポンス """ path = self.base_path + '/notification' return self.rs.send_get_request(path=path, url_param={}) # def update_space_notification(self) -> Response: # """ # スペースのお知らせの更新 # https://developer.nulab.com/ja/docs/backlog/api/2/update-space-notification/ # # :return: レスポンス # """ # # path = self.base_path + '/notification' # # return self.rs.send_patch_request(path=path, request_param={}) def get_space_disk_usage(self) -> Response: """ スペースの容量使用状況の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-space-disk-usage/ :return: レスポンス """ path = self.base_path + '/diskUsage' return self.rs.send_get_request(path=path, url_param={})
class PullRequestAttachment: def __init__(self, config: Optional[BacklogConfigure] = None): self.base_path = 'projects' _config = config if config else None self.rs = RequestSender(_config) def get_list_of_pull_request_attachment(self, project_id_or_key: str, repo_id_or_name: str, number: int, ) -> Response: """ プルリクエスト添付ファイル一覧の取得 https://developer.nulab.com/ja/docs/backlog/api/2/get-list-of-pull-request-attachment/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param repo_id_or_name: リポジトリのID または リポジトリ名 :param number: プルリクエストの番号 :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/git/repositories/{repo_id_or_name}/' \ 'pullRequests/{number}/attachments' \ .format(project_id_or_key=project_id_or_key, repo_id_or_name=repo_id_or_name, number=number) return self.rs.send_get_request(path=path, url_param={}) def download_pull_request_attachment(self, project_id_or_key: str, repo_id_or_name: str, number: int, attachment_id: int, ) -> Tuple[str, Response]: """ プルリクエスト添付ファイルのダウンロード https://developer.nulab.com/ja/docs/backlog/api/2/download-pull-request-attachment/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param repo_id_or_name: リポジトリのID または リポジトリ名 :param number: プルリクエストの番号 :param attachment_id: 添付ファイルのID :return: ダウンロードされたファイルのPATH """ path = self.base_path + '/{project_id_or_key}/git/repositories/{repo_id_or_name}/' \ 'pullRequests/{number}/attachments/{attachment_id}' \ .format(project_id_or_key=project_id_or_key, repo_id_or_name=repo_id_or_name, number=number, attachment_id=attachment_id) return self.rs.get_file(path=path, url_param={}) def delete_pull_request_attachments(self, project_id_or_key: str, repo_id_or_name: str, number: int, attachment_id: int, ) -> Response: """ プルリクエスト添付ファイルの削除 https://developer.nulab.com/ja/docs/backlog/api/2/delete-pull-request-attachments/ :param project_id_or_key: プロジェクトのID または プロジェクトキー :param repo_id_or_name: リポジトリのID または リポジトリ名 :param number: プルリクエストの番号 :param attachment_id: 添付ファイルのID :return: レスポンス """ path = self.base_path + '/{project_id_or_key}/git/repositories/{repo_id_or_name}/' \ 'pullRequests/{number}/attachments/{attachment_id}' \ .format(project_id_or_key=project_id_or_key, repo_id_or_name=repo_id_or_name, number=number, attachment_id=attachment_id) return self.rs.send_delete_request(path=path, request_param={})