59 lines
3.1 KiB
Python
59 lines
3.1 KiB
Python
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)
|