diff --git a/docs/gl_objects/projects.rst b/docs/gl_objects/projects.rst index 6d692950d..1abb82c9b 100644 --- a/docs/gl_objects/projects.rst +++ b/docs/gl_objects/projects.rst @@ -430,6 +430,10 @@ Delete a snippet:: # or snippet.delete() +Get user agent detail (admin only):: + + detail = snippet.user_agent_detail() + Notes ===== diff --git a/docs/gl_objects/snippets.rst b/docs/gl_objects/snippets.rst index 5493db0ac..9ab4ab2dd 100644 --- a/docs/gl_objects/snippets.rst +++ b/docs/gl_objects/snippets.rst @@ -52,3 +52,7 @@ Delete a snippet:: gl.snippets.delete(snippet_id) # or snippet.delete() + +Get user agent detail (admin only):: + + detail = snippet.user_agent_detail() diff --git a/gitlab/mixins.py b/gitlab/mixins.py index 013f7b72f..988042b3c 100644 --- a/gitlab/mixins.py +++ b/gitlab/mixins.py @@ -371,6 +371,23 @@ def delete(self, **kwargs): self.manager.delete(self.get_id()) +class UserAgentDetailMixin(object): + @cli.register_custom_action(('Snippet', 'ProjectSnippet', 'ProjectIssue')) + @exc.on_http_error(exc.GitlabGetError) + def user_agent_detail(self, **kwargs): + """Get the user agent detail. + + Args: + **kwargs: Extra options to send to the server (e.g. sudo) + + Raises: + GitlabAuthenticationError: If authentication is not correct + GitlabGetError: If the server cannot perform the request + """ + path = '%s/%s/user_agent_detail' % (self.manager.path, self.get_id()) + return self.manager.gitlab.http_get(path, **kwargs) + + class AccessRequestMixin(object): @cli.register_custom_action(('ProjectAccessRequest', 'GroupAccessRequest'), tuple(), ('access_level', )) diff --git a/gitlab/tests/test_mixins.py b/gitlab/tests/test_mixins.py index c73795387..b3c2e81f0 100644 --- a/gitlab/tests/test_mixins.py +++ b/gitlab/tests/test_mixins.py @@ -73,6 +73,13 @@ class O(SetMixin): obj = O() self.assertTrue(hasattr(obj, 'set')) + def test_user_agent_detail_mixin(self): + class O(UserAgentDetailMixin): + pass + + obj = O() + self.assertTrue(hasattr(obj, 'user_agent_detail')) + class TestMetaMixins(unittest.TestCase): def test_retrieve_mixin(self): diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 2c96e749b..46a6fd748 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -786,7 +786,7 @@ class LicenseManager(RetrieveMixin, RESTManager): _optional_get_attrs = ('project', 'fullname') -class Snippet(SaveMixin, ObjectDeleteMixin, RESTObject): +class Snippet(UserAgentDetailMixin, SaveMixin, ObjectDeleteMixin, RESTObject): _short_print_attr = 'title' @cli.register_custom_action('Snippet') @@ -1386,8 +1386,9 @@ class ProjectIssueDiscussionManager(RetrieveMixin, CreateMixin, RESTManager): _create_attrs = (('body',), ('created_at',)) -class ProjectIssue(SubscribableMixin, TodoMixin, TimeTrackingMixin, SaveMixin, - ObjectDeleteMixin, RESTObject): +class ProjectIssue(UserAgentDetailMixin, SubscribableMixin, TodoMixin, + TimeTrackingMixin, SaveMixin, ObjectDeleteMixin, + RESTObject): _short_print_attr = 'title' _id_attr = 'iid' _managers = ( @@ -1396,21 +1397,6 @@ class ProjectIssue(SubscribableMixin, TodoMixin, TimeTrackingMixin, SaveMixin, ('notes', 'ProjectIssueNoteManager'), ) - @cli.register_custom_action('ProjectIssue') - @exc.on_http_error(exc.GitlabUpdateError) - def user_agent_detail(self, **kwargs): - """Get user agent detail. - - Args: - **kwargs: Extra options to send to the server (e.g. sudo) - - Raises: - GitlabAuthenticationError: If authentication is not correct - GitlabGetError: If the detail could not be retrieved - """ - path = '%s/%s/user_agent_detail' % (self.manager.path, self.get_id()) - return self.manager.gitlab.http_get(path, **kwargs) - @cli.register_custom_action('ProjectIssue', ('to_project_id',)) @exc.on_http_error(exc.GitlabUpdateError) def move(self, to_project_id, **kwargs): @@ -2291,7 +2277,8 @@ class ProjectSnippetDiscussionManager(RetrieveMixin, CreateMixin, RESTManager): _create_attrs = (('body',), ('created_at',)) -class ProjectSnippet(SaveMixin, ObjectDeleteMixin, RESTObject): +class ProjectSnippet(UserAgentDetailMixin, SaveMixin, ObjectDeleteMixin, + RESTObject): _url = '/projects/%(project_id)s/snippets' _short_print_attr = 'title' _managers = ( diff --git a/tools/python_test_v4.py b/tools/python_test_v4.py index 5cec8d350..fc19ee7ba 100644 --- a/tools/python_test_v4.py +++ b/tools/python_test_v4.py @@ -506,6 +506,8 @@ assert(len(issue1.notes.list()) == 0) assert(isinstance(issue1.user_agent_detail(), dict)) +assert(issue1.user_agent_detail()['user_agent']) + discussion = issue1.discussions.create({'body': 'Discussion body'}) assert(len(issue1.discussions.list()) == 1) d_note = discussion.notes.create({'body': 'first note'}) @@ -534,6 +536,8 @@ 'visibility': gitlab.v4.objects.VISIBILITY_PRIVATE} ) +assert(snippet.user_agent_detail()['user_agent']) + discussion = snippet.discussions.create({'body': 'Discussion body'}) assert(len(snippet.discussions.list()) == 1) d_note = discussion.notes.create({'body': 'first note'}) @@ -699,6 +703,8 @@ content = snippet.content() assert(content == 'import gitlab') +assert(snippet.user_agent_detail()['user_agent']) + snippet.delete() snippets = gl.snippets.list(all=True) assert(len(snippets) == 0)