lib.itmens/journal/views/mark.py

202 lines
7.7 KiB
Python
Raw Permalink Normal View History

2023-08-10 14:56:38 -04:00
from datetime import datetime
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.core.exceptions import BadRequest, PermissionDenied
2023-08-10 14:56:38 -04:00
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
2023-08-10 14:56:38 -04:00
from django.utils import timezone
from django.utils.dateparse import parse_datetime
2024-06-07 22:29:10 -04:00
from django.utils.translation import gettext as _
2024-04-23 23:57:49 -04:00
from django.views.decorators.http import require_http_methods
2024-05-25 23:38:11 -04:00
from loguru import logger
2023-08-10 14:56:38 -04:00
from catalog.models import *
2023-12-30 22:20:15 -05:00
from common.utils import AuthedHttpRequest, get_uuid_or_404
2023-08-10 14:56:38 -04:00
from ..models import Comment, Mark, ShelfManager, ShelfType
from .common import render_list, render_relogin
2023-08-10 14:56:38 -04:00
PAGE_SIZE = 10
_checkmark = "✔️".encode("utf-8")
@login_required
2024-04-23 23:57:49 -04:00
@require_http_methods(["POST"])
2023-07-20 21:59:49 -04:00
def wish(request: AuthedHttpRequest, item_uuid):
2023-08-10 14:56:38 -04:00
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
2023-11-20 12:13:43 -05:00
mark = Mark(request.user.identity, item)
if not mark.shelf_type:
mark.update(ShelfType.WISHLIST)
2023-08-10 14:56:38 -04:00
if request.GET.get("back"):
2023-07-20 21:59:49 -04:00
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
2023-08-10 14:56:38 -04:00
return HttpResponse(_checkmark)
@login_required
2024-04-23 23:57:49 -04:00
@require_http_methods(["GET", "POST"])
2023-07-20 21:59:49 -04:00
def mark(request: AuthedHttpRequest, item_uuid):
2023-08-10 14:56:38 -04:00
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
2023-07-20 21:59:49 -04:00
mark = Mark(request.user.identity, item)
2023-08-10 14:56:38 -04:00
if request.method == "GET":
2023-07-20 21:59:49 -04:00
tags = request.user.identity.tag_manager.get_item_tags(item)
2024-04-03 23:10:21 -04:00
shelf_actions = ShelfManager.get_actions_for_category(item.category)
2024-05-29 10:50:41 -04:00
shelf_statuses = ShelfManager.get_statuses_for_category(item.category)
2023-08-10 14:56:38 -04:00
shelf_type = request.GET.get("shelf_type", mark.shelf_type)
return render(
request,
"mark.html",
{
"item": item,
"mark": mark,
"shelf_type": shelf_type,
"tags": ",".join(tags),
2024-04-03 23:10:21 -04:00
"shelf_actions": shelf_actions,
2024-05-29 10:50:41 -04:00
"shelf_statuses": shelf_statuses,
2023-08-10 14:56:38 -04:00
"date_today": timezone.localdate().isoformat(),
},
)
2024-04-23 23:57:49 -04:00
else:
2023-08-10 14:56:38 -04:00
if request.POST.get("delete", default=False):
2023-07-20 21:59:49 -04:00
mark.delete()
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
2023-08-10 14:56:38 -04:00
else:
visibility = int(request.POST.get("visibility", default=0))
rating_grade = request.POST.get("rating_grade", default=0)
rating_grade = int(rating_grade) if rating_grade else None
2024-07-17 09:37:04 -04:00
_status = request.POST.get("status", "wishlist")
try:
status = ShelfType(_status)
except Exception:
logger.error(f"unknown shelf: {_status}")
status = ShelfType.WISHLIST
2023-08-10 14:56:38 -04:00
text = request.POST.get("text")
tags = request.POST.get("tags")
tags = tags.split(",") if tags else []
share_to_mastodon = bool(
request.POST.get("share_to_mastodon", default=False)
)
mark_date = None
if request.POST.get("mark_anotherday"):
2023-11-22 22:29:38 -05:00
shelf_time_offset = {
ShelfType.WISHLIST: " 20:00:00",
ShelfType.PROGRESS: " 21:00:00",
2024-01-21 20:46:27 -05:00
ShelfType.DROPPED: " 21:30:00",
2023-11-22 22:29:38 -05:00
ShelfType.COMPLETE: " 22:00:00",
}
dt = parse_datetime(
2024-01-21 20:46:27 -05:00
request.POST.get("mark_date", "")
+ shelf_time_offset.get(status, "")
2023-11-22 22:29:38 -05:00
)
2023-08-10 14:56:38 -04:00
mark_date = (
dt.replace(tzinfo=timezone.get_current_timezone()) if dt else None
)
if mark_date and mark_date >= timezone.now():
mark_date = None
try:
mark.update(
status,
text,
rating_grade,
2024-06-04 10:12:04 -04:00
tags,
2023-08-10 14:56:38 -04:00
visibility,
share_to_mastodon=share_to_mastodon,
created_time=mark_date,
)
2024-04-06 00:13:50 -04:00
except PermissionDenied:
2024-05-25 23:38:11 -04:00
logger.warning(f"post to mastodon error 401 {request.user}")
2023-08-10 14:56:38 -04:00
return render_relogin(request)
except ValueError as e:
2024-05-25 23:38:11 -04:00
logger.warning(f"post to mastodon error {e} {request.user}")
2024-03-24 22:28:22 -04:00
err = (
2024-05-25 23:38:11 -04:00
_("Content too long for your Fediverse instance.")
2024-03-24 22:28:22 -04:00
if str(e) == "422"
else str(e)
)
2023-08-10 14:56:38 -04:00
return render(
request,
"common/error.html",
{
2024-05-25 23:38:11 -04:00
"msg": _(
2024-06-16 21:54:20 -04:00
"Data saved but unable to crosspost to Fediverse instance."
2024-05-25 23:38:11 -04:00
),
2023-08-10 14:56:38 -04:00
"secondary_msg": err,
},
)
2023-07-20 21:59:49 -04:00
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
2023-08-10 14:56:38 -04:00
@login_required
2024-04-23 23:57:49 -04:00
@require_http_methods(["POST"])
2023-07-20 21:59:49 -04:00
def mark_log(request: AuthedHttpRequest, item_uuid, log_id):
2023-08-10 14:56:38 -04:00
"""
Delete log of one item by log id.
"""
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
2023-07-20 21:59:49 -04:00
mark = Mark(request.user.identity, item)
2024-04-23 23:57:49 -04:00
if request.GET.get("delete", default=False):
if log_id:
mark.delete_log(log_id)
else:
mark.delete_all_logs()
return render(request, "_item_user_mark_history.html", {"mark": mark})
else:
raise BadRequest(_("Invalid parameter"))
2023-08-10 14:56:38 -04:00
@login_required
2024-04-23 23:57:49 -04:00
@require_http_methods(["GET", "POST"])
2023-07-20 21:59:49 -04:00
def comment(request: AuthedHttpRequest, item_uuid):
2023-08-10 14:56:38 -04:00
item = get_object_or_404(Item, uid=get_uuid_or_404(item_uuid))
2024-04-06 00:13:50 -04:00
if item.class_name not in ["podcastepisode", "tvepisode"]:
2024-03-24 22:28:22 -04:00
raise BadRequest("Commenting this type of items is not supported yet.")
2023-11-19 15:19:49 -05:00
comment = Comment.objects.filter(owner=request.user.identity, item=item).first()
2023-08-10 14:56:38 -04:00
if request.method == "GET":
return render(
request,
2024-04-06 00:13:50 -04:00
"comment.html",
2023-08-10 14:56:38 -04:00
{
"item": item,
"comment": comment,
},
)
2024-04-23 23:57:49 -04:00
else:
2023-08-10 14:56:38 -04:00
if request.POST.get("delete", default=False):
if not comment:
2024-04-23 23:57:49 -04:00
raise Http404(_("Content not found"))
2023-08-10 14:56:38 -04:00
comment.delete()
2023-07-20 21:59:49 -04:00
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
2023-08-10 14:56:38 -04:00
visibility = int(request.POST.get("visibility", default=0))
text = request.POST.get("text")
position = None
if item.class_name == "podcastepisode":
position = request.POST.get("position") or "0:0:0"
try:
pos = datetime.strptime(position, "%H:%M:%S")
position = pos.hour * 3600 + pos.minute * 60 + pos.second
2024-04-06 00:13:50 -04:00
except Exception:
2023-08-10 14:56:38 -04:00
if settings.DEBUG:
raise
position = None
2023-11-19 15:19:49 -05:00
d = {"text": text, "visibility": visibility}
if position:
d["metadata"] = {"position": position}
2024-06-14 00:17:27 -04:00
delete_existing_post = comment is not None and comment.visibility != visibility
share_to_mastodon = bool(request.POST.get("share_to_mastodon", default=False))
2024-04-23 23:57:49 -04:00
comment = Comment.objects.update_or_create(
2023-11-19 15:19:49 -05:00
owner=request.user.identity, item=item, defaults=d
2024-04-23 23:57:49 -04:00
)[0]
2024-07-03 16:42:20 -04:00
update_mode = 1 if delete_existing_post else 0
comment.sync_to_timeline(update_mode)
2024-06-14 00:17:27 -04:00
if share_to_mastodon:
2024-07-03 16:42:20 -04:00
comment.sync_to_social_accounts(update_mode)
2024-12-30 01:51:19 -05:00
comment.update_index()
2023-07-20 21:59:49 -04:00
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
2023-08-10 14:56:38 -04:00
2023-12-30 22:20:15 -05:00
def user_mark_list(request: AuthedHttpRequest, user_name, shelf_type, item_category):
2023-08-10 14:56:38 -04:00
return render_list(
2023-12-30 22:20:15 -05:00
request, user_name, "mark", shelf_type=shelf_type, item_category=item_category
2023-08-10 14:56:38 -04:00
)