docassemble.AssemblyLine 4.5.0__tar.gz → 4.6.0__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 (104) hide show
  1. docassemble_assemblyline-4.6.0/MANIFEST.in +17 -0
  2. {docassemble_assemblyline-4.5.0/docassemble.AssemblyLine.egg-info → docassemble_assemblyline-4.6.0}/PKG-INFO +1 -5
  3. docassemble_assemblyline-4.6.0/docassemble/AssemblyLine/__init__.py +1 -0
  4. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/al_document.py +114 -13
  5. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_code.yml +4 -3
  6. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_document.yml +3 -3
  7. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_language.yml +13 -2
  8. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_settings.yml +2 -2
  9. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/interview_list.yml +4 -4
  10. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/ql_baseline.yml +6 -2
  11. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_signature.yml +2 -0
  12. docassemble_assemblyline-4.6.0/docassemble/AssemblyLine/data/templates/sample_word_template.docx +0 -0
  13. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/language.py +1 -1
  14. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/sessions.py +8 -8
  15. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/test_al_document.py +69 -0
  16. docassemble_assemblyline-4.6.0/docassemble/AssemblyLine/test_all_imports.py +12 -0
  17. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0/docassemble.AssemblyLine.egg-info}/PKG-INFO +1 -5
  18. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble.AssemblyLine.egg-info/SOURCES.txt +1 -4
  19. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/pyproject.toml +15 -1
  20. docassemble_assemblyline-4.6.0/setup.cfg +4 -0
  21. docassemble_assemblyline-4.5.0/MANIFEST.in +0 -1
  22. docassemble_assemblyline-4.5.0/docassemble/AssemblyLine/__init__.py +0 -1
  23. docassemble_assemblyline-4.5.0/docassemble/AssemblyLine/data/templates/sample_word_template.docx +0 -0
  24. docassemble_assemblyline-4.5.0/docassemble/AssemblyLine/requirements.txt +0 -9
  25. docassemble_assemblyline-4.5.0/docassemble.AssemblyLine.egg-info/not-zip-safe +0 -1
  26. docassemble_assemblyline-4.5.0/setup.cfg +0 -7
  27. docassemble_assemblyline-4.5.0/setup.py +0 -60
  28. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/LICENSE +0 -0
  29. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/README.md +0 -0
  30. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/al_courts.py +0 -0
  31. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/al_general.py +0 -0
  32. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/custom_jinja_filters.py +0 -0
  33. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_package.yml +0 -0
  34. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_package_unstyled.yml +0 -0
  35. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_question_test.yml +0 -0
  36. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_reminders.yml +0 -0
  37. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_saved_sessions.yml +0 -0
  38. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_saved_sessions_store.yml +0 -0
  39. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_terms_of_use.yml +0 -0
  40. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/al_visual.yml +0 -0
  41. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/assembly_line.yml +0 -0
  42. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/assembly_line_unstyled.yml +0 -0
  43. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/demo_search_sessions.yml +0 -0
  44. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/feedback.yml +0 -0
  45. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/ql_catchall.yml +0 -0
  46. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/ql_namechange.yml +0 -0
  47. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/reserved_words.yml +0 -0
  48. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_al_table_document.yml +0 -0
  49. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_aladdendum.yml +0 -0
  50. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_alcourts.yml +0 -0
  51. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_aldocument.yml +0 -0
  52. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_aldocument_background_assembly.yml +0 -0
  53. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_alexhibit.yml +0 -0
  54. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_alexhibit_maxsize.yml +0 -0
  55. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_bundle_parity.yml +0 -0
  56. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_catchall.yml +0 -0
  57. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_familiar_disambiguation.yml +0 -0
  58. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_if_final.yml +0 -0
  59. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_preferred_formats.yml +0 -0
  60. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_preferred_name.yml +0 -0
  61. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/questions/test_question_library.yml +0 -0
  62. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/README.md +0 -0
  63. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/ar-words.yml +0 -0
  64. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/es-words.yml +0 -0
  65. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/fr-words.yml +0 -0
  66. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/languages.yml +0 -0
  67. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/ne-words.yml +0 -0
  68. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/test_aldocument.feature +0 -0
  69. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/test_alexhibit_docx_1.docx +0 -0
  70. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/test_alexhibit_jpg_1.jpg +0 -0
  71. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/test_alexhibit_pdf_1.pdf +0 -0
  72. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/test_alexhibit_png_1.png +0 -0
  73. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/test_question_library.feature +0 -0
  74. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/translation_es.xlsx +0 -0
  75. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/translation_ht.xlsx +0 -0
  76. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/sources/translation_pt.xlsx +0 -0
  77. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/README.md +0 -0
  78. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/al_audio.css +0 -0
  79. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/al_audio.js +0 -0
  80. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/aldocument.css +0 -0
  81. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/aldocument.js +0 -0
  82. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/interview_list.css +0 -0
  83. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/limit_upload_size.js +0 -0
  84. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/lt1-pullout-10-getting-organized.pdf +0 -0
  85. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/ma_logo.png +0 -0
  86. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/placeholder.png +0 -0
  87. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/seal.jpg +0 -0
  88. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/static/styles.css +0 -0
  89. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/README.md +0 -0
  90. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/al_basic_addendum.docx +0 -0
  91. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/exhibit_cover_sheet.docx +0 -0
  92. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/exhibit_table_of_contents.docx +0 -0
  93. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/general_cover_sheet.docx +0 -0
  94. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/test_aldocument_docx_1.docx +0 -0
  95. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/test_aldocument_pdf_1.pdf +0 -0
  96. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/test_catchall.docx +0 -0
  97. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/data/templates/test_if_final.docx +0 -0
  98. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/py.typed +0 -0
  99. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/sign.py +0 -0
  100. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/test_al_general.py +0 -0
  101. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble/AssemblyLine/test_language.py +0 -0
  102. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble.AssemblyLine.egg-info/dependency_links.txt +0 -0
  103. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/docassemble.AssemblyLine.egg-info/requires.txt +0 -0
  104. {docassemble_assemblyline-4.5.0 → docassemble_assemblyline-4.6.0}/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.6.0
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.6.0'
@@ -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],
@@ -1677,6 +1755,7 @@ class ALDocumentBundle(DAList):
1677
1755
  font_size=self.page_number_font_size,
