Skip to content

Commit

Permalink
Add moveTo parameter to delete methods when needed by Taiga API
Browse files Browse the repository at this point in the history
  • Loading branch information
protoroto committed Aug 22, 2023
1 parent 8a701a3 commit 1953692
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 23 deletions.
1 change: 1 addition & 0 deletions changes/130.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add moveTo parameter in delete methods when needed by Taiga API
8 changes: 4 additions & 4 deletions taiga/models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@ def get(self, resource_id):
response = self.requester.get("/{endpoint}/{id}", endpoint=self.instance.endpoint, id=resource_id)
return self.instance.parse(self.requester, response.json())

def delete(self, resource_id):
self.requester.delete("/{endpoint}/{id}", endpoint=self.instance.endpoint, id=resource_id)
def delete(self, resource_id, query=None):
self.requester.delete("/{endpoint}/{id}", endpoint=self.instance.endpoint, id=resource_id, query=query)
return self

def _new_resource(self, **attrs):
Expand Down Expand Up @@ -170,11 +170,11 @@ def patch(self, fields, **args):
self.__dict__["version"] = obj_json["version"]
return self

def delete(self):
def delete(self, query=None):
"""
Delete the current :class:`InstanceResource`
"""
self.requester.delete("/{endpoint}/{id}", endpoint=self.endpoint, id=self.id)
self.requester.delete("/{endpoint}/{id}", endpoint=self.endpoint, id=self.id, query=query)
return self

def to_dict(self):
Expand Down
50 changes: 34 additions & 16 deletions taiga/models/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,24 @@
from .base import InstanceResource, ListResource


class MoveOnDestroyMixinList:
"""
Mixin that define a delete method with moveTo parameter
"""

def delete(self, resource_id, move_to_id):
return super().delete(resource_id=resource_id, query={"moveTo": move_to_id})

Check warning on line 15 in taiga/models/models.py

View check run for this annotation

Codecov / codecov/patch

taiga/models/models.py#L15

Added line #L15 was not covered by tests


class MoveOnDestroyMixinObject:
"""
Mixin that define a delete method with moveTo parameter
"""

def delete(self, move_to_id):
return super().delete(query={"moveTo": move_to_id})

Check warning on line 24 in taiga/models/models.py

View check run for this annotation

Codecov / codecov/patch

taiga/models/models.py#L24

Added line #L24 was not covered by tests


class CommentableResource(InstanceResource):
"""
CommentableResource base class
Expand Down Expand Up @@ -155,7 +173,7 @@ def create(self, project, email, role, **attrs):
return self._new_resource(payload=attrs)


class Priority(InstanceResource):
class Priority(MoveOnDestroyMixinObject, InstanceResource):
"""
Priority model
Expand All @@ -172,7 +190,7 @@ class Priority(InstanceResource):
repr_attribute = "name"


class Priorities(ListResource):
class Priorities(MoveOnDestroyMixinList, ListResource):
"""
Priorities factory class
"""
Expand Down Expand Up @@ -345,7 +363,7 @@ def create(self, project, subject, **attrs):
return self._new_resource(payload=attrs)


class EpicStatus(InstanceResource):
class EpicStatus(MoveOnDestroyMixinObject, InstanceResource):
"""
Taiga Epic Status model
Expand All @@ -364,7 +382,7 @@ class EpicStatus(InstanceResource):
allowed_params = ["color", "is_closed", "name", "order", "project", "slug`"]


class EpicStatuses(ListResource):
class EpicStatuses(MoveOnDestroyMixinList, ListResource):
instance = EpicStatus

def create(self, project, name, **attrs):
Expand Down Expand Up @@ -495,7 +513,7 @@ def import_(self, project, subject, status, **attrs):
return self.instance.parse(self.requester, response.json())


class UserStoryStatus(InstanceResource):
class UserStoryStatus(MoveOnDestroyMixinObject, InstanceResource):
"""
Taiga User Story Status model
Expand All @@ -514,7 +532,7 @@ class UserStoryStatus(InstanceResource):
allowed_params = ["color", "is_closed", "name", "order", "project", "wip_limit"]


class UserStoryStatuses(ListResource):
class UserStoryStatuses(MoveOnDestroyMixinList, ListResource):
instance = UserStoryStatus

def create(self, project, name, **attrs):
Expand All @@ -529,7 +547,7 @@ def create(self, project, name, **attrs):
return self._new_resource(payload=attrs)


