details:   https://code.tryton.org/tryton/commit/21569807a4b3
branch:    default
user:      Cédric Krier <[email protected]>
date:      Fri Feb 27 12:55:11 2026 +0100
description:
        Add attn to address

        Closes #14633
diffstat:

 modules/party/CHANGELOG                           |   1 +
 modules/party/address.py                          |   3 +++
 modules/party/party.py                            |   5 +++--
 modules/party/view/address_form.xml               |   3 +++
 modules/party/view/address_form_simple.xml        |   3 +++
 modules/party/view/address_tree.xml               |   1 +
 modules/party/view/address_tree_sequence.xml      |   1 +
 modules/stock/delivery_note.fodt                  |   1 -
 modules/stock/shipment.py                         |   2 +-
 modules/stock_package_shipping/stock.py           |  16 ----------------
 modules/stock_package_shipping_dpd/stock.py       |   5 ++---
 modules/stock_package_shipping_mygls/stock.py     |   5 ++---
 modules/stock_package_shipping_sendcloud/stock.py |  10 ++++------
 modules/stock_package_shipping_ups/stock.py       |   5 ++---
 modules/web_shop_shopify/party.py                 |   7 +++++--
 15 files changed, 31 insertions(+), 37 deletions(-)

diffs (267 lines):

diff -r 3715120393fa -r 21569807a4b3 modules/party/CHANGELOG
--- a/modules/party/CHANGELOG   Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/party/CHANGELOG   Fri Feb 27 12:55:11 2026 +0100
@@ -1,3 +1,4 @@
+* Add attn to address
 * Add support for Python 3.14
 * Remove support for Python 3.9
 * Add a menu entry for party identifiers
diff -r 3715120393fa -r 21569807a4b3 modules/party/address.py
--- a/modules/party/address.py  Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/party/address.py  Fri Feb 27 12:55:11 2026 +0100
@@ -34,6 +34,7 @@
     party_name = fields.Char(
         "Party Name",
         help="If filled, replace the name of the party for address formatting")