1678
1756
  offset_horizontal=self.page_number_offset_horizontal,
1679
1757
  offset_vertical=self.page_number_offset_vertical,
1758
+ filename=pdf.filename,
1680
1759
  )
1681
1760
  pdf.title = self.title
1682
1761
  setattr(self.cache, safe_key, pdf)
@@ -2064,13 +2143,21 @@ class ALDocumentBundle(DAList):
2064
2143
  refresh (bool): Flag to reconsider the 'enabled' attribute, default is True.
2065
2144
  pdfa (bool): Flag to return documents in PDF/A format, default is False.
2066
2145
  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".
2146
+ view_label (str): Label for the 'view' button. If `None`, falls back to
2147
+ `self.view_label` (a translatable template defined in `ql_baseline.yml`,
2148
+ defaulting to `"View"`).
2068
2149
  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".
2150
+ download_label (str): Label for the 'download' button. If `None`, falls back to
2151
+ `self.download_label` (a translatable template defined in `ql_baseline.yml`,
2152
+ defaulting to `"Download"`).
2070
2153
  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".
2154
+ send_label (str): Label for the 'send' button. If `None`, falls back to
2155
+ `self.send_label` (a translatable template defined in `ql_baseline.yml`,
2156
+ defaulting to `"Send"`).
2072
2157
  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").
2158
+ zip_label (Optional[str]): Label for the zip button. If `None`, falls back to
2159
+ `self.zip_label` (a translatable template defined in `al_document.yml`,
2160
+ defaulting to `"Download all"`).
2074
2161
  zip_icon (str): Icon for the zip option, default is "file-archive".
2075
2162
  zip_row_label (str, optional): Text to go in the left-most column
2076
2163
  of the table's zip row. Will default to the value of `self.title`.
@@ -2137,7 +2224,7 @@ class ALDocumentBundle(DAList):
2137
2224
  download_doc.url_for(
2138
2225
  attachment=True, display_filename=download_filename
2139
2226
  ),
2140
- label=download_label,
2227
+ label=f'{download_label} <span class="visually-hidden">{title}</span>',
2141
2228
  icon=download_icon,
2142
2229
  color="primary",
2143
2230
  size="md",
@@ -2152,7 +2239,7 @@ class ALDocumentBundle(DAList):
2152
2239
  result["pdf"].url_for(
2153
2240
  attachment=False, display_filename=view_filename
2154
2241
  ),
2155
- label=view_label,
2242
+ label=f'{view_label} <span class="visually-hidden">{title}</span>',
2156
2243
  icon=view_icon,
2157
2244
  color="secondary",
2158
2245
  size="md",
@@ -2296,7 +2383,9 @@ class ALDocumentBundle(DAList):
2296
2383
 
2297
2384
  Args:
2298
2385
  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".
