lib.itmens/journal/models/utils.py

89 lines
3.4 KiB
Python
Raw Normal View History

2024-06-20 14:54:46 -04:00
from auditlog.context import set_actor
2024-02-04 18:41:34 -05:00
from django.db import transaction
from django.db.utils import IntegrityError
from loguru import logger
from catalog.models import Item
2025-02-08 19:57:42 -05:00
from journal.models.index import JournalIndex
2024-06-20 14:54:46 -04:00
from users.models import APIdentity, User
from .collection import Collection, CollectionMember, FeaturedCollection
from .comment import Comment
2024-02-04 18:41:34 -05:00
from .common import Content, Debris
from .itemlist import ListMember
2025-01-28 21:38:02 -05:00
from .note import Note
from .rating import Rating
from .review import Review
2023-07-20 21:59:49 -04:00
from .shelf import ShelfLogEntry, ShelfMember
from .tag import Tag, TagMember
def reset_journal_visibility_for_user(owner: APIdentity, visibility: int):
ShelfMember.objects.filter(owner=owner).update(visibility=visibility)
Comment.objects.filter(owner=owner).update(visibility=visibility)
Rating.objects.filter(owner=owner).update(visibility=visibility)
Review.objects.filter(owner=owner).update(visibility=visibility)
2025-02-08 19:57:42 -05:00
def remove_data_by_identity(owner: APIdentity):
2023-07-20 21:59:49 -04:00
ShelfMember.objects.filter(owner=owner).delete()
ShelfLogEntry.objects.filter(owner=owner).delete()
Comment.objects.filter(owner=owner).delete()
Rating.objects.filter(owner=owner).delete()
Review.objects.filter(owner=owner).delete()
TagMember.objects.filter(owner=owner).delete()
Tag.objects.filter(owner=owner).delete()
2025-01-28 21:38:02 -05:00
Note.objects.filter(owner=owner).delete()
2023-07-20 21:59:49 -04:00
CollectionMember.objects.filter(owner=owner).delete()
Collection.objects.filter(owner=owner).delete()
FeaturedCollection.objects.filter(owner=owner).delete()
2025-02-08 19:57:42 -05:00
index = JournalIndex.instance()
index.delete_by_owner(owner.pk)
logger.info(f"removed journal data by {owner}")
2024-06-20 14:54:46 -04:00
def update_journal_for_merged_item_task(editing_user_id: int, legacy_item_uuid: str):
with set_actor(User.objects.get(pk=editing_user_id)):
update_journal_for_merged_item(legacy_item_uuid)
def update_journal_for_merged_item(
legacy_item_uuid: str, delete_duplicated: bool = False
):
legacy_item = Item.get_by_url(legacy_item_uuid)
if not legacy_item:
logger.error("update_journal_for_merged_item: unable to find item")
return
new_item = legacy_item.merged_to_item
if not new_item:
logger.error("update_journal_for_merged_item: unable to find merged_to_item")
return
2024-02-04 18:41:34 -05:00
delete_q = []
for cls in list(Content.__subclasses__()) + list(ListMember.__subclasses__()):
for p in cls.objects.filter(item=legacy_item):
2024-02-04 18:41:34 -05:00
with transaction.atomic():
try:
p.item = new_item
p.save(update_fields=["item_id"])
2024-12-30 01:51:19 -05:00
p.update_index()
2024-02-04 18:41:34 -05:00
except IntegrityError:
if delete_duplicated:
logger.warning(
f"deleted piece {p.pk} when merging {cls.__name__}: {legacy_item_uuid} -> {new_item.uuid}"
2024-02-04 18:41:34 -05:00
)
delete_q.append(p)
else:
logger.warning(
f"skip piece {p.pk} when merging {cls.__name__}: {legacy_item_uuid} -> {new_item.uuid}"
2024-02-04 18:41:34 -05:00
)
for p in delete_q:
Debris.create_from_piece(p)
p.delete()
def journal_exists_for_item(item: Item) -> bool:
for cls in list(Content.__subclasses__()) + list(ListMember.__subclasses__()):
if cls.objects.filter(item=item).exists():
return True
return False