Files
Subscribarr/accounts/views.py

133 lines
5.5 KiB
Python

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.urls import reverse_lazy
from django.views.generic.edit import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth import login
from django.conf import settings
from .forms import CustomUserCreationForm, CustomUserChangeForm, JellyfinLoginForm
from .models import User
from .utils import JellyfinClient
class RegisterView(CreateView):
form_class = CustomUserCreationForm
template_name = 'accounts/register.html'
success_url = reverse_lazy('accounts:login')
def form_valid(self, form):
response = super().form_valid(form)
messages.success(self.request, 'Registrierung erfolgreich! Sie können sich jetzt anmelden.')
return response
@login_required
def profile(request):
if request.method == 'POST':
form = CustomUserChangeForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
messages.success(request, 'E-Mail gespeichert.')
return redirect('accounts:profile')
else:
form = CustomUserChangeForm(instance=request.user)
# Lade Abonnements
series_subs = request.user.series_subscriptions.all()
movie_subs = request.user.movie_subscriptions.all()
# Best-effort Backfill fehlender Poster, damit die Profilseite Bilder zeigt
try:
from settingspanel.models import AppSettings
from arr_api.services import sonarr_get_series, radarr_lookup_movie_by_title
cfg = AppSettings.current()
# Serien
for sub in series_subs:
if not sub.series_poster and sub.series_id:
details = sonarr_get_series(sub.series_id, base_url=cfg.sonarr_url, api_key=cfg.sonarr_api_key)
if details and details.get('series_poster'):
sub.series_poster = details['series_poster']
if not sub.series_overview:
sub.series_overview = details.get('series_overview') or ''
if not sub.series_genres:
sub.series_genres = details.get('series_genres') or []
sub.save(update_fields=['series_poster', 'series_overview', 'series_genres'])
# Filme
for sub in movie_subs:
if not sub.poster:
details = radarr_lookup_movie_by_title(sub.title, base_url=cfg.radarr_url, api_key=cfg.radarr_api_key)
if details and details.get('poster'):
sub.poster = details['poster']
if not sub.overview:
sub.overview = details.get('overview') or ''
if not sub.genres:
sub.genres = details.get('genres') or []
sub.save(update_fields=['poster', 'overview', 'genres'])
except Exception:
# still show page even if lookups fail
pass
return render(request, 'accounts/profile.html', {
'form': form,
'series_subs': series_subs,
'movie_subs': movie_subs,
})
def jellyfin_login(request):
if request.method == 'POST':
form = JellyfinLoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
# Jellyfin-URL aus AppSettings
from settingspanel.models import AppSettings
app_settings = AppSettings.current()
server_url = app_settings.get_jellyfin_url()
if not server_url:
messages.error(request, 'Jellyfin Server ist nicht konfiguriert. Bitte Setup abschließen.')
return render(request, 'accounts/login.html', {'form': form})
try:
client = JellyfinClient()
client.server_url = server_url
auth_result = client.authenticate(username, password)
if not auth_result:
messages.error(request, 'Anmeldung fehlgeschlagen. Bitte überprüfen Sie Ihre Anmeldedaten.')
return render(request, 'accounts/login.html', {'form': form})
# Existierenden User finden oder neu erstellen
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = User.objects.create_user(
username=username,
email=f"{username}@jellyfin.local"
)
# Jellyfin Daten aktualisieren
user.jellyfin_user_id = auth_result['user_id']
user.jellyfin_token = auth_result['access_token']
user.jellyfin_server = server_url
user.save()
if auth_result['is_admin']:
user.is_admin = True
user.save()
login(request, user)
messages.success(request, f'Willkommen, {username}!')
return redirect('arr_api:index')
except ValueError as e:
messages.error(request, str(e))
except Exception as e:
messages.error(request, f'Verbindungsfehler: {str(e)}')
# invalid form or error path
return render(request, 'accounts/login.html', {'form': form})
else:
form = JellyfinLoginForm()
return render(request, 'accounts/login.html', {'form': form})