usermanagement/translation/calendar

This commit is contained in:
jschaufuss@leitwerk.de
2025-08-11 12:27:30 +02:00
parent 13a5286357
commit c2bb64d961
27 changed files with 998 additions and 240 deletions

View File

@@ -7,6 +7,8 @@ from .models import AppSettings
from django.http import JsonResponse
from accounts.utils import jellyfin_admin_required
from django.contrib.auth import get_user_model
from arr_api.models import SeriesSubscription, MovieSubscription
from django.db.models import Count
import requests
def needs_setup():
@@ -32,7 +34,7 @@ def first_run(request):
settings.radarr_api_key = form.cleaned_data['radarr_api_key']
settings.save()
messages.success(request, 'Setup erfolgreich abgeschlossen!')
messages.success(request, 'Setup completed successfully!')
return redirect('accounts:login')
else:
form = FirstRunSetupForm()
@@ -53,9 +55,9 @@ def test_connection(request):
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)
return JsonResponse({"ok": False, "error": "Invalid type"}, status=400)
if not url or not key:
return JsonResponse({"ok": False, "error": "URL und API-Key erforderlich"}, status=400)
return JsonResponse({"ok": False, "error": "URL and API key required"}, status=400)
try:
r = requests.get(
@@ -105,35 +107,87 @@ class SettingsView(View):
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
"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.jellyfin_server_url = jellyfin_form.cleaned_data.get("jellyfin_server_url") or None
cfg.jellyfin_api_key = jellyfin_form.cleaned_data.get("jellyfin_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
# Update Sonarr/Radarr settings
cfg.sonarr_url = arr_form.cleaned_data.get("sonarr_url") or None
cfg.sonarr_api_key = arr_form.cleaned_data.get("sonarr_api_key") or None
cfg.radarr_url = arr_form.cleaned_data.get("radarr_url") or None
cfg.radarr_api_key = arr_form.cleaned_data.get("radarr_api_key") or None
cfg.acc_username = acc_form.cleaned_data["username"] or None
cfg.acc_email = acc_form.cleaned_data["email"] or None
# Update Mail settings
cfg.mail_host = mail_form.cleaned_data.get("mail_host") or None
cfg.mail_port = mail_form.cleaned_data.get("mail_port") or None
cfg.mail_secure = mail_form.cleaned_data.get("mail_secure") or ""
cfg.mail_user = mail_form.cleaned_data.get("mail_user") or None
cfg.mail_password = mail_form.cleaned_data.get("mail_password") or None
cfg.mail_from = mail_form.cleaned_data.get("mail_from") or None
# Update account settings
cfg.acc_username = acc_form.cleaned_data.get("username") or None
cfg.acc_email = acc_form.cleaned_data.get("email") or None
cfg.save()
messages.success(request, "Einstellungen gespeichert (DB).")
messages.success(request, "Settings saved (DB).")
return redirect("settingspanel:index")
@jellyfin_admin_required
def subscriptions_overview(request):
series = SeriesSubscription.objects.select_related('user').order_by('user__username', 'series_title')
movies = MovieSubscription.objects.select_related('user').order_by('user__username', 'title')
# Aggregate counts per user
s_counts = SeriesSubscription.objects.values('user_id', 'user__username').annotate(series_count=Count('id'))
m_counts = MovieSubscription.objects.values('user_id', 'user__username').annotate(movie_count=Count('id'))
user_map = {}
for row in s_counts:
key = row['user_id']
user_map.setdefault(key, {
'user_id': key,
'username': row['user__username'],
'series_count': 0,
'movie_count': 0,
})
user_map[key]['series_count'] = row['series_count']
for row in m_counts:
key = row['user_id']
user_map.setdefault(key, {
'user_id': key,
'username': row['user__username'],
'series_count': 0,
'movie_count': 0,
})
user_map[key]['movie_count'] = row['movie_count']
user_stats = []
for key, val in user_map.items():
total = (val.get('series_count') or 0) + (val.get('movie_count') or 0)
user_stats.append({
'user_id': val['user_id'],
'username': val['username'],
'username_lower': (val['username'] or '').lower(),
'series_count': val.get('series_count') or 0,
'movie_count': val.get('movie_count') or 0,
'total_count': total,
})
user_stats.sort(key=lambda x: (-x['total_count'], x['username'].lower()))
return render(request, 'settingspanel/subscriptions.html', {
'series': series,
'movies': movies,
'user_stats': user_stats,
})