2386
+ send_label (str): Label for the 'send' button. If `None`, falls back to
2387
+ `self.send_label` (a translatable template defined in `ql_baseline.yml`,
2388
+ defaulting to `"Send"`).
2300
2389
  send_icon (str): Icon for the 'send' button. Default is "envelope".
2301
2390
 
2302
2391
  Returns:
@@ -2360,7 +2449,9 @@ class ALDocumentBundle(DAList):
2360
2449
  email (str): The recipient's email address.
2361
2450
  editable (bool, optional): Flag indicating if the bundle is editable. Defaults to False. (deprecated; use preferred_formats instead)
2362
2451
  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".
2452
+ label (str, optional): The label for the button. If `None`, falls back to
2453
+ `self.send_label` (a translatable template defined in `ql_baseline.yml`,
2454
+ defaulting to `"Send"`).
2364
2455
  icon (str, optional): The Fontawesome icon for the button. Defaults to "envelope".
2365
2456
  color (str, optional): The Bootstrap color of the button. Defaults to "primary".
2366
2457
  key (str, optional): A key used to identify which version of the ALDocument to send. Defaults to "final".
@@ -2412,7 +2503,7 @@ class ALDocumentBundle(DAList):
2412
2503
  key: str = "final",
2413
2504
  show_editable_checkbox: bool = True,
2414
2505
  template_name: str = "",
2415
- label: str = "Send",
2506
+ label: Optional[str] = None,
2416
2507
  icon: str = "envelope",
2417
2508
  preferred_formats: Optional[Union[str, List[str]]] = None,
2418
2509
  email_legend_class: str = "h4",
@@ -2441,6 +2532,9 @@ class ALDocumentBundle(DAList):
2441
2532
  Returns:
2442
2533
  str: The generated HTML string for the input box and button.
