Browse Source

Moved ReportResult creation into Report.run()

Jeremy Stretch 7 years ago
parent
commit
571b817f04
2 changed files with 18 additions and 18 deletions
  1. 2 7
      netbox/extras/api/views.py
  2. 16 11
      netbox/extras/reports.py

+ 2 - 7
netbox/extras/api/views.py

@@ -153,14 +153,9 @@ class ReportViewSet(ViewSet):
         if not request.user.has_perm('extras.add_reportresult'):
             raise PermissionDenied("This user does not have permission to run reports.")
 
-        # Retrieve and run the Report.
+        # Retrieve and run the Report. This will create a new ReportResult.
         report = self._retrieve_report(pk)
-        result = report.run()
-
-        # Delete the old ReportResult (if any) and save the new one.
-        ReportResult.objects.filter(report=pk).delete()
-        report.result = ReportResult(report=pk, failed=report.failed, data=result)
-        report.result.save()
+        report.run()
 
         serializer = serializers.ReportDetailSerializer(report)
 

+ 16 - 11
netbox/extras/reports.py

@@ -6,6 +6,7 @@ import pkgutil
 from django.utils import timezone
 
 from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_LEVEL_CODES, LOG_SUCCESS, LOG_WARNING
+from .models import ReportResult
 import reports as custom_reports
 
 
@@ -34,8 +35,8 @@ def get_reports():
     Compile a list of all reports available across all modules in the reports path. Returns a list of tuples:
 
     [
-        (module_name, (report_class, report_class, report_class, ...)),
-        (module_name, (report_class, report_class, report_class, ...)),
+        (module_name, (report, report, report, ...)),
+        (module_name, (report, report, report, ...)),
         ...
     ]
     """
@@ -56,7 +57,7 @@ class Report(object):
     NetBox users can extend this object to write custom reports to be used for validating data within NetBox. Each
     report must have one or more test methods named `test_*`.
 
-    The `results` attribute of a completed report will take the following form:
+    The `_results` attribute of a completed report will take the following form:
 
     {
         'test_bar': {
@@ -79,7 +80,7 @@ class Report(object):
 
     def __init__(self):
 
-        self.results = OrderedDict()
+        self._results = OrderedDict()
         self.active_test = None
         self.failed = False
 
@@ -88,7 +89,7 @@ class Report(object):
         for method in dir(self):
             if method.startswith('test_') and callable(getattr(self, method)):
                 test_methods.append(method)
-                self.results[method] = OrderedDict([
+                self._results[method] = OrderedDict([
                     ('success', 0),
                     ('info', 0),
                     ('warning', 0),
@@ -118,7 +119,7 @@ class Report(object):
         if level not in LOG_LEVEL_CODES:
             raise Exception("Unknown logging level: {}".format(level))
         logline = [timezone.now().isoformat(), level, str(obj), message]
-        self.results[self.active_test]['log'].append(logline)
+        self._results[self.active_test]['log'].append(logline)
 
     def log_success(self, obj, message=None):
         """
@@ -126,28 +127,28 @@ class Report(object):
         """
         if message:
             self._log(obj, message, level=LOG_SUCCESS)
-        self.results[self.active_test]['success'] += 1
+        self._results[self.active_test]['success'] += 1
 
     def log_info(self, obj, message):
         """
         Log an informational message.
         """
         self._log(obj, message, level=LOG_INFO)
-        self.results[self.active_test]['info'] += 1
+        self._results[self.active_test]['info'] += 1
 
     def log_warning(self, obj, message):
         """
         Log a warning.
         """
         self._log(obj, message, level=LOG_WARNING)
-        self.results[self.active_test]['warning'] += 1
+        self._results[self.active_test]['warning'] += 1
 
     def log_failure(self, obj, message):
         """
         Log a failure. Calling this method will automatically mark the report as failed.
         """
         self._log(obj, message, level=LOG_FAILURE)
-        self.results[self.active_test]['failed'] += 1
+        self._results[self.active_test]['failed'] += 1
         self.failed = True
 
     def run(self):
@@ -159,4 +160,8 @@ class Report(object):
             test_method = getattr(self, method_name)
             test_method()
 
-        return self.results
+        # Delete any previous ReportResult and create a new one to record the result.
+        ReportResult.objects.filter(report=self.full_name).delete()
+        result = ReportResult(report=self.full_name, failed=self.failed, data=self._results)
+        result.save()
+        self.result = result