From 00c2f97063c055bb2cf0ef48c9be3904bb77e4a7 Mon Sep 17 00:00:00 2001 From: Daniel Dietsch Date: Sat, 7 Dec 2019 19:59:01 +0100 Subject: [PATCH] add API methods Repository.create_issue, Repository.is_collaborator, Organisation.is_member, disable debug logging of all API methods --- gitea/basicGiteaApiObject.py | 2 +- gitea/gitea.py | 51 +++++++++++++++++++++++++++++------- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/gitea/basicGiteaApiObject.py b/gitea/basicGiteaApiObject.py index 54375a0..d8ac53c 100644 --- a/gitea/basicGiteaApiObject.py +++ b/gitea/basicGiteaApiObject.py @@ -34,7 +34,7 @@ class BasicGiteaApiObject: @classmethod def parse_request(cls, gitea, result): id = int(result["id"]) - logging.debug("Found api object of type %s (id: %s)" % (type(cls), id)) + #gitea.logger.debug("Found api object of type %s (id: %s)" % (type(cls), id)) api_object = cls(gitea, id=id) cls._initialize(gitea, api_object, result) return api_object diff --git a/gitea/gitea.py b/gitea/gitea.py index 6698898..99b0ed5 100644 --- a/gitea/gitea.py +++ b/gitea/gitea.py @@ -18,6 +18,7 @@ class Organization(GiteaApiObject): ORG_TEAMS_REQUEST = """/orgs/%s/teams""" # ORG_TEAMS_CREATE = """/orgs/%s/teams""" # ORG_GET_MEMBERS = """/orgs/%s/members""" # + ORG_IS_MEMBER = """/orgs/%s/members/%s""" # , ORG_DELETE = """/orgs/%s""" # ORG_HEATMAP = """/users/%s/heatmap""" # @@ -55,6 +56,16 @@ class Organization(GiteaApiObject): results = self.gitea.requests_get(Organization.ORG_GET_MEMBERS % self.username) return [User.parse_request(self.gitea, result) for result in results] + def is_member(self, username) -> bool: + if isinstance(username, User): + username = username.username + try: + # returns 204 if its ok, 404 if its not + self.gitea.requests_get(Organization.ORG_IS_MEMBER % (self.username, username)) + return True + except: + return False + def remove_member(self, user: GiteaApiObject): path = "/orgs/" + self.username + "/members/" + user.username self.gitea.requests_delete(path) @@ -136,6 +147,7 @@ class User(GiteaApiObject): class Repository(GiteaApiObject): + REPO_IS_COLLABORATOR = """/repos/%s/%s/collaborators/%s""" # , , GET_API_OBJECT = """/repos/{owner}/{name}""" # , REPO_SEARCH = """/repos/search/%s""" # REPO_BRANCHES = """/repos/%s/%s/branches""" # , @@ -197,6 +209,29 @@ class Repository(GiteaApiObject): time = sum(r["time"] for r in results) return time + def get_full_name(self) -> str: + return self.owner.username + '/' + self.name + + def create_issue(self, title, assignees=[], description="", ) -> GiteaApiObject: + data = { + "assignees": assignees, + "body": description, + "closed": False, + "title": title + } + result = self.gitea.requests_post(Repository.REPO_ISSUES % (self.owner.username, self.name), data=data) + return Issue.parse_request(self.gitea, result) + + def is_collaborator(self, username) -> bool: + if isinstance(username, User): + username = username.username + try: + # returns 204 if its ok, 404 if its not + self.gitea.requests_get(Repository.REPO_IS_COLLABORATOR % (self.owner.username, self.name, username)) + return True + except: + return False + def delete(self): self.gitea.requests_delete(Repository.REPO_DELETE % (self.owner.username, self.name)) self.deleted = True @@ -356,7 +391,7 @@ class Gitea: def __init__(self, gitea_url: str, token_text: str, cached=False, log_level="INFO"): """ Initializing Gitea-instance.""" - self.logger = logging.getLogger() + self.logger = logging.getLogger(__name__) self.logger.setLevel(log_level) self.headers = {"Authorization": "token " + token_text, "Content-type": "application/json"} self.url = gitea_url @@ -382,13 +417,14 @@ class Gitea: request = self.requests.get(self.__get_url(endpoint), headers=self.headers, params=params) else: request = requests.get(self.__get_url(endpoint), headers=self.headers, params=params) + if request.status_code == 204: + return None if request.status_code not in [200, 201]: message = "Received status code: %s (%s)" % (request.status_code, request.url) - self.logger.error(message) if request.status_code in [404]: - raise NotFoundException() + raise NotFoundException(message) if request.status_code in [403]: - raise Exception("Unauthorized: %s - Check your permissions and try again!" % request.url) + raise Exception("Unauthorized: %s - Check your permissions and try again! (%s)" % request.url, message) raise Exception(message) return self.parse_result(request) @@ -424,13 +460,10 @@ class Gitea: self.__get_url(endpoint), headers=self.headers, data=json.dumps(data) ) if request.status_code not in [200, 201]: - if ( - "already exists" in request.text - or "e-mail already in use" in request.text - ): + if "already exists" in request.text or "e-mail already in use" in request.text: self.logger.warning(request.text) raise AlreadyExistsException() - self.logger.error("Received status code: %s (%s)" % (request.status_code, request.url)) + self.logger.error("Received status code: %s (%s)" % (request.status_code, request.url)) self.logger.error("With info: %s (%s)" % (data, self.headers)) self.logger.error("Answer: %s" % request.text) raise Exception("Received status code: %s (%s), %s" % (request.status_code, request.url, request.text))