From 6d8b8ca4979e7e0a55867b7fbdce3f5200dd16a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Ch=C3=A1vez?= Date: Mon, 19 Jan 2026 11:50:09 -0500 Subject: [PATCH] feat: `ObjectTag.is_copied` field added to serializer [FC-0114] (#37855) `ObjectTag.is_copied` field added to serializer --- .../rest_api/v1/serializers.py | 5 +++ .../rest_api/v1/tests/test_views.py | 42 ++++++++++++++++--- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/openedx/core/djangoapps/content_tagging/rest_api/v1/serializers.py b/openedx/core/djangoapps/content_tagging/rest_api/v1/serializers.py index 849d3891f2..bda2ae163c 100644 --- a/openedx/core/djangoapps/content_tagging/rest_api/v1/serializers.py +++ b/openedx/core/djangoapps/content_tagging/rest_api/v1/serializers.py @@ -105,6 +105,11 @@ class ObjectTagCopiedMinimalSerializer(ObjectTagMinimalSerializer): object tags if is copied. """ + is_copied = serializers.BooleanField(read_only=True) + + class Meta(ObjectTagMinimalSerializer.Meta): + fields = ObjectTagMinimalSerializer.Meta.fields + ["is_copied"] + def get_can_delete_objecttag(self, instance): """ Verify if the user can delete the object tag. diff --git a/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py b/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py index 3b36df3f40..a4094c301b 100644 --- a/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py +++ b/openedx/core/djangoapps/content_tagging/rest_api/v1/tests/test_views.py @@ -1880,8 +1880,18 @@ class TestObjectTagViewSet(TestObjectTagMixin, APITestCase): 'taxonomy_id': taxonomy.pk, 'can_tag_object': True, 'tags': [ - {'value': 'Tag 1', 'lineage': ['Tag 1'], 'can_delete_objecttag': True}, - {'value': 'Tag 2', 'lineage': ['Tag 2'], 'can_delete_objecttag': True}, + { + 'value': 'Tag 1', + 'lineage': ['Tag 1'], + 'can_delete_objecttag': True, + 'is_copied': False, + }, + { + 'value': 'Tag 2', + 'lineage': ['Tag 2'], + 'can_delete_objecttag': True, + 'is_copied': False, + }, ], }] @@ -1913,8 +1923,18 @@ class TestObjectTagViewSet(TestObjectTagMixin, APITestCase): 'can_tag_object': True, 'export_id': self.t1.export_id, 'tags': [ - {'value': 'android', 'lineage': ['ALPHABET', 'android'], 'can_delete_objecttag': False}, - {'value': 'anvil', 'lineage': ['ALPHABET', 'anvil'], 'can_delete_objecttag': True} + { + 'value': 'android', + 'lineage': ['ALPHABET', 'android'], + 'can_delete_objecttag': False, + 'is_copied': True, + }, + { + 'value': 'anvil', + 'lineage': ['ALPHABET', 'anvil'], + 'can_delete_objecttag': True, + 'is_copied': False, + }, ] }] @@ -1952,8 +1972,18 @@ class TestObjectTagViewSet(TestObjectTagMixin, APITestCase): object_id = str(object_key) tagging_api.tag_object(object_id=object_id, taxonomy=self.t1, tags=["anvil", "android"]) expected_tags = [ - {"value": "android", "lineage": ["ALPHABET", "android"], "can_delete_objecttag": expected_perm}, - {"value": "anvil", "lineage": ["ALPHABET", "anvil"], "can_delete_objecttag": expected_perm}, + { + "value": "android", + "lineage": ["ALPHABET", "android"], + "can_delete_objecttag": expected_perm, + "is_copied": False, + }, + { + "value": "anvil", + "lineage": ["ALPHABET", "anvil"], + "can_delete_objecttag": expected_perm, + "is_copied": False, + }, ] url = OBJECT_TAGS_URL.format(object_id=object_id) user = getattr(self, user_attr)