class Point(InstanceResource):
class Point(MoveOnDestroyMixinObject, InstanceResource):
"""
Taiga Point model
Expand All @@ -547,7 +565,7 @@ class Point(InstanceResource):
allowed_params = ["color", "value", "name", "order", "project"]


class Points(ListResource):
class Points(MoveOnDestroyMixinList, ListResource):
"""
Points factory
"""
Expand Down Expand Up @@ -653,7 +671,7 @@ def import_(self, project, name, estimated_start, estimated_finish, **attrs):
return self.instance.parse(self.requester, response.json())


class TaskStatus(InstanceResource):
class TaskStatus(MoveOnDestroyMixinObject, InstanceResource):
"""
Task Status model
Expand All @@ -669,7 +687,7 @@ class TaskStatus(InstanceResource):
allowed_params = ["name", "color", "order", "project", "is_closed"]


class TaskStatuses(ListResource):
class TaskStatuses(MoveOnDestroyMixinList, ListResource):
instance = TaskStatus

def create(self, project, name, **attrs):
Expand Down Expand Up @@ -792,7 +810,7 @@ def import_(self, project, subject, status, **attrs):
return self.instance.parse(self.requester, response.json())


class IssueType(InstanceResource):
class IssueType(MoveOnDestroyMixinObject, InstanceResource):
"""
IssueType model
Expand All @@ -807,7 +825,7 @@ class IssueType(InstanceResource):
allowed_params = ["name", "color", "order", "project"]


class IssueTypes(ListResource):
class IssueTypes(MoveOnDestroyMixinList, ListResource):
"""
IssueTypes factory
"""
Expand All @@ -819,7 +837,7 @@ def create(self, project, name, **attrs):
return self._new_resource(payload=attrs)


class IssueStatus(InstanceResource):
class IssueStatus(MoveOnDestroyMixinObject, InstanceResource):
"""
Issue Status model
Expand All @@ -835,7 +853,7 @@ class IssueStatus(InstanceResource):
allowed_params = ["name", "color", "order", "project", "is_closed"]


class IssueStatuses(ListResource):
class IssueStatuses(MoveOnDestroyMixinList, ListResource):
"""
IssueStatuses factory
"""
Expand Down Expand Up @@ -1044,7 +1062,7 @@ class EpicAttributes(CustomAttributes):
instance = EpicAttribute


class Severity(InstanceResource):
class Severity(MoveOnDestroyMixinObject, InstanceResource):
"""
Severity model
Expand All @@ -1059,7 +1077,7 @@ class Severity(InstanceResource):
allowed_params = ["name", "color", "order", "project"]


class Severities(ListResource):
class Severities(MoveOnDestroyMixinList, ListResource):
"""
Severities factory
"""
Expand Down
27 changes: 24 additions & 3 deletions tests/test_model_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,14 @@ def test_call_model_base_delete(self, mock_requestmaker_delete):
rm = RequestMaker("/api/v1", "fakehost", "faketoken")
fake = Fake(rm, id=1, param1="one", param2="two")
fake.delete()
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1)
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1, query=None)

@patch("taiga.requestmaker.RequestMaker.delete")
def test_call_model_base_delete_with_query(self, mock_requestmaker_delete):
rm = RequestMaker("/api/v1", "fakehost", "faketoken")
fake = Fake(rm, id=1, param1="one", param2="two")
fake.delete(query=2)
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1, query=2)

@patch("taiga.requestmaker.RequestMaker.get")
def test_call_model_base_get_element(self, mock_requestmaker_get):
Expand All @@ -128,14 +135,28 @@ def test_call_model_base_delete_element(self, mock_requestmaker_delete):
rm = RequestMaker("/api/v1", "fakehost", "faketoken")
fake = Fake(rm, id=1, param1="one", param2="two")
fake.delete()
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1)
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1, query=None)

@patch("taiga.requestmaker.RequestMaker.delete")
def test_call_model_base_delete_element_with_query(self, mock_requestmaker_delete):
rm = RequestMaker("/api/v1", "fakehost", "faketoken")
fake = Fake(rm, id=1, param1="one", param2="two")
fake.delete(1)
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1, query=1)

@patch("taiga.requestmaker.RequestMaker.delete")
def test_call_model_base_delete_element_from_list(self, mock_requestmaker_delete):
rm = RequestMaker("/api/v1", "fakehost", "faketoken")
fakes = Fakes(rm)
fakes.delete(1)
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1)
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1, query=None)

@patch("taiga.requestmaker.RequestMaker.delete")
def test_call_model_base_delete_element_from_list_with_query(self, mock_requestmaker_delete):
rm = RequestMaker("/api/v1", "fakehost", "faketoken")
fakes = Fakes(rm)
fakes.delete(1, 2)
mock_requestmaker_delete.assert_called_once_with("/{endpoint}/{id}", endpoint="fakes", id=1, query=2)

@patch("taiga.requestmaker.RequestMaker.get")
def test_call_model_base_list_elements(self, mock_requestmaker_get):
Expand Down

0 comments on commit 1953692

Please sign in to comment.