Moved ReportResult creation into Report.run()

This commit is contained in:
Jeremy Stretch 2017-09-28 12:50:32 -04:00
parent 2fbb39bf6f
commit 571b817f04
2 changed files with 18 additions and 18 deletions

View File

@ -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)

View File

@ -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