cr-connect-workflow/crc/scripts/email.py

104 lines
4.3 KiB
Python
Raw Normal View History

2020-06-17 23:00:16 +00:00
import markdown
2020-06-17 00:42:36 +00:00
from jinja2 import Template
from crc import app
2020-06-17 00:42:36 +00:00
from crc.api.common import ApiError
from crc.scripts.script import Script
from crc.services.ldap_service import LdapService
from crc.services.mails import send_mail
class Email(Script):
"""This Script allows to be introduced as part of a workflow and called from there, specifying
recipients and content """
def get_description(self):
return """
Creates an email, using the provided arguments (a list of UIDs)"
Each argument will be used to look up personal information needed for
the email creation.
Example:
Email Subject ApprvlApprvr1 PIComputingID
"""
def do_task_validate_only(self, task, *args, **kwargs):
self.get_subject(task, args)
self.get_users_info(task, args)
self.get_content(task)
2020-06-17 00:42:36 +00:00
def do_task(self, task, *args, **kwargs):
args = [arg for arg in args if type(arg) == str]
subject = self.get_subject(task, args)
recipients = self.get_users_info(task, args)
content, content_html = self.get_content(task)
2020-06-17 00:42:36 +00:00
if recipients:
send_mail(
subject=subject,
sender=app.config['DEFAULT_SENDER'],
2020-06-17 00:42:36 +00:00
recipients=recipients,
content=content,
2020-06-17 23:00:16 +00:00
content_html=content_html
2020-06-17 00:42:36 +00:00
)
def get_users_info(self, task, args):
2020-06-17 00:42:36 +00:00
if len(args) < 1:
raise ApiError(code="missing_argument",
message="Email script requires at least one argument. The "
"name of the variable in the task data that contains user"
"id to process. Multiple arguments are accepted.")
emails = []
for arg in args:
try:
uid = task.workflow.script_engine.evaluate_expression(task, arg)
except Exception as e:
app.logger.error(f'Workflow engines could not parse {arg}')
app.logger.error(str(e))
continue
2020-06-17 00:42:36 +00:00
user_info = LdapService.user_info(uid)
email = user_info.email_address
emails.append(user_info.email_address)
if not isinstance(email, str):
raise ApiError(code="invalid_argument",
message="The Email script requires at least 1 UID argument. The "
"name of the variable in the task data that contains subject and"
" user ids to process. This must point to an array or a string, but "
"it currently points to a %s " % emails.__class__.__name__)
return emails
2020-06-17 00:42:36 +00:00
def get_subject(self, task, args):
if len(args) < 1:
raise ApiError(code="missing_argument",
message="Email script requires at least one subject argument. The "
"name of the variable in the task data that contains subject"
" to process. Multiple arguments are accepted.")
subject_index = 0
subject = args[subject_index]
if subject.startswith('"') and not subject.endswith('"'):
# Multi-word subject
subject_index += 1
next_word = args[subject_index]
while not next_word.endswith('"'):
subject = ' '.join((subject, next_word))
subject_index += 1
next_word = args[subject_index]
subject = ' '.join((subject, next_word))
subject = subject.replace('"', '')
2020-06-17 00:42:36 +00:00
if not isinstance(subject, str):
raise ApiError(code="invalid_argument",
message="The Email script requires 1 argument. The "
"the name of the variable in the task data that contains user"
"ids to process. This must point to an array or a string, but "
"it currently points to a %s " % subject.__class__.__name__)
2020-06-17 00:42:36 +00:00
return subject
2020-06-17 00:42:36 +00:00
def get_content(self, task):
2020-06-17 00:42:36 +00:00
content = task.task_spec.documentation
template = Template(content)
rendered = template.render(task.data)
2020-06-17 23:00:16 +00:00
rendered_markdown = markdown.markdown(rendered).replace('\n', '<br>')
return rendered, rendered_markdown