mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-09-16 21:55:37 -05:00
save some fixes
This commit is contained in:
@@ -117,7 +117,7 @@ class Tag(MatchingModel, TreeNodeModel):
|
|||||||
verbose_name_plural = _("tags")
|
verbose_name_plural = _("tags")
|
||||||
|
|
||||||
def subtree_height(self, node: TreeNodeModel) -> int:
|
def subtree_height(self, node: TreeNodeModel) -> int:
|
||||||
children = list(node.children)
|
children = list(node.get_children())
|
||||||
if not children:
|
if not children:
|
||||||
return 0
|
return 0
|
||||||
return 1 + max(self.subtree_height(child) for child in children)
|
return 1 + max(self.subtree_height(child) for child in children)
|
||||||
|
@@ -544,6 +544,14 @@ class TagSerializer(MatchingModelSerializer, OwnedObjectSerializer):
|
|||||||
def get_children(self, obj):
|
def get_children(self, obj):
|
||||||
return obj.get_children_pks()
|
return obj.get_children_pks()
|
||||||
|
|
||||||
|
# map to treenode's tn_parent
|
||||||
|
parent = serializers.PrimaryKeyRelatedField(
|
||||||
|
queryset=Tag.objects.all(),
|
||||||
|
allow_null=True,
|
||||||
|
required=False,
|
||||||
|
source="tn_parent",
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Tag
|
model = Tag
|
||||||
fields = (
|
fields = (
|
||||||
@@ -579,13 +587,13 @@ class TagSerializer(MatchingModelSerializer, OwnedObjectSerializer):
|
|||||||
# Temporarily set parent on the instance if updating and use model clean()
|
# Temporarily set parent on the instance if updating and use model clean()
|
||||||
original_parent = self.instance.parent
|
original_parent = self.instance.parent
|
||||||
try:
|
try:
|
||||||
self.instance.tn_parent = parent
|
self.instance.set_parent(parent)
|
||||||
self.instance.clean()
|
self.instance.clean()
|
||||||
except ValidationError as e:
|
except ValueError as e:
|
||||||
logger.debug("Tag parent validation failed: %s", e)
|
logger.debug("Tag parent validation failed: %s", e)
|
||||||
raise serializers.ValidationError({"parent": _("Invalid parent tag.")})
|
raise serializers.ValidationError({"parent": _("Invalid parent tag.")})
|
||||||
finally:
|
finally:
|
||||||
self.instance.tn_parent = original_parent
|
self.instance.set_parent(original_parent)
|
||||||
else:
|
else:
|
||||||
# For new instances, create a transient Tag and validate
|
# For new instances, create a transient Tag and validate
|
||||||
temp = Tag(tn_parent=parent)
|
temp = Tag(tn_parent=parent)
|
||||||
@@ -1070,7 +1078,7 @@ class DocumentSerializer(
|
|||||||
tag_parents_being_removed = [
|
tag_parents_being_removed = [
|
||||||
tag
|
tag
|
||||||
for tag in instance.tags.all()
|
for tag in instance.tags.all()
|
||||||
if tag not in validated_data["tags"] and tag.children.count() > 0
|
if tag not in validated_data["tags"] and tag.get_children_count() > 0
|
||||||
]
|
]
|
||||||
validated_data["tags"] = [
|
validated_data["tags"] = [
|
||||||
tag
|
tag
|
||||||
|
@@ -144,7 +144,7 @@ class TestTagHierarchy(APITestCase):
|
|||||||
format="json",
|
format="json",
|
||||||
)
|
)
|
||||||
assert resp.status_code == 400
|
assert resp.status_code == 400
|
||||||
assert "parent" in resp.data
|
assert "Cannot set parent to a descendant" in str(resp.data["non_field_errors"])
|
||||||
|
|
||||||
def test_max_depth_on_create(self):
|
def test_max_depth_on_create(self):
|
||||||
a = Tag.objects.create(name="A1")
|
a = Tag.objects.create(name="A1")
|
||||||
@@ -182,7 +182,7 @@ class TestTagHierarchy(APITestCase):
|
|||||||
|
|
||||||
x = Tag.objects.create(name="X2")
|
x = Tag.objects.create(name="X2")
|
||||||
y = Tag.objects.create(name="Y2", tn_parent=x)
|
y = Tag.objects.create(name="Y2", tn_parent=x)
|
||||||
assert y.parent_id == x.id
|
assert y.parent_pk == x.pk
|
||||||
|
|
||||||
# Moving X under D would make deepest node Y exceed depth 5 -> reject
|
# Moving X under D would make deepest node Y exceed depth 5 -> reject
|
||||||
resp_fail = self.client.patch(
|
resp_fail = self.client.patch(
|
||||||
@@ -191,7 +191,9 @@ class TestTagHierarchy(APITestCase):
|
|||||||
format="json",
|
format="json",
|
||||||
)
|
)
|
||||||
assert resp_fail.status_code == 400
|
assert resp_fail.status_code == 400
|
||||||
assert "parent" in resp_fail.data
|
assert "Maximum nesting depth exceeded" in str(
|
||||||
|
resp_fail.data["non_field_errors"],
|
||||||
|
)
|
||||||
|
|
||||||
# Moving X under C (depth 3) should be allowed (deepest becomes 5)
|
# Moving X under C (depth 3) should be allowed (deepest becomes 5)
|
||||||
resp_ok = self.client.patch(
|
resp_ok = self.client.patch(
|
||||||
|
Reference in New Issue
Block a user