docassemble.AssemblyLine 4.5.0__tar.gz → 4.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. docassemble_assemblyline-4.5.1/MANIFEST.in +17 -0
  2. {docassemble_assemblyline-4.5.0/docassemble.AssemblyLine.egg-info → docassemble_assemblyline-4.5.1}/PKG-INFO +1 -5
  3. docassemble_assemblyline-4.5.1/docassemble/AssemblyLine/__init__.py +1 -0
  4. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/al_document.py +107 -10
  5. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_language.yml +13 -2
  6. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/language.py +1 -1
  7. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/sessions.py +8 -8
  8. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/test_al_document.py +69 -0
  9. docassemble_assemblyline-4.5.1/docassemble/AssemblyLine/test_all_imports.py +12 -0
  10. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1/docassemble.AssemblyLine.egg-info}/PKG-INFO +1 -5
  11. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble.AssemblyLine.egg-info/SOURCES.txt +1 -4
  12. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/pyproject.toml +15 -1
  13. docassemble_assemblyline-4.5.1/setup.cfg +4 -0
  14. docassemble_assemblyline-4.5.0/MANIFEST.in +0 -1
  15. docassemble_assemblyline-4.5.0/docassemble/AssemblyLine/__init__.py +0 -1
  16. docassemble_assemblyline-4.5.0/docassemble/AssemblyLine/requirements.txt +0 -9
  17. docassemble_assemblyline-4.5.0/docassemble.AssemblyLine.egg-info/not-zip-safe +0 -1
  18. docassemble_assemblyline-4.5.0/setup.cfg +0 -7
  19. docassemble_assemblyline-4.5.0/setup.py +0 -60
  20. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/LICENSE +0 -0
  21. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/README.md +0 -0
  22. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/al_courts.py +0 -0
  23. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/al_general.py +0 -0
  24. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/custom_jinja_filters.py +0 -0
  25. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_code.yml +0 -0
  26. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_document.yml +0 -0
  27. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_package.yml +0 -0
  28. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_package_unstyled.yml +0 -0
  29. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_question_test.yml +0 -0
  30. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_reminders.yml +0 -0
  31. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_saved_sessions.yml +0 -0
  32. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_saved_sessions_store.yml +0 -0
  33. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_settings.yml +0 -0
  34. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_terms_of_use.yml +0 -0
  35. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/al_visual.yml +0 -0
  36. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/assembly_line.yml +0 -0
  37. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/assembly_line_unstyled.yml +0 -0
  38. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/demo_search_sessions.yml +0 -0
  39. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/feedback.yml +0 -0
  40. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/interview_list.yml +0 -0
  41. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/ql_baseline.yml +0 -0
  42. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/ql_catchall.yml +0 -0
  43. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/ql_namechange.yml +0 -0
  44. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/reserved_words.yml +0 -0
  45. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_al_table_document.yml +0 -0
  46. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_aladdendum.yml +0 -0
  47. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_alcourts.yml +0 -0
  48. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_aldocument.yml +0 -0
  49. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_aldocument_background_assembly.yml +0 -0
  50. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_alexhibit.yml +0 -0
  51. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_alexhibit_maxsize.yml +0 -0
  52. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_bundle_parity.yml +0 -0
  53. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_catchall.yml +0 -0
  54. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_familiar_disambiguation.yml +0 -0
  55. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_if_final.yml +0 -0
  56. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_preferred_formats.yml +0 -0
  57. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_preferred_name.yml +0 -0
  58. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_question_library.yml +0 -0
  59. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/questions/test_signature.yml +0 -0
  60. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/README.md +0 -0
  61. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/ar-words.yml +0 -0
  62. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/es-words.yml +0 -0
  63. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/fr-words.yml +0 -0
  64. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/languages.yml +0 -0
  65. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/ne-words.yml +0 -0
  66. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/test_aldocument.feature +0 -0
  67. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/test_alexhibit_docx_1.docx +0 -0
  68. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/test_alexhibit_jpg_1.jpg +0 -0
  69. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/test_alexhibit_pdf_1.pdf +0 -0
  70. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/test_alexhibit_png_1.png +0 -0
  71. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/test_question_library.feature +0 -0
  72. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/translation_es.xlsx +0 -0
  73. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/translation_ht.xlsx +0 -0
  74. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/sources/translation_pt.xlsx +0 -0
  75. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/README.md +0 -0
  76. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/al_audio.css +0 -0
  77. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/al_audio.js +0 -0
  78. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/aldocument.css +0 -0
  79. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/aldocument.js +0 -0
  80. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/interview_list.css +0 -0
  81. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/limit_upload_size.js +0 -0
  82. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/lt1-pullout-10-getting-organized.pdf +0 -0
  83. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/ma_logo.png +0 -0
  84. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/placeholder.png +0 -0
  85. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/seal.jpg +0 -0
  86. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/static/styles.css +0 -0
  87. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/README.md +0 -0
  88. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/al_basic_addendum.docx +0 -0
  89. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/exhibit_cover_sheet.docx +0 -0
  90. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/exhibit_table_of_contents.docx +0 -0
  91. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/general_cover_sheet.docx +0 -0
  92. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/sample_word_template.docx +0 -0
  93. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/test_aldocument_docx_1.docx +0 -0
  94. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/test_aldocument_pdf_1.pdf +0 -0
  95. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/test_catchall.docx +0 -0
  96. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/data/templates/test_if_final.docx +0 -0
  97. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/py.typed +0 -0
  98. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/sign.py +0 -0
  99. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/test_al_general.py +0 -0
  100. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble/AssemblyLine/test_language.py +0 -0
  101. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble.AssemblyLine.egg-info/dependency_links.txt +0 -0
  102. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble.AssemblyLine.egg-info/requires.txt +0 -0
  103. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.5.1}/docassemble.AssemblyLine.egg-info/top_level.txt +0 -0
