From b2e31e3474c31ca77c8afd3109e633cb8ac408af Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 26 Jun 2022 09:25:37 +1000 Subject: [PATCH] Notify users when a build order is completed (#3255) --- InvenTree/build/models.py | 42 ++++++++++++++++++- InvenTree/common/notifications.py | 6 ++- .../email/build_order_completed.html | 27 ++++++++++++ 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 InvenTree/templates/email/build_order_completed.html diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py index 9ed0958691..770b78a7f6 100644 --- a/InvenTree/build/models.py +++ b/InvenTree/build/models.py @@ -32,6 +32,7 @@ import InvenTree.tasks from plugin.events import trigger_event +import common.notifications from part import models as PartModels from stock import models as StockModels from users import models as UserModels @@ -534,12 +535,51 @@ class Build(MPTTModel, ReferenceIndexingMixin): self.subtract_allocated_stock(user) # Ensure that there are no longer any BuildItem objects - # which point to thisFcan Build Order + # which point to this Build Order self.allocated_stock.all().delete() # Register an event trigger_event('build.completed', id=self.pk) + # Notify users that this build has been completed + targets = [ + self.issued_by, + self.responsible, + ] + + # Notify those users interested in the parent build + if self.parent: + targets.append(self.parent.issued_by) + targets.append(self.parent.responsible) + + # Notify users if this build points to a sales order + if self.sales_order: + targets.append(self.sales_order.created_by) + targets.append(self.sales_order.responsible) + + build = self + name = _(f'Build order {build} has been completed') + + context = { + 'build': build, + 'name': name, + 'slug': 'build.completed', + 'message': _('A build order has been completed'), + 'link': InvenTree.helpers.construct_absolute_url(self.get_absolute_url()), + 'template': { + 'html': 'email/build_order_completed.html', + 'subject': name, + } + } + + common.notifications.trigger_notification( + build, + 'build.completed', + targets=targets, + context=context, + target_exclude=[user], + ) + @transaction.atomic def cancel_build(self, user, **kwargs): """Mark the Build as CANCELLED. diff --git a/InvenTree/common/notifications.py b/InvenTree/common/notifications.py index 6f8a47ca5a..bfd125afc1 100644 --- a/InvenTree/common/notifications.py +++ b/InvenTree/common/notifications.py @@ -291,7 +291,7 @@ class InvenTreeNotificationBodies: NewOrder = NotificationBody( name=_("New {verbose_name}"), slug='{app_label}.new_{model_name}', - message=_("A new {verbose_name} has been created and ,assigned to you"), + message=_("A new order has been created and assigned to you"), template='email/new_order_assigned.html', ) """Send when a new order (build, sale or purchase) was created.""" @@ -344,8 +344,10 @@ def trigger_notification(obj, category=None, obj_ref='pk', **kwargs): if targets: for target in targets: + if target is None: + continue # User instance is provided - if isinstance(target, get_user_model()): + elif isinstance(target, get_user_model()): if target not in target_exclude: target_users.add(target) # Group instance is provided diff --git a/InvenTree/templates/email/build_order_completed.html b/InvenTree/templates/email/build_order_completed.html new file mode 100644 index 0000000000..37c2d486e0 --- /dev/null +++ b/InvenTree/templates/email/build_order_completed.html @@ -0,0 +1,27 @@ +{% extends "email/email.html" %} + +{% load i18n %} +{% load inventree_extras %} + +{% block title %} +{{ message }} +{% if link %} +

{% trans "Click on the following link to view this order" %}: {{ link }}

+{% endif %} +{% endblock title %} + +{% block body %} + + + {% trans "Build Order" %} + {% trans "Part" %} + {% trans "Quantity" %} + + + + {{ build }} + {{ build.part.full_name }} + {{ build.quantity }} + + +{% endblock body %}