delete tags when remove mark

This commit is contained in:
Your Name 2024-06-04 10:12:04 -04:00 committed by Henri Dickson
parent df315c9e67
commit 3031bb844f
7 changed files with 35 additions and 34 deletions

View file

@ -103,11 +103,11 @@ def mark_item(request, item_uuid: str, mark: MarkInSchema):
if mark.created_time and mark.created_time >= timezone.now():
mark.created_time = None
m = Mark(request.user.identity, item)
TagManager.tag_item(item, request.user.identity, mark.tags, mark.visibility)
m.update(
mark.shelf_type,
mark.comment_text,
mark.rating_grade,
mark.tags,
mark.visibility,
created_time=mark.created_time,
share_to_mastodon=mark.post_to_fediverse,
@ -122,15 +122,13 @@ def mark_item(request, item_uuid: str, mark: MarkInSchema):
)
def delete_mark(request, item_uuid: str):
"""
Remove a holding mark about an item for current user.
Remove a holding mark about an item for current user, unlike the web behavior, this does not clean up tags.
"""
item = Item.get_by_url(item_uuid)
if not item:
return 404, {"message": "Item not found"}
m = Mark(request.user.identity, item)
m.delete()
# skip tag deletion for now to be consistent with web behavior
# TagManager.tag_item(item, request.user, [], 0)
m.delete(keep_tags=True)
return 200, {"message": "OK"}

View file

@ -268,11 +268,9 @@ class DoubanImporter:
print("-", end="", flush=True)
return 2
mark.update(
shelf_type, comment, rating_grade, self.visibility, created_time=time
shelf_type, comment, rating_grade, tags, self.visibility, created_time=time
)
print("+", end="", flush=True)
if tags:
TagManager.tag_item(item, self.user.identity, tags)
return 1
def import_review_sheet(self, worksheet, sheet_name):

View file

@ -107,16 +107,15 @@ class LetterboxdImporter(Task):
else:
title = _("a review of {item_title}").format(item_title=item.title)
Review.update_item_review(item, owner, title, text, visibility, dt)
tag_titles = [s.strip() for s in tags.split(",")] if tags else None
mark.update(
shelf_type,
comment_text=comment,
rating_grade=rating_grade,
tags=tag_titles,
visibility=visibility,
created_time=dt,
)
if tags:
tag_titles = [s.strip() for s in tags.split(",")]
TagManager.tag_item(item, owner, tag_titles, visibility)
self.progress(1)
def progress(self, mark_state: int, url=None):

View file

