Files
Subscribarr/settingspanel/views.py

140 lines
5.9 KiB
Python

from django.shortcuts import render, redirect
from django.views import View
from django.contrib import messages
from django.utils.decorators import method_decorator
from .forms import ArrSettingsForm, MailSettingsForm, AccountForm, FirstRunSetupForm, JellyfinSettingsForm
from .models import AppSettings
from django.http import JsonResponse
from accounts.utils import jellyfin_admin_required
from django.contrib.auth import get_user_model
import requests
def needs_setup():
"""Check if the app needs first-run setup"""
settings = AppSettings.current()
return not bool(settings.jellyfin_server_url)
def first_run(request):
"""Handle first-run setup"""
if not needs_setup():
return redirect('arr_api:index')
if request.method == 'POST':
form = FirstRunSetupForm(request.POST)
if form.is_valid():
# Save settings
settings = AppSettings.current()
settings.jellyfin_server_url = form.cleaned_data['jellyfin_server_url']
settings.jellyfin_api_key = form.cleaned_data['jellyfin_api_key']
settings.sonarr_url = form.cleaned_data['sonarr_url']
settings.sonarr_api_key = form.cleaned_data['sonarr_api_key']
settings.radarr_url = form.cleaned_data['radarr_url']
settings.radarr_api_key = form.cleaned_data['radarr_api_key']
settings.save()
messages.success(request, 'Setup erfolgreich abgeschlossen!')
return redirect('accounts:login')
else:
form = FirstRunSetupForm()
return render(request, 'settingspanel/first_run.html', {'form': form})
from django.shortcuts import render, redirect
from django.contrib import messages
from django.utils.decorators import method_decorator
from .forms import ArrSettingsForm, MailSettingsForm, AccountForm, JellyfinSettingsForm
from .models import AppSettings
from django.http import JsonResponse
from accounts.utils import jellyfin_admin_required
import requests
@jellyfin_admin_required
def test_connection(request):
kind = request.GET.get("kind") # "sonarr" | "radarr"
url = (request.GET.get("url") or "").strip()
key = (request.GET.get("key") or "").strip()
if kind not in ("sonarr", "radarr"):
return JsonResponse({"ok": False, "error": "Ungültiger Typ"}, status=400)
if not url or not key:
return JsonResponse({"ok": False, "error": "URL und API-Key erforderlich"}, status=400)
try:
r = requests.get(
f"{url.rstrip('/')}/api/v3/system/status",
headers={"X-Api-Key": key},
timeout=5
)
if r.status_code == 200:
return JsonResponse({"ok": True})
return JsonResponse({"ok": False, "error": f"HTTP {r.status_code}"})
except requests.RequestException as e:
return JsonResponse({"ok": False, "error": str(e)})
@method_decorator(jellyfin_admin_required, name='dispatch')
class SettingsView(View):
template_name = "settingspanel/settings.html"
def get(self, request):
cfg = AppSettings.current()
return render(request, self.template_name, {
"jellyfin_form": JellyfinSettingsForm(initial={
"jellyfin_server_url": cfg.jellyfin_server_url or "",
"jellyfin_api_key": cfg.jellyfin_api_key or "",
}),
"arr_form": ArrSettingsForm(initial={
"sonarr_url": cfg.sonarr_url or "",
"sonarr_api_key": cfg.sonarr_api_key or "",
"radarr_url": cfg.radarr_url or "",
"radarr_api_key": cfg.radarr_api_key or "",
}),
"mail_form": MailSettingsForm(initial={
"mail_host": cfg.mail_host or "",
"mail_port": cfg.mail_port or "",
"mail_secure": cfg.mail_secure or "",
"mail_user": cfg.mail_user or "",
"mail_password": cfg.mail_password or "",
"mail_from": cfg.mail_from or "",
}),
"account_form": AccountForm(initial={
"username": cfg.acc_username or "",
"email": cfg.acc_email or "",
}),
})
def post(self, request):
jellyfin_form = JellyfinSettingsForm(request.POST)
arr_form = ArrSettingsForm(request.POST)
mail_form = MailSettingsForm(request.POST)
acc_form = AccountForm(request.POST)
if not (jellyfin_form.is_valid() and arr_form.is_valid() and mail_form.is_valid() and acc_form.is_valid()):
return render(request, self.template_name, {
"jellyfin_form": jellyfin_form,
"arr_form": arr_form,
"mail_form": mail_form,
"account_form": acc_form
})
cfg = AppSettings.current()
# Update Jellyfin settings
cfg.jellyfin_server_url = jellyfin_form.cleaned_data["jellyfin_server_url"] or None
cfg.jellyfin_api_key = jellyfin_form.cleaned_data["jellyfin_api_key"] or None
cfg.sonarr_url = arr_form.cleaned_data["sonarr_url"] or None
cfg.sonarr_api_key = arr_form.cleaned_data["sonarr_api_key"] or None
cfg.radarr_url = arr_form.cleaned_data["radarr_url"] or None
cfg.radarr_api_key = arr_form.cleaned_data["radarr_api_key"] or None
cfg.mail_host = mail_form.cleaned_data["mail_host"] or None
cfg.mail_port = mail_form.cleaned_data["mail_port"] or None
cfg.mail_secure = mail_form.cleaned_data["mail_secure"] or ""
cfg.mail_user = mail_form.cleaned_data["mail_user"] or None
cfg.mail_password = mail_form.cleaned_data["mail_password"] or None
cfg.mail_from = mail_form.cleaned_data["mail_from"] or None
cfg.acc_username = acc_form.cleaned_data["username"] or None
cfg.acc_email = acc_form.cleaned_data["email"] or None
cfg.save()
messages.success(request, "Einstellungen gespeichert (DB).")
return redirect("settingspanel:index")