From 0f392017747c3ef3b93c18d6ea8fe6815f2f50aa Mon Sep 17 00:00:00 2001 From: JonnyWong16 Date: Sat, 6 Jan 2018 22:27:49 -0800 Subject: [PATCH] Initial newsletter support --- data/interfaces/default/css/tautulli.css | 35 +- .../images/logo-tautulli-newsletter.png | Bin 0 -> 30989 bytes data/interfaces/default/js/jquery-cron-min.js | 1 + .../interfaces/default/newsletter_config.html | 306 ++++++ .../interfaces/default/newsletters_table.html | 42 + data/interfaces/default/notifier_config.html | 10 +- data/interfaces/default/settings.html | 97 +- .../newsletters/recently_added.html | 978 ++++++++++++++++++ plexpy/__init__.py | 8 + plexpy/helpers.py | 10 +- plexpy/newsletters.py | 537 ++++++++++ plexpy/notification_handler.py | 6 +- plexpy/notifiers.py | 38 +- plexpy/pmsconnect.py | 273 +++-- plexpy/webserve.py | 236 +++++ 15 files changed, 2454 insertions(+), 123 deletions(-) create mode 100644 data/interfaces/default/images/logo-tautulli-newsletter.png create mode 100644 data/interfaces/default/js/jquery-cron-min.js create mode 100644 data/interfaces/default/newsletter_config.html create mode 100644 data/interfaces/default/newsletters_table.html create mode 100644 data/interfaces/newsletters/recently_added.html create mode 100644 plexpy/newsletters.py diff --git a/data/interfaces/default/css/tautulli.css b/data/interfaces/default/css/tautulli.css index 78fa8014..fbfc9bff 100644 --- a/data/interfaces/default/css/tautulli.css +++ b/data/interfaces/default/css/tautulli.css @@ -2973,6 +2973,9 @@ a .home-platforms-list-cover-face:hover .stacked-configs > li.new-notification-agent, .stacked-configs > li.notification-agent, .stacked-configs > li.add-notification-agent, +.stacked-configs > li.new-newsletter-agent, +.stacked-configs > li.newsletter-agent, +.stacked-configs > li.add-newsletter-agent, .stacked-configs > li.mobile-device, .stacked-configs > li.add-mobile-device { cursor: pointer; @@ -3657,38 +3660,58 @@ a:hover .overlay-refresh-image:hover { } #plexpy-notifiers-table .friendly_name, #notifier-config-modal span.notifier_id, +#plexpy-newsletters-table .friendly_name, +#newsletter-config-modal span.newsletter_id, #plexpy-mobile-devices-table .friendly_name, #mobile-device-config-modal span.notifier_id { color: #777; } -#notifier-config-modal .nav-tabs { +#notifier-config-modal .nav-tabs, +#newsletter-config-modal .nav-tabs { margin-bottom: 10px; padding-left: 15px; border-bottom: 1px solid #444; } -#notifier-config-modal .nav-tabs > li { +#notifier-config-modal .nav-tabs > li, +#newsletter-config-modal .nav-tabs > li { margin: 0 0 -1px 0; } -#notifier-config-modal .nav-tabs > li > a { +#notifier-config-modal .nav-tabs > li > a, +#newsletter-config-modal .nav-tabs > li > a { padding: 5px 10px; color: #737373; } -#notifier-config-modal .nav-tabs > li > a:hover { +#notifier-config-modal .nav-tabs > li > a:hover, +#newsletter-config-modal .nav-tabs > li > a:hover { border-color: #444; background: #222; } #notifier-config-modal .nav-tabs > li.active > a, #notifier-config-modal .nav-tabs > li.active > a:hover, -#notifier-config-modal .nav-tabs > li.active > a:focus { +#notifier-config-modal .nav-tabs > li.active > a:focus, +#newsletter-config-modal .nav-tabs > li.active > a, +#newsletter-config-modal .nav-tabs > li.active > a:hover, +#newsletter-config-modal .nav-tabs > li.active > a:focus { color: #fff; background: #222; } #notifier-config-modal .nav-tabs > li.active > a, #notifier-config-modal .nav-tabs > li.active > a:hover, -#notifier-config-modal .nav-tabs > li.active > a:focus { +#notifier-config-modal .nav-tabs > li.active > a:focus, +#newsletter-config-modal .nav-tabs > li.active > a, +#newsletter-config-modal .nav-tabs > li.active > a:hover, +#newsletter-config-modal .nav-tabs > li.active > a:focus { border: 1px solid #444; border-bottom-color: transparent; } +#newsletter-config-modal #cron-widget select.cron-select { + width: initial; + display: inline; +} +#newsletter-config-modal #cron-widget select.cron-select[name=cron-period] option[value=minute], +#newsletter-config-modal #cron-widget select.cron-select[name=cron-period] option[value=hour] { + display: none; +} .git-group input.form-control { width: 50%; } diff --git a/data/interfaces/default/images/logo-tautulli-newsletter.png b/data/interfaces/default/images/logo-tautulli-newsletter.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ec4923b6709e9231d491b570649bc4361a9d19 GIT binary patch literal 30989 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 biHDIZF>;Fcndv|84pER*m8p<6egFReD8Z+J literal 0 HcmV?d00001 diff --git a/data/interfaces/default/js/jquery-cron-min.js b/data/interfaces/default/js/jquery-cron-min.js new file mode 100644 index 00000000..87aa765a --- /dev/null +++ b/data/interfaces/default/js/jquery-cron-min.js @@ -0,0 +1 @@ +!function(e){function t(e){return"undefined"==typeof e?!1:!0}function n(e){return!t(e)||"object"==typeof e}function s(n,s){if(t(s.customValues))for(key in s.customValues)if(n==s.customValues[key])return key;var a=/^((\d{1,2}|\*)\s){4}(\d{1,2}|\*)$/;if("string"!=typeof n||!a.test(n))return void e.error("cron: invalid initial value");for(var i=n.split(" "),r=[0,0,1,1,0],l=[59,23,31,12,6],c=0;c=r[c]))return void e.error("cron: invalid value found (col "+(c+1)+") in "+o.initial)}for(var u in k)if(k[u].test(n))return u;return void e.error("cron: valid but unsupported cron format. sorry.")}function a(o,a){if(!t(s(a.initial,a)))return!0;if(!n(a.customValues))return!0;if(t(a.customValues))for(key in a.customValues)if(k.hasOwnProperty(key))return e.error("cron: reserved keyword '"+key+"' should not be used as customValues key."),!0;return!1}function i(e){var t=e.data("block"),o=hour=day=month=dow="*",n=t.period.find("select").val();switch(n){case"minute":break;case"hour":o=t.mins.find("select").val();break;case"day":o=t.time.find("select.cron-time-min").val(),hour=t.time.find("select.cron-time-hour").val();break;case"week":o=t.time.find("select.cron-time-min").val(),hour=t.time.find("select.cron-time-hour").val(),dow=t.dow.find("select").val();break;case"month":o=t.time.find("select.cron-time-min").val(),hour=t.time.find("select.cron-time-hour").val(),day=t.dom.find("select").val();break;case"year":o=t.time.find("select.cron-time-min").val(),hour=t.time.find("select.cron-time-hour").val(),day=t.dom.find("select").val(),month=t.month.find("select").val();break;default:return n}return[o,hour,day,month,dow].join(" ")}for(var r={initial:"* * * * *",minuteOpts:{minWidth:100,itemWidth:30,columns:4,rows:void 0,title:"Minutes Past the Hour"},timeHourOpts:{minWidth:100,itemWidth:20,columns:2,rows:void 0,title:"Time: Hour"},domOpts:{minWidth:100,itemWidth:30,columns:void 0,rows:10,title:"Day of Month"},monthOpts:{minWidth:100,itemWidth:100,columns:2,rows:void 0,title:void 0},dowOpts:{minWidth:100,itemWidth:void 0,columns:void 0,rows:void 0,title:void 0},timeMinuteOpts:{minWidth:100,itemWidth:20,columns:4,rows:void 0,title:"Time: Minute"},effectOpts:{openSpeed:400,closeSpeed:400,openEffect:"slide",closeEffect:"slide",hideOnMouseOut:!0},url_set:void 0,customValues:void 0,onChange:void 0,useGentleSelect:!1},l="",c=0;60>c;c++){var d=10>c?"0":"";l+="\n"}for(var u="",c=0;24>c;c++){var d=10>c?"0":"";u+="\n"}for(var m="",c=1;32>c;c++){if(1==c||21==c||31==c)var h="st";else if(2==c||22==c)var h="nd";else if(3==c||23==c)var h="rd";else var h="th";m+="\n"}for(var p="",v=["January","February","March","April","May","June","July","August","September","October","November","December"],c=0;c"+v[c]+"\n";for(var f="",y=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],c=0;c"+y[c]+"\n";for(var g="",b=["minute","hour","day","week","month","year"],c=0;c"+b[c]+"\n";var O={minute:[],hour:["mins"],day:["time"],week:["dow","time"],month:["dom","time"],year:["dom","month","time"]},k={minute:/^(\*\s){4}\*$/,hour:/^\d{1,2}\s(\*\s){3}\*$/,day:/^(\d{1,2}\s){2}(\*\s){2}\*$/,week:/^(\d{1,2}\s){2}(\*\s){2}\d{1,2}$/,month:/^(\d{1,2}\s){3}\*\s\*$/,year:/^(\d{1,2}\s){4}\*$/},w={init:function(o){var n=o?o:{},s=e.extend([],r,n),i=e.extend({},r.effectOpts,n.effectOpts);if(e.extend(s,{minuteOpts:e.extend({},r.minuteOpts,i,n.minuteOpts),domOpts:e.extend({},r.domOpts,i,n.domOpts),monthOpts:e.extend({},r.monthOpts,i,n.monthOpts),dowOpts:e.extend({},r.dowOpts,i,n.dowOpts),timeHourOpts:e.extend({},r.timeHourOpts,i,n.timeHourOpts),timeMinuteOpts:e.extend({},r.timeMinuteOpts,i,n.timeMinuteOpts)}),a(this,s))return this;var c=[],d="",h=s.customValues;if(t(h))for(var v in h)d+="\n";c.period=e("Every ").appendTo(this).data("root",this);var y=c.period.find("select");return y.bind("change.cron",S.periodChanged).data("root",this),s.useGentleSelect&&y.gentleSelect(i),c.dom=e(" on the ").appendTo(this).data("root",this),y=c.dom.find("select").data("root",this),s.useGentleSelect&&y.gentleSelect(s.domOpts),c.month=e(" of ").appendTo(this).data("root",this),y=c.month.find("select").data("root",this),s.useGentleSelect&&y.gentleSelect(s.monthOpts),c.mins=e(" at minutes past the hour ").appendTo(this).data("root",this),y=c.mins.find("select").data("root",this),s.useGentleSelect&&y.gentleSelect(s.minuteOpts),c.dow=e(" on ").appendTo(this).data("root",this),y=c.dow.find("select").data("root",this),s.useGentleSelect&&y.gentleSelect(s.dowOpts),c.time=e(" at : Enable the newsletter + + + +
+ +
+
+
+ +
+
+

Set the schedule for the newsletter

+
+ +
+ + + % for item in newsletter['config_options']: + % if item['input_type'] == 'help': +
+ +

${item['description'] | n}

+
+ % elif item['input_type'] == 'text' or item['input_type'] == 'password': +
+ +
+
+ +
+
+

${item['description'] | n}

+
+ % elif item['input_type'] == 'number': +
+ +
+
+ +
+
+

${item['description'] | n}

+
+ % elif item['input_type'] == 'button': +
+ +
+
+ +
+
+

${item['description'] | n}

+
+ % elif item['input_type'] == 'checkbox': +
+ +

${item['description'] | n}

+ +
+ % elif item['input_type'] == 'select': +
+ +
+
+ +
+
+

${item['description'] | n}

+
+ % endif + % endfor +
+
+
+ +
+
+ +
+
+

Optional: Enter a description to help identify this newsletter in the newsletters list.

+
+
+ + +
+ +

+ Preview the ${newsletter['agent_label']} newsletter. +

+
+
+
+ +
+
+
+ +

+ Test if the ${newsletter['agent_label']} newsletter is working. Check the logs for troubleshooting. +

+
+
+
+ +
+
+
+
+ + + + + + + + + + +% else: + +% endif diff --git a/data/interfaces/default/newsletters_table.html b/data/interfaces/default/newsletters_table.html new file mode 100644 index 00000000..0ef4883f --- /dev/null +++ b/data/interfaces/default/newsletters_table.html @@ -0,0 +1,42 @@ +<%doc> +USAGE DOCUMENTATION :: PLEASE LEAVE THIS AT THE TOP OF THIS FILE + +For Mako templating syntax documentation please visit: http://docs.makotemplates.org/en/latest/ + +Filename: newsletters_table.html +Version: 0.1 + +DOCUMENTATION :: END + + +
    + % for newsletter in sorted(newsletters_list, key=lambda k: (k['agent_label'], k['friendly_name'], k['id'])): + + % endfor +
  • + + Add a new newsletter agent + + +
  • +
+ + \ No newline at end of file diff --git a/data/interfaces/default/notifier_config.html b/data/interfaces/default/notifier_config.html index a70fc5d4..955e97af 100644 --- a/data/interfaces/default/notifier_config.html +++ b/data/interfaces/default/notifier_config.html @@ -7,8 +7,6 @@ sorted(user_emails, key=lambda u: u['user']) %> % if notifier: - -