diff --git a/docassemble/AssemblyLine/al_general.py b/docassemble/AssemblyLine/al_general.py index 7fe1e4d8..404574e6 100644 --- a/docassemble/AssemblyLine/al_general.py +++ b/docassemble/AssemblyLine/al_general.py @@ -2558,7 +2558,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. @@ -2583,49 +2587,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 dc53103c..2aa1059d 100644 --- a/docassemble/AssemblyLine/test_al_general.py +++ b/docassemble/AssemblyLine/test_al_general.py @@ -1108,3 +1108,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 + )