lib.itmens/users/apis.py

94 lines
2.4 KiB
Python
Raw Normal View History

from typing import Literal
from django.conf import settings
from ninja import Schema
2025-01-20 15:34:49 -05:00
from ninja.schema import Field
from common.api import NOT_FOUND, Result, api
from mastodon.models import SocialAccount
from users.models import APIdentity
2025-01-20 15:34:49 -05:00
class ExternalAccountSchema(Schema):
platform: str
handle: str
url: str | None
class UserSchema(Schema):
2023-06-03 01:22:19 -04:00
url: str
2025-01-20 15:34:49 -05:00
external_acct: str | None = Field(deprecated=True)
external_accounts: list[ExternalAccountSchema]
display_name: str
avatar: str
2023-12-26 13:52:57 -05:00
username: str
roles: list[Literal["admin", "staff"]]
2025-01-24 19:15:31 -05:00
class PreferenceSchema(Schema):
default_crosspost: bool = Field(alias="mastodon_default_repost")
default_visibility: int
hidden_categories: list[str]
language: str = Field(alias="user.language")
2024-01-28 07:57:39 -05:00
@api.get(
"/me",
2023-06-03 01:22:19 -04:00
response={200: UserSchema, 401: Result},
summary="Get current user's basic info",
2024-01-28 07:57:39 -05:00
tags=["user"],
)
def me(request):
2025-01-20 15:34:49 -05:00
accts = SocialAccount.objects.filter(user=request.user)
return 200, {
2025-02-04 12:20:08 -05:00
# "id": str(request.user.identity.pk),
2023-12-26 13:52:57 -05:00
"username": request.user.username,
2023-06-03 11:32:49 -04:00
"url": settings.SITE_INFO["site_url"] + request.user.url,
2024-07-03 00:07:07 -04:00
"external_acct": (
request.user.mastodon.handle if request.user.mastodon else None
),
2025-01-20 15:34:49 -05:00
"external_accounts": accts,
"display_name": request.user.display_name,
2023-07-23 19:15:23 -04:00
"avatar": request.user.avatar,
"roles": request.user.get_roles(),
}
2025-01-22 21:11:11 -05:00
2025-01-24 19:15:31 -05:00
@api.get(
"/me/preference",
response={200: PreferenceSchema, 401: Result},
summary="Get current user's preference",
tags=["user"],
)
def preference(request):
return 200, request.user.preference
2025-01-22 21:11:11 -05:00
@api.get(
"/user/{handle}",
response={200: UserSchema, 401: Result, 403: Result, 404: Result},
2025-01-22 21:11:11 -05:00
tags=["user"],
)
def user(request, handle: str):
"""
Get user's basic info
More detailed info can be fetched from Mastodon API
"""
try:
target = APIdentity.get_by_handle(handle)
except APIdentity.DoesNotExist:
return NOT_FOUND
2025-01-22 21:11:11 -05:00
viewer = request.user.identity
if target.is_blocking(viewer) or target.is_blocked_by(viewer):
return 403, {"message": "unavailable"}
return 200, {
"username": target.handle,
"url": target.url,
"external_acct": None,
"external_accounts": [],
"display_name": target.display_name,
"avatar": target.avatar,
"roles": target.user.get_roles() if target.local else [],
2025-01-22 21:11:11 -05:00
}