@@ -0,0 +1,17 @@
1
+ include README.md
2
+ graft docassemble/AssemblyLine/data
3
+ recursive-exclude * *.egg-info
4
+ recursive-exclude .git *
5
+ recursive-exclude venv *
6
+ recursive-exclude .github *
7
+ recursive-exclude .pytest_cache *
8
+ recursive-exclude .vscode *
9
+ recursive-exclude build *
10
+ recursive-exclude dist *
11
+ recursive-exclude * __pycache__
12
+ recursive-exclude * *.pyc
13
+ recursive-exclude * *.pyo
14
+ recursive-exclude * *.orig
15
+ recursive-exclude * *~
16
+ recursive-exclude * *.bak
17
+ recursive-exclude * *.swp
@@ -1,9 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docassemble.AssemblyLine
3
- Version: 4.5.0
3
+ Version: 4.5.1
4
4
  Summary: Quickly go from a paper court form to a runnable, guided, step-by-step web application powered by Docassemble. Swap out branding and pre-built questions to meet your needs.
5
- Home-page: https://courtformsonline.org
6
- Author: Suffolk Legal Innovation and Technology Lab
7
5
  Author-email: Suffolk Legal Innovation and Technology Lab <litlab@suffolk.edu>
8
6
  License-Expression: MIT
9
7
  Project-URL: Homepage, https://courtformsonline.org
@@ -11,8 +9,6 @@ Description-Content-Type: text/markdown
11
9
  License-File: LICENSE
12
10
  Requires-Dist: docassemble.ALToolbox>=0.16.0
13
11
  Requires-Dist: docassemble.GitHubFeedbackForm>=0.4.1.1
14
- Dynamic: author
15
- Dynamic: home-page
16
12
  Dynamic: license-file
17
13
 
18
14
  # Suffolk LIT Lab Document Assembly Line
@@ -0,0 +1 @@
1
+ __version__ = '4.5.1'
@@ -945,6 +945,15 @@ class ALDocument(DADict):
945
945
  instance. These values will be used to detect and handle overflow.
946
946
  has_addendum (bool): (optional) Defaults to False. Set to True if the
947
947
  document could have overflow, like for a PDF template.
948
+ default_overflow_message (str): The message appended to truncated text when it overflows
949
+ to the addendum. Defaults to `"..."`. This is used as the fallback whenever
950
+ `overflow_message=None` is passed to :meth:`safe_value`,
951
+ :meth:`overflow_value`, or :meth:`original_or_overflow_message`.
952
+ Override per-document by setting `my_doc.default_overflow_message`.
953
+ suffix_to_append (str): When the document key matches this value, it is appended to
954
+ the output filename to distinguish it from other versions. Defaults to `"preview"`
955
+ so the preview version is saved as e.g. `myDoc_preview.pdf` while the final
956
+ version is saved as `myDoc.pdf`.
948
957
 
949
958
  Note:
950
959
  The `enabled` attribute should always be defined by a code block or the
@@ -1099,6 +1108,7 @@ class ALDocument(DADict):
1099
1108
 
1100
1109
  if isinstance(main_doc, DAFileCollection):
1101
1110
  main_doc = main_doc.pdf
1111
+ if isinstance(main_doc, DAFile):
1102
1112
  main_doc.title = self.title
1103
1113
  main_doc.filename = filename
1104
1114
  try:
@@ -1254,6 +1264,8 @@ class ALDocument(DADict):
1254
1264
  Args:
1255
1265
  field_name (str): The name of the field to check.
1256
1266
  overflow_message (str): A short message to go on the page where text is cutoff.
1267
+ If `None`, falls back to `self.default_overflow_message`
1268
+ (`"..."` by default).
1257
1269
  input_width (int): The width, in characters, of the input box. Defaults to 80.
1258
1270
  preserve_newlines (bool): Determines whether newlines are preserved in the "safe" text.
1259
1271
  Defaults to False, which means all newlines are removed. This allows more text to appear
@@ -1292,7 +1304,9 @@ class ALDocument(DADict):
1292
1304
 
1293
1305
  Args:
1294
1306
  field_name (str): The name of the field to retrieve the safe value from.
1295
- overflow_message (Optional[str]): Message to display when the field value overflows. Defaults to the class's default overflow message.
1307
+ overflow_message (Optional[str]): Message appended when the field value is truncated.
1308
+ If `None`, falls back to `self.default_overflow_message`
1309
+ (`"..."` by default).
1296
1310
  preserve_newlines (bool): Whether to maintain newlines in the output. Defaults to False.
1297
1311
  input_width (int): The expected input width, used for formatting. Defaults to 80.
1298
1312
  preserve_words (bool): Whether to avoid splitting words during formatting. Defaults to True.
@@ -1322,7 +1336,9 @@ class ALDocument(DADict):
1322
1336
 
1323
1337
  Args:
1324
1338
  field_name (str): The name of the field to retrieve the overflow value from.
