Browse Source

Tweaked report run logic

Jeremy Stretch 7 years ago
parent
commit
16d1f9aca8
2 changed files with 30 additions and 14 deletions
  1. 23 10
      netbox/extras/management/commands/runreport.py
  2. 7 4
      netbox/extras/reports.py

+ 23 - 10
netbox/extras/management/commands/runreport.py

@@ -20,26 +20,39 @@ class Command(BaseCommand):
         # Gather all reports to be run
         reports = []
         for module_name in options['reports']:
+
+            # Split the report name off if one has been provided.
+            report_name = None
+            if '.' in module_name:
+                module_name, report_name = module_name.split('.', 1)
+
+            # Import the report module
             try:
                 report_module = importlib.import_module('reports.report_{}'.format(module_name))
             except ImportError:
                 self.stdout.write(
-                    "Report '{}' not found. Ensure that the report has been saved as 'report_{}.py' in the reports "
-                    "directory.".format(module_name, module_name)
+                    "Report module '{}' not found. Ensure that the report has been saved as 'report_{}.py' in the "
+                    "reports directory.".format(module_name, module_name)
                 )
                 return
-            for name, cls in inspect.getmembers(report_module, inspect.isclass):
-                if cls in Report.__subclasses__():
-                    reports.append((name, cls))
+
+            # If the name of a particular report has been given, run that. Otherwise, run all reports in the module.
+            if report_name is not None:
+                report_cls = getattr(report_module, report_name)
+                reports = [(report_name, report_cls)]
+            else:
+                for name, report_cls in inspect.getmembers(report_module, inspect.isclass):
+                    if report_cls in Report.__subclasses__():
+                        reports.append((name, report_cls))
 
         # Run reports
-        for name, report in reports:
-            self.stdout.write("[{:%H:%M:%S}] Running report {}...".format(timezone.now(), name))
-            report = report()
-            report.run()
+        for name, report_cls in reports:
+            self.stdout.write("[{:%H:%M:%S}] Running {}...".format(timezone.now(), name))
+            report = report_cls()
+            results = report.run()
             status = self.style.ERROR('FAILED') if report.failed else self.style.SUCCESS('SUCCESS')
             self.stdout.write("[{:%H:%M:%S}] {}: {}".format(timezone.now(), name, status))
-            for test_name, attrs in report.results.items():
+            for test_name, attrs in results.items():
                 self.stdout.write("    {}: {} success, {} info, {} warning, {} failed".format(
                     test_name, attrs['success'], attrs['info'], attrs['warning'], attrs['failed']
                 ))

+ 7 - 4
netbox/extras/reports.py

@@ -29,12 +29,13 @@ class Report(object):
         }
     }
     """
-    results = OrderedDict()
-    active_test = None
-    failed = False
 
     def __init__(self):
 
+        self.results = OrderedDict()
+        self.active_test = None
+        self.failed = False
+
         # Compile test methods and initialize results skeleton
         test_methods = []
         for method in dir(self):
@@ -92,9 +93,11 @@ class Report(object):
 
     def run(self):
         """
-        Run the report. Each test method will be executed in order.
+        Run the report and return its results. Each test method will be executed in order.
         """
         for method_name in self.test_methods:
             self.active_test = method_name
             test_method = getattr(self, method_name)
             test_method()
+
+        return self.results