lib.itmens/users/views.py
2023-07-12 17:58:36 -04:00

199 lines
5.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.shortcuts import redirect, render, get_object_or_404
from django.urls import reverse
from django.contrib.auth.decorators import login_required
from django.utils.translation import gettext_lazy as _
from management.models import Announcement
from .models import User, Report, Preference
from .forms import ReportForm
from mastodon.api import *
from common.config import *
from .account import *
from .data import *
import json
from django.core.exceptions import BadRequest, PermissionDenied
from django.http import HttpResponseRedirect
from discord import SyncWebhook
def render_user_not_found(request):
sec_msg = _("😖哎呀这位用户好像还没有加入本站快去联邦宇宙呼唤TA来注册吧")
msg = _("未找到该用户")
return render(
request,
"common/error.html",
{
"msg": msg,
"secondary_msg": sec_msg,
},
)
def render_user_blocked(request):
msg = _("没有访问该用户主页的权限")
return render(
request,
"common/error.html",
{
"msg": msg,
},
)
@login_required
def follow(request, user_name):
if request.method != "POST":
raise BadRequest()
user = User.get(user_name)
if request.user.follow(user):
return render(request, "users/profile_actions.html", context={"user": user})
else:
raise BadRequest()
@login_required
def unfollow(request, user_name):
if request.method != "POST":
raise BadRequest()
user = User.get(user_name)
if request.user.unfollow(user):
return render(request, "users/profile_actions.html", context={"user": user})
else:
raise BadRequest()
@login_required
def mute(request, user_name):
if request.method != "POST":
raise BadRequest()
user = User.get(user_name)
if request.user.mute(user):
return render(request, "users/profile_actions.html", context={"user": user})
else:
raise BadRequest()
@login_required
def unmute(request, user_name):
if request.method != "POST":
raise BadRequest()
user = User.get(user_name)
if request.user.unmute(user):
return render(request, "users/profile_actions.html", context={"user": user})
else:
raise BadRequest()
@login_required
def block(request, user_name):
if request.method != "POST":
raise BadRequest()
user = User.get(user_name)
if request.user.block(user):
return render(request, "users/profile_actions.html", context={"user": user})
else:
raise BadRequest()
@login_required
def unblock(request, user_name):
if request.method != "POST":
raise BadRequest()
user = User.get(user_name)
if request.user.unblock(user):
return render(request, "users/profile_actions.html", context={"user": user})
else:
raise BadRequest()
@login_required
def follow_locked(request, user_name):
user = User.get(user_name)
return render(request, "users/follow_locked.html", context={"user": user})
@login_required
def set_layout(request):
if request.method == "POST":
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()
@login_required
def report(request):
if request.method == "GET":
user_id = request.GET.get("user_id")
if user_id:
user = get_object_or_404(User, pk=user_id)
form = ReportForm(initial={"reported_user": user})
else:
form = ReportForm()
return render(
request,
"users/report.html",
{
"form": form,
},
)
elif request.method == "POST":
form = ReportForm(request.POST, request.FILES)
if form.is_valid():
form.instance.is_read = False
form.instance.submit_user = request.user
form.save()
dw = settings.DISCORD_WEBHOOKS.get("user-report")
if dw:
webhook = SyncWebhook.from_url(dw)
webhook.send(
f"New report from {request.user} about {form.instance.reported_user} : {form.instance.message}"
)
return redirect(reverse("common:home"))
else:
return render(
request,
"users/report.html",
{
"form": form,
},
)
else:
raise BadRequest()
@login_required
def manage_report(request):
if not request.user.is_staff:
raise PermissionDenied()
if request.method == "GET":
reports = Report.objects.all()
for r in reports.filter(is_read=False):
r.is_read = True
r.save()
return render(
request,
"users/manage_report.html",
{
"reports": reports,
},
)
else:
raise BadRequest()
@login_required
def mark_announcements_read(request):
if request.method == "POST":
try:
request.user.read_announcement_index = Announcement.objects.latest("pk").pk
request.user.save(update_fields=["read_announcement_index"])
except ObjectDoesNotExist:
# when there is no annoucenment
pass
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))