1325
- overflow_message (Optional[str]): Message to display when the field value overflows. Defaults to the object's default overflow message.
1339
+ overflow_message (Optional[str]): Message appended when the safe portion of the field
1340
+ value is truncated. If `None`, falls back to `self.default_overflow_message`
1341
+ (`"..."` by default).
1326
1342
  preserve_newlines (bool): Whether to maintain newlines in the output. Defaults to False.
1327
1343
  input_width (int): The expected input width, used for formatting. Defaults to 80.
1328
1344
  preserve_words (bool): Whether to avoid splitting words during formatting. Defaults to True.
@@ -1548,7 +1564,62 @@ class ALDocumentBundle(DAList):
1548
1564
  enabled (bool, optional): Determines if the bundle is active. Defaults to True.
1549
1565
  auto_gather (bool, optional): Automatically gathers attributes. Defaults to False.
1550
1566
  gathered (bool, optional): Specifies if attributes have been gathered. Defaults to True.
1551
- default_parity (Optional[Literal["even", "odd"]]): Default parity to enforce on the PDF. Defaults to None.
1567
+ default_parity (Optional[Literal["even", "odd"]]): Default parity to enforce on the PDF.
1568
+ When set, :meth:`as_pdf` will append a blank page if necessary to reach the desired
1569
+ parity. Defaults to `None` (no enforcement).
1570
+ suffix_to_append (str): When the document key matches this value, it is appended to the
1571
+ output filename to distinguish it from other versions. Defaults to `"preview"`
1572
+ so the preview bundle is saved as e.g. `bundle_preview.pdf` while the final is
1573
+ saved as `bundle.pdf`.
1574
+ view_label (DALazyTemplate): Template providing the label for "View" buttons in
1575
+ :meth:`download_list_html`. Defined generically in `ql_baseline.yml`; resolves to
1576
+ `"View"` (or its translation). Override by assigning a new template to
1577
+ `your_bundle.view_label` in your interview YAML.
1578
+ download_label (DALazyTemplate): Template providing the label for "Download" buttons in
1579
+ :meth:`download_list_html`. Defined generically in `ql_baseline.yml`; resolves to
1580
+ `"Download"` (or its translation).
1581
+ send_label (DALazyTemplate): Template providing the label for "Send" buttons in
1582
+ :meth:`download_list_html`, :meth:`send_email_table_row`, and
1583
+ :meth:`send_button_to_html`. Defined generically in `ql_baseline.yml`; resolves to
1584
+ `"Send"` (or its translation).
1585
+ zip_label (DALazyTemplate): Template providing the label for the "Download all" zip
1586
+ button in :meth:`download_list_html`. Defined generically in `al_document.yml`;
1587
+ resolves to `"Download all"` (or its translation).
1588
+ full_pdf_label (DALazyTemplate): Template providing the label for the "Download as one
1589
+ PDF" button in :meth:`download_list_html`. Defined generically in
1590
+ `al_document.yml`; resolves to `"Download as one PDF"` (or its translation).
1591
+ send_email_template (DALazyTemplate): Template used as the default email subject and
1592
+ body in :meth:`send_email` when `template=None`. Defined generically in
1593
+ `al_document.yml`. The subject defaults to
1594
+ `"Your <document> document from <app> is ready"` and the body to
1595
+ `"Your document is attached. Visit <homepage> to learn more."`
1596
+ Override by assigning a new template block to `your_bundle.send_email_template`
1597
+ in your interview YAML.
1598
+ get_email_copy (DALazyTemplate): Template providing the header text for the email input
1599
+ section rendered by :meth:`send_button_html`. Defined generically in
1600
+ `al_document.yml`; resolves to `"Get a copy of the documents in email"`
1601
+ (or its translation).
1602
+ include_editable_documents (DALazyTemplate): Template providing the label for the
1603
+ "include editable copy" checkbox in :meth:`send_button_html`. Defined generically
1604
+ in `al_document.yml`; resolves to `"Include an editable copy"`
1605
+ (or its translation).
1606
+ add_page_numbers (bool): If `True`, Bates-style page numbers are stamped onto the
1607
+ merged PDF produced by :meth:`as_pdf`. Defaults to `False`.
1608
+ page_number_prefix (str): Text prepended to each stamped page number (e.g. `"EX-"`).
1609
+ Defaults to `""`.
1610
+ page_number_start (int): The first page number used when stamping page numbers.
1611
+ Defaults to `1`.
1612
+ page_number_digits (int): Minimum number of digits in each stamped page number;
1613
+ shorter numbers are left-padded with zeros. Defaults to `5`.
1614
+ page_number_area (Optional[str]): Location on the page where numbers are stamped.
1615
+ Accepted values: `"TOP_LEFT"`, `"TOP_RIGHT"`, `"BOTTOM_LEFT"`,
1616
+ `"BOTTOM_RIGHT"`. Defaults to `None` (bottom-right).
1617
+ page_number_font_size (float): Font size in points for stamped page numbers.
1618
+ Defaults to `10`.
1619
+ page_number_offset_horizontal (float): Horizontal inset in pixels from the nearest
1620
+ page edge for stamped page numbers. Defaults to `15`.
1621
+ page_number_offset_vertical (float): Vertical inset in pixels from the nearest page
1622
+ edge for stamped page numbers. Defaults to `15`.
1552
1623
 
1553
1624
  Examples:
1554
1625
  Given three documents: `Cover page`, `Main motion form`, and `Notice of Interpreter Request`,
@@ -1660,7 +1731,14 @@ class ALDocumentBundle(DAList):
1660
1731
  pdfa=pdfa,
