diff --git a/docs/release-notes/version-3.0.md b/docs/release-notes/version-3.0.md index b4d6bb4ac..7e0198260 100644 --- a/docs/release-notes/version-3.0.md +++ b/docs/release-notes/version-3.0.md @@ -18,6 +18,7 @@ * [#7411](https://github.com/netbox-community/netbox/issues/7411) - Fix exception in UI when adding member devices to virtual chassis * [#7412](https://github.com/netbox-community/netbox/issues/7412) - Fix exception in UI when adding child device to device bay * [#7417](https://github.com/netbox-community/netbox/issues/7417) - Prevent exception when filtering objects list by invalid tag +* [#7425](https://github.com/netbox-community/netbox/issues/7425) - Housekeeping command should honor zero verbosity --- diff --git a/netbox/extras/management/commands/housekeeping.py b/netbox/extras/management/commands/housekeeping.py index 4dbfa6725..a4d617c9a 100644 --- a/netbox/extras/management/commands/housekeeping.py +++ b/netbox/extras/management/commands/housekeeping.py @@ -18,48 +18,60 @@ class Command(BaseCommand): def handle(self, *args, **options): # Clear expired authentication sessions (essentially replicating the `clearsessions` command) - self.stdout.write("[*] Clearing expired authentication sessions") - if options['verbosity'] >= 2: - self.stdout.write(f"\tConfigured session engine: {settings.SESSION_ENGINE}") + if options['verbosity']: + self.stdout.write("[*] Clearing expired authentication sessions") + if options['verbosity'] >= 2: + self.stdout.write(f"\tConfigured session engine: {settings.SESSION_ENGINE}") engine = import_module(settings.SESSION_ENGINE) try: engine.SessionStore.clear_expired() - self.stdout.write("\tSessions cleared.", self.style.SUCCESS) + if options['verbosity']: + self.stdout.write("\tSessions cleared.", self.style.SUCCESS) except NotImplementedError: - self.stdout.write( - f"\tThe configured session engine ({settings.SESSION_ENGINE}) does not support " - f"clearing sessions; skipping." - ) + if options['verbosity']: + self.stdout.write( + f"\tThe configured session engine ({settings.SESSION_ENGINE}) does not support " + f"clearing sessions; skipping." + ) # Delete expired ObjectRecords - self.stdout.write("[*] Checking for expired changelog records") + if options['verbosity']: + self.stdout.write("[*] Checking for expired changelog records") if settings.CHANGELOG_RETENTION: cutoff = timezone.now() - timedelta(days=settings.CHANGELOG_RETENTION) if options['verbosity'] >= 2: - self.stdout.write(f"Retention period: {settings.CHANGELOG_RETENTION} days") + self.stdout.write(f"\tRetention period: {settings.CHANGELOG_RETENTION} days") self.stdout.write(f"\tCut-off time: {cutoff}") expired_records = ObjectChange.objects.filter(time__lt=cutoff).count() if expired_records: - self.stdout.write(f"\tDeleting {expired_records} expired records... ", self.style.WARNING, ending="") - self.stdout.flush() + if options['verbosity']: + self.stdout.write( + f"\tDeleting {expired_records} expired records... ", + self.style.WARNING, + ending="" + ) + self.stdout.flush() ObjectChange.objects.filter(time__lt=cutoff)._raw_delete(using=DEFAULT_DB_ALIAS) - self.stdout.write("Done.", self.style.WARNING) - else: - self.stdout.write("\tNo expired records found.") - else: + if options['verbosity']: + self.stdout.write("Done.", self.style.SUCCESS) + elif options['verbosity']: + self.stdout.write("\tNo expired records found.", self.style.SUCCESS) + elif options['verbosity']: self.stdout.write( f"\tSkipping: No retention period specified (CHANGELOG_RETENTION = {settings.CHANGELOG_RETENTION})" ) # Check for new releases (if enabled) - self.stdout.write("[*] Checking for latest release") + if options['verbosity']: + self.stdout.write("[*] Checking for latest release") if settings.RELEASE_CHECK_URL: headers = { 'Accept': 'application/vnd.github.v3+json', } try: - self.stdout.write(f"\tFetching {settings.RELEASE_CHECK_URL}") + if options['verbosity'] >= 2: + self.stdout.write(f"\tFetching {settings.RELEASE_CHECK_URL}") response = requests.get( url=settings.RELEASE_CHECK_URL, headers=headers, @@ -73,15 +85,19 @@ class Command(BaseCommand): continue releases.append((version.parse(release['tag_name']), release.get('html_url'))) latest_release = max(releases) - self.stdout.write(f"\tFound {len(response.json())} releases; {len(releases)} usable") - self.stdout.write(f"\tLatest release: {latest_release[0]}") + if options['verbosity'] >= 2: + self.stdout.write(f"\tFound {len(response.json())} releases; {len(releases)} usable") + if options['verbosity']: + self.stdout.write(f"\tLatest release: {latest_release[0]}", self.style.SUCCESS) # Cache the most recent release cache.set('latest_release', latest_release, None) except requests.exceptions.RequestException as exc: - self.stdout.write(f"\tRequest error: {exc}") + self.stdout.write(f"\tRequest error: {exc}", self.style.ERROR) else: - self.stdout.write(f"\tSkipping: RELEASE_CHECK_URL not set") + if options['verbosity']: + self.stdout.write(f"\tSkipping: RELEASE_CHECK_URL not set") - self.stdout.write("Finished.", self.style.SUCCESS) + if options['verbosity']: + self.stdout.write("Finished.", self.style.SUCCESS)