lib.itmens/mastodon/admin.py

59 lines
3.1 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.contrib import admin
from .models import *
from .api import create_app
from django.utils.translation import gettext_lazy as _
from requests.exceptions import Timeout
from django.core.exceptions import ObjectDoesNotExist
# Register your models here.
@admin.register(MastodonApplication)
class MastodonApplicationModelAdmin(admin.ModelAdmin):
def add_view(self, request, form_url='', extra_context=None):
"""
Dirty code here, use POST['domain_name'] to pass error message to user.
"""
if request.method == 'POST':
if not request.POST.get('client_id') and not request.POST.get('client_secret'):
# make the post data mutable
request.POST = request.POST.copy()
# (is_proxy xor proxy_to) or (proxy_to!=null and is_proxy=false)
if (bool(request.POST.get('is_proxy')) or bool(request.POST.get('proxy_to'))) and\
not (bool(request.POST.get('is_proxy')) and bool(request.POST.get('proxy_to'))) or\
(not bool(request.POST.get('is_proxy')) and bool(request.POST.get('proxy_to'))):
request.POST['domain_name'] = _("请同时填写is_proxy和proxy_to。")
else:
if request.POST.get("is_proxy"):
try:
origin = MastodonApplication.objects.get(domain_name=request.POST['proxy_to'])
# set proxy credentials to those of its original site
request.POST['app_id'] = origin.app_id
request.POST['client_id'] = origin.client_id
request.POST['client_secret'] = origin.client_secret
request.POST['vapid_key'] = origin.vapid_key
except ObjectDoesNotExist:
request.POST['domain_name'] = _("proxy_to所指域名不存在请先添加原站点。")
else:
# create mastodon app
try:
response = create_app(request.POST.get('domain_name'))
except (Timeout, ConnectionError):
request.POST['domain_name'] = _("联邦网络请求超时。")
except Exception as e:
request.POST['domain_name'] = str(e)
else:
# fill the form with returned data
data = response.json()
if response.status_code != 200:
request.POST['domain_name'] = str(data)
else:
request.POST['app_id'] = data['id']
request.POST['client_id'] = data['client_id']
request.POST['client_secret'] = data['client_secret']
request.POST['vapid_key'] = data['vapid_key']
return super().add_view(request, form_url=form_url, extra_context=extra_context)
admin.site.register(CrossSiteUserInfo)