Просмотр исходного кода

Merge pull request #5126 from netbox-community/5108-report-management-command-fix

fixes #5108 - correct the runreport management command to work with JobResult model
Jeremy Stretch 5 лет назад
Родитель
Сommit
22e30b93d5
1 измененных файлов с 30 добавлено и 4 удалено
  1. 30 4
      netbox/extras/management/commands/runreport.py

+ 30 - 4
netbox/extras/management/commands/runreport.py

@@ -1,7 +1,12 @@
+import time
+
+from django.contrib.contenttypes.models import ContentType
 from django.core.management.base import BaseCommand
 from django.utils import timezone
 
-from extras.reports import get_reports
+from extras.choices import JobResultStatusChoices
+from extras.models import JobResult
+from extras.reports import get_reports, run_report
 
 
 class Command(BaseCommand):
@@ -24,11 +29,29 @@ class Command(BaseCommand):
                     self.stdout.write(
                         "[{:%H:%M:%S}] Running {}...".format(timezone.now(), report.full_name)
                     )
-                    report.run()
+
+                    report_content_type = ContentType.objects.get(app_label='extras', model='report')
+                    job_result = JobResult.enqueue_job(
+                        run_report,
+                        report.full_name,
+                        report_content_type,
+                        None
+                    )
+
+                    # Wait on the job to finish
+                    while job_result.status not in JobResultStatusChoices.TERMINAL_STATE_CHOICES:
+                        time.sleep(1)
+                        job_result = JobResult.objects.get(pk=job_result.pk)
 
                     # Report on success/failure
-                    status = self.style.ERROR('FAILED') if report.failed else self.style.SUCCESS('SUCCESS')
-                    for test_name, attrs in report.result.data.items():
+                    if job_result.status == JobResultStatusChoices.STATUS_FAILED:
+                        status = self.style.ERROR('FAILED')
+                    elif job_result == JobResultStatusChoices.STATUS_ERRORED:
+                        status = self.style.ERROR('ERRORED')
+                    else:
+                        status = self.style.SUCCESS('SUCCESS')
+
+                    for test_name, attrs in job_result.data.items():
                         self.stdout.write(
                             "\t{}: {} success, {} info, {} warning, {} failure".format(
                                 test_name, attrs['success'], attrs['info'], attrs['warning'], attrs['failure']
@@ -37,6 +60,9 @@ class Command(BaseCommand):
                     self.stdout.write(
                         "[{:%H:%M:%S}] {}: {}".format(timezone.now(), report.full_name, status)
                     )
+                    self.stdout.write(
+                        "[{:%H:%M:%S}] {}: Duration {}".format(timezone.now(), report.full_name, job_result.duration)
+                    )
 
         # Wrap things up
         self.stdout.write(