diff --git a/gitea/basicGiteaApiObject.py b/gitea/basicGiteaApiObject.py index 28f6877..6e1d86f 100644 --- a/gitea/basicGiteaApiObject.py +++ b/gitea/basicGiteaApiObject.py @@ -29,7 +29,7 @@ class BasicGiteaApiObject: return {name: getattr(self, name) for name in self.dirty_fields} @classmethod - def parse_response(cls, gitea, result): + def parse_response(cls, gitea, result) -> "BasicGiteaApiObject": if "id" in result: id = int(result["id"]) else: @@ -53,23 +53,30 @@ class BasicGiteaApiObject: parse_func = cls.fields_to_parsers[name] value = parse_func(gitea, value) if name in cls.patchable_fields: - prop = property( - (lambda name: lambda self: self.__get_var(name))(name), - (lambda name: lambda self, v: self.__set_var(name, v))(name)) + cls._add_property(name, value, api_object) else: - prop = property( - (lambda name: lambda self: self.__get_var(name))(name)) - setattr(cls, name, prop) - setattr(api_object, "_" + name, value) + cls._add_readonly_property(name,value,api_object) # add all patchable fields to be watched if changed for name in cls.patchable_fields: if not hasattr(api_object,name): - prop = property( - (lambda name: lambda self: self.__get_var(name))(name), - (lambda name: lambda self, v: self.__set_var(name, v))(name)) - setattr(cls, name, prop) - setattr(api_object, "_" + name, None) + cls._add_property(name, None, api_object) + @classmethod + def _add_property(cls, name, value, api_object): + if not hasattr(api_object, name): + prop = property( + (lambda name: lambda self: self.__get_var(name))(name), + (lambda name: lambda self, v: self.__set_var(name, v))(name)) + setattr(cls, name, prop) + setattr(api_object, "_" + name, value) + + @classmethod + def _add_readonly_property(cls, name, value, api_object): + if not hasattr(api_object, name): + prop = property( + (lambda name: lambda self: self.__get_var(name))(name)) + setattr(cls, name, prop) + setattr(api_object, "_" + name, value) def __set_var(self, name, i): if self.deleted: diff --git a/gitea/gitea.py b/gitea/gitea.py index 44aaaf5..5d10a5c 100644 --- a/gitea/gitea.py +++ b/gitea/gitea.py @@ -32,6 +32,13 @@ class Organization(GiteaApiObject): def request(cls, gitea, name): return cls._request(gitea, {"name": name}) + @classmethod + def parse_response(cls, gitea, result): + api_object = super().parse_response(gitea, result) + # add "name" field to make this behave similar to users + Organization._add_readonly_property("name", result["username"], api_object) + return api_object + patchable_fields = {"description", "full_name", "location", "visibility", "website"} def commit(self): diff --git a/gitea/giteaApiObject.py b/gitea/giteaApiObject.py index 2170445..b7ea64f 100644 --- a/gitea/giteaApiObject.py +++ b/gitea/giteaApiObject.py @@ -18,7 +18,10 @@ class GiteaApiObject(BasicGiteaApiObject): def _request(cls, gitea, args): result = cls._get_gitea_api_object(gitea, args) api_object = cls.parse_response(gitea, result) - for key, value in args.items(): # hack: not all necessary request args in api result (e.g. repo name in issue) + # hack: not all necessary request args in api result (e.g. repo name in issue) + for key, value in args.items(): if not hasattr(api_object, key): setattr(api_object, key, value) return api_object + + diff --git a/tests/test_api.py b/tests/test_api.py index d4b2d21..486b584 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -169,6 +169,11 @@ def test_create_issue(instance): assert issue.title == "TestIssue" assert issue.body == "Body text with this issue" +def test_team_get_org(instance): + org = Organization.request(instance, test_org) + user = instance.get_user_by_name(test_user) + teams = user.get_teams() + assert org.username == teams[0].organization.name def test_delete_repo_userowned(instance): user = User.request(instance, test_user) @@ -177,7 +182,6 @@ def test_delete_repo_userowned(instance): with pytest.raises(NotFoundException) as e: Repository.request(instance, test_user, test_repo) - def test_secundary_email(instance): SECONDARYMAIL = "secondarytest@test.org" # set up with real email sec_user = instance.get_user_by_email(SECONDARYMAIL)