lib.itmens/users/views.py

220 lines
6 KiB
Python
Raw Normal View History

import json
2020-05-05 23:50:48 +08:00
from django.contrib.auth.decorators import login_required
2024-04-17 00:00:40 -04:00
from django.core.exceptions import BadRequest
from django.http import HttpResponseRedirect
2024-04-17 00:00:40 -04:00
from django.shortcuts import redirect, render
from django.urls import reverse
2020-05-05 23:50:48 +08:00
from django.utils.translation import gettext_lazy as _
from common.config import *
2023-08-13 23:11:12 -04:00
from common.utils import (
AuthedHttpRequest,
HTTPResponseHXRedirect,
target_identity_required,
)
2020-10-22 21:45:05 +02:00
from mastodon.api import *
2023-08-13 18:00:10 -04:00
from takahe.utils import Takahe
from .account import *
from .data import *
2024-04-17 00:00:40 -04:00
from .models import APIdentity
2020-05-01 22:46:15 +08:00
2023-08-13 18:00:10 -04:00
def render_user_not_found(request, user_name=""):
2023-07-07 16:54:15 -04:00
sec_msg = _("😖哎呀这位用户好像还没有加入本站快去联邦宇宙呼唤TA来注册吧")
2023-08-13 18:00:10 -04:00
msg = _("未找到用户") + user_name
2022-05-12 08:14:05 -04:00
return render(
request,
"common/error.html",
2022-05-12 08:14:05 -04:00
{
"msg": msg,
"secondary_msg": sec_msg,
},
2022-05-12 08:14:05 -04:00
)
2022-12-27 14:52:03 -05:00
def render_user_blocked(request):
2023-07-07 16:54:15 -04:00
msg = _("没有访问该用户主页的权限")
2022-12-27 14:52:03 -05:00
return render(
request,
"common/error.html",
2022-12-27 14:52:03 -05:00
{
"msg": msg,
},
2022-12-27 14:52:03 -05:00
)
def render_user_noanonymous(request):
msg = _("作者已设置仅限登录用户查看")
return render(
request,
"common/error.html",
{
"msg": msg,
},
)
2023-08-13 18:00:10 -04:00
def query_identity(request, handle):
try:
2024-02-25 23:04:50 -05:00
i = APIdentity.get_by_handle(handle)
2023-08-13 18:00:10 -04:00
return redirect(i.url)
except APIdentity.DoesNotExist:
if len(handle.split("@")) == 3:
Takahe.fetch_remote_identity(handle)
return render(
request, "users/fetch_identity_pending.html", {"handle": handle}
)
else:
return render_user_not_found(request, handle)
def fetch_refresh(request):
handle = request.GET.get("handle", "")
try:
2024-02-25 23:04:50 -05:00
i = APIdentity.get_by_handle(handle)
2023-08-13 18:00:10 -04:00
return HTTPResponseHXRedirect(i.url)
2024-04-06 00:13:50 -04:00
except Exception:
2023-08-13 18:00:10 -04:00
retry = int(request.GET.get("retry", 0)) + 1
if retry > 10:
return render(request, "users/fetch_identity_failed.html")
else:
return render(
request,
"users/fetch_identity_refresh.html",
{"handle": handle, "retry": retry, "delay": retry * 2},
)
2023-07-07 02:02:48 -04:00
@login_required
2023-08-13 23:11:12 -04:00
@target_identity_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def follow(request: AuthedHttpRequest, user_name):
request.user.identity.follow(request.target_identity)
return render(
request,
"users/profile_actions.html",
context={"identity": request.target_identity},
)
2023-07-07 02:02:48 -04:00
@login_required
2023-08-13 23:11:12 -04:00
@target_identity_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def unfollow(request: AuthedHttpRequest, user_name):
request.user.identity.unfollow(request.target_identity)
return render(
request,
"users/profile_actions.html",
context={"identity": request.target_identity},
)
2023-07-07 16:54:15 -04:00
@login_required
2023-08-13 23:11:12 -04:00
@target_identity_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def mute(request: AuthedHttpRequest, user_name):
request.user.identity.mute(request.target_identity)
return render(
request,
"users/profile_actions.html",
context={"identity": request.target_identity},
)
2023-07-07 16:54:15 -04:00
@login_required
2023-08-13 23:11:12 -04:00
@target_identity_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def unmute(request: AuthedHttpRequest, user_name):
request.user.identity.unmute(request.target_identity)
return render(
request,
"users/profile_actions.html",
context={"identity": request.target_identity},
)
2023-07-07 16:54:15 -04:00
@login_required
2023-08-13 23:11:12 -04:00
@target_identity_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def block(request: AuthedHttpRequest, user_name):
request.user.identity.block(request.target_identity)
return render(
request,
"users/profile_actions.html",
context={"identity": request.target_identity},
)
2023-07-07 16:54:15 -04:00
@login_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def unblock(request: AuthedHttpRequest, user_name):
2023-12-05 22:00:35 -05:00
try:
2024-02-25 23:04:50 -05:00
target = APIdentity.get_by_handle(user_name)
2023-12-05 22:00:35 -05:00
except APIdentity.DoesNotExist:
return render_user_not_found(request)
target_user = target.user
if target_user and not target_user.is_active:
return render_user_not_found(request)
request.user.identity.unblock(target)
2023-08-13 23:11:12 -04:00
return render(
request,
"users/profile_actions.html",
2023-12-05 22:00:35 -05:00
context={"identity": target},
2023-08-13 23:11:12 -04:00
)
@login_required
@target_identity_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def accept_follow_request(request: AuthedHttpRequest, user_name):
request.user.identity.accept_follow_request(request.target_identity)
return render(
request,
"users/profile_actions.html",
context={"identity": request.target_identity},
)
2023-07-07 02:02:48 -04:00
@login_required
2023-08-13 23:11:12 -04:00
@target_identity_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def reject_follow_request(request: AuthedHttpRequest, user_name):
request.user.identity.reject_follow_request(request.target_identity)
return render(
request,
"users/profile_actions.html",
context={"identity": request.target_identity},
)
2023-07-07 02:02:48 -04:00
2021-02-17 15:08:16 +01:00
@login_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def set_layout(request: AuthedHttpRequest):
2024-04-17 00:00:40 -04:00
layout = json.loads(request.POST.get("layout", "{}"))
if request.POST.get("name") == "profile":
request.user.preference.profile_layout = layout
request.user.preference.save(update_fields=["profile_layout"])
return redirect(request.user.url)
elif request.POST.get("name") == "discover":
request.user.preference.discover_layout = layout
request.user.preference.save(update_fields=["discover_layout"])
return redirect(reverse("catalog:discover"))
raise BadRequest()
2021-02-17 15:08:16 +01:00
2021-02-15 21:27:50 +01:00
@login_required
2024-04-17 00:00:40 -04:00
@require_http_methods(["POST"])
2023-08-13 23:11:12 -04:00
def mark_announcements_read(request: AuthedHttpRequest):
2024-04-17 00:00:40 -04:00
Takahe.mark_announcements_seen(request.user)
2023-08-13 23:11:12 -04:00
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
2024-04-17 00:00:40 -04:00
def announcements(request):
return render(
request,
"users/announcements.html",
{"announcements": Takahe.get_announcements()},
)