From 484fa165a9f5b6c162d74138f0d0d5f3a38504ec Mon Sep 17 00:00:00 2001 From: Quinten Steenhuis Date: Sun, 25 Oct 2026 17:31:23 -0400 Subject: [PATCH] Fix ALIndividual address_block to include name and address in both formats --- docassemble/AssemblyLine/al_general.py | 59 ++++++--------------- docassemble/AssemblyLine/test_al_general.py | 48 +++++++++++++++++ 2 files changed, 64 insertions(+), 43 deletions(-) diff --git a/docassemble/AssemblyLine/al_general.py b/docassemble/AssemblyLine/al_general.py index 88592017..07fc0fcb 100644 --- a/docassemble/AssemblyLine/al_general.py +++ b/docassemble/AssemblyLine/al_general.py @@ -2514,7 +2514,11 @@ def address_block( show_impounded=False, ) -> str: """ - Generate a formatted address block for mailings. + Generate a mailing block containing the full name followed by the address. + + Uses Word line breaks in DOCX output and Docassemble line-break markers + elsewhere. Address confidentiality and formatting are delegated to the + address object. Use ``person.address.block()`` for an address without a name. Args: language (Optional): The language in which the address is written. @@ -2539,49 +2543,18 @@ def address_block( {{ users[0].address_block() }} ``` """ + name = self.name_full() + options = dict( + language=language, + international=international, + show_country=show_country, + ) + if isinstance(self.address, ALAddress): + options.update(bare=bare, show_impounded=show_impounded) + address = self.address.block(**options) if docassemble.base.functions.this_thread.evaluation_context == "docx": - if isinstance(self.address, ALAddress): - return self.address.block( - language=language, - international=international, - show_country=show_country, - bare=bare, - show_impounded=show_impounded, - ) - else: - # bare parameter is ignored for plain Address objects - return self.address.block( - language=language, - international=international, - show_country=show_country, - ) - else: - if isinstance(self.address, ALAddress): - return ( - "[FLUSHLEFT] " + self.name_full() - if isinstance(self, ALIndividual) - else self.name.full(middle="full") - + " [NEWLINE] " - + self.address.block( - language=language, - international=international, - show_country=show_country, - bare=bare, - show_impounded=show_impounded, - ) - ) - else: - return ( - "[FLUSHLEFT] " + self.name_full() - if isinstance(self, ALIndividual) - else self.name.full(middle="full") - + " [NEWLINE] " - + self.address.block( - language=language, - international=international, - show_country=show_country, - ) - ) + return name + '' + address + return "[FLUSHLEFT] " + name + " [NEWLINE] " + address def pronoun(self, **kwargs) -> str: """ diff --git a/docassemble/AssemblyLine/test_al_general.py b/docassemble/AssemblyLine/test_al_general.py index c1d393d5..e1ffc706 100644 --- a/docassemble/AssemblyLine/test_al_general.py +++ b/docassemble/AssemblyLine/test_al_general.py @@ -904,3 +904,51 @@ def test_hides_section_with_no_visible_subsections(self): if __name__ == "__main__": unittest.main() + + +class TestNameAndAddressBlock(unittest.TestCase): + def test_both_rendering_contexts_and_confidentiality(self): + import docassemble.base.functions + + person = ALIndividual("person") + person.name.first = "Alex" + person.name.middle = "" + person.name.last = "Rivera" + person.name.suffix = "" + person.address.address = "123 Main Street" + person.address.unit = "" + person.address.city = "Boston" + person.address.state = "MA" + person.address.zip = "02108" + person.address.country = "US" + for context, separator in [("docx", ""), ("pdf", "[NEWLINE]")]: + with self.subTest(context=context), patch.object( + docassemble.base.functions.this_thread, "evaluation_context", context + ): + result = person.address_block() + self.assertIn("Alex Rivera", result) + self.assertIn("123 Main Street", result) + self.assertIn(separator, result) + self.assertNotIn("Alex Rivera", person.address.block()) + person.address.impounded = True + person.address.impounded_output_label = "Confidential" + self.assertIn("Confidential", person.address_block()) + self.assertNotIn("123 Main Street", person.address_block()) + self.assertIn( + "123 Main Street", person.address_block(show_impounded=True) + ) + person.address.impounded = False + + def test_plain_address_does_not_receive_al_options(self): + from docassemble.base.util import Address + + person = ALIndividual("person") + person.name_full = Mock(return_value="Alex Rivera") + person.address = Address("plain_address") + person.address.block = Mock(return_value="123 Main Street") + self.assertIn( + "Alex Rivera", person.address_block(bare=True, show_impounded=True) + ) + person.address.block.assert_called_once_with( + language=None, international=False, show_country=False + )