From eda0e73eb664e655958c0677c74efaf84bd7b99b Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Tue, 20 Mar 2018 09:09:49 -0700 Subject: [PATCH] Queue newsletters instead of waiting for send --- .../interfaces/default/newsletter_config.html | 10 ++++------ plexpy/newsletter_handler.py | 14 +++++++++++++- plexpy/newsletters.py | 13 +++++++------ plexpy/notification_handler.py | 7 +++++-- plexpy/webserve.py | 19 +++++++++---------- 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/data/interfaces/default/newsletter_config.html b/data/interfaces/default/newsletter_config.html index 0d2f783a..71ece2ed 100644 --- a/data/interfaces/default/newsletter_config.html +++ b/data/interfaces/default/newsletter_config.html @@ -549,13 +549,11 @@ }, cache: false, async: true, - complete: function (xhr, status) { - if (xhr.responseText.indexOf('sent') > -1) { - var msg = '  ' + xhr.responseText; - showMsg(msg, false, true, 2000); + success: function (data) { + if (data.result === 'success') { + showMsg(' ' + data.message, false, true, 5000); } else { - var msg = '  ' + xhr.responseText; - showMsg(msg, false, true, 2000, true); + showMsg(' ' + data.message, false, true, 5000, true); } } }); diff --git a/plexpy/newsletter_handler.py b/plexpy/newsletter_handler.py index 09123cc0..72243364 100644 --- a/plexpy/newsletter_handler.py +++ b/plexpy/newsletter_handler.py @@ -28,6 +28,18 @@ import newsletters NEWSLETTER_SCHED = BackgroundScheduler() +def add_newsletter_each(newsletter_id=None, notify_action=None, **kwargs): + if not notify_action: + logger.debug(u"Tautulli NewsletterHandler :: Notify called but no action received.") + return + + data = {'newsletter': True, + 'newsletter_id': newsletter_id, + 'notify_action': notify_action} + data.update(kwargs) + plexpy.NOTIFY_QUEUE.put(data) + + def schedule_newsletters(newsletter_id=None): newsletters_list = newsletters.get_newsletters(newsletter_id=newsletter_id) @@ -36,7 +48,7 @@ def schedule_newsletters(newsletter_id=None): if newsletter['active']: schedule_newsletter_job('newsletter-{}'.format(newsletter['id']), name=newsletter_job_name, - func=notify, args=[newsletter['id'], 'on_cron'], cron=newsletter['cron']) + func=add_newsletter_each, args=[newsletter['id'], 'on_cron'], cron=newsletter['cron']) else: schedule_newsletter_job('newsletter-{}'.format(newsletter['id']), name=newsletter_job_name, remove_job=True) diff --git a/plexpy/newsletters.py b/plexpy/newsletters.py index 5ed4520a..7425081c 100644 --- a/plexpy/newsletters.py +++ b/plexpy/newsletters.py @@ -27,9 +27,7 @@ import helpers import libraries import logger import newsletter_handler -import notification_handler import pmsconnect -from notification_handler import get_poster_info, CustomFormatter from notifiers import send_notification, EMAIL @@ -459,6 +457,7 @@ class Newsletter(object): return parameters def build_text(self): + from notification_handler import CustomFormatter custom_formatter = CustomFormatter() try: @@ -507,6 +506,8 @@ class RecentlyAdded(Newsletter): _TEMPLATE = 'recently_added.html' def _get_recently_added(self, media_type=None): + from notification_handler import format_group_index + pms_connect = pmsconnect.PmsConnect() recently_added = [] @@ -562,16 +563,14 @@ class RecentlyAdded(Newsletter): seasons = [] for k, v in groupby(filtered_children, key=lambda x: x['parent_media_index']): episodes = list(v) - num, num00 = notification_handler.format_group_index( - [helpers.cast_to_int(d['media_index']) for d in episodes]) + num, num00 = format_group_index([helpers.cast_to_int(d['media_index']) for d in episodes]) seasons.append({'media_index': k, 'episode_range': num00, 'episode_count': len(episodes), 'episode': episodes}) - num, num00 = notification_handler.format_group_index( - [helpers.cast_to_int(d['media_index']) for d in seasons]) + num, num00 = format_group_index([helpers.cast_to_int(d['media_index']) for d in seasons]) show_metadata['season_range'] = num00 show_metadata['season_count'] = len(seasons) @@ -623,6 +622,8 @@ class RecentlyAdded(Newsletter): return recently_added def retrieve_data(self): + from notification_handler import get_poster_info + if not self.config['incl_libraries']: logger.warn(u"Tautulli Newsletters :: Failed to retrieve %s newsletter data: no libraries selected." % self.NAME) diff --git a/plexpy/notification_handler.py b/plexpy/notification_handler.py index cfc576a0..627c1770 100644 --- a/plexpy/notification_handler.py +++ b/plexpy/notification_handler.py @@ -39,6 +39,7 @@ import plextv import pmsconnect import request import users +from newsletter_handler import notify as notify_newsletter def process_queue(): @@ -50,7 +51,9 @@ def process_queue(): break elif params: try: - if 'notify' in params: + if 'newsletter' in params: + notify_newsletter(**params) + elif 'notification' in params: notify(**params) else: add_notifier_each(**params) @@ -111,7 +114,7 @@ def add_notifier_each(notifier_id=None, notify_action=None, stream_data=None, ti # Check custom user conditions if manual_trigger or notify_custom_conditions(notifier_id=notifier['id'], parameters=parameters): # Add each notifier to the queue - data = {'notify': True, + data = {'notification': True, 'notifier_id': notifier['id'], 'notify_action': notify_action, 'stream_data': stream_data, diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 08ae5b8a..aafd9183 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -5559,6 +5559,7 @@ class WebInterface(object): return {'result': 'error', 'message': 'Failed to save newsletter.'} @cherrypy.expose + @cherrypy.tools.json_out() @requireAuth(member_of("admin")) @addtoapi("notify_newsletter") def send_newsletter(self, newsletter_id=None, subject='', body='', notify_action='', **kwargs): @@ -5584,20 +5585,18 @@ class WebInterface(object): if newsletter: logger.debug(u"Sending %s%s newsletter." % (test, newsletter['agent_label'])) - if newsletter_handler.notify(newsletter_id=newsletter_id, - notify_action=notify_action, - subject=subject, - body=body, - **kwargs): - return "Newsletter sent." - else: - return "Newsletter failed." + newsletter_handler.add_newsletter_each(newsletter_id=newsletter_id, + notify_action=notify_action, + subject=subject, + body=body, + **kwargs) + return {'result': 'success', 'message': 'Newsletter queued.'} else: logger.debug(u"Unable to send %snewsletter, invalid newsletter_id %s." % (test, newsletter_id)) - return "Invalid newsletter id %s." % newsletter_id + return {'result': 'error', 'message': 'Invalid newsletter id %s.' % newsletter_id} else: logger.debug(u"Unable to send %snotification, no newsletter_id received." % test) - return "No newsletter id received." + return {'result': 'error', 'message': 'No newsletter id received.'} @cherrypy.expose def newsletter(self, *args, **kwargs):