Queue newsletters instead of waiting for send

This commit is contained in:
JonnyWong16 2018-03-20 09:09:49 -07:00
parent f810f50ea9
commit eda0e73eb6
5 changed files with 38 additions and 25 deletions

View file

@ -549,13 +549,11 @@
}, },
cache: false, cache: false,
async: true, async: true,
complete: function (xhr, status) { success: function (data) {
if (xhr.responseText.indexOf('sent') > -1) { if (data.result === 'success') {
var msg = '<i class="fa fa-check"></i>&nbsp; ' + xhr.responseText; showMsg('<i class="fa fa-check"></i> ' + data.message, false, true, 5000);
showMsg(msg, false, true, 2000);
} else { } else {
var msg = '<i class="fa fa-times"></i>&nbsp; ' + xhr.responseText; showMsg('<i class="fa fa-exclamation-circle"></i> ' + data.message, false, true, 5000, true);
showMsg(msg, false, true, 2000, true);
} }
} }
}); });

View file

@ -28,6 +28,18 @@ import newsletters
NEWSLETTER_SCHED = BackgroundScheduler() 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): def schedule_newsletters(newsletter_id=None):
newsletters_list = newsletters.get_newsletters(newsletter_id=newsletter_id) newsletters_list = newsletters.get_newsletters(newsletter_id=newsletter_id)
@ -36,7 +48,7 @@ def schedule_newsletters(newsletter_id=None):
if newsletter['active']: if newsletter['active']:
schedule_newsletter_job('newsletter-{}'.format(newsletter['id']), name=newsletter_job_name, 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: else:
schedule_newsletter_job('newsletter-{}'.format(newsletter['id']), name=newsletter_job_name, schedule_newsletter_job('newsletter-{}'.format(newsletter['id']), name=newsletter_job_name,
remove_job=True) remove_job=True)

View file

@ -27,9 +27,7 @@ import helpers
import libraries import libraries
import logger import logger
import newsletter_handler import newsletter_handler
import notification_handler
import pmsconnect import pmsconnect
from notification_handler import get_poster_info, CustomFormatter
from notifiers import send_notification, EMAIL from notifiers import send_notification, EMAIL
@ -459,6 +457,7 @@ class Newsletter(object):
return parameters return parameters
def build_text(self): def build_text(self):
from notification_handler import CustomFormatter
custom_formatter = CustomFormatter() custom_formatter = CustomFormatter()
try: try:
@ -507,6 +506,8 @@ class RecentlyAdded(Newsletter):
_TEMPLATE = 'recently_added.html' _TEMPLATE = 'recently_added.html'
def _get_recently_added(self, media_type=None): def _get_recently_added(self, media_type=None):
from notification_handler import format_group_index
pms_connect = pmsconnect.PmsConnect() pms_connect = pmsconnect.PmsConnect()
recently_added = [] recently_added = []
@ -562,16 +563,14 @@ class RecentlyAdded(Newsletter):
seasons = [] seasons = []
for k, v in groupby(filtered_children, key=lambda x: x['parent_media_index']): for k, v in groupby(filtered_children, key=lambda x: x['parent_media_index']):
episodes = list(v) episodes = list(v)
num, num00 = notification_handler.format_group_index( num, num00 = format_group_index([helpers.cast_to_int(d['media_index']) for d in episodes])
[helpers.cast_to_int(d['media_index']) for d in episodes])
seasons.append({'media_index': k, seasons.append({'media_index': k,
'episode_range': num00, 'episode_range': num00,
'episode_count': len(episodes), 'episode_count': len(episodes),
'episode': episodes}) 'episode': episodes})
num, num00 = notification_handler.format_group_index( num, num00 = format_group_index([helpers.cast_to_int(d['media_index']) for d in seasons])
[helpers.cast_to_int(d['media_index']) for d in seasons])
show_metadata['season_range'] = num00 show_metadata['season_range'] = num00
show_metadata['season_count'] = len(seasons) show_metadata['season_count'] = len(seasons)
@ -623,6 +622,8 @@ class RecentlyAdded(Newsletter):
return recently_added return recently_added
def retrieve_data(self): def retrieve_data(self):
from notification_handler import get_poster_info
if not self.config['incl_libraries']: if not self.config['incl_libraries']:
logger.warn(u"Tautulli Newsletters :: Failed to retrieve %s newsletter data: no libraries selected." % self.NAME) logger.warn(u"Tautulli Newsletters :: Failed to retrieve %s newsletter data: no libraries selected." % self.NAME)

View file

@ -39,6 +39,7 @@ import plextv
import pmsconnect import pmsconnect
import request import request
import users import users
from newsletter_handler import notify as notify_newsletter
def process_queue(): def process_queue():
@ -50,7 +51,9 @@ def process_queue():
break break
elif params: elif params:
try: try:
if 'notify' in params: if 'newsletter' in params:
notify_newsletter(**params)
elif 'notification' in params:
notify(**params) notify(**params)
else: else:
add_notifier_each(**params) 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 # Check custom user conditions
if manual_trigger or notify_custom_conditions(notifier_id=notifier['id'], parameters=parameters): if manual_trigger or notify_custom_conditions(notifier_id=notifier['id'], parameters=parameters):
# Add each notifier to the queue # Add each notifier to the queue
data = {'notify': True, data = {'notification': True,
'notifier_id': notifier['id'], 'notifier_id': notifier['id'],
'notify_action': notify_action, 'notify_action': notify_action,
'stream_data': stream_data, 'stream_data': stream_data,

View file

@ -5559,6 +5559,7 @@ class WebInterface(object):
return {'result': 'error', 'message': 'Failed to save newsletter.'} return {'result': 'error', 'message': 'Failed to save newsletter.'}
@cherrypy.expose @cherrypy.expose
@cherrypy.tools.json_out()
@requireAuth(member_of("admin")) @requireAuth(member_of("admin"))
@addtoapi("notify_newsletter") @addtoapi("notify_newsletter")
def send_newsletter(self, newsletter_id=None, subject='', body='', notify_action='', **kwargs): def send_newsletter(self, newsletter_id=None, subject='', body='', notify_action='', **kwargs):
@ -5584,20 +5585,18 @@ class WebInterface(object):
if newsletter: if newsletter:
logger.debug(u"Sending %s%s newsletter." % (test, newsletter['agent_label'])) logger.debug(u"Sending %s%s newsletter." % (test, newsletter['agent_label']))
if newsletter_handler.notify(newsletter_id=newsletter_id, newsletter_handler.add_newsletter_each(newsletter_id=newsletter_id,
notify_action=notify_action, notify_action=notify_action,
subject=subject, subject=subject,
body=body, body=body,
**kwargs): **kwargs)
return "Newsletter sent." return {'result': 'success', 'message': 'Newsletter queued.'}
else:
return "Newsletter failed."
else: else:
logger.debug(u"Unable to send %snewsletter, invalid newsletter_id %s." % (test, newsletter_id)) 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: else:
logger.debug(u"Unable to send %snotification, no newsletter_id received." % test) 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 @cherrypy.expose
def newsletter(self, *args, **kwargs): def newsletter(self, *args, **kwargs):