From 571b817f0483d567e024dd152d84e024929fcfda Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Sep 2017 12:50:32 -0400 Subject: [PATCH] Moved ReportResult creation into Report.run() --- netbox/extras/api/views.py | 9 ++------- netbox/extras/reports.py | 27 ++++++++++++++++----------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index 216ea42a0..81eb5e739 100644 --- a/netbox/extras/api/views.py +++ b/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) diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index 7af639e49..7bf8951ea 100644 --- a/netbox/extras/reports.py +++ b/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