fix duplicated email

This commit is contained in:
2025-08-13 21:13:25 +02:00
parent 70c95f7976
commit 839fafdb33
3 changed files with 94 additions and 45 deletions

View File

@@ -2,6 +2,7 @@ from django.core.mail import send_mail
from django.conf import settings
from django.template.loader import render_to_string
from django.utils import timezone
from django.db import transaction
from settingspanel.models import AppSettings
# from accounts.utils import JellyfinClient # not needed for availability; use Sonarr/Radarr instead
import requests
@@ -254,22 +255,32 @@ def check_and_notify_users():
if season is None or number is None:
continue
# duplicate guard (per series per day per user)
if not getattr(settings, 'NOTIFICATIONS_ALLOW_DUPLICATES', False):
already_notified = SentNotification.objects.filter(
media_id=sub.series_id,
media_type='series',
air_date=today,
user=sub.user
).exists()
if already_notified:
continue
# check availability via Sonarr hasFile
if sonarr_episode_has_file(sub.series_id, season, number):
if not sub.user.email:
continue
send_notification_email(
# After confirming availability, reserve once per user/series/day
if not getattr(settings, 'NOTIFICATIONS_ALLOW_DUPLICATES', False):
try:
with transaction.atomic():
obj, created = SentNotification.objects.get_or_create(
user=sub.user,
media_id=sub.series_id,
media_type='series',
air_date=today,
defaults={
'media_title': sub.series_title,
}
)
if not created:
# already reserved/sent
continue
except Exception:
# if DB error (race), skip to avoid duplicates
continue
try:
send_notification_email(
user=sub.user,
media_title=sub.series_title,
media_type='series',
@@ -279,16 +290,21 @@ def check_and_notify_users():
season=season,
episode=number,
air_date=ep.get('airDateUtc'),
)
# mark as sent unless duplicates are allowed
if not getattr(settings, 'NOTIFICATIONS_ALLOW_DUPLICATES', False):
SentNotification.objects.create(
user=sub.user,
media_id=sub.series_id,
media_type='series',
media_title=sub.series_title,
air_date=today
)
except Exception:
# roll back reservation so we can retry next run
if not getattr(settings, 'NOTIFICATIONS_ALLOW_DUPLICATES', False):
try:
SentNotification.objects.filter(
user=sub.user,
media_id=sub.series_id,
media_type='series',
air_date=today,
).delete()
except Exception:
pass
continue
# no-op: already reserved via get_or_create above
# Film-Abos
for sub in MovieSubscription.objects.select_related('user').all():
@@ -296,16 +312,6 @@ def check_and_notify_users():
if not it:
continue
if not getattr(settings, 'NOTIFICATIONS_ALLOW_DUPLICATES', False):
already_notified = SentNotification.objects.filter(
media_id=sub.movie_id,
media_type='movie',
air_date=today,
user=sub.user
).exists()
if already_notified:
continue
if radarr_movie_has_file(sub.movie_id):
if not sub.user.email:
continue
@@ -323,23 +329,47 @@ def check_and_notify_users():
except Exception:
pass
send_notification_email(
user=sub.user,
media_title=sub.title,
media_type='movie',
overview=sub.overview,
poster_url=it.get('posterUrl'),
year=it.get('year'),
release_type=rel,
)
# After confirming availability, reserve once per user/movie/day
if not getattr(settings, 'NOTIFICATIONS_ALLOW_DUPLICATES', False):
SentNotification.objects.create(
try:
with transaction.atomic():
obj, created = SentNotification.objects.get_or_create(
user=sub.user,
media_id=sub.movie_id,
media_type='movie',
air_date=today,
defaults={
'media_title': sub.title,
}
)
if not created:
continue
except Exception:
continue
try:
send_notification_email(
user=sub.user,
media_id=sub.movie_id,
media_type='movie',
media_title=sub.title,
air_date=today
media_type='movie',
overview=sub.overview,
poster_url=it.get('posterUrl'),
year=it.get('year'),
release_type=rel,
)
except Exception:
if not getattr(settings, 'NOTIFICATIONS_ALLOW_DUPLICATES', False):
try:
SentNotification.objects.filter(
user=sub.user,
media_id=sub.movie_id,
media_type='movie',
air_date=today,
).delete()
except Exception:
pass
continue
# no-op: already reserved via get_or_create above
def has_new_episode_today(series_id):