2443
2534
  """
2535
+ if label is None:
2536
+ label = str(self.send_label) or word("Send")
2537
+
2444
2538
  if not self.has_enabled_documents():
2445
2539
  return "" # Don't let people email an empty set of documents
2446
2540
 
@@ -2528,7 +2622,14 @@ class ALDocumentBundle(DAList):
2528
2622
  to (Any): The email address, list of email addresses, or list of Individuals with a .email attribute to send to.
2529
2623
  key (str, optional): Specifies which version of the document to send. Defaults to "final".
2530
2624
  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.
2625
+ template (Any, optional): The template variable for the subject and body of the email,
2626
+ similar to the `template` parameter of docassemble's `send_email` function.
2627
+ If `None`, falls back to `self.send_email_template`, a template defined
2628
+ generically in `al_document.yml`. Its subject defaults to
2629
+ `"Your <document> document from <app> is ready"` and its body to
2630
+ `"Your document is attached. Visit <homepage> to learn more."`
2631
+ Override it by assigning a new template block to `your_bundle.send_email_template`
2632
+ in your interview YAML.
2532
2633
  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
2634
  **kwargs: Additional parameters to pass to the da `send_email` function.
2534
2635
 
@@ -155,15 +155,16 @@ code: |
155
155
  for signature in signature_fields:
156
156
  # Signature fields are strings like "users[0].signature". If the string ends in .signature, remove that and replace with .typed_signature, only at the end of the string
157
157
  if signature.endswith("signature"):
158
- typed_signature = signature[:-9] + "typed_signature"
159
- define(signature, DAFile(signature, filename="signature.png"))
158
+ typed_signature = value(signature[:-9] + "typed_signature")
159
+ define(signature, DAFile(signature, filename="signature.png", alt_text=typed_signature))
160
160
  value(signature).initialize()
161
161
  create_signature(
162
- value(typed_signature),
162
+ typed_signature,
163
163
  value(signature).path(),
164
164
  signature_prefix=al_typed_signature_prefix,
165
165
  font_name=al_typed_signature_font,
166
166
  )
167
+ del(typed_signature)
167
168
  else:
168
169
  log(
169
170
  "Signature field "
@@ -89,7 +89,7 @@ code: |
89
89
  # Used in the email subject line when email is triggered on download screen.
90
90
  # This defaults to the interview title. For example, if the
91
91
  # interview title is "Guardianship Helper", the email
92
- # subject would be "Your Guardianship Helper document from CourtFormsOnline is ready".
92
+ # subject would be "Your Guardianship Helper document from docassemble is ready".
93
93
  # Customize this if you prefer something like "Your guardianship document is ready"
94
94
  x.document_label = str(
95
95
  all_variables(special="titles").get(
@@ -123,12 +123,12 @@ content: |
123
123
  generic object: ALDocumentBundle
124
124
  template: x.zip_label
125
125
  content: |
126
- Download all
126
+ Download all <span class="visually-hidden">${ x.title }</span> documents
127
127
  ---
128
128
  generic object: ALDocumentBundle
129
129
  template: x.full_pdf_label
130
130
  content: |
131
- Download as one PDF
131
+ Download <span class="visually-hidden">${ x.title }</span> as one PDF
132
132
  ---
133
133
  id: al exhibit ocr pages bg
134
134
  event: al_exhibit_ocr_pages
@@ -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)
@@ -7,13 +7,13 @@ code: |
7
7
  # Set this to the name of your application
8
8
  # Defaults to checking for a possible name from global docassemble config
9
9
  al_app_name = get_config(
10
- "appname", get_config("external hostname", "CourtFormsOnline.org")
10
+ "appname", get_config("external hostname", "docassemble")
11
11
  )
12
12
  ---
13
13
  code: |
14
14
  # The name of your organization. Defaults to a similar value as `al_app_name`,
15
15
  # but is still distinct
16
- AL_ORGANIZATION_TITLE = get_config("appname", "CourtFormsOnline")
16
+ AL_ORGANIZATION_TITLE = get_config("appname", "docassemble")
17
17
  ---
18
18
  code: |
19
19
  AL_ORGANIZATION_HOMEPAGE = get_config("app homepage", "https://courtformsonline.org")
@@ -158,7 +158,7 @@ default screen parts:
158
158
  % elif showifdef("AL_ORGANIZATION_TITLE"):
159
159
  ${ AL_ORGANIZATION_TITLE }
160
160
  % else:
161
- ${ get_config("app name", "CourtFormsOnline") }
161
+ ${ get_config("appname", "docassemble") }
162
162
  % endif
163
163
  short title: |
164
164
  % if PAGE_TITLE:
@@ -166,7 +166,7 @@ default screen parts:
166
166
  % elif showifdef("AL_ORGANIZATION_TITLE"):
167
167
  ${ AL_ORGANIZATION_TITLE }
168
168
  % else:
169
- ${ get_config("app name", "CourtFormsOnline") }
169
+ ${ get_config("appname", "docassemble") }
170
170
  % endif
171
171
  title url: |
172
172
  % if LOGO_URL:
@@ -197,7 +197,7 @@ default screen parts:
197
197
  % elif showifdef("AL_ORGANIZATION_TITLE"):
198
198
  <span class="title-row-1">${ AL_ORGANIZATION_TITLE }</span>
199
199
  % else:
200
- <span class="title-row-1">${ get_config("app name", "CourtFormsOnline") }</span>
200
+ <span class="title-row-1">${ get_config("appname", "docassemble") }</span>
201
201
  % endif
202
202
  % if LOGO_TITLE_ROW_2:
203
203
  <span class="title-row-2">${ LOGO_TITLE_ROW_2 }</span>
@@ -223,7 +223,7 @@ default screen parts:
223
223
  % elif showifdef("AL_ORGANIZATION_TITLE"):
224
224
  <span class="title-row-1">${ AL_ORGANIZATION_TITLE }</span>
225
225
  % else:
226
- <span class="title-row-1">${ get_config("app name", "CourtFormsOnline") }</span>
226
+ <span class="title-row-1">${ get_config("appname", "docassemble") }</span>
227
227
  % endif
228
228
  % if LOGO_TITLE_ROW_2:
229
229
  <span class="title-row-2">${ LOGO_TITLE_ROW_2 }</span>
@@ -1248,6 +1248,8 @@ question: |
1248
1248
  signature: x.signature
1249
1249
  under: |
1250
1250
  ${x}
1251
+ validation code: |
1252
+ x.signature.alt_text = f"Signature of {x.name_full()}"
1251
1253
  ---
1252
1254
  id: signature date
1253
1255
  question: |
@@ -2666,8 +2668,10 @@ content: "Download"
2666
2668
  ---
2667
2669
  generic object: ALDocumentBundle
2668
2670
  template: x.send_label
2669
- content: "Send"
2671
+ content: |
2672
+ Send <span class="visually-hidden">${ x.title } documents</span>
2670
2673
  ---
2671
2674
  generic object: ALDocumentBundle
2672
2675
  template: x.send_button_to_label
2673
- content: "Send"
2676
+ content: |
2677
+ Send <span class="visually-hidden">${ x.title } documents</span>
@@ -23,6 +23,8 @@ subquestion: |
23
23
  ${ users[0].signature }
24
24
 
25
25
  % endif
26
+ attachment:
27
+ docx template file: sample_word_template.docx
26
28
  ---
27
29
  code: |
28
30
  al_form_requires_digital_signature = False
@@ -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.6.0
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.6.0"
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
-