1661
1732
  append_matching_suffix=append_matching_suffix,
1662
1733
  )
1734
+ bundle_filename = f"{base_name(self.filename)}{append_suffix}.pdf"
1663
1735
  pdf.title = self.title
1736
+ pdf.filename = bundle_filename
1737
+ try:
1738
+ pdf.set_attributes(filename=bundle_filename)
1739
+ pdf.set_mimetype("application/pdf")
1740
+ except:
1741
+ pass
1664
1742
  else:
1665
1743
  pdf = pdf_concatenate(
1666
1744
  [document.as_pdf(key=key, refresh=refresh) for document in files],
@@ -2064,13 +2142,21 @@ class ALDocumentBundle(DAList):
2064
2142
  refresh (bool): Flag to reconsider the 'enabled' attribute, default is True.
2065
2143
  pdfa (bool): Flag to return documents in PDF/A format, default is False.
2066
2144
  include_zip (bool): Flag to include a zip option, default is True.
2067
- view_label (str): Label for the 'view' button, default is self.view_label or "View".
2145
+ view_label (str): Label for the 'view' button. If `None`, falls back to
2146
+ `self.view_label` (a translatable template defined in `ql_baseline.yml`,
2147
+ defaulting to `"View"`).
2068
2148
  view_icon (str): Icon for the 'view' button, default is "eye".
2069
- download_label (str): Label for the 'download' button, default is self.download_label or "Download".
2149
+ download_label (str): Label for the 'download' button. If `None`, falls back to
2150
+ `self.download_label` (a translatable template defined in `ql_baseline.yml`,
2151
+ defaulting to `"Download"`).
2070
2152
  download_icon (str): Icon for the 'download' button, default is "download".
2071
- send_label (str): Label for the 'send' button. Default is self.send_label or "Send".
2153
+ send_label (str): Label for the 'send' button. If `None`, falls back to
2154
+ `self.send_label` (a translatable template defined in `ql_baseline.yml`,
2155
+ defaulting to `"Send"`).
2072
2156
  send_icon (str): Fontawesome icon for the 'send' button. Default is "envelope".
2073
- zip_label (Optional[str]): Label for the zip option. If not provided, uses the generic template for `self.zip_label` ("Download all").
2157
+ zip_label (Optional[str]): Label for the zip button. If `None`, falls back to
2158
+ `self.zip_label` (a translatable template defined in `al_document.yml`,
2159
+ defaulting to `"Download all"`).
2074
2160
  zip_icon (str): Icon for the zip option, default is "file-archive".
2075
2161
  zip_row_label (str, optional): Text to go in the left-most column
2076
2162
  of the table's zip row. Will default to the value of `self.title`.
@@ -2296,7 +2382,9 @@ class ALDocumentBundle(DAList):
2296
2382
 
2297
2383
  Args:
2298
2384
  key (str): A key used to identify which version of the ALDocument to send. Defaults to "final".
2299
- send_label (str): Label for the 'send' button. Default is "Send".
2385
+ send_label (str): Label for the 'send' button. If `None`, falls back to
2386
+ `self.send_label` (a translatable template defined in `ql_baseline.yml`,
2387
+ defaulting to `"Send"`).
2300
2388
  send_icon (str): Icon for the 'send' button. Default is "envelope".
2301
2389
 
2302
2390
  Returns:
@@ -2360,7 +2448,9 @@ class ALDocumentBundle(DAList):
2360
2448
  email (str): The recipient's email address.
2361
2449
  editable (bool, optional): Flag indicating if the bundle is editable. Defaults to False. (deprecated; use preferred_formats instead)
2362
2450
  template_name (str, optional): The name of the template to be used. Defaults to an empty string.
2363
- label (str, optional): The label for the button. Defaults to "Send".
2451
+ label (str, optional): The label for the button. If `None`, falls back to
2452
+ `self.send_label` (a translatable template defined in `ql_baseline.yml`,
2453
+ defaulting to `"Send"`).
2364
2454
  icon (str, optional): The Fontawesome icon for the button. Defaults to "envelope".
2365
2455
  color (str, optional): The Bootstrap color of the button. Defaults to "primary".
2366
2456
  key (str, optional): A key used to identify which version of the ALDocument to send. Defaults to "final".
@@ -2528,7 +2618,14 @@ class ALDocumentBundle(DAList):
2528
2618
  to (Any): The email address, list of email addresses, or list of Individuals with a .email attribute to send to.
2529
2619
  key (str, optional): Specifies which version of the document to send. Defaults to "final".
2530
2620
  editable (bool, optional): If True, sends the editable documents. Defaults to False. (Deprecated)
2531
- template (Any): The template variable for the subject and body of the email, similar to da `send_email` `template` variable.
2621
+ template (Any, optional): The template variable for the subject and body of the email,
2622
+ similar to the `template` parameter of docassemble's `send_email` function.
2623
+ If `None`, falls back to `self.send_email_template`, a template defined
2624
+ generically in `al_document.yml`. Its subject defaults to
2625
+ `"Your <document> document from <app> is ready"` and its body to
2626
+ `"Your document is attached. Visit <homepage> to learn more."`
2627
+ Override it by assigning a new template block to `your_bundle.send_email_template`
2628
+ in your interview YAML.
2532
2629
  preferred_formats (str): Specifies the format of the files to send. Can be "pdf" or "docx", or a list of these formats. Overrides deprecated `editable` keyword.
2533
2630
  **kwargs: Additional parameters to pass to the da `send_email` function.
2534
2631
 
@@ -19,13 +19,16 @@ code: |
19
19
  default screen parts:
20
20
  navigation bar html: |
21
21
  % if enable_al_language and len(al_interview_languages) > 1:
22
- ${ get_language_list_dropdown(al_interview_languages,current=al_user_language ) }
22
+ ${ get_language_list_dropdown(al_interview_languages, current=session_local.attr("al_user_language") or al_user_language ) }
23
23
  % endif
24
24
  ---
25
25
  initial: True
26
26
  code: |
27
27
  if enable_al_language:
28
- set_language(al_user_language)
28
+ if session_local.attr("al_user_language"):
29
+ set_language(session_local.attr("al_user_language"))
30
+ else:
31
+ set_language(al_user_language)
29
32
  process_action()
30
33
  ---
31
34
  code: |
@@ -37,6 +40,14 @@ code: |
37
40
  ---
38
41
  event: al_change_language
39
42
  code: |
43
+ # Set browser-specific language for this interview session
44
+ if "lang" in action_arguments():
45
+ session_local.al_user_language = action_argument("lang")
46
+ set_language(session_local.al_user_language)
47
+ ---
48
+ event: al_get_language_list_change_language
49
+ code: |
50
+ # Set "global" language for this interview session instead of user-specific
40
51
  if "lang" in action_arguments():
41
52
  al_user_language = action_argument("lang")
42
53
  set_language(al_user_language)
@@ -173,7 +173,7 @@ def get_language_list(
173
173
  current="",
174
174
  lang_codes: Optional[List[str]] = None,
175
175
  languages_path: Optional[str] = None,
176
- event_name="al_change_language",
176
+ event_name="al_get_language_list_change_language",
177
177
  ) -> str:
178
178
  """
179
179
  Given a list of language codes, returns
@@ -310,8 +310,8 @@ def get_interview_metadata(
310
310
  {"filename": filename, "tags": metadata_key_name, "session_id": session_id},
311
311
  ).fetchone()
312
312
 
313
- if row:
314
- return row[0] # row is a RowMapping/tuple; data is column 0
313
+ if row:
314
+ return row[0] # row is a RowMapping/tuple; data is column 0
315
315
  return {}
316
316
 
317
317
 
@@ -447,6 +447,7 @@ def get_saved_interview_list(
447
447
  log("Asked to get interview list for user that is not logged in")
448
448
  return []
449
449
 
450
+ sessions = []
450
451
  with db.connect() as con:
451
452
  rs = con.execute(
452
453
  get_sessions_query,
@@ -463,9 +464,8 @@ def get_saved_interview_list(
463
464
  ), # We need to pass a value to the query, but it's treated as a flag
464
465
  },
465
466
  )
466
- sessions = []
467
- for session in rs:
468
- sessions.append(dict(session._mapping))
467
+ for session in rs:
468
+ sessions.append(dict(session._mapping))
469
469
 
470
470
  return sessions
471
471
 
@@ -665,12 +665,12 @@ def find_matching_sessions(
665
665
  for column, val_tuple in metadata_filters.items():
666
666
  parameters[f"{column}_filter"] = val_tuple[0]
667
667
 
668
+ sessions = []
668
669
  with db.connect() as con:
669
670
  rs = con.execute(get_sessions_query, parameters)
670
671
 
671
- sessions = []
672
- for session in rs:
673
- sessions.append(dict(session._mapping))
672
+ for session in rs:
673
+ sessions.append(dict(session._mapping))
674
674
 
675
675
  return sessions
676
676
 
@@ -35,6 +35,75 @@ class test_dont_assume_pdf(unittest.TestCase):
35
35
  pass
36
36
 
37
37
 
38
+ class FakePdf(DAFile):
39
+ def __init__(self, filename="file.pdf", title="child"):
40
+ self.instanceName = "fake_pdf"
41
+ self.has_nonrandom_instance_name = True
42
+ self.filename = filename
43
+ self.title = title
44
+ self.attribute_filenames = []
45
+ self.mimetype = None
46
+
47
+ def set_attributes(self, **kwargs):
48
+ if "filename" in kwargs:
49
+ self.attribute_filenames.append(kwargs["filename"])
50
+
51
+ def set_mimetype(self, mimetype):
52
+ self.mimetype = mimetype
53
+
54
+
55
+ class FakeSingleDoc:
56
+ def __init__(self, pdf):
57
+ self._pdf = pdf
58
+
59
+ def is_enabled(self, refresh=True):
60
+ return True
61
+
62
+ def as_pdf(self, **kwargs):
63
+ return self._pdf
64
+
65
+
66
+ class TestSingleDocumentBundleFilename(unittest.TestCase):
67
+ def test_bundle_as_pdf_renames_single_document_to_bundle_filename(self):
68
+ child_pdf = FakePdf()
69
+ bundle = ALDocumentBundle(
70
+ "bundle",
71
+ elements=[FakeSingleDoc(child_pdf)],
72
+ title="Bundle title",
73
+ filename="bundle-output.pdf",
74
+ enabled=True,
75
+ )
76
+
77
+ result = bundle.as_pdf()
78
+
79
+ self.assertIs(result, child_pdf)
80
+ self.assertEqual(result.title, "Bundle title")
81
+ self.assertEqual(result.filename, "bundle-output.pdf")
82
+ self.assertEqual(result.attribute_filenames, ["bundle-output.pdf"])
83
+ self.assertEqual(result.mimetype, "application/pdf")
84
+
85
+
86
+ class TestSingleDocumentFilename(unittest.TestCase):
87
+ def test_document_as_pdf_renames_plain_dafile_to_document_filename(self):
88
+ child_pdf = FakePdf()
89
+ doc = ALDocument(
90
+ "doc",
91
+ title="Document title",
92
+ filename="document-output.pdf",
93
+ enabled=True,
94
+ has_addendum=False,
95
+ )
96
+ doc["final"] = child_pdf
97
+
98
+ result = doc.as_pdf(refresh=False)
99
+
100
+ self.assertIs(result, child_pdf)
101
+ self.assertEqual(result.title, "Document title")
102
+ self.assertEqual(result.filename, "document-output.pdf")
103
+ self.assertEqual(result.attribute_filenames, ["document-output.pdf"])
104
+ self.assertEqual(result.mimetype, "application/pdf")
105
+
106
+
38
107
  class test_aladdendum(unittest.TestCase):
39
108
  def test_safe_value(self):
40
109
  text_testcase1 = """Charged by my father with a very delicate mission, I repaired, towards the end of May, 1788, to the château of Ionis, situated a dozen leagues distant, in the lands lying between Angers and Saumur. I was twenty-two, and already practising the profession of lawyer, for which I experienced but slight inclination, although neither the study of business nor of argument had presented serious difficulties to me. Taking my youth into consideration, I was not esteemed without talent, and the standing of my father, a lawyer renowned in the locality, assured me a brilliant patronage in the future, in return for any paltry efforts I might make to be worthy of replacing him. But I would have preferred literature, a more dreamy life, a more independent and more individual use of my faculties, a responsibility less submissive to the passions and interests of others. As my family was well off, and I an only son, greatly spoiled and petted, I might have chosen my own career, but I would have thus afflicted my father, who took pride in his ability to direct me 4in the road which he had cleared in advance, and I loved him too tenderly to permit my instinct to outweigh his wishes.
@@ -0,0 +1,12 @@
1
+ # Makes sure that loading each module file works.
2
+ # Includes all imports not covered by other test files.
3
+
4
+ from .al_courts import *
5
+ from .custom_jinja_filters import *
6
+ from .language import *
7
+ from .sign import *
8
+
9
+ try:
10
+ from .sessions import *
11
+ except SystemExit as ex:
12
+ print(f"Ignoring SystemExit error (expected from config.py: {ex})")
@@ -1,9 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docassemble.AssemblyLine
3
- Version: 4.5.0
3
+ Version: 4.5.1
4
4
  Summary: Quickly go from a paper court form to a runnable, guided, step-by-step web application powered by Docassemble. Swap out branding and pre-built questions to meet your needs.
5
- Home-page: https://courtformsonline.org
6
- Author: Suffolk Legal Innovation and Technology Lab
7
5
  Author-email: Suffolk Legal Innovation and Technology Lab <litlab@suffolk.edu>
8
6
  License-Expression: MIT
9
7
  Project-URL: Homepage, https://courtformsonline.org
@@ -11,8 +9,6 @@ Description-Content-Type: text/markdown
11
9
  License-File: LICENSE
12
10
  Requires-Dist: docassemble.ALToolbox>=0.16.0
13
11
  Requires-Dist: docassemble.GitHubFeedbackForm>=0.4.1.1
14
- Dynamic: author
15
- Dynamic: home-page
16
12
  Dynamic: license-file
17
13
 
18
14
  # Suffolk LIT Lab Document Assembly Line
@@ -2,12 +2,9 @@ LICENSE
2
2
  MANIFEST.in
3
3
  README.md
4
4
  pyproject.toml
5
- setup.cfg
6
- setup.py
7
5
  docassemble.AssemblyLine.egg-info/PKG-INFO
8
6
  docassemble.AssemblyLine.egg-info/SOURCES.txt
9
7
  docassemble.AssemblyLine.egg-info/dependency_links.txt
10
- docassemble.AssemblyLine.egg-info/not-zip-safe
11
8
  docassemble.AssemblyLine.egg-info/requires.txt
12
9
  docassemble.AssemblyLine.egg-info/top_level.txt
13
10
  docassemble/AssemblyLine/__init__.py
@@ -17,11 +14,11 @@ docassemble/AssemblyLine/al_general.py
17
14
  docassemble/AssemblyLine/custom_jinja_filters.py
18
15
  docassemble/AssemblyLine/language.py
19
16
  docassemble/AssemblyLine/py.typed
20
- docassemble/AssemblyLine/requirements.txt
21
17
  docassemble/AssemblyLine/sessions.py
22
18
  docassemble/AssemblyLine/sign.py
23
19
  docassemble/AssemblyLine/test_al_document.py
24
20
  docassemble/AssemblyLine/test_al_general.py
21
+ docassemble/AssemblyLine/test_all_imports.py
25
22
  docassemble/AssemblyLine/test_language.py
26
23
  docassemble/AssemblyLine/data/questions/al_code.yml
27
24
  docassemble/AssemblyLine/data/questions/al_document.yml
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "docassemble.AssemblyLine"
9
- version = "4.5.0"
9
+ version = "4.5.1"
10
10
  description = "Quickly go from a paper court form to a runnable, guided, step-by-step web application powered by Docassemble. Swap out branding and pre-built questions to meet your needs."
11
11
  readme = "README.md"
12
12
  authors = [
@@ -62,3 +62,17 @@ ignore_missing_imports = true
62
62
  [[tool.mypy.overrides]]
63
63
  module = "backports.*"
64
64
  ignore_missing_imports = true
65
+
66
+ [dependency-groups]
67
+ dev = [
68
+ "docassemble.base>=1.7",
69
+ "docassemble.webapp>=1.7",
70
+ "pytest>=7.0",
71
+ "mypy",
72
+ "pandas-stubs",
73
+ "sqlalchemy[mypy]>=1.3.0",
74
+ "types-PyYAML",
75
+ "types-requests",
76
+ "types-psycopg2",
77
+ ]
78
+
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -1 +0,0 @@
1
- include README.md
@@ -1 +0,0 @@
1
- __version__ = '4.5.0'
@@ -1,9 +0,0 @@
1
- docassemble.base>=1.3
2
- docassemble.webapp
3
- mypy
4
- pandas-stubs
5
- sqlalchemy[mypy]
6
- types-PyYAML
7
- PyGithub
8
- types-requests
9
- types-psycopg2
@@ -1,7 +0,0 @@
1
- [metadata]
2
- description_file = README.md
3
-
4
- [egg_info]
5
- tag_build =
6
- tag_date = 0
7
-
@@ -1,60 +0,0 @@
1
- import os
2
- import sys
3
- from setuptools import setup, find_namespace_packages
4
- from fnmatch import fnmatchcase
5
- from distutils.util import convert_path
6
-
7
- standard_exclude = ('*.pyc', '*~', '.*', '*.bak', '*.swp*')
8
- standard_exclude_directories = ('.*', 'CVS', '_darcs', './build', './dist', 'EGG-INFO', '*.egg-info')
9
-
10
- def find_package_data(where='.', package='', exclude=standard_exclude, exclude_directories=standard_exclude_directories):
11
- out = {}
12
- stack = [(convert_path(where), '', package)]
13
- while stack:
14
- where, prefix, package = stack.pop(0)
15
- for name in os.listdir(where):
16
- fn = os.path.join(where, name)
17
- if os.path.isdir(fn):
18
- bad_name = False
19
- for pattern in exclude_directories:
20
- if (fnmatchcase(name, pattern)
21
- or fn.lower() == pattern.lower()):
22
- bad_name = True
23
- break
24
- if bad_name:
25
- continue
26
- if os.path.isfile(os.path.join(fn, '__init__.py')):
27
- if not package:
28
- new_package = name
29
- else:
30
- new_package = package + '.' + name
31
- stack.append((fn, '', new_package))
32
- else:
33
- stack.append((fn, prefix + name + '/', package))
34
- else:
35
- bad_name = False
36
- for pattern in exclude:
37
- if (fnmatchcase(name, pattern)
38
- or fn.lower() == pattern.lower()):
39
- bad_name = True
40
- break
41
- if bad_name:
42
- continue
43
- out.setdefault(package, []).append(prefix+name)
44
- return out
45
-
46
- setup(name='docassemble.AssemblyLine',
47
- version='4.5.0',
48
- description=(''),
49
- long_description='# Suffolk LIT Lab Document Assembly Line\r\n\r\n[![PyPI version](https://badge.fury.io/py/docassemble-AssemblyLine.svg)](https://badge.fury.io/py/docassemble-AssemblyLine)\r\n\r\n<img src="https://user-images.githubusercontent.com/7645641/142245862-c2eb02ab-3090-4e97-9653-bb700bf4c54d.png" alt="drawing" width="300" alt="work together" style="align: center;"/>\r\n\r\nThe Assembly Line Project is a collection of volunteers, students, and institutions who joined together\r\nduring the COVID-19 pandemic to help increase access to the court system. Our vision is mobile-friendly,\r\neasy to use **guided** online forms that help empower litigants to access the court remotely.\r\n\r\nOur signature project is [CourtFormsOnline.org](https://courtformsonline.org).\r\n\r\nWe designed a step-by-step, assembly line style process for automating court forms on top of Docassemble\r\nand built several tools along the way that **you** can use in your home jurisdiction.\r\n\r\nThis package contains **runtime code** and **pre-written questions** to support authoring robust, \r\nconsistent, and attractive Docassemble interviews that help complete court forms.\r\n\r\nRead more on our [documentation page](https://suffolklitlab.org/docassemble-AssemblyLine-documentation/).\r\n\r\n\r\n# Related repositories\r\n\r\n* https://github.com/SuffolkLitLab/docassemble-ALWeaver\r\n* https://github.com/SuffolkLitLab/docassemble-ALMassachusetts\r\n* https://github.com/SuffolkLitLab/docassemble-MassAccess\r\n* https://github.com/SuffolkLitLab/docassemble-ALThemeTemplate\r\n* https://github.com/SuffolkLitLab/EfileProxyServer\r\n\r\n# Documentation\r\n\r\nhttps://suffolklitlab.org/docassemble-AssemblyLine-documentation/\r\n\r\n# Installation\r\n\r\n## Menu-driven installation\r\n\r\nThe recommended installation method is with the [guided installation script](https://suffolklitlab.org/docassemble-AssemblyLine-documentation/docs/installation).\r\n\r\n## Manual installation\r\n\r\nNormally you do not need to manually install the Assembly Line. Use the [installation script](https://suffolklitlab.org/docassemble-AssemblyLine-documentation/docs/installation)\r\nif you can. The instructions below are for your optional reference.\r\n\r\nThis package depends on the following configuration changes on your Docassemble server:\r\n\r\n* Ensure that [font-awesome](https://docassemble.org/docs/config.html#default%20icons) is enabled (this may be on by default:\r\n```yaml\r\ndefault icons: font awesome\r\n```\r\n* Add a [Google API key](https://docassemble.org/docs/config.html#google) that has access to:\r\n * Google Places API\r\n * Google Geocoding API\r\n* Add a [VoiceRSS API key](https://docassemble.org/docs/config.html#voicerss)\r\n* Add a [Twilio API key](https://docassemble.org/docs/config.html#twilio) for SMS support\r\n* Add an email account: [Mailgun](https://docassemble.org/docs/config.html#mailgun%20api) or [SendGrid](https://docassemble.org/docs/config.html#sendgrid%20api) recommended for email support\r\n* To show package update time and to enable the feedback form, add a GitHub Private Access token to your config.yml file, like this:\r\n```yaml\r\n# Needs access to create new issues on repositories\r\ngithub issues:\r\n username: "suffolklitlab-issues"\r\n token: "12345"\r\n# Does not need any special access to public repositories \r\ngithub readonly:\r\n username: "suffolklitlab-issues"\r\n password: "45678"\r\n type: "basic"\r\n```\r\n* If you are also using the [Assembly Line Weaver](https://github.com/SuffolkLITLab/docassemble-assemblylinewizard), you may want to set up a [Docassemble API key](https://docassemble.org/docs/api.html#manage_api) in your config.yml file to allow you to install packages automatically, like this:\r\n```yaml\r\ninstall packages api key: 12345\r\n```\r\n\r\n# Migration\r\n\r\nSee [discussion here](https://github.com/SuffolkLITLab/docassemble-AssemblyLine/issues/69)\r\n\r\n\r\n# ALDocument class\r\n\r\n## Purpose\r\n\r\nThe ALDocument class is a small utility library that makes it simpler to use the following features in an interview:\r\n\r\n* Conditional assembly of multiple, optional documents that are triggered in different ways in your interview\r\n* An addendum for PDF files that makes it simple to deal with overflow text\r\n* A customizable download screen that lists the documents in a neat table\r\n* A customizable "send" button that allows the user to email the final forms to a location of their choice\r\n\r\nHere is a small snippet that you can copy and modify that shows how to use the most important features of the ALDocument class.\r\n\r\n```\r\n---\r\nobjects:\r\n - CRA_Motion_to_Dismiss_attachment: ALDocument.using(filename="CRA_Motion_to_Dismiss", title="Motion to Dismiss CRA", enabled=True, has_addendum=True, default_overflow_message="[See addendum]") \r\n---\r\nobjects:\r\n - al_user_bundle: ALDocumentBundle.using(elements=[CRA_Motion_to_Dismiss_attachment], title="Forms to download and deliver to court", filename="motion_to_dismiss_CRA.pdf")\r\n - al_court_bundle: ALDocumentBundle.using(elements=[CRA_Motion_to_Dismiss_attachment], title="Forms to download and deliver to court", filename="motion_to_dismiss_CRA.pdf")\r\n---\r\ngeneric object: ALDocument\r\nattachment:\r\n variable name: x.addendum\r\n docx template file: docx_addendum.docx\r\n---\r\ncode: |\r\n CRA_Motion_to_Dismiss_attachment.overflow_fields[\'reasons_for_request\'].overflow_trigger = 640\r\n CRA_Motion_to_Dismiss_attachment.overflow_fields[\'reasons_for_request\'].label = "Reasons for request"\r\n CRA_Motion_to_Dismiss_attachment.overflow_fields.gathered = True\r\n \r\n---\r\nattachment:\r\n variable name: CRA_Motion_to_Dismiss_attachment[i]\r\n name: CRA Motion to Dismiss\r\n filename: CRA_Motion_to_Dismiss\r\n skip undefined: True\r\n pdf template file: CRA_Motion_to_Dismiss.pdf\r\n fields: \r\n - "court_county": ${ trial_court.address.county }\r\n - "docket_number": ${ docket_number }\r\n - "user_signature": ${ users[0].signature_if_final(i) }\r\n - "signature_date": ${ signature_date }\r\n```\r\n\r\nIt is very common to have a *contingent* document in ALDocument. If your document is contingent, remove the `enabled=True` from the object declaration, and use\r\nsome other method to "turn on" the attachment.\r\n\r\nE.g.,\r\n\r\n```\r\ncode: |\r\n CRA_Motion_to_Dismiss_attachment.enabled = condition1 and condition2\r\n```\r\n\r\n# Changelog\r\n\r\nSee [CHANGELOG.MD](https://github.com/SuffolkLITLab/docassemble-AssemblyLine/blob/main/CHANGELOG.md)\r\n',
50
- long_description_content_type='text/markdown',
51
- author='Suffolk Legal Innovation and Technology Lab',
52
- author_email='qsteenhuis@suffolk.edu',
53
- license='The MIT License (MIT)',
54
- url='https://courtformsonline.org',
55
- packages=find_namespace_packages(),
56
- install_requires=['docassemble.ALToolbox>=0.16.0', 'docassemble.GithubFeedbackForm>=0.4.1.1'],
57
- zip_safe=False,
58
- package_data=find_package_data(where='docassemble/AssemblyLine/', package='docassemble.AssemblyLine'),
59
- )
60
-