mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-12 08:16:06 -07:00
Add body text to newsletters
This commit is contained in:
parent
6f6fb485fe
commit
7e11af1fd0
8 changed files with 170 additions and 76 deletions
|
@ -48,7 +48,7 @@ newsletter_log_table_options = {
|
||||||
$(td).html(cellData);
|
$(td).html(cellData);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"width": "10%",
|
"width": "5%",
|
||||||
"className": "no-wrap"
|
"className": "no-wrap"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -67,43 +67,53 @@ newsletter_log_table_options = {
|
||||||
"data": "subject_text",
|
"data": "subject_text",
|
||||||
"createdCell": function (td, cellData, rowData, row, col) {
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
if (cellData !== '') {
|
if (cellData !== '') {
|
||||||
$(td).html('<a href="newsletter/' + rowData['uuid'] + '" target="_blank">' + cellData + '</a>');
|
$(td).html(cellData);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"width": "38%"
|
"width": "25%"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"targets": [5],
|
"targets": [5],
|
||||||
|
"data": "body_text",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html(cellData);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "33%"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [6],
|
||||||
"data": "start_date",
|
"data": "start_date",
|
||||||
"createdCell": function (td, cellData, rowData, row, col) {
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
if (cellData !== '') {
|
if (cellData !== '') {
|
||||||
$(td).html(cellData);
|
$(td).html(cellData);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"width": "10%"
|
"width": "5%"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"targets": [6],
|
"targets": [7],
|
||||||
"data": "end_date",
|
"data": "end_date",
|
||||||
"createdCell": function (td, cellData, rowData, row, col) {
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
if (cellData !== '') {
|
if (cellData !== '') {
|
||||||
$(td).html(cellData);
|
$(td).html(cellData);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"width": "10%"
|
"width": "5%"
|
||||||
},
|
|
||||||
{
|
|
||||||
"targets": [7],
|
|
||||||
"data": "uuid",
|
|
||||||
"createdCell": function (td, cellData, rowData, row, col) {
|
|
||||||
if (cellData !== '') {
|
|
||||||
$(td).html(cellData);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"width": "10%"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"targets": [8],
|
"targets": [8],
|
||||||
|
"data": "uuid",
|
||||||
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
|
if (cellData !== '') {
|
||||||
|
$(td).html('<a href="newsletter/' + rowData['uuid'] + '" target="_blank">' + cellData + '</a>');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "5%"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"targets": [9],
|
||||||
"data": "success",
|
"data": "success",
|
||||||
"createdCell": function (td, cellData, rowData, row, col) {
|
"createdCell": function (td, cellData, rowData, row, col) {
|
||||||
if (cellData === 1) {
|
if (cellData === 1) {
|
||||||
|
|
|
@ -152,6 +152,7 @@
|
||||||
<th align="left" id="newsletter_agent_name">Agent</th>
|
<th align="left" id="newsletter_agent_name">Agent</th>
|
||||||
<th align="left" id="newsletter_notify_action">Action</th>
|
<th align="left" id="newsletter_notify_action">Action</th>
|
||||||
<th align="left" id="newsletter_subject_text">Subject Text</th>
|
<th align="left" id="newsletter_subject_text">Subject Text</th>
|
||||||
|
<th align="left" id="newsletter_body_text">Body Text</th>
|
||||||
<th align="left" id="newsletter_start_date">Start Date</th>
|
<th align="left" id="newsletter_start_date">Start Date</th>
|
||||||
<th align="left" id="newsletter_end_date">End Date</th>
|
<th align="left" id="newsletter_end_date">End Date</th>
|
||||||
<th align="left" id="newsletter_uuid">UUID</th>
|
<th align="left" id="newsletter_uuid">UUID</th>
|
||||||
|
|
|
@ -176,10 +176,10 @@
|
||||||
<p class="help-block">Use an existing Email notification agent or enter a new configuration below.</p>
|
<p class="help-block">Use an existing Email notification agent or enter a new configuration below.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="email_subject">Email Subject</label>
|
<label for="subject">Subject</label>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<input type="text" class="form-control" id="email_subject" name="email_subject" value="${newsletter['email_config']['subject']}" size="30">
|
<input type="text" class="form-control" id="subject" name="subject" value="${newsletter['subject']}" size="30">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p class="help-block">
|
<p class="help-block">
|
||||||
|
@ -188,6 +188,19 @@
|
||||||
Note: You may include <span class="inline-pre">{server_name}</span>, <span class="inline-pre">{start_date}</span>, and <span class="inline-pre">{end_date}</span> as parameters. The global date format under Settings > General will be used.
|
Note: You may include <span class="inline-pre">{server_name}</span>, <span class="inline-pre">{start_date}</span>, and <span class="inline-pre">{end_date}</span> as parameters. The global date format under Settings > General will be used.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="body">Body</label>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<input type="text" class="form-control" id="body" name="body" value="${newsletter['body']}" size="30">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p class="help-block">
|
||||||
|
Optional: Enter a body line for the email. Leave blank for default.
|
||||||
|
<br>
|
||||||
|
Note: You may include <span class="inline-pre">{server_name}</span>, <span class="inline-pre">{start_date}</span>, and <span class="inline-pre">{end_date}</span> as parameters. The global date format under Settings > General will be used.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="newsletter-email-config" class="col-md-12" style="padding-top: 10px; border-top: 1px solid #444; ${'display: none;' if newsletter['email_config']['notifier'] else ''}">
|
<div id="newsletter-email-config" class="col-md-12" style="padding-top: 10px; border-top: 1px solid #444; ${'display: none;' if newsletter['email_config']['notifier'] else ''}">
|
||||||
% for item in newsletter['email_config_options']:
|
% for item in newsletter['email_config_options']:
|
||||||
|
|
|
@ -638,14 +638,15 @@ def dbcheck():
|
||||||
'CREATE TABLE IF NOT EXISTS newsletters (id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
'CREATE TABLE IF NOT EXISTS newsletters (id INTEGER PRIMARY KEY AUTOINCREMENT, '
|
||||||
'agent_id INTEGER, agent_name TEXT, agent_label TEXT, '
|
'agent_id INTEGER, agent_name TEXT, agent_label TEXT, '
|
||||||
'friendly_name TEXT, newsletter_config TEXT, email_config TEXT, '
|
'friendly_name TEXT, newsletter_config TEXT, email_config TEXT, '
|
||||||
'cron TEXT NOT NULL DEFAULT "0 0 * * 0", active INTEGER DEFAULT 0)'
|
'subject TEXT, body TEXT, cron TEXT NOT NULL DEFAULT "0 0 * * 0", active INTEGER DEFAULT 0)'
|
||||||
)
|
)
|
||||||
|
|
||||||
# newsletter_log table :: This is a table which logs newsletters sent
|
# newsletter_log table :: This is a table which logs newsletters sent
|
||||||
c_db.execute(
|
c_db.execute(
|
||||||
'CREATE TABLE IF NOT EXISTS newsletter_log (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, '
|
'CREATE TABLE IF NOT EXISTS newsletter_log (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, '
|
||||||
'newsletter_id INTEGER, agent_id INTEGER, agent_name TEXT, notify_action TEXT, '
|
'newsletter_id INTEGER, agent_id INTEGER, agent_name TEXT, notify_action TEXT, '
|
||||||
'subject_text TEXT, start_date TEXT, end_date TEXT, uuid TEXT UNIQUE, success INTEGER DEFAULT 0)'
|
'subject_text TEXT, body_text TEXT, start_date TEXT, end_date TEXT, '
|
||||||
|
'uuid TEXT UNIQUE, success INTEGER DEFAULT 0)'
|
||||||
)
|
)
|
||||||
|
|
||||||
# poster_urls table :: This table keeps record of the notification poster urls
|
# poster_urls table :: This table keeps record of the notification poster urls
|
||||||
|
|
|
@ -1573,6 +1573,7 @@ class DataFactory(object):
|
||||||
'newsletter_log.agent_name',
|
'newsletter_log.agent_name',
|
||||||
'newsletter_log.notify_action',
|
'newsletter_log.notify_action',
|
||||||
'newsletter_log.subject_text',
|
'newsletter_log.subject_text',
|
||||||
|
'newsletter_log.body_text',
|
||||||
'newsletter_log.start_date',
|
'newsletter_log.start_date',
|
||||||
'newsletter_log.end_date',
|
'newsletter_log.end_date',
|
||||||
'newsletter_log.uuid',
|
'newsletter_log.uuid',
|
||||||
|
@ -1606,6 +1607,7 @@ class DataFactory(object):
|
||||||
'agent_name': item['agent_name'],
|
'agent_name': item['agent_name'],
|
||||||
'notify_action': item['notify_action'],
|
'notify_action': item['notify_action'],
|
||||||
'subject_text': item['subject_text'],
|
'subject_text': item['subject_text'],
|
||||||
|
'body_text': item['body_text'],
|
||||||
'start_date': item['start_date'],
|
'start_date': item['start_date'],
|
||||||
'end_date': item['end_date'],
|
'end_date': item['end_date'],
|
||||||
'uuid': item['uuid'],
|
'uuid': item['uuid'],
|
||||||
|
|
|
@ -65,19 +65,24 @@ def notify(newsletter_id=None, notify_action=None, **kwargs):
|
||||||
if not newsletter_config:
|
if not newsletter_config:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if notify_action in ('test', 'api'):
|
||||||
|
subject = kwargs.pop('subject', newsletter_config['subject'])
|
||||||
|
body = kwargs.pop('body', newsletter_config['subject'])
|
||||||
|
else:
|
||||||
|
subject = newsletter_config['subject']
|
||||||
|
body = newsletter_config['body']
|
||||||
|
|
||||||
newsletter_agent = newsletters.get_agent_class(agent_id=newsletter_config['agent_id'],
|
newsletter_agent = newsletters.get_agent_class(agent_id=newsletter_config['agent_id'],
|
||||||
config=newsletter_config['config'],
|
config=newsletter_config['config'],
|
||||||
email_config=newsletter_config['email_config'])
|
email_config=newsletter_config['email_config'],
|
||||||
|
subject=subject,
|
||||||
if notify_action in ('test', 'api'):
|
body=body)
|
||||||
subject_string = kwargs.pop('subject', None)
|
|
||||||
if subject_string:
|
|
||||||
newsletter_agent.subject = newsletter_agent.format_subject(subject_string)
|
|
||||||
|
|
||||||
# Set the newsletter state in the db
|
# Set the newsletter state in the db
|
||||||
newsletter_log_id = set_notify_state(newsletter=newsletter_config,
|
newsletter_log_id = set_notify_state(newsletter=newsletter_config,
|
||||||
notify_action=notify_action,
|
notify_action=notify_action,
|
||||||
subject=newsletter_agent.subject,
|
subject=newsletter_agent.subject_formatted,
|
||||||
|
body=newsletter_agent.body_formatted,
|
||||||
start_date=newsletter_agent.start_date.format('YYYY-MM-DD'),
|
start_date=newsletter_agent.start_date.format('YYYY-MM-DD'),
|
||||||
end_date=newsletter_agent.end_date.format('YYYY-MM-DD'),
|
end_date=newsletter_agent.end_date.format('YYYY-MM-DD'),
|
||||||
newsletter_uuid=newsletter_agent.uuid)
|
newsletter_uuid=newsletter_agent.uuid)
|
||||||
|
@ -90,7 +95,7 @@ def notify(newsletter_id=None, notify_action=None, **kwargs):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def set_notify_state(newsletter, notify_action, subject, start_date, end_date, newsletter_uuid):
|
def set_notify_state(newsletter, notify_action, subject, body, start_date, end_date, newsletter_uuid):
|
||||||
|
|
||||||
if newsletter and notify_action:
|
if newsletter and notify_action:
|
||||||
db = database.MonitorDatabase()
|
db = database.MonitorDatabase()
|
||||||
|
@ -103,6 +108,7 @@ def set_notify_state(newsletter, notify_action, subject, start_date, end_date, n
|
||||||
'agent_name': newsletter['agent_name'],
|
'agent_name': newsletter['agent_name'],
|
||||||
'notify_action': notify_action,
|
'notify_action': notify_action,
|
||||||
'subject_text': subject,
|
'subject_text': subject,
|
||||||
|
'body_text': body,
|
||||||
'start_date': start_date,
|
'start_date': start_date,
|
||||||
'end_date': end_date}
|
'end_date': end_date}
|
||||||
|
|
||||||
|
@ -149,3 +155,4 @@ def get_newsletter(newsletter_uuid):
|
||||||
return "Newsletter no longer exists"
|
return "Newsletter no longer exists"
|
||||||
else:
|
else:
|
||||||
return "Newsletter does not exist"
|
return "Newsletter does not exist"
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ import logger
|
||||||
import newsletter_handler
|
import newsletter_handler
|
||||||
import notification_handler
|
import notification_handler
|
||||||
import pmsconnect
|
import pmsconnect
|
||||||
from notification_handler import get_poster_info
|
from notification_handler import get_poster_info, CustomFormatter
|
||||||
from notifiers import send_notification, EMAIL
|
from notifiers import send_notification, EMAIL
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ def available_notification_actions():
|
||||||
'name': 'on_cron',
|
'name': 'on_cron',
|
||||||
'description': 'Trigger a notification on a certain schedule.',
|
'description': 'Trigger a notification on a certain schedule.',
|
||||||
'subject': 'Tautulli Newsletter',
|
'subject': 'Tautulli Newsletter',
|
||||||
|
'body': 'Tautulli Newsletter',
|
||||||
'icon': 'fa-calendar',
|
'icon': 'fa-calendar',
|
||||||
'media_types': ('newsletter',)
|
'media_types': ('newsletter',)
|
||||||
}
|
}
|
||||||
|
@ -63,14 +64,17 @@ def available_notification_actions():
|
||||||
return actions
|
return actions
|
||||||
|
|
||||||
|
|
||||||
def get_agent_class(agent_id=None, config=None, email_config=None, start_date=None, end_date=None):
|
def get_agent_class(agent_id=None, config=None, email_config=None, start_date=None, end_date=None,
|
||||||
|
subject=None, body=None):
|
||||||
if str(agent_id).isdigit():
|
if str(agent_id).isdigit():
|
||||||
agent_id = int(agent_id)
|
agent_id = int(agent_id)
|
||||||
|
|
||||||
kwargs = {'config': config,
|
kwargs = {'config': config,
|
||||||
'email_config': email_config,
|
'email_config': email_config,
|
||||||
'start_date': start_date,
|
'start_date': start_date,
|
||||||
'end_date': end_date}
|
'end_date': end_date,
|
||||||
|
'subject': subject,
|
||||||
|
'body': body}
|
||||||
|
|
||||||
if agent_id == 0:
|
if agent_id == 0:
|
||||||
return RecentlyAdded(**kwargs)
|
return RecentlyAdded(**kwargs)
|
||||||
|
@ -131,13 +135,18 @@ def get_newsletter_config(newsletter_id=None):
|
||||||
try:
|
try:
|
||||||
config = json.loads(result.pop('newsletter_config', '{}'))
|
config = json.loads(result.pop('newsletter_config', '{}'))
|
||||||
email_config = json.loads(result.pop('email_config', '{}'))
|
email_config = json.loads(result.pop('email_config', '{}'))
|
||||||
newsletter_agent = get_agent_class(agent_id=result['agent_id'], config=config, email_config=email_config)
|
subject = result.pop('subject')
|
||||||
|
body = result.pop('body')
|
||||||
|
newsletter_agent = get_agent_class(agent_id=result['agent_id'], config=config, email_config=email_config,
|
||||||
|
subject=subject, body=body)
|
||||||
newsletter_config = newsletter_agent.return_config_options()
|
newsletter_config = newsletter_agent.return_config_options()
|
||||||
newsletter_email_config = newsletter_agent.return_email_config_options()
|
newsletter_email_config = newsletter_agent.return_email_config_options()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(u"Tautulli Newsletters :: Failed to get newsletter config options: %s." % e)
|
logger.error(u"Tautulli Newsletters :: Failed to get newsletter config options: %s." % e)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
result['subject'] = newsletter_agent.subject
|
||||||
|
result['body'] = newsletter_agent.body
|
||||||
result['config'] = config
|
result['config'] = config
|
||||||
result['email_config'] = email_config
|
result['email_config'] = email_config
|
||||||
result['config_options'] = newsletter_config
|
result['config_options'] = newsletter_config
|
||||||
|
@ -169,7 +178,9 @@ def add_newsletter_config(agent_id=None, **kwargs):
|
||||||
'agent_label': agent['label'],
|
'agent_label': agent['label'],
|
||||||
'friendly_name': '',
|
'friendly_name': '',
|
||||||
'newsletter_config': json.dumps(agent_class.config),
|
'newsletter_config': json.dumps(agent_class.config),
|
||||||
'email_config': json.dumps(agent_class.email_config)
|
'email_config': json.dumps(agent_class.email_config),
|
||||||
|
'subject': agent_class.subject,
|
||||||
|
'body': agent_class.body
|
||||||
}
|
}
|
||||||
|
|
||||||
db = database.MonitorDatabase()
|
db = database.MonitorDatabase()
|
||||||
|
@ -207,7 +218,11 @@ def set_newsletter_config(newsletter_id=None, agent_id=None, **kwargs):
|
||||||
email_config = {k[len(email_config_prefix):]: kwargs.pop(k)
|
email_config = {k[len(email_config_prefix):]: kwargs.pop(k)
|
||||||
for k in kwargs.keys() if k.startswith(email_config_prefix)}
|
for k in kwargs.keys() if k.startswith(email_config_prefix)}
|
||||||
|
|
||||||
agent_class = get_agent_class(agent_id=agent['id'], config=newsletter_config, email_config=email_config)
|
subject = kwargs.pop('subject')
|
||||||
|
body = kwargs.pop('body')
|
||||||
|
|
||||||
|
agent_class = get_agent_class(agent_id=agent['id'], config=newsletter_config, email_config=email_config,
|
||||||
|
subject=subject, body=body)
|
||||||
|
|
||||||
keys = {'id': newsletter_id}
|
keys = {'id': newsletter_id}
|
||||||
values = {'agent_id': agent['id'],
|
values = {'agent_id': agent['id'],
|
||||||
|
@ -216,6 +231,8 @@ def set_newsletter_config(newsletter_id=None, agent_id=None, **kwargs):
|
||||||
'friendly_name': kwargs.get('friendly_name', ''),
|
'friendly_name': kwargs.get('friendly_name', ''),
|
||||||
'newsletter_config': json.dumps(agent_class.config),
|
'newsletter_config': json.dumps(agent_class.config),
|
||||||
'email_config': json.dumps(agent_class.email_config),
|
'email_config': json.dumps(agent_class.email_config),
|
||||||
|
'subject': agent_class.subject,
|
||||||
|
'body': agent_class.body,
|
||||||
'cron': kwargs.get('cron'),
|
'cron': kwargs.get('cron'),
|
||||||
'active': kwargs.get('active')
|
'active': kwargs.get('active')
|
||||||
}
|
}
|
||||||
|
@ -232,16 +249,15 @@ def set_newsletter_config(newsletter_id=None, agent_id=None, **kwargs):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def send_newsletter(newsletter_id=None, subject=None, notify_action='', newsletter_log_id=None, **kwargs):
|
def send_newsletter(newsletter_id=None, subject=None, body=None, newsletter_log_id=None, **kwargs):
|
||||||
newsletter_config = get_newsletter_config(newsletter_id=newsletter_id)
|
newsletter_config = get_newsletter_config(newsletter_id=newsletter_id)
|
||||||
if newsletter_config:
|
if newsletter_config:
|
||||||
agent = get_agent_class(agent_id=newsletter_config['agent_id'],
|
agent = get_agent_class(agent_id=newsletter_config['agent_id'],
|
||||||
config=newsletter_config['config'],
|
config=newsletter_config['config'],
|
||||||
email_config=newsletter_config['email_config'])
|
email_config=newsletter_config['email_config'],
|
||||||
return agent.send(subject=subject,
|
subject=subject,
|
||||||
action=notify_action.split('on_')[-1],
|
body=body)
|
||||||
newsletter_log_id=newsletter_log_id,
|
return agent.send()
|
||||||
**kwargs)
|
|
||||||
else:
|
else:
|
||||||
logger.debug(u"Tautulli Newsletters :: Notification requested but no newsletter_id received.")
|
logger.debug(u"Tautulli Newsletters :: Notification requested but no newsletter_id received.")
|
||||||
|
|
||||||
|
@ -279,15 +295,16 @@ class Newsletter(object):
|
||||||
_DEFAULT_EMAIL_CONFIG = EMAIL().return_default_config()
|
_DEFAULT_EMAIL_CONFIG = EMAIL().return_default_config()
|
||||||
_DEFAULT_EMAIL_CONFIG['from_name'] = 'Tautulli Newsletter'
|
_DEFAULT_EMAIL_CONFIG['from_name'] = 'Tautulli Newsletter'
|
||||||
_DEFAULT_EMAIL_CONFIG['notifier'] = 0
|
_DEFAULT_EMAIL_CONFIG['notifier'] = 0
|
||||||
_DEFAULT_EMAIL_CONFIG['subject'] = 'Tautulli Newsletter'
|
_DEFAULT_SUBJECT = 'Tautulli Newsletter'
|
||||||
|
_DEFAULT_BODY = 'Tautulli Newsletter'
|
||||||
_TEMPLATE_MASTER = ''
|
_TEMPLATE_MASTER = ''
|
||||||
_TEMPLATE = ''
|
_TEMPLATE = ''
|
||||||
|
|
||||||
def __init__(self, config=None, email_config=None, start_date=None, end_date=None):
|
def __init__(self, config=None, email_config=None, start_date=None, end_date=None, subject=None, body=None):
|
||||||
self.config = self.set_config(config=config, default=self._DEFAULT_CONFIG)
|
self.config = self.set_config(config=config, default=self._DEFAULT_CONFIG)
|
||||||
self.email_config = self.set_config(config=email_config, default=self._DEFAULT_EMAIL_CONFIG)
|
self.email_config = self.set_config(config=email_config, default=self._DEFAULT_EMAIL_CONFIG)
|
||||||
|
|
||||||
date_format = helpers.momentjs_to_arrow(plexpy.CONFIG.DATE_FORMAT)
|
self.uuid = generate_newsletter_uuid()
|
||||||
|
|
||||||
self.start_date = None
|
self.start_date = None
|
||||||
self.end_date = None
|
self.end_date = None
|
||||||
|
@ -313,22 +330,19 @@ class Newsletter(object):
|
||||||
self.end_time = self.end_date.timestamp
|
self.end_time = self.end_date.timestamp
|
||||||
self.start_time = self.start_date.timestamp
|
self.start_time = self.start_date.timestamp
|
||||||
|
|
||||||
self.parameters = {
|
self.parameters = self.build_params()
|
||||||
'start_date': self.start_date.format(date_format),
|
self.subject = subject or self._DEFAULT_SUBJECT
|
||||||
'end_date': self.end_date.format(date_format),
|
self.body = body or self._DEFAULT_BODY
|
||||||
'server_name': plexpy.CONFIG.PMS_NAME
|
self.subject_formatted, self.body_formatted = self.build_text()
|
||||||
}
|
|
||||||
|
|
||||||
self.subject = self.format_subject(self.email_config['subject'])
|
|
||||||
|
|
||||||
self.uuid = generate_newsletter_uuid()
|
|
||||||
|
|
||||||
self.is_preview = False
|
|
||||||
|
|
||||||
self.data = {}
|
self.data = {}
|
||||||
self.newsletter = None
|
self.newsletter = None
|
||||||
|
|
||||||
|
self.is_preview = False
|
||||||
|
|
||||||
def set_config(self, config=None, default=None):
|
def set_config(self, config=None, default=None):
|
||||||
|
self._add_config()
|
||||||
|
|
||||||
return self._validate_config(config=config, default=default)
|
return self._validate_config(config=config, default=default)
|
||||||
|
|
||||||
def _validate_config(self, config=None, default=None):
|
def _validate_config(self, config=None, default=None):
|
||||||
|
@ -344,6 +358,9 @@ class Newsletter(object):
|
||||||
|
|
||||||
return new_config
|
return new_config
|
||||||
|
|
||||||
|
def _add_config(self):
|
||||||
|
pass
|
||||||
|
|
||||||
def retrieve_data(self):
|
def retrieve_data(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -372,7 +389,7 @@ class Newsletter(object):
|
||||||
|
|
||||||
return serve_template(
|
return serve_template(
|
||||||
templatename=template,
|
templatename=template,
|
||||||
title=self.subject,
|
title=self.subject_formatted,
|
||||||
parameters=self.parameters,
|
parameters=self.parameters,
|
||||||
data=self.data,
|
data=self.data,
|
||||||
preview=self.is_preview
|
preview=self.is_preview
|
||||||
|
@ -412,32 +429,62 @@ class Newsletter(object):
|
||||||
if self.email_config['notifier']:
|
if self.email_config['notifier']:
|
||||||
return send_notification(
|
return send_notification(
|
||||||
notifier_id=self.email_config['notifier'],
|
notifier_id=self.email_config['notifier'],
|
||||||
subject=self.subject,
|
subject=self.subject_formatted,
|
||||||
body=self.newsletter
|
body=self.newsletter
|
||||||
)
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
email = EMAIL(config=self.email_config)
|
email = EMAIL(config=self.email_config)
|
||||||
return email.notify(
|
return email.notify(
|
||||||
subject=self.subject,
|
subject=self.subject_formatted,
|
||||||
body=self.newsletter
|
body=self.newsletter
|
||||||
)
|
)
|
||||||
|
|
||||||
def format_subject(self, subject=None):
|
def build_params(self):
|
||||||
subject = subject or self._DEFAULT_EMAIL_CONFIG['subject']
|
parameters = self._build_params()
|
||||||
|
|
||||||
|
return parameters
|
||||||
|
|
||||||
|
def _build_params(self):
|
||||||
|
date_format = helpers.momentjs_to_arrow(plexpy.CONFIG.DATE_FORMAT)
|
||||||
|
|
||||||
|
parameters = {
|
||||||
|
'server_name': plexpy.CONFIG.PMS_NAME,
|
||||||
|
'start_date': self.start_date.format(date_format),
|
||||||
|
'end_date': self.end_date.format(date_format),
|
||||||
|
'newsletter_days': self.config['last_days'],
|
||||||
|
'newsletter_url': 'http://localhost:8181/dev'.rstrip('/') + '/newsletter/' + self.uuid,
|
||||||
|
'newsletter_uuid': self.uuid
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameters
|
||||||
|
|
||||||
|
def build_text(self):
|
||||||
|
custom_formatter = CustomFormatter()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
subject = unicode(subject).format(**self.parameters)
|
subject = custom_formatter.format(unicode(self.subject), **self.parameters)
|
||||||
except LookupError as e:
|
except LookupError as e:
|
||||||
logger.error(
|
logger.error(
|
||||||
u"Tautulli Newsletter :: Unable to parse parameter %s in newsletter subject. Using fallback." % e)
|
u"Tautulli Newsletter :: Unable to parse parameter %s in newsletter subject. Using fallback." % e)
|
||||||
subject = unicode(self._DEFAULT_EMAIL_CONFIG['subject']).format(**self.parameters)
|
subject = unicode(self._DEFAULT_SUBJECT).format(**self.parameters)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(
|
logger.error(
|
||||||
u"Tautulli Newsletter :: Unable to parse custom newsletter subject: %s. Using fallback." % e)
|
u"Tautulli Newsletter :: Unable to parse custom newsletter subject: %s. Using fallback." % e)
|
||||||
subject = unicode(self._DEFAULT_EMAIL_CONFIG['subject']).format(**self.parameters)
|
subject = unicode(self._DEFAULT_SUBJECT).format(**self.parameters)
|
||||||
|
|
||||||
return subject
|
try:
|
||||||
|
body = custom_formatter.format(unicode(self.body), **self.parameters)
|
||||||
|
except LookupError as e:
|
||||||
|
logger.error(
|
||||||
|
u"Tautulli Newsletter :: Unable to parse parameter %s in newsletter body. Using fallback." % e)
|
||||||
|
body = unicode(self._DEFAULT_BODY).format(**self.parameters)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
u"Tautulli Newsletter :: Unable to parse custom newsletter body: %s. Using fallback." % e)
|
||||||
|
body = unicode(self._DEFAULT_BODY).format(**self.parameters)
|
||||||
|
|
||||||
|
return subject, body
|
||||||
|
|
||||||
def return_config_options(self):
|
def return_config_options(self):
|
||||||
config_options = []
|
config_options = []
|
||||||
|
@ -455,23 +502,22 @@ class RecentlyAdded(Newsletter):
|
||||||
_DEFAULT_CONFIG = {'last_days': 7,
|
_DEFAULT_CONFIG = {'last_days': 7,
|
||||||
'incl_libraries': None
|
'incl_libraries': None
|
||||||
}
|
}
|
||||||
|
_DEFAULT_SUBJECT = 'Recently Added to {server_name}! ({end_date})'
|
||||||
|
_DEFAULT_BODY = 'View the newsletter here: {newsletter_url}'
|
||||||
_TEMPLATE_MASTER = 'recently_added_master.html'
|
_TEMPLATE_MASTER = 'recently_added_master.html'
|
||||||
_TEMPLATE = 'recently_added.html'
|
_TEMPLATE = 'recently_added.html'
|
||||||
|
|
||||||
def __init__(self, config=None, email_config=None, start_date=None, end_date=None):
|
def __init__(self, config=None, email_config=None, start_date=None, end_date=None, subject=None, body=None):
|
||||||
super(RecentlyAdded, self).__init__(config=config, email_config=email_config,
|
super(RecentlyAdded, self).__init__(config=config, email_config=email_config,
|
||||||
start_date=start_date, end_date=end_date)
|
start_date=start_date, end_date=end_date,
|
||||||
|
subject=subject, body=body)
|
||||||
|
|
||||||
|
def _add_config(self):
|
||||||
if self.config['incl_libraries'] is None:
|
if self.config['incl_libraries'] is None:
|
||||||
self.config['incl_libraries'] = []
|
self.config['incl_libraries'] = []
|
||||||
elif not isinstance(self.config['incl_libraries'], list):
|
elif not isinstance(self.config['incl_libraries'], list):
|
||||||
self.config['incl_libraries'] = [self.config['incl_libraries']]
|
self.config['incl_libraries'] = [self.config['incl_libraries']]
|
||||||
|
|
||||||
self._DEFAULT_EMAIL_CONFIG['subject'] = 'Recently Added to Plex ({server_name})! ({end_date})'
|
|
||||||
|
|
||||||
self.parameters['pms_identifier'] = plexpy.CONFIG.PMS_IDENTIFIER
|
|
||||||
self.parameters['pms_web_url'] = plexpy.CONFIG.PMS_WEB_URL
|
|
||||||
|
|
||||||
def _get_recently_added(self, media_type=None):
|
def _get_recently_added(self, media_type=None):
|
||||||
pms_connect = pmsconnect.PmsConnect()
|
pms_connect = pmsconnect.PmsConnect()
|
||||||
|
|
||||||
|
@ -656,6 +702,20 @@ class RecentlyAdded(Newsletter):
|
||||||
sections[library_type] = group
|
sections[library_type] = group
|
||||||
return sections
|
return sections
|
||||||
|
|
||||||
|
def build_params(self):
|
||||||
|
parameters = self._build_params()
|
||||||
|
|
||||||
|
newsletter_libraries = []
|
||||||
|
for s in self._get_sections():
|
||||||
|
if str(s['section_id']) in self.config['incl_libraries']:
|
||||||
|
newsletter_libraries.append(s['section_name'])
|
||||||
|
|
||||||
|
parameters['newsletter_libraries'] = ', '.join(sorted(newsletter_libraries))
|
||||||
|
parameters['pms_identifier'] = plexpy.CONFIG.PMS_IDENTIFIER
|
||||||
|
parameters['pms_web_url'] = plexpy.CONFIG.PMS_WEB_URL
|
||||||
|
|
||||||
|
return parameters
|
||||||
|
|
||||||
def return_config_options(self):
|
def return_config_options(self):
|
||||||
config_option = [{'label': 'Number of Days',
|
config_option = [{'label': 'Number of Days',
|
||||||
'value': self.config['last_days'],
|
'value': self.config['last_days'],
|
||||||
|
|
|
@ -2495,6 +2495,7 @@ class WebInterface(object):
|
||||||
("agent_name", True, True),
|
("agent_name", True, True),
|
||||||
("notify_action", True, True),
|
("notify_action", True, True),
|
||||||
("subject_text", True, True),
|
("subject_text", True, True),
|
||||||
|
("body_text", True, True),
|
||||||
("start_date", True, True),
|
("start_date", True, True),
|
||||||
("end_date", True, True),
|
("end_date", True, True),
|
||||||
("uuid", True, True)]
|
("uuid", True, True)]
|
||||||
|
@ -5482,13 +5483,11 @@ class WebInterface(object):
|
||||||
"cron": "0 0 * * 1",
|
"cron": "0 0 * * 1",
|
||||||
"active": 1
|
"active": 1
|
||||||
"config": {"last_days": 7,
|
"config": {"last_days": 7,
|
||||||
"incl_movies": 1,
|
"incl_libraries": [1, 2]
|
||||||
"incl_shows": 1,
|
|
||||||
"incl_artists": 1,
|
|
||||||
},
|
},
|
||||||
|
"email_config": {...},
|
||||||
"config_options": [{...}, ...],
|
"config_options": [{...}, ...],
|
||||||
"email_config_options": [{...}, ...],
|
"email_config_options": [{...}, ...]
|
||||||
"email_notifier": 0
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
|
@ -5561,7 +5560,7 @@ class WebInterface(object):
|
||||||
@cherrypy.expose
|
@cherrypy.expose
|
||||||
@requireAuth(member_of("admin"))
|
@requireAuth(member_of("admin"))
|
||||||
@addtoapi("notify_newsletter")
|
@addtoapi("notify_newsletter")
|
||||||
def send_newsletter(self, newsletter_id=None, subject='', notify_action='', **kwargs):
|
def send_newsletter(self, newsletter_id=None, subject='', body='', notify_action='', **kwargs):
|
||||||
""" Send a newsletter using Tautulli.
|
""" Send a newsletter using Tautulli.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
@ -5587,6 +5586,7 @@ class WebInterface(object):
|
||||||
if newsletter_handler.notify(newsletter_id=newsletter_id,
|
if newsletter_handler.notify(newsletter_id=newsletter_id,
|
||||||
notify_action=notify_action,
|
notify_action=notify_action,
|
||||||
subject=subject,
|
subject=subject,
|
||||||
|
body=body,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
return "Newsletter sent."
|
return "Newsletter sent."
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue