Source code for osctiny.extensions.comments

"""
Comments extension
------------------
"""
import os
from urllib.parse import urljoin

from ..utils.base import ExtensionBase


[docs]class Comment(ExtensionBase): """ The BuildService comment(s) API is accessible through this object. """ base_path = "/comments/" allowed_object_types = {"project": 1, "package": 2, "request": 1} def _validate(self, obj_type, ids): if obj_type not in self.allowed_object_types: raise ValueError( "Type '{}' is not in list of allowed values: {}".format( obj_type, self.allowed_object_types ) ) required_length = self.allowed_object_types.get(obj_type, -1) if len(ids) != required_length: raise ValueError("For object type {} the length of IDs has to be " "equal to {}!".format(obj_type, required_length))
[docs] def get(self, obj_type, ids): """ Get a list of comments for object .. versionadded:: 0.1.8 .. note:: The ``ids`` argument will look like this, e.g. for a package: ``('project_name', 'package_name')``. :param obj_type: Name of object type (project, package, request) :type obj_type: str :param ids: IDs of object :type ids: iterable :return: Objectified XML element :rtype: lxml.objectify.ObjectifiedElement """ self._validate(obj_type, ids) response = self.osc.request( url=urljoin(self.osc.url, os.path.join(*([self.base_path, obj_type] + [str(x) for x in ids]))), method="GET", ) return self.osc.get_objectified_xml(response)
[docs] def add(self, obj_type, ids, comment, parent_id=None): """ Add a comment to object :param obj_type: Name of object type (project, package, request) :type obj_type: str :param ids: IDs of object :type ids: iterable :param comment: Comment to be added :param parent_id: ID of parent comment. Default: ``None`` :return: ``True``, if successful. :raises HTTPError: if comment was not saved correctly. The raised exception contains the full response object and API response. .. versionadded: 0.1.8 .. versionchanged:: 0.3.0 Instead of simply returning the API response, if the comment was not added, an exception is raised. """ self._validate(obj_type, ids) url = urljoin(self.osc.url, os.path.join(*([self.base_path, obj_type] + [str(x) for x in ids]))) params = {} if parent_id and str(parent_id).isnumeric(): params["parent_id"] = parent_id response = self.osc.request( url=url, method="POST", data=comment, params=params, raise_for_status=True ) parsed = self.osc.get_objectified_xml(response) if response.status_code == 200 and parsed.get("code") == "ok": return True return False
[docs] def delete(self, comment_id): """ Delete comment .. versionadded:: 0.1.8 :param comment_id: ID of comment :return: ``True``, if successful. Otherwise API response :rtype: bool or lxml.objectify.ObjectifiedElement """ url = urljoin(self.osc.url, '/comment/' + str(comment_id)) response = self.osc.request( url=url, method="DELETE", raise_for_status=False ) parsed = self.osc.get_objectified_xml(response) if response.status_code == 200 and parsed.get("code") == "ok": return True return parsed