diff --git a/catalog/templates/discover.html b/catalog/templates/discover.html index 7e9dad04..ec5f58b2 100644 --- a/catalog/templates/discover.html +++ b/catalog/templates/discover.html @@ -102,7 +102,7 @@ {% endif %} {% if request.user.is_authenticated %} - {% include "_sidebar.html" with show_progress=1 %} + {% include "_sidebar.html" with show_progress=1 identity=request.user.identity %} {% else %} {% include "_sidebar_anonymous.html" %} {% endif %} diff --git a/catalog/templates/search_results.html b/catalog/templates/search_results.html index 2648ed3f..baa0ea4d 100644 --- a/catalog/templates/search_results.html +++ b/catalog/templates/search_results.html @@ -93,7 +93,7 @@ {% empty %}

无站内条目匹配。 - {% if user.is_authenticated %}系统会尝试搜索其它网站的条目,点击标题可添加到本站。{% endif %} + {% if request.user.is_authenticated %}系统会尝试搜索其它网站的条目,点击标题可添加到本站。{% endif %}

如果你在 @@ -116,7 +116,7 @@ {% endif %}

- {% if request.GET.q and user.is_authenticated %} + {% if request.GET.q and request.user.is_authenticated %}

diff --git a/common/templates/_sidebar.html b/common/templates/_sidebar.html index db041be9..b1952131 100644 --- a/common/templates/_sidebar.html +++ b/common/templates/_sidebar.html @@ -53,7 +53,7 @@ target="_blank" rel="noopener" onclick="window.open(this.href); return false;" - title="@{{ user.mastodon_acct }}"> + title="@{{ identity.user.mastodon_acct }}"> {% endif %} @@ -88,7 +88,7 @@ {% for featured_collection in identity.featured_collections.all %} {% user_visibility_of featured_collection as visible %} {% if visible %} - {% user_stats_of collection=featured_collection user=user as stats %} + {% user_stats_of collection=featured_collection identity=identity as stats %}

