소스 검색

Closes #16307: Enable calling log_* methods on Script without a log message

Jeremy Stretch 1 년 전
부모
커밋
8b62e40874
2개의 변경된 파일23개의 추가작업 그리고 19개의 파일을 삭제
  1. 7 5
      docs/customization/custom-scripts.md
  2. 16 14
      netbox/extras/scripts.py

+ 7 - 5
docs/customization/custom-scripts.md

@@ -138,11 +138,11 @@ These two methods will load data in YAML or JSON format, respectively, from file
 
 The Script object provides a set of convenient functions for recording messages at different severity levels:
 
-* `log_debug(message, obj=None)`
-* `log_success(message, obj=None)`
-* `log_info(message, obj=None)`
-* `log_warning(message, obj=None)`
-* `log_failure(message, obj=None)`
+* `log_debug(message=None, obj=None)`
+* `log_success(message=None, obj=None)`
+* `log_info(message=None, obj=None)`
+* `log_warning(message=None, obj=None)`
+* `log_failure(message=None, obj=None)`
 
 Log messages are returned to the user upon execution of the script. Markdown rendering is supported for log messages. A message may optionally be associated with a particular object by passing it as the second argument to the logging method.
 
@@ -152,6 +152,8 @@ A script can define one or more test methods to report on certain conditions. Al
 
 These methods are detected and run automatically when the script is executed, unless its `run()` method has been overridden. (When overriding `run()`, `run_tests()` can be called to run all test methods present in the script.)
 
+Calling any of these logging methods without a message will increment the relevant counter, but will not generate an output line in the script's log.
+
 !!! info
     This functionality was ported from [legacy reports](./reports.md) in NetBox v4.0.
 

+ 16 - 14
netbox/extras/scripts.py

@@ -480,19 +480,21 @@ class BaseScript:
         # A test method is currently active, so log the message using legacy Report logging
         if self._current_test:
 
-            # TODO: Use a dataclass for test method logs
-            self.tests[self._current_test]['log'].append((
-                timezone.now().isoformat(),
-                level,
-                str(obj) if obj else None,
-                obj.get_absolute_url() if hasattr(obj, 'get_absolute_url') else None,
-                str(message),
-            ))
-
             # Increment the event counter for this level
             if level in self.tests[self._current_test]:
                 self.tests[self._current_test][level] += 1
 
+            # Record message (if any) to the report log
+            if message:
+                # TODO: Use a dataclass for test method logs
+                self.tests[self._current_test]['log'].append((
+                    timezone.now().isoformat(),
+                    level,
+                    str(obj) if obj else None,
+                    obj.get_absolute_url() if hasattr(obj, 'get_absolute_url') else None,
+                    str(message),
+                ))
+
         elif message:
 
             # Record to the script's log
@@ -509,19 +511,19 @@ class BaseScript:
                 message = f"{obj}: {message}"
             self.logger.log(LogLevelChoices.SYSTEM_LEVELS[level], message)
 
-    def log_debug(self, message, obj=None):
+    def log_debug(self, message=None, obj=None):
         self._log(message, obj, level=LogLevelChoices.LOG_DEBUG)
 
-    def log_success(self, message, obj=None):
+    def log_success(self, message=None, obj=None):
         self._log(message, obj, level=LogLevelChoices.LOG_SUCCESS)
 
-    def log_info(self, message, obj=None):
+    def log_info(self, message=None, obj=None):
         self._log(message, obj, level=LogLevelChoices.LOG_INFO)
 
-    def log_warning(self, message, obj=None):
+    def log_warning(self, message=None, obj=None):
         self._log(message, obj, level=LogLevelChoices.LOG_WARNING)
 
-    def log_failure(self, message, obj=None):
+    def log_failure(self, message=None, obj=None):
         self._log(message, obj, level=LogLevelChoices.LOG_FAILURE)
         self.failed = True