lib.itmens/common/views.py

148 lines
4.7 KiB
Python
Raw Normal View History

from django.conf import settings
from django.contrib.auth.decorators import login_required
2024-05-19 17:14:03 -04:00
from django.core.cache import cache
2025-02-09 15:05:04 -05:00
from django.core.exceptions import DisallowedHost
from django.http import HttpRequest, HttpResponse, JsonResponse
2023-02-04 00:45:17 -05:00
from django.shortcuts import redirect, render
from django.urls import reverse
2020-05-01 22:46:15 +08:00
2023-12-03 15:40:20 -05:00
from boofilsic import __version__
2024-12-30 01:51:19 -05:00
from catalog.views import search as catalog_search
from journal.views import search as journal_search
from social.views import search as timeline_search
2024-06-10 17:28:20 -04:00
from takahe.utils import Takahe
from .api import api
2024-07-04 00:17:12 -04:00
def render_error(request: HttpRequest, title, message=""):
2024-07-03 00:07:07 -04:00
return render(
request, "common/error.html", {"msg": title, "secondary_msg": message}
)
2020-05-01 22:46:15 +08:00
@login_required
def me(request):
2023-09-03 20:11:46 +00:00
if not request.user.registration_complete:
return redirect(reverse("users:register"))
2023-07-20 21:59:49 -04:00
return redirect(request.user.identity.url)
2024-12-30 01:51:19 -05:00
def search(request):
match request.GET.get("c", default="all").strip().lower():
case "journal":
return journal_search(request)
case "timeline":
return timeline_search(request)
case _:
return catalog_search(request)
2020-05-01 22:46:15 +08:00
def home(request):
if request.user.is_authenticated:
2023-09-03 20:11:46 +00:00
if not request.user.registration_complete:
return redirect(reverse("users:register"))
home = request.user.preference.classic_homepage
if home == 1:
return redirect(request.user.url)
elif home == 2:
return redirect(reverse("social:feed"))
else:
return redirect(reverse("catalog:discover"))
2022-05-30 22:48:11 -04:00
else:
2023-04-19 22:31:27 -04:00
return redirect(reverse("catalog:discover"))
2023-02-04 00:45:17 -05:00
2023-07-20 21:59:49 -04:00
def ap_redirect(request, uri):
return redirect(request.get_full_path().replace("/~neodb~/", "/"))
2023-07-20 21:59:49 -04:00
def nodeinfo2(request):
2024-05-27 14:20:58 -04:00
usage = cache.get("nodeinfo_usage", default={})
return JsonResponse(
{
"version": "2.0",
"software": {
"name": "neodb",
2023-12-03 15:40:20 -05:00
"version": __version__,
"repository": "https://github.com/neodb-social/neodb",
"homepage": "https://neodb.net/",
},
"protocols": ["activitypub", "neodb"],
2023-12-03 15:30:21 -05:00
"openRegistrations": not settings.INVITE_ONLY,
"services": {"outbound": [], "inbound": []},
"usage": usage,
2023-12-03 15:40:20 -05:00
"metadata": {
"nodeName": settings.SITE_INFO["site_name"],
"nodeRevision": settings.NEODB_VERSION,
2024-05-27 14:20:58 -04:00
"nodeEnvironment": "development" if settings.DEBUG else "production",
2023-12-03 15:40:20 -05:00
},
}
)
def _error_response(request, status: int, exception=None, default_message=""):
message = str(exception) if exception else default_message
2025-03-08 16:43:15 -05:00
if request.headers.get("HTTP_ACCEPT", "").endswith("json"):
return JsonResponse({"error": message}, status=status)
if (
request.headers.get("HTTP_HX_REQUEST") is not None
and request.headers.get("HTTP_HX_BOOSTED") is None
):
return HttpResponse(message, status=status)
return render(
request,
f"{status}.html",
status=status,
context={"message": message, "exception": exception},
)
2023-02-04 00:45:17 -05:00
def error_400(request, exception=None):
2025-02-09 15:05:04 -05:00
if isinstance(exception, DisallowedHost):
url = settings.SITE_INFO["site_url"] + request.get_full_path()
return redirect(url, permanent=True)
return _error_response(request, 400, exception, "invalid request")
2023-02-04 00:45:17 -05:00
def error_403(request, exception=None):
return _error_response(request, 403, exception, "forbidden")
2023-02-04 00:45:17 -05:00
def error_404(request, exception=None):
request.session.pop("next_url", None)
return _error_response(request, 404, exception, "not found")
2023-02-04 00:45:17 -05:00
def error_500(request, exception=None):
return _error_response(request, 500, exception, "something wrong")
2024-06-10 17:28:20 -04:00
def console(request):
token = None
if request.method == "POST":
if not request.user.is_authenticated:
return redirect(reverse("users:login"))
app = Takahe.get_or_create_app(
"Dev Console",
settings.SITE_INFO["site_url"],
"",
owner_pk=0,
client_id="app-00000000000-dev",
)
token = Takahe.refresh_token(app, request.user.identity.pk, request.user.pk)
context = {
"api": api,
"token": token,
"openapi_json_url": reverse(f"{api.urls_namespace}:openapi-json"),
}
return render(request, "console.html", context)
def signup(request, code: str | None = None):
if request.user.is_authenticated:
return redirect(reverse("common:home"))
if code:
return redirect(reverse("users:login") + "?invite=" + code)
return redirect(reverse("users:login"))