12510 review changes

This commit is contained in:
Arthur 2024-02-01 14:20:07 -08:00
parent fe591fbfb2
commit da9b089723
3 changed files with 45 additions and 9 deletions

View File

@ -10,7 +10,6 @@ from django.db import transaction
from core.choices import JobStatusChoices from core.choices import JobStatusChoices
from core.models import Job from core.models import Job
from extras.api.serializers import ScriptOutputSerializer
from extras.context_managers import event_tracking from extras.context_managers import event_tracking
from extras.scripts import get_module_and_script from extras.scripts import get_module_and_script
from extras.signals import clear_events from extras.signals import clear_events
@ -34,6 +33,30 @@ class Command(BaseCommand):
parser.add_argument('script', help="Script to run") parser.add_argument('script', help="Script to run")
def handle(self, *args, **options): def handle(self, *args, **options):
def _output_results(job):
# Report on success/failure
if job.status == JobStatusChoices.STATUS_FAILED:
status = self.style.ERROR('FAILED')
elif job == JobStatusChoices.STATUS_ERRORED:
status = self.style.ERROR('ERRORED')
else:
status = self.style.SUCCESS('SUCCESS')
for test_name, attrs in job.data.logs.items():
self.stdout.write(
"\t{}: {} success, {} info, {} warning, {} failure".format(
test_name, attrs['success'], attrs['info'], attrs['warning'], attrs['failure']
)
)
def _set_job_data(job, script):
logs = script._logs
job.data = {
'logs': logs,
'output': script._output,
}
return job
def _run_script(): def _run_script():
""" """
Core script execution task. We capture this within a subfunction to allow for conditionally wrapping it with Core script execution task. We capture this within a subfunction to allow for conditionally wrapping it with
@ -48,7 +71,7 @@ class Command(BaseCommand):
except AbortTransaction: except AbortTransaction:
script.log_info("Database changes have been reverted automatically.") script.log_info("Database changes have been reverted automatically.")
clear_events.send(request) clear_events.send(request)
job.data = ScriptOutputSerializer(script).data job = _set_job_data(job, script)
job.terminate() job.terminate()
except Exception as e: except Exception as e:
stacktrace = traceback.format_exc() stacktrace = traceback.format_exc()
@ -58,7 +81,7 @@ class Command(BaseCommand):
script.log_info("Database changes have been reverted due to error.") script.log_info("Database changes have been reverted due to error.")
logger.error(f"Exception raised during script execution: {e}") logger.error(f"Exception raised during script execution: {e}")
clear_events.send(request) clear_events.send(request)
job.data = ScriptOutputSerializer(script).data job = _set_job_data(job, script)
job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e))
logger.info(f"Script completed in {job.duration}") logger.info(f"Script completed in {job.duration}")

View File

@ -12,6 +12,7 @@ from django.core.validators import RegexValidator
from django.db import transaction from django.db import transaction
from django.utils import timezone from django.utils import timezone
from django.utils.functional import classproperty from django.utils.functional import classproperty
from django.utils.translation import gettext as _
from core.choices import JobStatusChoices from core.choices import JobStatusChoices
from core.models import Job from core.models import Job
@ -25,6 +26,8 @@ from utilities.forms import add_blank_choice
from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField
from .context_managers import event_tracking from .context_managers import event_tracking
from .forms import ScriptForm from .forms import ScriptForm
from .utils import is_report
__all__ = ( __all__ = (
'BaseScript', 'BaseScript',
@ -612,8 +615,6 @@ def run_script(data, job, request=None, commit=True, **kwargs):
Core script execution task. We capture this within a subfunction to allow for conditionally wrapping it with Core script execution task. We capture this within a subfunction to allow for conditionally wrapping it with
the event_tracking context manager (which is bypassed if commit == False). the event_tracking context manager (which is bypassed if commit == False).
""" """
from .reports import Report # here to prevent circular import
try: try:
try: try:
with transaction.atomic(): with transaction.atomic():
@ -622,7 +623,7 @@ def run_script(data, job, request=None, commit=True, **kwargs):
raise AbortTransaction() raise AbortTransaction()
except AbortTransaction: except AbortTransaction:
msg = _("Database changes have been reverted automatically.") msg = _("Database changes have been reverted automatically.")
if issubclass(script, Report): if is_report(script):
# script and legacy reports have different log function signatures # script and legacy reports have different log function signatures
script.log_info(message=msg) script.log_info(message=msg)
else: else:
@ -639,7 +640,7 @@ def run_script(data, job, request=None, commit=True, **kwargs):
except Exception as e: except Exception as e:
if type(e) is AbortScript: if type(e) is AbortScript:
msg = _("Script aborted with error: ") + str(e) msg = _("Script aborted with error: ") + str(e)
if issubclass(script, Report): if is_report(script):
script.log_failure(message=msg) script.log_failure(message=msg)
else: else:
script.log_failure(msg) script.log_failure(msg)
@ -648,13 +649,13 @@ def run_script(data, job, request=None, commit=True, **kwargs):
else: else:
stacktrace = traceback.format_exc() stacktrace = traceback.format_exc()
msg = _("An exception occurred: : ") + f"`{type(e).__name__}: {e}`\n```\n{stacktrace}\n```" msg = _("An exception occurred: : ") + f"`{type(e).__name__}: {e}`\n```\n{stacktrace}\n```"
if issubclass(script, Report): if is_report(script):
script.log_failure(message=msg) script.log_failure(message=msg)
else: else:
script.log_failure(msg) script.log_failure(msg)
logger.error(f"Exception raised during script execution: {e}") logger.error(f"Exception raised during script execution: {e}")
msg = _("Database changes have been reverted due to error.") msg = _("Database changes have been reverted due to error.")
if issubclass(script, Report): if is_report(script):
script.log_info(message=msg) script.log_info(message=msg)
else: else:
script.log_info(msg) script.log_info(msg)

View File

@ -47,6 +47,18 @@ def register_features(model, features):
registry['models'][app_label].add(model_name) registry['models'][app_label].add(model_name)
def is_report(obj):
"""
Returns True if the given object is a Report.
"""
from .reports import Report
try:
return issubclass(obj, Report) and obj != Report
except TypeError:
print("TypeError")
return False
def is_script(obj): def is_script(obj):
""" """
Returns True if the object is a Script. Returns True if the object is a Script.