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'): if not request.user.has_perm('extras.add_reportresult'):
raise PermissionDenied("This user does not have permission to run reports.") 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) report = self._retrieve_report(pk)
result = report.run() 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()
serializer = serializers.ReportDetailSerializer(report) serializer = serializers.ReportDetailSerializer(report)

View File

@ -6,6 +6,7 @@ import pkgutil
from django.utils import timezone from django.utils import timezone
from .constants import LOG_DEFAULT, LOG_FAILURE, LOG_INFO, LOG_LEVEL_CODES, LOG_SUCCESS, LOG_WARNING 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 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: 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, report, report, ...)),
(module_name, (report_class, report_class, report_class, ...)), (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 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_*`. 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': { 'test_bar': {
@ -79,7 +80,7 @@ class Report(object):
def __init__(self): def __init__(self):
self.results = OrderedDict() self._results = OrderedDict()
self.active_test = None self.active_test = None
self.failed = False self.failed = False
@ -88,7 +89,7 @@ class Report(object):
for method in dir(self): for method in dir(self):
if method.startswith('test_') and callable(getattr(self, method)): if method.startswith('test_') and callable(getattr(self, method)):
test_methods.append(method) test_methods.append(method)
self.results[method] = OrderedDict([ self._results[method] = OrderedDict([
('success', 0), ('success', 0),
('info', 0), ('info', 0),
('warning', 0), ('warning', 0),
@ -118,7 +119,7 @@ class Report(object):
if level not in LOG_LEVEL_CODES: if level not in LOG_LEVEL_CODES:
raise Exception("Unknown logging level: {}".format(level)) raise Exception("Unknown logging level: {}".format(level))
logline = [timezone.now().isoformat(), level, str(obj), message] 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): def log_success(self, obj, message=None):
""" """
@ -126,28 +127,28 @@ class Report(object):
""" """
if message: if message:
self._log(obj, message, level=LOG_SUCCESS) 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): def log_info(self, obj, message):
""" """
Log an informational message. Log an informational message.
""" """
self._log(obj, message, level=LOG_INFO) 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): def log_warning(self, obj, message):
""" """
Log a warning. Log a warning.
""" """
self._log(obj, message, level=LOG_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): def log_failure(self, obj, message):
""" """
Log a failure. Calling this method will automatically mark the report as failed. Log a failure. Calling this method will automatically mark the report as failed.
""" """
self._log(obj, message, level=LOG_FAILURE) self._log(obj, message, level=LOG_FAILURE)
self.results[self.active_test]['failed'] += 1 self._results[self.active_test]['failed'] += 1
self.failed = True self.failed = True
def run(self): def run(self):
@ -159,4 +160,8 @@ class Report(object):
test_method = getattr(self, method_name) test_method = getattr(self, method_name)
test_method() 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