Skip to content

Commit

Permalink
fix unable to delete tagged node issue
Browse files Browse the repository at this point in the history
  • Loading branch information
ciur committed Feb 1, 2025
1 parent b3116a9 commit 03688bb
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""add ondelete cascade to nodes tags
Revision ID: 88b6b2d497ea
Revises: f0e0da122a9a
Create Date: 2025-02-01 08:20:24.361716
"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = "88b6b2d497ea"
down_revision: Union[str, None] = "f0e0da122a9a"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_foreign_key(
"nodes_user_id_fkey",
"nodes",
"users",
["user_id"],
["id"],
ondelete="CASCADE",
use_alter=True,
)
op.drop_constraint("nodes_tags_node_id_fkey", "nodes_tags", type_="foreignkey")
op.create_foreign_key(
None, "nodes_tags", "nodes", ["node_id"], ["id"], ondelete="CASCADE"
)
op.create_foreign_key(
"tag_user_id_fk", "tags", "users", ["user_id"], ["id"], use_alter=True
)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint("tag_user_id_fk", "tags", type_="foreignkey")
op.drop_constraint(None, "nodes_tags", type_="foreignkey")
op.create_foreign_key(
"nodes_tags_node_id_fkey", "nodes_tags", "nodes", ["node_id"], ["id"]
)
op.drop_constraint("nodes_user_id_fkey", "nodes", type_="foreignkey")
# ### end Alembic commands ###
52 changes: 52 additions & 0 deletions papermerge/core/features/nodes/tests/test_nodes_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,58 @@ def test_delete_nodes_with_descendants(
assert found is None


def test_delete_tagged_folder(make_folder, db_session, user, auth_api_client):
folder = make_folder(title="My Documents", user=user, parent=user.home_folder)

nodes_dbapi.assign_node_tags(
db_session,
node_id=folder.id,
tags=["tag1", "tag2"],
user_id=user.id,
)

# delete tagged folder
response = auth_api_client.delete(f"/nodes/", json=[str(folder.id)])

assert response.status_code == 200, response.json()

# folder is not there anymore
q = db_session.query(orm.Folder).filter(orm.Folder.id == folder.id)
assert db_session.query(q.exists()).scalar() is False

# but both tags are
q_tag1 = db_session.query(orm.Tag).filter(orm.Tag.name == "tag1")
q_tag2 = db_session.query(orm.Tag).filter(orm.Tag.name == "tag2")
assert db_session.query(q_tag1.exists()).scalar() is True
assert db_session.query(q_tag2.exists()).scalar() is True


def test_delete_tagged_document(make_document, db_session, user, auth_api_client):
doc = make_document(title="My Contract.pdf", user=user, parent=user.home_folder)

nodes_dbapi.assign_node_tags(
db_session,
node_id=doc.id,
tags=["tag1", "tag2"],
user_id=user.id,
)

# delete tagged document
response = auth_api_client.delete(f"/nodes/", json=[str(doc.id)])

assert response.status_code == 200, response.json()

# document is not there anymore
q = db_session.query(orm.Document).filter(orm.Document.id == doc.id)
assert db_session.query(q.exists()).scalar() is False

# but both tags are
q_tag1 = db_session.query(orm.Tag).filter(orm.Tag.name == "tag1")
q_tag2 = db_session.query(orm.Tag).filter(orm.Tag.name == "tag2")
assert db_session.query(q_tag1.exists()).scalar() is True
assert db_session.query(q_tag2.exists()).scalar() is True


def test_get_node_tags_router_when_node_is_folder(
make_folder, db_session, user, auth_api_client
):
Expand Down
4 changes: 3 additions & 1 deletion papermerge/core/features/tags/db/orm.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
class NodeTagsAssociation(Base):
__tablename__ = "nodes_tags"
id: Mapped[int] = mapped_column(primary_key=True)
node_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("nodes.id"))
node_id: Mapped[uuid.UUID] = mapped_column(
ForeignKey("nodes.id", ondelete="CASCADE")
)
tag_id: Mapped[uuid.UUID] = mapped_column(
ForeignKey("tags.id"),
)
Expand Down

0 comments on commit 03688bb

Please sign in to comment.