@ -195,6 +195,7 @@ class Mark:
shelf_type: ShelfType | None,
comment_text: str | None = None,
rating_grade: int | None = None,
tags: list[str] | None = None,
visibility: int | None = None,
metadata: dict[str, Any] | None = None,
created_time: datetime | None = None,
@ -207,7 +208,9 @@ class Mark:
visibility = self.visibility
last_shelf_type = self.shelf_type
last_visibility = self.visibility if last_shelf_type else None
if shelf_type is None: # TODO change this use case to DEFERRED status
if tags is not None:
self.owner.tag_manager.tag_item(self.item, tags, visibility)
if shelf_type is None:
# take item off shelf
if self.shelfmember:
Takahe.delete_posts(self.shelfmember.all_post_ids)
@ -285,9 +288,8 @@ class Mark:
boost_toot_later(self.owner.user, post.url)
return True
def delete(self):
# self.logs.delete() # When deleting a mark, all logs of the mark are deleted first.
self.update(None)
def delete(self, keep_tags=False):
self.update(None, tags=None if keep_tags else [])
def delete_log(self, log_id: int):
ShelfLogEntry.objects.filter(

View file

@ -91,9 +91,9 @@ class TagManager:
return tags
@staticmethod
def tag_item(
item: Item,
def tag_item_for_owner(
owner: APIdentity,
item: Item,
tag_titles: list[str],
default_visibility: int = 0,
):
@ -113,6 +113,9 @@ class TagManager:
if tag:
tag.remove_item(item)
def tag_item(self, item: Item, tag_titles: list[str], default_visibility: int = 0):
TagManager.tag_item_for_owner(self.owner, item, tag_titles, default_visibility)
@staticmethod
def get_manager_for_user(owner):
return TagManager(owner)
@ -144,10 +147,7 @@ class TagManager:
def get_item_tags(self, item: Item):
return sorted(
[
m["parent__title"]
for m in TagMember.objects.filter(
parent__owner=self.owner, item=item
).values("parent__title")
]
TagMember.objects.filter(parent__owner=self.owner, item=item).values_list(
"parent__title", flat=True
)
)

View file

@ -119,7 +119,7 @@ class ShelfTest(TestCase):
self.assertEqual(len(Mark(user.identity, book1).all_post_ids), 3)
time.sleep(0.001)
Mark(user.identity, book1).update(
ShelfType.COMPLETE, metadata={"progress": 100}
ShelfType.COMPLETE, metadata={"progress": 100}, tags=["best"]
)
self.assertEqual(Mark(user.identity, book1).visibility, 1)
self.assertEqual(shelf_manager.get_log_for_item(book1).count(), 3)
@ -128,6 +128,9 @@ class ShelfTest(TestCase):
# test delete mark -> one more log
Mark(user.identity, book1).delete()
self.assertEqual(log.count(), 4)
deleted_mark = Mark(user.identity, book1)
self.assertEqual(deleted_mark.shelf_type, None)
self.assertEqual(deleted_mark.tags, [])
class TagTest(TestCase):
@ -140,16 +143,17 @@ class TagTest(TestCase):
self.user1 = User.register(email="a@b.com", username="user")
self.user2 = User.register(email="x@b.com", username="user2")
self.user3 = User.register(email="y@b.com", username="user3")
pass
def test_user_tag(self):
t1 = "tag 1"
t2 = "tag 2"
t3 = "tag 3"
TagManager.tag_item(self.book1, self.user2.identity, [t1, t3])
TagManager.tag_item_for_owner(self.user2.identity, self.book1, [t1, t3])
self.assertEqual(self.book1.tags, [t1, t3])
TagManager.tag_item(self.book1, self.user2.identity, [t2, t3])
TagManager.tag_item_for_owner(self.user2.identity, self.book1, [t2, t3])
self.assertEqual(self.book1.tags, [t2, t3])
m = Mark(self.user2.identity, self.book1)
self.assertEqual(m.tags, [t2, t3])
class MarkTest(TestCase):
@ -171,7 +175,7 @@ class MarkTest(TestCase):
self.assertEqual(mark.visibility, 2)
self.assertEqual(mark.review, None)
self.assertEqual(mark.tags, [])
mark.update(ShelfType.WISHLIST, "a gentle comment", 9, 1)
mark.update(ShelfType.WISHLIST, "a gentle comment", 9, None, 1)
mark = Mark(self.user1.identity, self.book1)
self.assertEqual(mark.shelf_type, ShelfType.WISHLIST)
@ -193,7 +197,9 @@ class MarkTest(TestCase):
self.assertIsNone(mark.review)
def test_tag(self):
TagManager.tag_item(self.book1, self.user1.identity, [" Sci-Fi ", " fic "])
TagManager.tag_item_for_owner(
self.user1.identity, self.book1, [" Sci-Fi ", " fic "]
)
mark = Mark(self.user1.identity, self.book1)
self.assertEqual(mark.tags, ["Sci-Fi", "fic"])
@ -208,9 +214,8 @@ class DebrisTest(TestCase):
self.user1 = User.register(email="test@test", username="test")
def test_journal_migration(self):
TagManager.tag_item(self.book1, self.user1.identity, ["Sci-Fi", "fic"])
mark = Mark(self.user1.identity, self.book1)
mark.update(ShelfType.WISHLIST, "a gentle comment", 9, 1)
mark.update(ShelfType.WISHLIST, "a gentle comment", 9, ["Sci-Fi", "fic"], 1)
Review.update_item_review(self.book1, self.user1.identity, "Critic", "Review")
collection = Collection.objects.create(title="test", owner=self.user1.identity)
collection.append_item(self.book1)
@ -219,9 +224,8 @@ class DebrisTest(TestCase):
cnt = Debris.objects.all().count()
self.assertEqual(cnt, 0)
TagManager.tag_item(self.book3, self.user1.identity, ["Sci-Fi", "fic"])
mark = Mark(self.user1.identity, self.book3)
mark.update(ShelfType.WISHLIST, "a gentle comment", 9, 1)
mark.update(ShelfType.WISHLIST, "a gentle comment", 9, ["Sci-Fi", "fic"], 1)
Review.update_item_review(self.book3, self.user1.identity, "Critic", "Review")
collection.append_item(self.book3)
self.book3.merge_to(self.book2)

View file

@ -91,12 +91,12 @@ def mark(request: AuthedHttpRequest, item_uuid):
)
if mark_date and mark_date >= timezone.now():
mark_date = None
TagManager.tag_item(item, request.user.identity, tags, visibility)
try:
mark.update(
status,
text,
rating_grade,
tags,
visibility,
share_to_mastodon=share_to_mastodon,
created_time=mark_date,