Loading src/rpc/methods.py +7 −4 Original line number Diff line number Diff line Loading @@ -2211,15 +2211,18 @@ def set_tag( @_rpc_groups(["Tags"]) def delete_tag(user: User, uid: str) -> bool: def delete_tag(user: User, uid: str, project_id: int) -> bool: """ Remove (delete) a tag based on its uid. Remove (delete) a tag based on its project and uid. Beware: This will remove ALL associations with the tag. """ project = Project.objects.filter(pk=project_id).first() if not project: raise ServiceException(NO_SUCH_PROJECT) try: tag_instance = Tag.objects.get(uid=uid) UserAccess(user, tag_instance.project).check_delete(tag_instance) tag_instance = Tag.objects.get(project=project, uid=uid) UserAccess(user, project).check_delete(tag_instance) tag_instance.delete() return True except Tag.DoesNotExist: Loading src/rpc/tests.py +22 −0 Original line number Diff line number Diff line Loading @@ -961,6 +961,28 @@ class ServiceTestCase(TestCase): tags = methods.tags(self.test_user, self.test_project.pk) self.assertEqual(len(tags), 1) def test_delete_tag_is_scoped_to_project(self): other_project = models.Project.objects.create(label="other tag project") tag = models.Tag.objects.create( project=self.test_project, uid="shared tag", label="local" ) other_tag = models.Tag.objects.create( project=other_project, uid="shared tag", label="foreign" ) self.assertTrue( methods.delete_tag(self.test_user, tag.uid, self.test_project.pk) ) self.assertFalse(models.Tag.objects.filter(pk=tag.pk).exists()) self.assertTrue(models.Tag.objects.filter(pk=other_tag.pk).exists()) def test_delete_tag_rejects_unknown_project(self): with self.assertRaises(ServiceException) as context: methods.delete_tag(self.test_user, "tag", -1) self.assertEqual(context.exception.message, methods.NO_SUCH_PROJECT) def test_add_collection_from_path(self): ancestors_labels = ["toto", "tata"] collections = methods.add_collection_from_path( Loading Loading
src/rpc/methods.py +7 −4 Original line number Diff line number Diff line Loading @@ -2211,15 +2211,18 @@ def set_tag( @_rpc_groups(["Tags"]) def delete_tag(user: User, uid: str) -> bool: def delete_tag(user: User, uid: str, project_id: int) -> bool: """ Remove (delete) a tag based on its uid. Remove (delete) a tag based on its project and uid. Beware: This will remove ALL associations with the tag. """ project = Project.objects.filter(pk=project_id).first() if not project: raise ServiceException(NO_SUCH_PROJECT) try: tag_instance = Tag.objects.get(uid=uid) UserAccess(user, tag_instance.project).check_delete(tag_instance) tag_instance = Tag.objects.get(project=project, uid=uid) UserAccess(user, project).check_delete(tag_instance) tag_instance.delete() return True except Tag.DoesNotExist: Loading
src/rpc/tests.py +22 −0 Original line number Diff line number Diff line Loading @@ -961,6 +961,28 @@ class ServiceTestCase(TestCase): tags = methods.tags(self.test_user, self.test_project.pk) self.assertEqual(len(tags), 1) def test_delete_tag_is_scoped_to_project(self): other_project = models.Project.objects.create(label="other tag project") tag = models.Tag.objects.create( project=self.test_project, uid="shared tag", label="local" ) other_tag = models.Tag.objects.create( project=other_project, uid="shared tag", label="foreign" ) self.assertTrue( methods.delete_tag(self.test_user, tag.uid, self.test_project.pk) ) self.assertFalse(models.Tag.objects.filter(pk=tag.pk).exists()) self.assertTrue(models.Tag.objects.filter(pk=other_tag.pk).exists()) def test_delete_tag_rejects_unknown_project(self): with self.assertRaises(ServiceException) as context: methods.delete_tag(self.test_user, "tag", -1) self.assertEqual(context.exception.message, methods.NO_SUCH_PROJECT) def test_add_collection_from_path(self): ancestors_labels = ["toto", "tata"] collections = methods.add_collection_from_path( Loading