2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-09-14 06:31:27 +00:00

Email history enhancements (#10109)

* Improve formatting for <ConfigValueList>

- Only used for email settings currently

* API updates:

- Allow delete operations of email record
- Allow bulk delete operations of email record

* Table updates:

- Improved table rendering
- Allow delete ops

* Display timestamp in email table

* Add setting to control email cleanup interval

* Add scheduled task to delete old emails

* Bump API version
This commit is contained in:
Oliver
2025-08-01 12:32:22 +10:00
committed by GitHub
parent 44bcf2c7e8
commit 4895370d0d
9 changed files with 118 additions and 24 deletions

View File

@@ -1,12 +1,15 @@
"""InvenTree API version information."""
# InvenTree API version
INVENTREE_API_VERSION = 376
INVENTREE_API_VERSION = 377
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
INVENTREE_API_TEXT = """
v377 -> 2025-08-01 : https://github.com/inventree/InvenTree/pull/10109
- Allow email records to be deleted via the API
v376 -> 2025-08-01 : https://github.com/inventree/InvenTree/pull/10108
- Fix search fields for ReturnOrderLineItem API list endpoint

View File

@@ -466,6 +466,26 @@ def delete_old_notifications():
)
@tracer.start_as_current_span('delete_old_emails')
@scheduled_task(ScheduledTask.DAILY)
def delete_old_emails():
"""Delete old email messages."""
try:
from common.models import EmailMessage
days = get_global_setting('INVENTREE_DELETE_EMAIL_DAYS', 30)
threshold = timezone.now() - timedelta(days=days)
emails = EmailMessage.objects.filter(timestamp__lte=threshold)
if emails.count() > 0:
logger.info('Deleted %s old email messages', emails.count())
emails.delete()
except AppRegistryNotReady:
logger.info("Could not perform 'delete_old_emails' - App registry not ready")
@tracer.start_as_current_span('check_for_updates')
@scheduled_task(ScheduledTask.DAILY)
def check_for_updates():

View File

@@ -43,6 +43,7 @@ from InvenTree.mixins import (
ListAPI,
ListCreateAPI,
RetrieveAPI,
RetrieveDestroyAPI,
RetrieveUpdateAPI,
RetrieveUpdateDestroyAPI,
)
@@ -842,7 +843,7 @@ class EmailMessageMixin:
permission_classes = [IsSuperuserOrSuperScope]
class EmailMessageList(EmailMessageMixin, ListAPI):
class EmailMessageList(EmailMessageMixin, BulkDeleteMixin, ListAPI):
"""List view for email objects."""
filter_backends = SEARCH_ORDER_FILTER
@@ -865,7 +866,7 @@ class EmailMessageList(EmailMessageMixin, ListAPI):
]
class EmailMessageDetail(EmailMessageMixin, RetrieveAPI):
class EmailMessageDetail(EmailMessageMixin, RetrieveDestroyAPI):
"""Detail view for an email object."""

View File

@@ -331,6 +331,15 @@ SYSTEM_SETTINGS: dict[str, InvenTreeSettingsKeyType] = {
'units': _('days'),
'validator': [int, MinValueValidator(7)],
},
'INVENTREE_DELETE_EMAIL_DAYS': {
'name': _('Email Deletion Interval'),
'description': _(
'Email messages will be deleted after specified number of days'
),
'default': 30,
'units': _('days'),
'validator': [int, MinValueValidator(7)],
},
'BARCODE_ENABLE': {
'name': _('Barcode Support'),
'description': _('Enable barcode scanner support in the web interface'),