import textwrap
from django.contrib import messages
from django.core.mail import mail_admins
from django.urls import reverse, NoReverseMatch
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.translation import ungettext, ugettext_lazy as _
from orchestra import settings as orchestra_settings
from orchestra.admin.utils import change_url
def get_backends_help_text(backends):
help_texts = {}
for backend in backends:
help_text = backend.__doc__ or ''
context = {
'model': backend.model,
'related_models': str(backend.related_models),
'script_executable': backend.script_executable,
'script_method': '.'.join(
(backend.script_method.__module__, backend.script_method.__name__)),
'function_method': '.'.join(
(backend.function_method.__module__, backend.function_method.__name__)),
'actions': str(backend.actions),
}
help_text += textwrap.dedent("""
- Model: '%(model)s'
- Related models: %(related_models)s
- Script executable: %(script_executable)s
- Script method: %(script_method)s
- Function method: %(function_method)s
- Actions: %(actions)s
"""
) % context
help_text = help_text.lstrip().splitlines()
help_settings = ['']
if backend.doc_settings:
module, names = backend.doc_settings
for name in names:
value = getattr(module, name)
if isinstance(value, str):
help_settings.append("%s = '%s'" % (name, value))
else:
help_settings.append("%s = %s" % (name, value))
help_text += help_settings
help_texts[backend.get_name()] = '
'.join(help_text)
return help_texts
def get_instance_url(operation):
try:
url = change_url(operation.instance)
except NoReverseMatch:
alt_repr = '%s-%s' % (operation.content_type, operation.object_id)
return _("Deleted {0}").format(operation.instance_repr or alt_repr)
return orchestra_settings.ORCHESTRA_SITE_URL + url
def send_report(method, args, log):
server = args[0]
backend = method.__self__.__class__.__name__
subject = '[Orchestra] %s execution %s on %s' % (backend, log.state, server)
separator = "\n%s\n\n" % ('~ '*40,)
operations = '\n'.join(
[' '.join((op.action, get_instance_url(op))) for op in log.operations.all()]
)
log_url = reverse('admin:orchestration_backendlog_change', args=(log.pk,))
log_url = orchestra_settings.ORCHESTRA_SITE_URL + log_url
message = separator.join([
"[EXIT CODE] %s" % log.exit_code,
"[STDERR]\n%s" % log.stderr,
"[STDOUT]\n%s" % log.stdout,
"[SCRIPT]\n%s" % log.script,
"[TRACEBACK]\n%s" % log.traceback,
"[OPERATIONS]\n%s" % operations,
"[BACKEND LOG] %s" % log_url,
])
html_message = '\n\n'.join([
'
%s' % escape(log.stderr), '
%s' % escape(log.stdout), '
%s' % escape(log.script), '
%s' % escape(log.traceback), '
%s' % escape(operations), '