From a4f0a0846924f91bc215131f6fd6e84c8723c2fe Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Mon, 2 Feb 2026 17:27:14 +0100 Subject: [PATCH] 02.02.26 --- modules/automation/cron.py | 2 +- modules/purchase_trade/stock.py | 53 ++++++++++++++----- .../purchase_trade/view/shipment_in_form.xml | 2 +- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/modules/automation/cron.py b/modules/automation/cron.py index 0f321bc..1c5c491 100644 --- a/modules/automation/cron.py +++ b/modules/automation/cron.py @@ -310,7 +310,7 @@ class AutomationCron(ModelSQL, ModelView): ShipmentIn.save([shipment]) shipment._create_lots_from_fintrade() shipment.controller = shipment.get_controller() - shipment.instructions = shipment.get_instructions() + shipment.instructions = shipment.get_instructions_html() ShipmentIn.save([shipment]) trans_shipment.commit() successful_shipments += 1 diff --git a/modules/purchase_trade/stock.py b/modules/purchase_trade/stock.py index 28e6d08..f379cca 100755 --- a/modules/purchase_trade/stock.py +++ b/modules/purchase_trade/stock.py @@ -23,6 +23,9 @@ import io import base64 import logging import json +import re +import html + logger = logging.getLogger(__name__) @@ -462,26 +465,46 @@ class ShipmentIn(metaclass=PoolMeta): for c in controllers: if c.party.IsAvailableForControl(self): return c.party - - def get_instructions(self): + + def get_instructions_html(self): lines = [ - "Hi,", - "", - "Please find details below for the requested control", - f"BL number: {self.bl_number}", - "" + "

Hi,

", + "

Please find details below for the requested control

", + f"

BL number: {self.bl_number}

", ] if self.incoming_moves: for m in self.incoming_moves: if m.lot: lines.append( - f"Lot nb: {m.lot.lot_name} | " - f"Net Qt: {m.lot.get_current_quantity()} {m.lot.lot_unit.symbol} | " - f"Gross Qt: {m.lot.get_current_gross_quantity()} {m.lot.lot_unit.symbol}" + "

" + f"Lot nb: {m.lot.lot_name} | " + f"Net Qt: {m.lot.get_current_quantity()} {m.lot.lot_unit.symbol} | " + f"Gross Qt: {m.lot.get_current_gross_quantity()} {m.lot.lot_unit.symbol}" + "

" ) - return "\n".join(lines) + return "".join(lines) + + # def get_instructions(self): + # lines = [ + # "Hi,", + # "", + # "Please find details below for the requested control", + # f"BL number: {self.bl_number}", + # "" + # ] + + # if self.incoming_moves: + # for m in self.incoming_moves: + # if m.lot: + # lines.append( + # f"Lot nb: {m.lot.lot_name} | " + # f"Net Qt: {m.lot.get_current_quantity()} {m.lot.lot_unit.symbol} | " + # f"Gross Qt: {m.lot.get_current_gross_quantity()} {m.lot.lot_unit.symbol}" + # ) + + # return "\n".join(lines) def _create_lots_from_fintrade(self): t = Table('freight_booking_lots') @@ -653,6 +676,12 @@ class ShipmentIn(metaclass=PoolMeta): return sale_line + def html_to_text(self,html_content): + text = re.sub(r"", "\n", html_content, flags=re.IGNORECASE) + text = re.sub(r"", "\n\n", text, flags=re.IGNORECASE) + text = re.sub(r"<[^>]+>", "", text) + return html.unescape(text).strip() + @classmethod @ModelView.button def send(cls, shipments): @@ -668,7 +697,7 @@ class ShipmentIn(metaclass=PoolMeta): payload = { "to": [contact[0].value], "subject": "Request for control", - "body": sh.instructions, + "body": sh.html_to_text(sh.instructions), # "attachments": [ # { # "filename": "instruction.pdf", diff --git a/modules/purchase_trade/view/shipment_in_form.xml b/modules/purchase_trade/view/shipment_in_form.xml index 8c2a3d9..1e0e20f 100755 --- a/modules/purchase_trade/view/shipment_in_form.xml +++ b/modules/purchase_trade/view/shipment_in_form.xml @@ -125,7 +125,7 @@ this repository contains the full copyright notices and license terms. -->