mirror of
				https://github.com/inventree/InvenTree.git
				synced 2025-10-31 21:25:42 +00:00 
			
		
		
		
	Housekeeping Settings (#3821)
* Add new settings for controlling how long logged data is retained * Update existing tasks to use new user-configurable values - Also add a task to delete failed task logs * Add background task to remove old notification logs
This commit is contained in:
		| @@ -226,22 +226,51 @@ def heartbeat(): | |||||||
|  |  | ||||||
| @scheduled_task(ScheduledTask.DAILY) | @scheduled_task(ScheduledTask.DAILY) | ||||||
| def delete_successful_tasks(): | def delete_successful_tasks(): | ||||||
|     """Delete successful task logs which are more than a month old.""" |     """Delete successful task logs which are older than a specified period""" | ||||||
|     try: |     try: | ||||||
|         from django_q.models import Success |         from django_q.models import Success | ||||||
|  |  | ||||||
|  |         from common.models import InvenTreeSetting | ||||||
|  |  | ||||||
|  |         days = InvenTreeSetting.get_setting('INVENTREE_DELETE_TASKS_DAYS', 30) | ||||||
|  |         threshold = timezone.now() - timedelta(days=days) | ||||||
|  |  | ||||||
|  |         # Delete successful tasks | ||||||
|  |         results = Success.objects.filter( | ||||||
|  |             started__lte=threshold | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         if results.count() > 0: | ||||||
|  |             logger.info(f"Deleting {results.count()} successful task records") | ||||||
|  |             results.delete() | ||||||
|  |  | ||||||
|     except AppRegistryNotReady:  # pragma: no cover |     except AppRegistryNotReady:  # pragma: no cover | ||||||
|         logger.info("Could not perform 'delete_successful_tasks' - App registry not ready") |         logger.info("Could not perform 'delete_successful_tasks' - App registry not ready") | ||||||
|         return |  | ||||||
|  |  | ||||||
|     threshold = timezone.now() - timedelta(days=30) |  | ||||||
|  |  | ||||||
|     results = Success.objects.filter( | @scheduled_task(ScheduledTask.DAILY) | ||||||
|         started__lte=threshold | def delete_failed_tasks(): | ||||||
|     ) |     """Delete failed task logs which are older than a specified period""" | ||||||
|  |  | ||||||
|     if results.count() > 0: |     try: | ||||||
|         logger.info(f"Deleting {results.count()} successful task records") |         from django_q.models import Failure | ||||||
|         results.delete() |  | ||||||
|  |         from common.models import InvenTreeSetting | ||||||
|  |  | ||||||
|  |         days = InvenTreeSetting.get_setting('INVENTREE_DELETE_TASKS_DAYS', 30) | ||||||
|  |         threshold = timezone.now() - timedelta(days=days) | ||||||
|  |  | ||||||
|  |         # Delete failed tasks | ||||||
|  |         results = Failure.objects.filter( | ||||||
|  |             started__lte=threshold | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         if results.count() > 0: | ||||||
|  |             logger.info(f"Deleting {results.count()} failed task records") | ||||||
|  |             results.delete() | ||||||
|  |  | ||||||
|  |     except AppRegistryNotReady:  # pragma: no cover | ||||||
|  |         logger.info("Could not perform 'delete_failed_tasks' - App registry not ready") | ||||||
|  |  | ||||||
|  |  | ||||||
| @scheduled_task(ScheduledTask.DAILY) | @scheduled_task(ScheduledTask.DAILY) | ||||||
| @@ -250,8 +279,10 @@ def delete_old_error_logs(): | |||||||
|     try: |     try: | ||||||
|         from error_report.models import Error |         from error_report.models import Error | ||||||
|  |  | ||||||
|         # Delete any error logs more than 30 days old |         from common.models import InvenTreeSetting | ||||||
|         threshold = timezone.now() - timedelta(days=30) |  | ||||||
|  |         days = InvenTreeSetting.get_setting('INVENTREE_DELETE_ERRORS_DAYS', 30) | ||||||
|  |         threshold = timezone.now() - timedelta(days=days) | ||||||
|  |  | ||||||
|         errors = Error.objects.filter( |         errors = Error.objects.filter( | ||||||
|             when__lte=threshold, |             when__lte=threshold, | ||||||
| @@ -264,7 +295,37 @@ def delete_old_error_logs(): | |||||||
|     except AppRegistryNotReady:  # pragma: no cover |     except AppRegistryNotReady:  # pragma: no cover | ||||||
|         # Apps not yet loaded |         # Apps not yet loaded | ||||||
|         logger.info("Could not perform 'delete_old_error_logs' - App registry not ready") |         logger.info("Could not perform 'delete_old_error_logs' - App registry not ready") | ||||||
|         return |  | ||||||
|  |  | ||||||
|  | @scheduled_task(ScheduledTask.DAILY) | ||||||
|  | def delete_old_notifications(): | ||||||
|  |     """Delete old notification logs""" | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         from common.models import (InvenTreeSetting, NotificationEntry, | ||||||
|  |                                    NotificationMessage) | ||||||
|  |  | ||||||
|  |         days = InvenTreeSetting.get_setting('INVENTREE_DELETE_NOTIFICATIONS_DAYS', 30) | ||||||
|  |         threshold = timezone.now() - timedelta(days=days) | ||||||
|  |  | ||||||
|  |         items = NotificationEntry.objects.filter( | ||||||
|  |             updated__lte=threshold | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         if items.count() > 0: | ||||||
|  |             logger.info(f"Deleted {items.count()} old notification entries") | ||||||
|  |             items.delete() | ||||||
|  |  | ||||||
|  |         items = NotificationMessage.objects.filter( | ||||||
|  |             creation__lte=threshold | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         if items.count() > 0: | ||||||
|  |             logger.info(f"Deleted {items.count()} old notification messages") | ||||||
|  |             items.delete() | ||||||
|  |  | ||||||
|  |     except AppRegistryNotReady: | ||||||
|  |         logger.info("Could not perform 'delete_old_notifications' - App registry not ready") | ||||||
|  |  | ||||||
|  |  | ||||||
| @scheduled_task(ScheduledTask.DAILY) | @scheduled_task(ScheduledTask.DAILY) | ||||||
|   | |||||||
| @@ -893,6 +893,39 @@ class InvenTreeSetting(BaseInvenTreeSetting): | |||||||
|             'default': True, |             'default': True, | ||||||
|         }, |         }, | ||||||
|  |  | ||||||
|  |         'INVENTREE_DELETE_TASKS_DAYS': { | ||||||
|  |             'name': _('Delete Old Tasks'), | ||||||
|  |             'description': _('Background task results will be deleted after specified number of days'), | ||||||
|  |             'default': 30, | ||||||
|  |             'units': 'days', | ||||||
|  |             'validator': [ | ||||||
|  |                 int, | ||||||
|  |                 MinValueValidator(7), | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         'INVENTREE_DELETE_ERRORS_DAYS': { | ||||||
|  |             'name': _('Delete Error Logs'), | ||||||
|  |             'description': _('Error logs will be deleted after specified number of days'), | ||||||
|  |             'default': 30, | ||||||
|  |             'units': 'days', | ||||||
|  |             'validator': [ | ||||||
|  |                 int, | ||||||
|  |                 MinValueValidator(7) | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         'INVENTREE_DELETE_NOTIFICATIONS_DAYS': { | ||||||
|  |             'name': _('Delete Noficiations'), | ||||||
|  |             'description': _('User notifications will be deleted after specified number of days'), | ||||||
|  |             'default': 30, | ||||||
|  |             'units': 'days', | ||||||
|  |             'validator': [ | ||||||
|  |                 int, | ||||||
|  |                 MinValueValidator(7), | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |  | ||||||
|         'BARCODE_ENABLE': { |         'BARCODE_ENABLE': { | ||||||
|             'name': _('Barcode Support'), |             'name': _('Barcode Support'), | ||||||
|             'description': _('Enable barcode scanner support'), |             'description': _('Enable barcode scanner support'), | ||||||
|   | |||||||
| @@ -24,6 +24,10 @@ | |||||||
|         {% include "InvenTree/settings/setting.html" with key="INVENTREE_REQUIRE_CONFIRM" icon="fa-check" %} |         {% include "InvenTree/settings/setting.html" with key="INVENTREE_REQUIRE_CONFIRM" icon="fa-check" %} | ||||||
|         {% include "InvenTree/settings/setting.html" with key="INVENTREE_TREE_DEPTH" icon="fa-sitemap" %} |         {% include "InvenTree/settings/setting.html" with key="INVENTREE_TREE_DEPTH" icon="fa-sitemap" %} | ||||||
|         {% include "InvenTree/settings/setting.html" with key="INVENTREE_BACKUP_ENABLE" icon="fa-hdd" %} |         {% include "InvenTree/settings/setting.html" with key="INVENTREE_BACKUP_ENABLE" icon="fa-hdd" %} | ||||||
|  |         <tr><td colspan='5'></td></tr> | ||||||
|  |         {% include "InvenTree/settings/setting.html" with key="INVENTREE_DELETE_TASKS_DAYS" icon="fa-calendar-alt" %} | ||||||
|  |         {% include "InvenTree/settings/setting.html" with key="INVENTREE_DELETE_ERRORS_DAYS" icon="fa-calendar-alt" %} | ||||||
|  |         {% include "InvenTree/settings/setting.html" with key="INVENTREE_DELETE_NOTIFICATIONS_DAYS" icon="fa-calendar-alt" %} | ||||||
|     </tbody> |     </tbody> | ||||||
| </table> | </table> | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user