{{ featured_collection.collection.title }} {{ stats.complete }} / {{ stats.total }}
@@ -96,7 +96,7 @@
{% endif %} {% empty %} - {% if request.user == user %} + {% if request.user == identity.user %}
将自己或他人的收藏单设为目标,这里就会显示进度
{% else %}
暂未设置目标
diff --git a/common/templatetags/mastodon.py b/common/templatetags/mastodon.py index ef18b5d9..982edf99 100644 --- a/common/templatetags/mastodon.py +++ b/common/templatetags/mastodon.py @@ -1,9 +1,7 @@ from django import template -from django.conf import settings -from django.template.defaultfilters import stringfilter from django.utils.translation import gettext_lazy as _ -from users.models import APIdentity, User +from users.models import APIdentity register = template.Library() @@ -16,7 +14,7 @@ def mastodon(domain): @register.simple_tag(takes_context=True) def current_user_relationship(context, target_identity: "APIdentity"): - current_identity = ( + current_identity: "APIdentity | None" = ( context["request"].user.identity if context["request"].user.is_authenticated else None @@ -24,9 +22,7 @@ def current_user_relationship(context, target_identity: "APIdentity"): r = { "requesting": False, "following": False, - "unfollowable": False, "muting": False, - "unmutable": False, "rejecting": False, "status": "", } @@ -36,10 +32,9 @@ def current_user_relationship(context, target_identity: "APIdentity"): ) or current_identity.is_blocked_by(target_identity): r["rejecting"] = True else: + r["requesting"] = current_identity.is_requesting(target_identity) r["muting"] = current_identity.is_muting(target_identity) - r["unmutable"] = r["muting"] r["following"] = current_identity.is_following(target_identity) - r["unfollowable"] = r["following"] if r["following"]: if current_identity.is_followed_by(target_identity): r["status"] = _("互相关注") diff --git a/common/utils.py b/common/utils.py index 578e8341..51564195 100644 --- a/common/utils.py +++ b/common/utils.py @@ -1,3 +1,4 @@ +import functools import uuid from typing import TYPE_CHECKING @@ -26,6 +27,27 @@ class HTTPResponseHXRedirect(HttpResponseRedirect): status_code = 200 +def target_identity_required(func): + @functools.wraps(func) + def wrapper(request, user_name, *args, **kwargs): + from users.models import APIdentity + from users.views import render_user_blocked, render_user_not_found + + try: + target = APIdentity.get_by_handler(user_name) + except APIdentity.DoesNotExist: + return render_user_not_found(request) + if not target.is_visible_to_user(request.user): + return render_user_blocked(request) + request.target_identity = target + # request.identity = ( + # request.user.identity if request.user.is_authenticated else None + # ) + return func(request, user_name, *args, **kwargs) + + return wrapper + + class PageLinksGenerator: # TODO inherit django paginator """ diff --git a/developer/templates/oauth2_provider/authorize.html b/developer/templates/oauth2_provider/authorize.html index e67215c7..47bb4bc4 100644 --- a/developer/templates/oauth2_provider/authorize.html +++ b/developer/templates/oauth2_provider/authorize.html @@ -10,7 +10,7 @@ {% csrf_token %} {% if not application.is_official %}

- {{ application.name }} 是由 @{{ application.user.handler }} 创建和维护的应用程序。 + {{ application.name }} 是由 @{{ application.user.identity.handler }} 创建和维护的应用程序。 {{ site_name }}无法保证其安全性和有效性,请自行验证确认后再授权。

{% endif %} diff --git a/journal/templates/collection.html b/journal/templates/collection.html index 94a2f9f8..a311f771 100644 --- a/journal/templates/collection.html +++ b/journal/templates/collection.html @@ -115,7 +115,7 @@
- {% if request.user == collection.owner %} + {% if request.user.identity == collection.owner %} {% trans '编辑' %} @@ -129,7 +129,7 @@ 创建于 {{ collection.created_time | date }}
- {% include "_sidebar.html" with user=collection.owner show_profile=1 %} + {% include "_sidebar.html" with identity=collection.owner show_profile=1 %} {% include "_footer.html" %} diff --git a/journal/templates/collection_edit.html b/journal/templates/collection_edit.html index 70414b2d..825db253 100644 --- a/journal/templates/collection_edit.html +++ b/journal/templates/collection_edit.html @@ -53,7 +53,7 @@ {% endif %} - {% include "_sidebar.html" with show_profile=1 fold_profile=1 %} + {% include "_sidebar.html" with show_profile=1 fold_profile=1 identity=collection.owner|default:request.user.identity %} {% include "_footer.html" %} diff --git a/journal/templates/profile.html b/journal/templates/profile.html index 37671f51..43e79b51 100644 --- a/journal/templates/profile.html +++ b/journal/templates/profile.html @@ -137,7 +137,7 @@ - {% if user == request.user %} + {% if identity.user == request.user %}
{% trans '编辑布局' %} diff --git a/journal/templates/review.html b/journal/templates/review.html index bfdc36a9..e919c9ca 100644 --- a/journal/templates/review.html +++ b/journal/templates/review.html @@ -21,7 +21,7 @@ - {% if user.preference.no_anonymous_view %}{% endif %} + {% if identity.preference.no_anonymous_view %}{% endif %} {{ site_name }}{% trans '评论' %} - {{ review.title }} {% include "common_libs.html" with jquery=0 v2=1 %} diff --git a/journal/templates/user_collection_list.html b/journal/templates/user_collection_list.html index ed8ed9e9..cb87b02c 100644 --- a/journal/templates/user_collection_list.html +++ b/journal/templates/user_collection_list.html @@ -13,7 +13,7 @@ - {{ site_name }} - {{ user.display_name }} - + <title>{{ site_name }} - {{ identity.display_name }} - {% if liked %}关注的{% endif %} 收藏单 {% include "common_libs.html" with jquery=0 v2=1 %} @@ -23,7 +23,7 @@
- {{ user.display_name }} - + {{ identity.display_name }} - {% if liked %}关注的{% endif %} 收藏单
diff --git a/journal/templates/user_item_list_base.html b/journal/templates/user_item_list_base.html index 9a3a56be..0ef56e8b 100644 --- a/journal/templates/user_item_list_base.html +++ b/journal/templates/user_item_list_base.html @@ -11,7 +11,7 @@ - {% block title %}{{ site_name }} - {{ user.display_name }}{% endblock %} + {% block title %}{{ site_name }} - {{ identity.display_name }}{% endblock %} {% include "common_libs.html" with jquery=0 v2=1 %} @@ -19,7 +19,7 @@
- {% block head %}{{ user.display_name }}{% endblock %} + {% block head %}{{ identity.display_name }}{% endblock %}
{% for member in members %} diff --git a/journal/templates/user_mark_list.html b/journal/templates/user_mark_list.html index e10046fa..e94a43dd 100644 --- a/journal/templates/user_mark_list.html +++ b/journal/templates/user_mark_list.html @@ -1,8 +1,8 @@ {% extends 'user_item_list_base.html' %} {% load i18n %} {% block title %} - {{ site_name }} - {{ user.display_name }} - {% trans '标记' %} + {{ site_name }} - {{ identity.display_name }} - {% trans '标记' %} {% endblock %} {% block head %} - {{ user.display_name }} - {% trans '标记' %} + {{ identity.display_name }} - {% trans '标记' %} {% endblock %} diff --git a/journal/templates/user_review_list.html b/journal/templates/user_review_list.html index 2c6a59c2..2c27de16 100644 --- a/journal/templates/user_review_list.html +++ b/journal/templates/user_review_list.html @@ -1,8 +1,8 @@ {% extends "user_item_list_base.html" %} {% load i18n %} {% block title %} - {{ site_name }} - {{ user.display_name }} - {% trans '评论' %} + {{ site_name }} - {{ identity.display_name }} - {% trans '评论' %} {% endblock %} {% block head %} - {{ user.display_name }} - {% trans '评论' %} + {{ identity.display_name }} - {% trans '评论' %} {% endblock %} diff --git a/journal/templates/user_tag_list.html b/journal/templates/user_tag_list.html index 125f09a2..f0b94452 100644 --- a/journal/templates/user_tag_list.html +++ b/journal/templates/user_tag_list.html @@ -13,7 +13,7 @@ - {{ site_name }} - {{ user.display_name }} 的标签 + {{ site_name }} - {{ identity.display_name }} 的标签 {% include "common_libs.html" with jquery=0 v2=1 %} @@ -25,7 +25,7 @@ {% for v in tags %} - {{ v.title }} + {{ v.title }} ({{ v.total }}) diff --git a/journal/templates/user_tagmember_list.html b/journal/templates/user_tagmember_list.html index 0122238c..1afd0083 100644 --- a/journal/templates/user_tagmember_list.html +++ b/journal/templates/user_tagmember_list.html @@ -1,15 +1,15 @@ {% extends "user_item_list_base.html" %} {% load i18n %} {% block title %} - {{ site_name }} - {{ user.display_name }} - {{ tag.title }} {% trans '标签' %} + {{ site_name }} - {{ identity.display_name }} - {{ tag.title }} {% trans '标签' %} {% endblock %} {% block head %} {{ tag.title }}
{% if tag.visibility > 0 %}{% endif %} - {{ user.display_name }}的{% trans '标签' %} - {% if user == request.user %} + {{ identity.display_name }}的{% trans '标签' %} + {% if identity.user == request.user %}
- {% include "_sidebar.html" with show_progress=1 %} + {% include "_sidebar.html" with show_progress=1 identity=request.user.identity %}
{% include "_footer.html" %} diff --git a/takahe/utils.py b/takahe/utils.py index a9d19952..6ec55ca1 100644 --- a/takahe/utils.py +++ b/takahe/utils.py @@ -70,6 +70,7 @@ class Takahe: """ from users.models import APIdentity + logger.info(f"User {u} initialize identity") if not u.username: logger.warning(f"User {u} has no username") return None diff --git a/users/account.py b/users/account.py index 5a6c1eb4..195712eb 100644 --- a/users/account.py +++ b/users/account.py @@ -20,6 +20,7 @@ from django.utils.translation import gettext_lazy as _ from loguru import logger from common.config import * +from common.utils import AuthedHttpRequest from journal.models import remove_data_by_user from mastodon import mastodon_request_included from mastodon.api import * @@ -162,18 +163,12 @@ def OAuth2_login(request): ): # swap login for existing user return swap_login(request, token, site, refresh_token) - user = authenticate(request, token=token, site=site) + user: User = authenticate(request, token=token, site=site) # type: ignore if user: # existing user user.mastodon_token = token # type: ignore user.mastodon_refresh_token = refresh_token # type: ignore user.save(update_fields=["mastodon_token", "mastodon_refresh_token"]) - auth_login(request, user) - if request.session.get("next_url") is not None: - response = redirect(request.session.get("next_url")) - del request.session["next_url"] - else: - response = redirect(reverse("common:home")) - return response + return login_existing_user(request, user) else: # newly registered user code, user_data = verify_account(site, token) if code != 200 or user_data is None: @@ -199,6 +194,18 @@ def register_new_user(request, **param): return redirect(reverse("users:register")) +def login_existing_user(request, existing_user): + auth_login(request, existing_user) + if not existing_user.username or not existing_user.identity: + response = redirect(reverse("account:register")) + elif request.session.get("next_url") is not None: + response = redirect(request.session.get("next_url")) + del request.session["next_url"] + else: + response = redirect(reverse("common:home")) + return response + + @mastodon_request_included @login_required def logout(request): @@ -317,8 +324,7 @@ def verify_email(request): elif action == "login": user = User.objects.get(pk=s["i"]) if user.email == email: - auth_login(request, user) - return redirect(reverse("common:home")) + return login_existing_user(request, user) else: error = _("电子邮件地址不匹配") elif action == "register": @@ -336,7 +342,7 @@ def verify_email(request): @login_required -def register(request): +def register(request: AuthedHttpRequest): form = None if settings.MASTODON_ALLOW_ANY_SITE: form = RegistrationForm(request.POST) @@ -352,7 +358,7 @@ def register(request): email_cleared = False if not form.is_valid(): return render(request, "users/register.html", {"form": form}) - if request.user.username is None and form.cleaned_data["username"]: + if not request.user.username and form.cleaned_data["username"]: if User.objects.filter( username__iexact=form.cleaned_data["username"] ).exists(): @@ -390,13 +396,14 @@ def register(request): if request.user.pending_email: django_rq.get_queue("mastodon").enqueue( send_verification_link, - request.user.id, + request.user.pk, "verify", request.user.pending_email, ) messages.add_message(request, messages.INFO, _("已发送验证邮件,请查收。")) + if request.user.username and not request.user.identity_linked(): + request.user.initialize() if username_changed: - request.user.initiatialize() messages.add_message(request, messages.INFO, _("用户名已设置。")) if email_cleared: messages.add_message(request, messages.INFO, _("电子邮件地址已取消关联。")) diff --git a/users/migrations/0013_init_identity.py b/users/migrations/0013_init_identity.py index ab55d653..40136a90 100644 --- a/users/migrations/0013_init_identity.py +++ b/users/migrations/0013_init_identity.py @@ -63,6 +63,7 @@ def init_identity(apps, schema_editor): local=True, discoverable=not user.preference.no_anonymous_view, ) + takahe_identity.generate_keypair() takahe_user.identities.add(takahe_identity) diff --git a/users/models/apidentity.py b/users/models/apidentity.py index b02c39b1..13a24fa3 100644 --- a/users/models/apidentity.py +++ b/users/models/apidentity.py @@ -97,6 +97,10 @@ class APIdentity(models.Model): def following(self): return Takahe.get_following_ids(self.pk) + @property + def followers(self): + return Takahe.get_follower_ids(self.pk) + @property def muting(self): return Takahe.get_muting_ids(self.pk) @@ -105,6 +109,26 @@ class APIdentity(models.Model): def blocking(self): return Takahe.get_blocking_ids(self.pk) + @property + def following_identities(self): + return APIdentity.objects.filter(pk__in=self.following) + + @property + def follower_identities(self): + return APIdentity.objects.filter(pk__in=self.followers) + + @property + def muting_identities(self): + return APIdentity.objects.filter(pk__in=self.muting) + + @property + def blocking_identities(self): + return APIdentity.objects.filter(pk__in=self.blocking) + + @property + def follow_requesting_identities(self): + return APIdentity.objects.filter(pk__in=self.following_request) + @property def rejecting(self): return Takahe.get_rejecting_ids(self.pk) @@ -119,11 +143,13 @@ class APIdentity(models.Model): def unfollow(self, target: "APIdentity"): # this also cancels follow request Takahe.unfollow(self.pk, target.pk) + @property def requested_followers(self): - Takahe.get_requested_follower_ids(self.pk) + return Takahe.get_requested_follower_ids(self.pk) + @property def following_request(self): - Takahe.get_following_request_ids(self.pk) + return Takahe.get_following_request_ids(self.pk) def accept_follow_request(self, target: "APIdentity"): Takahe.accept_follow_request(self.pk, target.pk) @@ -160,6 +186,9 @@ class APIdentity(models.Model): def is_following(self, target: "APIdentity"): return target.pk in self.following + def is_requesting(self, target: "APIdentity"): + return target.pk in self.following_request + def is_followed_by(self, target: "APIdentity"): return target.is_following(self) diff --git a/users/models/user.py b/users/models/user.py index 68a8c322..2531f825 100644 --- a/users/models/user.py +++ b/users/models/user.py @@ -333,8 +333,14 @@ class User(AbstractUser): new_user.initialize() return new_user + def identity_linked(self): + from .apidentity import APIdentity + + return APIdentity.objects.filter(user=self).exists() + def initialize(self): Takahe.init_identity_for_local_user(self) + self.identity.shelf_manager # TODO the following models should be deprecated soon diff --git a/users/templates/users/account.html b/users/templates/users/account.html index d600fc40..8373ad22 100644 --- a/users/templates/users/account.html +++ b/users/templates/users/account.html @@ -91,28 +91,34 @@ {% endif %} -
+
{% trans '正在关注的用户' %} - {% include 'users/relationship_list.html' with name="关注" id="follow" list=request.user.local_following.all %} + {% include 'users/relationship_list.html' with name="关注" id="follow" list=request.user.identity.following_identities.all %}
-
+
{% trans '关注了你的用户' %} - {% include 'users/relationship_list.html' with name="关注者" id="follower" list=request.user.local_followers.all %} + {% include 'users/relationship_list.html' with name="关注者" id="follower" list=request.user.identity.follower_identities.all %} +
+
+
+
+ {% trans '请求关注你的用户' %} + {% include 'users/relationship_list.html' with name="请求关注者" id="follow_request" list=request.user.identity.follow_requesting_identities.all %}
{% trans '已隐藏的用户' %} - {% include 'users/relationship_list.html' with name="隐藏" id="mute" list=request.user.local_muting.all %} + {% include 'users/relationship_list.html' with name="隐藏" id="mute" list=request.user.identity.muting_identities.all %}
{% trans '已屏蔽的用户' %} - {% include 'users/relationship_list.html' with name="屏蔽" id="block" list=request.user.local_blocking.all %} + {% include 'users/relationship_list.html' with name="屏蔽" id="block" list=request.user.identity.blocking_identities.all %}
@@ -126,7 +132,7 @@ value="{% trans '同步' %}" {% if not request.user.mastodon_username %}disabled{% endif %} /> - {% if user.mastodon_last_refresh %}上次更新时间 {{ user.mastodon_last_refresh }}{% endif %} + {% if request.user.mastodon_last_refresh %}上次更新时间 {{ request.user.mastodon_last_refresh }}{% endif %}
为了正确高效的展示短评和评论,{{ site_name }}会缓存你在联邦宇宙的关注、屏蔽和隐藏列表。如果你刚刚更新过帐户的上锁状态、增减过关注、隐藏或屏蔽,希望立即生效,可以点击这里立刻更新;这类信息也会每天自动同步。 @@ -167,7 +173,7 @@
- {% include "_sidebar.html" with show_profile=1 %} + {% include "_sidebar.html" with show_profile=1 identity=request.user.identity %}
{% include "_footer.html" %} diff --git a/users/templates/users/data.html b/users/templates/users/data.html index 27390b53..1844399e 100644 --- a/users/templates/users/data.html +++ b/users/templates/users/data.html @@ -177,7 +177,7 @@
- {% include "_sidebar.html" with show_profile=1 %} + {% include "_sidebar.html" with show_profile=1 identity=request.user.identity %} {% include "_footer.html" %} diff --git a/users/templates/users/follow_locked.html b/users/templates/users/follow_locked.html index c96f9db7..557cc756 100644 --- a/users/templates/users/follow_locked.html +++ b/users/templates/users/follow_locked.html @@ -9,10 +9,10 @@ 在联邦宇宙关注用户
-

{{ user.display_name | default:user.mastodon_acct }} 已经开启了关注审核,请复制以下ID,到你所在的联邦宇宙实例中去关注ta。

+

{{ identity.display_name }} 已经开启了关注审核,请复制以下ID,到你所在的联邦宇宙实例中去关注ta。

@{{ user.mastodon_acct }} + data-tooltip="点击复制">@{{ identity.user.mastodon_acct }}

如果你已经关注了ta,请耐心等待ta的审核。

{% if not request.user.mastodon_acct %} diff --git a/users/templates/users/home_anonymous.html b/users/templates/users/home_anonymous.html index 5fb098ee..5f20b9f9 100644 --- a/users/templates/users/home_anonymous.html +++ b/users/templates/users/home_anonymous.html @@ -6,21 +6,23 @@ - {{ site_name }} - {{ user.display_name }} + {{ site_name }} - {{ identity.handler }} + content="{{ site_name }} - {{ identity.handler }}的主页"> - {% if user.mastodon_account.url %} - Mastodon verification + {% if identity.user.mastodon_account.url %} + Mastodon verification {% endif %} diff --git a/users/templates/users/login.html b/users/templates/users/login.html index caa914b8..300ef0d3 100644 --- a/users/templates/users/login.html +++ b/users/templates/users/login.html @@ -47,7 +47,7 @@
- {% if user.is_authenticated %} + {% if request.user.is_authenticated %} {% trans '前往首页' %} {% else %} diff --git a/users/templates/users/preferences.html b/users/templates/users/preferences.html index 01619859..ca8c30a0 100644 --- a/users/templates/users/preferences.html +++ b/users/templates/users/preferences.html @@ -159,7 +159,7 @@
- {% include "_sidebar.html" with show_profile=1 %} + {% include "_sidebar.html" with show_profile=1 identity=request.user.identity %} {% include "_footer.html" %} diff --git a/users/templates/users/profile_actions.html b/users/templates/users/profile_actions.html index 5b7fa120..7529d66b 100644 --- a/users/templates/users/profile_actions.html +++ b/users/templates/users/profile_actions.html @@ -24,39 +24,34 @@ {% endif %} {% if relationship.following %} - {% if relationship.unfollowable %} - - - - - - {% else %} - - {% endif %} + + + + + + {% elif relationship.requesting %} + + + + + {% else %} - {% if identity.locked %} - - - - - - {% else %} - - - - - - {% endif %} + + + + + {% endif %} {% if not relationship.muting %} @@ -64,23 +59,17 @@ hx-post="{% url 'users:mute' identity.handler %}" hx-target="closest .action" hx-swap="innerHTML"> - + - {% elif relationship.unmutable %} + {% else %} - - - - {% else %} - - - + {% endif %} diff --git a/users/templates/users/relationship_list.html b/users/templates/users/relationship_list.html index 1907af75..1c0b1c4c 100644 --- a/users/templates/users/relationship_list.html +++ b/users/templates/users/relationship_list.html @@ -1,10 +1,10 @@ -{% for user in list %} +{% for identity in list %}

{% include 'users/profile_actions.html' with show_home=1 %} {{ user.handler }} + onclick="navigator.clipboard.writeText(this.innerText);$(this).data('tooltip','copied');">{{ identity.handler }}

{% empty %}

无数据

diff --git a/users/templates/users/verify_email.html b/users/templates/users/verify_email.html index bc1e6284..4a5e64b3 100644 --- a/users/templates/users/verify_email.html +++ b/users/templates/users/verify_email.html @@ -17,7 +17,7 @@

验证电子邮件

{% if success %}

- {{ user.email }} 验证成功,点击这里返回首页。 + {{ request.user.email }} 验证成功,点击这里返回首页

{% else %}

diff --git a/users/urls.py b/users/urls.py index b550b829..aa9759eb 100644 --- a/users/urls.py +++ b/users/urls.py @@ -27,7 +27,6 @@ urlpatterns = [ path("preferences", preferences, name="preferences"), path("logout", logout, name="logout"), path("layout", set_layout, name="set_layout"), - path("locked/", follow_locked, name="locked"), path("follow/", follow, name="follow"), path("unfollow/", unfollow, name="unfollow"), path("mute/", mute, name="mute"), diff --git a/users/views.py b/users/views.py index c440f1d5..3321ffd1 100644 --- a/users/views.py +++ b/users/views.py @@ -9,7 +9,11 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from common.config import * -from common.utils import HTTPResponseHXRedirect +from common.utils import ( + AuthedHttpRequest, + HTTPResponseHXRedirect, + target_identity_required, +) from management.models import Announcement from mastodon.api import * from takahe.utils import Takahe @@ -76,81 +80,113 @@ def fetch_refresh(request): @login_required -def follow(request, user_name): +@target_identity_required +def follow(request: AuthedHttpRequest, 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() + request.user.identity.follow(request.target_identity) + return render( + request, + "users/profile_actions.html", + context={"identity": request.target_identity}, + ) @login_required -def unfollow(request, user_name): +@target_identity_required +def unfollow(request: AuthedHttpRequest, 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() + request.user.identity.unfollow(request.target_identity) + return render( + request, + "users/profile_actions.html", + context={"identity": request.target_identity}, + ) @login_required -def mute(request, user_name): +@target_identity_required +def mute(request: AuthedHttpRequest, 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() + request.user.identity.mute(request.target_identity) + return render( + request, + "users/profile_actions.html", + context={"identity": request.target_identity}, + ) @login_required -def unmute(request, user_name): +@target_identity_required +def unmute(request: AuthedHttpRequest, 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() + request.user.identity.unmute(request.target_identity) + return render( + request, + "users/profile_actions.html", + context={"identity": request.target_identity}, + ) @login_required -def block(request, user_name): +@target_identity_required +def block(request: AuthedHttpRequest, 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() + request.user.identity.block(request.target_identity) + return render( + request, + "users/profile_actions.html", + context={"identity": request.target_identity}, + ) @login_required -def unblock(request, user_name): +@target_identity_required +def unblock(request: AuthedHttpRequest, 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: + request.user.identity.unblock(request.target_identity) + return render( + request, + "users/profile_actions.html", + context={"identity": request.target_identity}, + ) + + +@login_required +@target_identity_required +def accept_follow_request(request: AuthedHttpRequest, user_name): + if request.method != "POST": raise BadRequest() + request.user.identity.accept_follow_request(request.target_identity) + return render( + request, + "users/profile_actions.html", + context={"identity": request.target_identity}, + ) @login_required -def follow_locked(request, user_name): - user = User.get(user_name) - return render(request, "users/follow_locked.html", context={"user": user}) +@target_identity_required +def reject_follow_request(request: AuthedHttpRequest, user_name): + if request.method != "POST": + raise BadRequest() + request.user.identity.reject_follow_request(request.target_identity) + return render( + request, + "users/profile_actions.html", + context={"identity": request.target_identity}, + ) @login_required -def set_layout(request): +def set_layout(request: AuthedHttpRequest): if request.method == "POST": - layout = json.loads(request.POST.get("layout")) + layout = json.loads(request.POST.get("layout", {})) # type: ignore if request.POST.get("name") == "profile": request.user.preference.profile_layout = layout request.user.preference.save(update_fields=["profile_layout"]) @@ -163,7 +199,7 @@ def set_layout(request): @login_required -def report(request): +def report(request: AuthedHttpRequest): if request.method == "GET": user_id = request.GET.get("user_id") if user_id: @@ -204,7 +240,7 @@ def report(request): @login_required -def manage_report(request): +def manage_report(request: AuthedHttpRequest): if not request.user.is_staff: raise PermissionDenied() if request.method == "GET": @@ -224,7 +260,7 @@ def manage_report(request): @login_required -def mark_announcements_read(request): +def mark_announcements_read(request: AuthedHttpRequest): if request.method == "POST": try: request.user.read_announcement_index = Announcement.objects.latest("pk").pk @@ -232,4 +268,4 @@ def mark_announcements_read(request): except ObjectDoesNotExist: # when there is no annoucenment pass - return HttpResponseRedirect(request.META.get("HTTP_REFERER")) + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))