+    attn = fields.Char("Attn")
 
     street = fields.Function(fields.Text(
             "Street",
@@ -263,6 +264,8 @@
         if context.get('address_attention_party', False):
             substitutions['attn'] = (
                 context['address_attention_party'].full_name)
+        else:
+            substitutions['attn'] = getattr(self, 'attn', None) or ''
         for key, value in list(substitutions.items()):
             substitutions[key.upper()] = value.upper()
         substitutions.update(self._get_street_substitutions())
diff -r 3715120393fa -r 21569807a4b3 modules/party/party.py
--- a/modules/party/party.py    Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/party/party.py    Fri Feb 27 12:55:11 2026 +0100
@@ -1285,11 +1285,12 @@
                 ['type', 'code'],
                 [None, '****']),
             (Address, [('party', '=', party_id)], True,
-                ['street_unstructured', 'street_name', 'building_name',
+                ['party_name', 'attn',
+                    'street_unstructured', 'street_name', 'building_name',
                     'building_number', 'unit_number', 'floor_number',
                     'room_number', 'post_box', 'private_bag', 'post_office',
                     'postal_code', 'city', 'country', 'subdivision'],
-                [None] * 14),
+                [None] * 16),
             (ContactMechanism, [('party', '=', party_id)], True,
                 ['type', 'value', 'name', 'comment'],
                 ['other', '****', None, None]),
diff -r 3715120393fa -r 21569807a4b3 modules/party/view/address_form.xml
--- a/modules/party/view/address_form.xml       Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/party/view/address_form.xml       Fri Feb 27 12:55:11 2026 +0100
@@ -4,8 +4,11 @@
 <form col="6">
     <label name="party"/>
     <field name="party" colspan="5"/>
+
     <label name="party_name"/>
     <field name="party_name"/>
+    <label name="attn"/>
+    <field name="attn"/>
     <group colspan="2" col="-1" id="checkboxes">
         <label name="active"/>
         <field name="active"
diff -r 3715120393fa -r 21569807a4b3 modules/party/view/address_form_simple.xml
--- a/modules/party/view/address_form_simple.xml        Wed Mar 25 08:20:17 
2026 +0100
+++ b/modules/party/view/address_form_simple.xml        Fri Feb 27 12:55:11 
2026 +0100
@@ -4,8 +4,11 @@
 <form col="6">
     <label name="party"/>
     <field name="party" colspan="5"/>
+
     <label name="party_name"/>
     <field name="party_name"/>
+    <label name="attn"/>
+    <field name="attn"/>
     <group colspan="2" col="-1" id="checkboxes">
         <label name="active"/>
         <field name="active"
diff -r 3715120393fa -r 21569807a4b3 modules/party/view/address_tree.xml
--- a/modules/party/view/address_tree.xml       Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/party/view/address_tree.xml       Fri Feb 27 12:55:11 2026 +0100
@@ -4,6 +4,7 @@
 <tree>
     <field name="party" expand="1"/>
     <field name="party_name" optional="0"/>
+    <field name="attn" optional="1"/>
     <field name="street_single_line" expand="2"/>
     <field name="postal_code"/>
     <field name="city"/>
diff -r 3715120393fa -r 21569807a4b3 
modules/party/view/address_tree_sequence.xml
--- a/modules/party/view/address_tree_sequence.xml      Wed Mar 25 08:20:17 
2026 +0100
+++ b/modules/party/view/address_tree_sequence.xml      Fri Feb 27 12:55:11 
2026 +0100
@@ -4,6 +4,7 @@
 <tree sequence="sequence">
     <field name="party" expand="1"/>
     <field name="party_name" optional="0"/>
+    <field name="attn" optional="1"/>
     <field name="street_single_line" expand="2"/>
     <field name="postal_code"/>
     <field name="city"/>
diff -r 3715120393fa -r 21569807a4b3 modules/stock/delivery_note.fodt
--- a/modules/stock/delivery_note.fodt  Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/stock/delivery_note.fodt  Fri Feb 27 12:55:11 2026 +0100
@@ -538,7 +538,6 @@
    <text:p text:style-name="P23"/>
    <text:p text:style-name="P21"><text:placeholder 
text:placeholder-type="text">&lt;replace 
text:p=&quot;set_lang(shipment.delivery_address.party.lang)&quot;&gt;</text:placeholder></text:p>
    <text:p text:style-name="P21"><text:placeholder 
text:placeholder-type="text">&lt;replace 
text:p=&quot;shipment.set_lang(shipment.delivery_address.party.lang)&quot;&gt;</text:placeholder></text:p>
-   <text:p text:style-name="P21"><text:placeholder 
text:placeholder-type="text">&lt;shipment.customer.full_name&gt;</text:placeholder></text:p>
    <text:p text:style-name="P21"><text:placeholder 
text:placeholder-type="text">&lt;for each=&quot;line in 
shipment.delivery_address.full_address.split(&apos;\n&apos;)&quot;&gt;</text:placeholder></text:p>
    <text:p text:style-name="P19"><text:placeholder 
text:placeholder-type="text">&lt;line&gt;</text:placeholder></text:p>
    <text:p text:style-name="P19"><text:placeholder 
text:placeholder-type="text">&lt;/for&gt;</text:placeholder></text:p>
diff -r 3715120393fa -r 21569807a4b3 modules/stock/shipment.py
--- a/modules/stock/shipment.py Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/stock/shipment.py Fri Feb 27 12:55:11 2026 +0100
@@ -3101,7 +3101,7 @@
 
     @classmethod
     def execute(cls, ids, data):
-        with Transaction().set_context(address_with_party=False):
+        with Transaction().set_context(address_with_party=True):
             return super().execute(ids, data)
 
     @classmethod
diff -r 3715120393fa -r 21569807a4b3 modules/stock_package_shipping/stock.py
--- a/modules/stock_package_shipping/stock.py   Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/stock_package_shipping/stock.py   Fri Feb 27 12:55:11 2026 +0100
@@ -419,19 +419,3 @@
                     package_ids.append(package.id)
                     labels.add(package.shipping_label)
         return action, {'ids': package_ids}
-
-
-def address_name(address, party=None):
-    "Returns the party name of the address with party name removed"
-    if party is None:
-        party = address.party
-    name = address.party_full_name
-    for prefix in sorted([
-                f'{party.full_name} / ',
-                f'{party.name} / ',
-                party.full_name,
-                party.name,
-                ], key=len, reverse=True):
-        if name.startswith(prefix) and name != prefix:
-            return name[len(prefix):]
-    return name
diff -r 3715120393fa -r 21569807a4b3 modules/stock_package_shipping_dpd/stock.py
--- a/modules/stock_package_shipping_dpd/stock.py       Wed Mar 25 08:20:17 
2026 +0100
+++ b/modules/stock_package_shipping_dpd/stock.py       Fri Feb 27 12:55:11 
2026 +0100
@@ -16,7 +16,6 @@
 from trytond.model.exceptions import AccessError
 from trytond.modules.stock_package_shipping.exceptions import (
     PackingValidationError)
-from trytond.modules.stock_package_shipping.stock import address_name
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
 from trytond.wizard import StateAction, StateTransition, Wizard
@@ -214,8 +213,8 @@
         else:
             street = address.street_name or ''
             house_no = address.numbers
-        name = address_name(address, party)
-        contact = party.full_name if party.full_name != name else ''
+        name = address.party_full_name
+        contact = address.attn or ''
         if with_contact and not contact:
             contact = party.full_name
         shipping_party = {
diff -r 3715120393fa -r 21569807a4b3 
modules/stock_package_shipping_mygls/stock.py
--- a/modules/stock_package_shipping_mygls/stock.py     Wed Mar 25 08:20:17 
2026 +0100
+++ b/modules/stock_package_shipping_mygls/stock.py     Fri Feb 27 12:55:11 
2026 +0100
@@ -10,7 +10,6 @@
 from trytond.model.exceptions import AccessError
 from trytond.modules.stock_package_shipping.exceptions import (
     PackingValidationError)
-from trytond.modules.stock_package_shipping.stock import address_name
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
 from trytond.wizard import StateAction, StateTransition, Wizard
@@ -233,8 +232,8 @@
             house_number_info = address.building_name or ''
         phone = address.contact_mechanism_get({'phone', 'mobile'}, usage=usage)
         email = address.contact_mechanism_get('email', usage=usage)
-        name = address_name(address, party)
-        contact_name = party.full_name if party.full_name != name else None
+        name = address.party_full_name
+        contact_name = address.attn or ''
         return {
             'Name': name,
             'Street': street_name,
diff -r 3715120393fa -r 21569807a4b3 
modules/stock_package_shipping_sendcloud/stock.py
--- a/modules/stock_package_shipping_sendcloud/stock.py Wed Mar 25 08:20:17 
2026 +0100
+++ b/modules/stock_package_shipping_sendcloud/stock.py Fri Feb 27 12:55:11 
2026 +0100
@@ -8,7 +8,6 @@
 from trytond.i18n import gettext
 from trytond.model import fields
 from trytond.model.exceptions import AccessError
-from trytond.modules.stock_package_shipping.stock import address_name
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
 from trytond.wizard import StateAction, StateTransition, Wizard
@@ -149,17 +148,16 @@
 
         cm = UoM(ModelData.get_id('product', 'uom_centimeter'))
         kg = UoM(ModelData.get_id('product', 'uom_kilogram'))
-        party = shipment.shipping_to
         address = shipment.shipping_to_address
         phone = address.contact_mechanism_get(
             {'phone', 'mobile'}, usage=usage)
         email = address.contact_mechanism_get('email', usage=usage)
         street_lines = (address.street or '').splitlines()
-        name = address_name(address, party)
-        if party.full_name != name:
-            company_name = name
-            name = party.full_name
+        if address.attn:
+            name = address.attn
+            company_name = address.party_full_name
         else:
+            name = address.party_full_name
             company_name = None
         parcel = {
             'name': name,
diff -r 3715120393fa -r 21569807a4b3 modules/stock_package_shipping_ups/stock.py
--- a/modules/stock_package_shipping_ups/stock.py       Wed Mar 25 08:20:17 
2026 +0100
+++ b/modules/stock_package_shipping_ups/stock.py       Fri Feb 27 12:55:11 
2026 +0100
@@ -17,7 +17,6 @@
 from trytond.model.exceptions import AccessError
 from trytond.modules.stock_package_shipping.exceptions import (
     PackingValidationError)
-from trytond.modules.stock_package_shipping.stock import address_name
 from trytond.pool import Pool, PoolMeta
 from trytond.transaction import Transaction
 from trytond.wizard import StateAction, StateTransition, Wizard
@@ -235,8 +234,8 @@
             }
 
     def get_shipping_party(self, party, address, usage=None):
-        name = address_name(address, party)
-        attention_name = party.full_name
+        name = address.party_full_name
+        attention_name = address.attn or name
         shipping_party = {
             'Name': name[:35],
             'AttentionName': attention_name[:35],
diff -r 3715120393fa -r 21569807a4b3 modules/web_shop_shopify/party.py
--- a/modules/web_shop_shopify/party.py Wed Mar 25 08:20:17 2026 +0100
+++ b/modules/web_shop_shopify/party.py Fri Feb 27 12:55:11 2026 +0100
@@ -137,8 +137,10 @@
         values = {}
         values['party_name'] = remove_forbidden_chars(address['name'] or '')
         if address['company']:
-            values['party_name'] += (
-                f"({remove_forbidden_chars(address['company'])})")
+            values['attn'] = values['party_name']
+            values['party_name'] = remove_forbidden_chars(address['company'])
+        else:
+            values['attn'] = ''
         values['street'] = '\n'.join(filter(None, [
                     address['address1'], address['address2']]))
         values['city'] = remove_forbidden_chars(address['city'] or '')
@@ -167,6 +169,7 @@
     def shopify_values(self):
         values = {}
         values['party_name'] = self.party_name or ''
+        values['attn'] = self.attn or ''
         values['street'] = self.street or ''
         values['city'] = self.city or ''
         values['postal_code'] = self.postal_code or ''

Reply via email to