diff --git a/.gitignore b/.gitignore
index d3dbf0c..b3152a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
~$*
*Zone.Identifier
+.venv
+node_modules
diff --git a/docassemble/HousingCodeChecklist/__init__.py b/docassemble/HousingCodeChecklist/__init__.py
index 1160b07..ac4c647 100644
--- a/docassemble/HousingCodeChecklist/__init__.py
+++ b/docassemble/HousingCodeChecklist/__init__.py
@@ -1 +1 @@
-__version__ = '1.31.0'
+__version__ = "1.31.0"
diff --git a/docassemble/HousingCodeChecklist/data/questions/Repair_Demand_Letter_standalone.yml b/docassemble/HousingCodeChecklist/data/questions/Repair_Demand_Letter_standalone.yml
index 93c4e39..e3f3379 100644
--- a/docassemble/HousingCodeChecklist/data/questions/Repair_Demand_Letter_standalone.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/Repair_Demand_Letter_standalone.yml
@@ -13,7 +13,7 @@ metadata:
- Sofija Belajcic
---
code: |
- interview_metadata['main_interview_key'] = 'Repair_Demand_Letter'
+ interview_metadata["main_interview_key"] = "Repair_Demand_Letter"
---
code: |
# This controls the default country and list of states in address field questions
@@ -24,13 +24,13 @@ code: |
AL_DEFAULT_STATE = "MA"
---
code: |
- github_repo_name = 'docassemble-RepairDemandLetter'
+ github_repo_name = "docassemble-RepairDemandLetter"
---
code: |
interview_short_title = "Write a repair demand letter to your landlord"
---
code: |
- al_form_type = 'letter'
+ al_form_type = "letter"
---
objects:
- other_parties: ALPeopleList.using(ask_number=True,target_number=1)
@@ -44,8 +44,8 @@ comment: |
Controls order and branching logic for questions specific to this form
id: interview_order_Repair_Demand_Letter
code: |
- nav.set_section('review_Repair_Demand_Letter')
- user_role = 'na'
+ nav.set_section("review_Repair_Demand_Letter")
+ user_role = "na"
users.gather()
set_parts(subtitle=str(users))
users[0].address.address
@@ -56,7 +56,7 @@ code: |
notification_date
set_progress(40)
if written_notification == True:
- letter_date
+ letter_date
tenant_repair_issue_description
effect_of_conditions
set_progress(60)
@@ -78,12 +78,13 @@ code: |
interview_order_Repair_Demand_Letter
signature_date
# Save anonymized interview statistics (customize the saved data below)
- store_variables_snapshot(data={'zip': users[0].address.zip})
+ store_variables_snapshot(data={"zip": users[0].address.zip})
Repair_Demand_Letter_preview_question
basic_questions_signature_flow
users[0].signature
Repair_Demand_Letter_download
---
+id: landlord is not subject to 93a standalone
event: landlord_is_not_subject_to_93a
decoration: hand
question: |
@@ -138,4 +139,4 @@ objects:
---
code: |
Repair_Demand_Letter_post_interview_instructions.enabled = True
- Repair_Demand_Letter_attachment.enabled = True
\ No newline at end of file
+ Repair_Demand_Letter_attachment.enabled = True
diff --git a/docassemble/HousingCodeChecklist/data/questions/Repair_Demand_Letter_to_include.yml b/docassemble/HousingCodeChecklist/data/questions/Repair_Demand_Letter_to_include.yml
index 4702fcd..c471c53 100644
--- a/docassemble/HousingCodeChecklist/data/questions/Repair_Demand_Letter_to_include.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/Repair_Demand_Letter_to_include.yml
@@ -12,21 +12,21 @@ code: |
interview_metadata
if not defined("interview_metadata['Repair_Demand_Letter']"):
interview_metadata.initializeObject("Repair_Demand_Letter")
- interview_metadata["Repair_Demand_Letter"].update({
- "al_weaver_version": "1.6.2",
- "generated on": "2022-03-31",
- "title": "Repair Demand Letter",
- "short title": "Repair Demand Letter",
- "description": "A letter of demand for relief under the Consumer Protection Act, Chapter 93A",
- "original_form": "https://www.masslegalhelp.org/sites/default/files/2024-01/lt1-form-10-repair-demand.pdf",
- "allowed courts": [
- ],
- "categories": [
- ],
- "logic block variable": "interview_order_Repair_Demand_Letter",
- "attachment block variable": "Repair_Demand_Letter_attachment",
- "typical role": "plaintiff",
- })
+ interview_metadata["Repair_Demand_Letter"].update(
+ {
+ "al_weaver_version": "1.6.2",
+ "generated on": "2022-03-31",
+ "title": "Repair Demand Letter",
+ "short title": "Repair Demand Letter",
+ "description": "A letter of demand for relief under the Consumer Protection Act, Chapter 93A",
+ "original_form": "https://www.masslegalhelp.org/sites/default/files/2024-01/lt1-form-10-repair-demand.pdf",
+ "allowed courts": [],
+ "categories": [],
+ "logic block variable": "interview_order_Repair_Demand_Letter",
+ "attachment block variable": "Repair_Demand_Letter_attachment",
+ "typical role": "plaintiff",
+ }
+ )
---
objects:
- other_parties: ALPeopleList.using(ask_number=True,target_number=1)
@@ -37,8 +37,8 @@ comment: |
Controls order and branching logic for questions specific to this form
id: interview_order_Repair_Demand_Letter
code: |
- nav.set_section('review_Repair_Demand_Letter')
- user_role = 'plaintiff'
+ nav.set_section("review_Repair_Demand_Letter")
+ user_role = "plaintiff"
users[0].email
users.gather()
set_parts(subtitle=str(users))
@@ -46,7 +46,7 @@ code: |
tenant_movein_date
notification_date
if written_notification == True:
- letter_date
+ letter_date
tenant_repair_issue_description
effect_of_conditions
if damage_calculation_method in ["tenant_calculation", "uptocode_calculation"]:
@@ -200,8 +200,16 @@ fields:
val("landlord_is_housing_authority") === false && val("landlord_is_government") === false && (val("landlord_lives_in_building") === false || (val("building_larger_than_4_units") || val("landlord_rents_other_property")) )
---
code: |
- is_landlord_subject_to_93a = not landlord_is_housing_authority and not landlord_is_government and (not landlord_lives_in_building or (building_larger_than_4_units or landlord_rents_other_property))
+ is_landlord_subject_to_93a = (
+ not landlord_is_housing_authority
+ and not landlord_is_government
+ and (
+ not landlord_lives_in_building
+ or (building_larger_than_4_units or landlord_rents_other_property)
+ )
+ )
---
+id: landlord is not subject to 93a
continue button field: landlord_is_not_subject_to_93a
decoration: hand
question: |
@@ -583,7 +591,10 @@ fields:
validation code: |
if damage_calculation_method == "uptocode_calculation":
if tenant_percentage_estimate < 5:
- validation_error("Select a percentage that is greater than 0", field="tenant_percentage_estimate")
+ validation_error(
+ "Select a percentage that is greater than 0",
+ field="tenant_percentage_estimate",
+ )
---
template: what_if_problem_over_multiple_periods
subject: |
@@ -738,9 +749,11 @@ depends on:
- tenant_percentage_estimate
code: |
tenant_warranty_estimate = (
- tenant_unit_rent * 12 * (
- min(tenant_time_estimate / tenant_time_estimate_denominator, 6)
- ) * tenant_percentage_estimate / 100
+ tenant_unit_rent
+ * 12
+ * (min(tenant_time_estimate / tenant_time_estimate_denominator, 6))
+ * tenant_percentage_estimate
+ / 100
)
---
template: settlement_offer_93a_explanation
@@ -832,6 +845,7 @@ review:
* ${ item }
% endfor
---
+id: edit repair demand letter landlords
continue button field: other_parties.revisit
question: |
Edit other_parties
@@ -853,6 +867,7 @@ edit:
confirm: True
---
+id: edit repair demand letter tenants
continue button field: users.revisit
question: |
Edit users
diff --git a/docassemble/HousingCodeChecklist/data/questions/Repair_Letter_Tenant.yml b/docassemble/HousingCodeChecklist/data/questions/Repair_Letter_Tenant.yml
index 074e3a7..93f356b 100644
--- a/docassemble/HousingCodeChecklist/data/questions/Repair_Letter_Tenant.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/Repair_Letter_Tenant.yml
@@ -9,27 +9,29 @@ comment: |
This section is used by MAVirtualCourts to control how some of the questions work.
mandatory: True
code: |
- interview_metadata # make sure we initialize the object
+ interview_metadata # make sure we initialize the object
if not defined("interview_metadata['tenant_repair_request']"):
- interview_metadata.initializeObject('tenant_repair_request')
- interview_metadata['tenant_repair_request'].update({
- 'title': 'Tenant Repair Request Letter',
- 'short title': 'Tenant Repair Request Letter',
- 'description': 'Tenant Repair Request Letter',
- 'original_form': '',
- 'allowed courts': [
- 'Boston Municipal Court',
- 'District Court',
- 'Housing Court',
- 'Superior Court',
- ],
- 'categories': [
- 'Housing',
- ],
- 'logic block variable': 'tenant_repair_request',
- 'attachment block variable': 'tenant_repair_request',
- 'typical role': 'plaintiff',
- })
+ interview_metadata.initializeObject("tenant_repair_request")
+ interview_metadata["tenant_repair_request"].update(
+ {
+ "title": "Tenant Repair Request Letter",
+ "short title": "Tenant Repair Request Letter",
+ "description": "Tenant Repair Request Letter",
+ "original_form": "",
+ "allowed courts": [
+ "Boston Municipal Court",
+ "District Court",
+ "Housing Court",
+ "Superior Court",
+ ],
+ "categories": [
+ "Housing",
+ ],
+ "logic block variable": "tenant_repair_request",
+ "attachment block variable": "tenant_repair_request",
+ "typical role": "plaintiff",
+ }
+ )
---
features:
navigation: True
@@ -39,8 +41,8 @@ sections:
---
id: interview_order_tenant_repair_request
code: |
- user_role = 'plaintiff'
- # mailing_method
+ user_role = "plaintiff"
+ # mailing_method
set_parts(subtitle=str(users))
set_progress(12.5)
users[0].email
@@ -119,7 +121,7 @@ subquestion: |
Before you start, you will need information about your landlord and their address.
- *The [Court Forms Online](https://courtformsonline.org/housing/) project may be able to help with other housing problems.*
+ *The [Court Forms Online](https://courtformsonline.org/ma/housing) project may be able to help with other housing problems.*
help:
label: |
diff --git a/docassemble/HousingCodeChecklist/data/questions/Repair_Letter_Tenant_standalone.yml b/docassemble/HousingCodeChecklist/data/questions/Repair_Letter_Tenant_standalone.yml
index 1609dad..31a0f59 100644
--- a/docassemble/HousingCodeChecklist/data/questions/Repair_Letter_Tenant_standalone.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/Repair_Letter_Tenant_standalone.yml
@@ -20,7 +20,7 @@ code: |
interview_order_tenant_repair_request
preview_screen
users[i].signature
- download_tenant_repair_request
+ download_tenant_repair_request
---
code: |
al_form_type = "letter"
diff --git a/docassemble/HousingCodeChecklist/data/questions/contempt_complaint_standalone.yml b/docassemble/HousingCodeChecklist/data/questions/contempt_complaint_standalone.yml
index 1876166..0ed6902 100644
--- a/docassemble/HousingCodeChecklist/data/questions/contempt_complaint_standalone.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/contempt_complaint_standalone.yml
@@ -26,8 +26,13 @@ code: |
user_role = "plaintiff"
---
code: |
- allowed_courts = ["Boston Municipal Court","District Court","Housing Court","Superior Court"]
- al_form_type = 'existing_case'
+ allowed_courts = [
+ "Boston Municipal Court",
+ "District Court",
+ "Housing Court",
+ "Superior Court",
+ ]
+ al_form_type = "existing_case"
---
code: |
landlord_name_is_optional = False
@@ -40,7 +45,7 @@ comment: |
Controls order and branching logic for questions specific to this form
id: interview_order_Contempt_Complaint
code: |
- nav.set_section('review_Contempt_Complaint')
+ nav.set_section("review_Contempt_Complaint")
user_role = "plaintiff"
users.gather()
users.there_is_another
@@ -72,7 +77,7 @@ code: |
interview_order_Contempt_Complaint
signature_date
# Save anonymized interview statistics (customize the saved data below)
- store_variables_snapshot(data={'zip': users[0].address.zip})
+ store_variables_snapshot(data={"zip": users[0].address.zip})
Contempt_Complaint_preview_question
basic_questions_signature_flow
users[0].signature
@@ -149,7 +154,7 @@ question: |
% endif
fields:
- code: |
- other_parties[i].name_fields(person_or_business='unsure')
+ other_parties[i].name_fields(person_or_business="unsure")
---
id: information about the landlord
question: |
diff --git a/docassemble/HousingCodeChecklist/data/questions/customized_screens.yml b/docassemble/HousingCodeChecklist/data/questions/customized_screens.yml
index d34d473..950728a 100644
--- a/docassemble/HousingCodeChecklist/data/questions/customized_screens.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/customized_screens.yml
@@ -58,7 +58,9 @@ fields:
depends on:
- document_choice["sue_landlord"]
code: |
- landlord_name_is_optional = not screen_ll_knows_problem or not document_choice.get("sue_landlord")
+ landlord_name_is_optional = not screen_ll_knows_problem or not document_choice.get(
+ "sue_landlord"
+ )
if landlord_name_is_optional:
ll_name_unknown = False
---
@@ -82,23 +84,21 @@ subquestion: |
% elif person_answering == "tenant":
First, you will be asked if your landlord is a business or an individual and then what your landlord's name is.
- Your landlord **may not be the owner** of the property. It’s important to sue the owner, not just the landlord or property manager (in other words, name **both** the landlord and the owner in your court complaint and any demand letter you may want to send under the Consumer Protection Act). You will be asked if you have another landlord or owner to enter after this.
+ Your landlord **may not be the owner** of the property. It's important to sue the owner, not just the landlord or property manager (in other words, name **both** the landlord and the owner in your court complaint and any demand letter you may want to send under the Consumer Protection Act). You will be asked if you have another landlord or owner to enter after this.
To find out who the owner is, try using [masslandrecords.com](https://www.masslandrecords.com/), or if you are having trouble:
-
- - call your local Registry of Deeds for help finding the most recent deed for the property, or
- - call your town/city tax assessor’s office to find out who is listed as owner for the property's tax and water bills.
-
+
+ - call your local Registry of Deeds for help finding the most recent deed for the property, or
+ - call your town/city tax assessor's office to find out who is listed as owner for the property's tax and water bills.
% else:
First, you will be asked if the tenant's landlord is a business or an individual and then what the landlord's name is.
- The tenant's landlord **may not be the owner** of the property. It’s important to sue the owner, not just the landlord or property manager (in other words, name **both** the landlord and the owner in the court complaint and any demand letter the tenant may want to send under the Consumer Protection Act). You will be asked if you have another landlord or owner to enter after this.
+ The tenant's landlord **may not be the owner** of the property. It's important to sue the owner, not just the landlord or property manager (in other words, name **both** the landlord and the owner in the court complaint and any demand letter the tenant may want to send under the Consumer Protection Act). You will be asked if you have another landlord or owner to enter after this.
To find out who the owner is, try using [masslandrecords.com](https://www.masslandrecords.com/), or if you are having trouble:
- - call the tenant's local Registry of Deeds for help finding the most recent deed for the property, or
- - call the tenant's town/city tax assessor’s office to find out who is listed as owner for the property's tax and water bills.
-
+ - call the tenant's local Registry of Deeds for help finding the most recent deed for the property, or
+ - call the tenant's town/city tax assessor's office to find out who is listed as owner for the property's tax and water bills.
% endif
fields:
- label: |
@@ -190,7 +190,7 @@ validation code: |
if ll_name_unknown:
other_parties[i].name.first = "[ Landlord's Name ]"
---
-id: tenant contact information
+id: tenant contact information indexed
question: |
% if person_answering == "tenant":
${ users[i].familiar() }, what is your contact information?
@@ -242,13 +242,19 @@ fields:
disable others: True
validation code: |
if users[i].no_contact_method:
- users[i].phone_number = users[i].mobile_number = users[i].email = ""
- if (not showifdef('users[i].phone_number') and \
- (not showifdef('users[i].mobile_number')) and \
- (not showifdef('users[i].email')) and \
- (not users[i].no_contact_method)
+ users[i].phone_number = users[i].mobile_number = users[i].email = ""
+ if (
+ not showifdef("users[i].phone_number")
+ and (not showifdef("users[i].mobile_number"))
+ and (not showifdef("users[i].email"))
+ and (not users[i].no_contact_method)
):
- validation_error(word("You need to provide at least one contact method, or state that you do not have any."), field="users[i].mobile_number")
+ validation_error(
+ word(
+ "You need to provide at least one contact method, or state that you do not have any."
+ ),
+ field="users[i].mobile_number",
+ )
---
id: tenant contact information
question: |
@@ -302,13 +308,19 @@ fields:
disable others: True
validation code: |
if users[0].no_contact_method:
- users[0].phone_number = users[0].mobile_number = users[0].email = ""
- if (not showifdef('users[0].phone_number') and \
- (not showifdef('users[0].mobile_number')) and \
- (not showifdef('users[0].email')) and \
- (not users[0].no_contact_method)
+ users[0].phone_number = users[0].mobile_number = users[0].email = ""
+ if (
+ not showifdef("users[0].phone_number")
+ and (not showifdef("users[0].mobile_number"))
+ and (not showifdef("users[0].email"))
+ and (not users[0].no_contact_method)
):
- validation_error(word("You need to provide at least one contact method, or state that you do not have any."), field="users[0].mobile_number")
+ validation_error(
+ word(
+ "You need to provide at least one contact method, or state that you do not have any."
+ ),
+ field="users[0].mobile_number",
+ )
---
id: landlord's contact information
generic object: ALIndividual
@@ -415,9 +427,9 @@ subquestion: |
% if len(other_parties.elements) > 1:
You have already told us about ${comma_and_list(other_parties.complete_elements())}.
% elif person_answering == "tenant":
- Your landlord may not be the owner of the property. It’s important to sue the owner, not just the landlord or property manager (in other words, name both the landlord and the owner in your court complaint and any demand letter you may want to send under the Consumer Protection Act).
+ Your landlord may not be the owner of the property. It's important to sue the owner, not just the landlord or property manager (in other words, name both the landlord and the owner in your court complaint and any demand letter you may want to send under the Consumer Protection Act).
% else:
- The tenant's landlord may not be the owner of the property. It’s important to sue the owner, not just the landlord or property manager (in other words, name both the landlord and the owner in the court complaint and any demand letter you may want to send under the Consumer Protection Act).
+ The tenant's landlord may not be the owner of the property. It's important to sue the owner, not just the landlord or property manager (in other words, name both the landlord and the owner in the court complaint and any demand letter you may want to send under the Consumer Protection Act).
% endif
fields:
- Is anyone else on the landlord's side of the case?: other_parties.there_is_another
@@ -649,7 +661,8 @@ fields:
We can text or share a link with your phone on the next screen
- On a computer with my mouse: this_device
- On the paper with a pen after I print the documents: sign_after_printing
- - no label: users[0].states_above_true
+ - label: Affirm that the statements above are true
+ field: users[0].states_above_true
datatype: checkboxes
minlength: 1
choices:
@@ -659,7 +672,8 @@ fields:
You cannot keep going unless you did your best to tell the truth.
js show if: |
val("signature_choice") == "phone" || val("signature_choice") == "this_device"
- - no label: users[0].states_above_true
+ - label: Certify service of the motion on the landlord
+ field: users[0].states_above_true
datatype: checkboxes
minlength: 1
choices:
@@ -712,12 +726,17 @@ fields:
---
code: |
if len(bad_conditions[i].details.elements):
- bad_conditions[i].min_date = min([c.start_date if not c.condition_existed_at_start else users[0].move_in_date for c in bad_conditions[i].details.elements.values()])
+ bad_conditions[i].min_date = min(
+ [
+ c.start_date if not c.condition_existed_at_start else users[0].move_in_date
+ for c in bad_conditions[i].details.elements.values()
+ ]
+ )
else:
bad_conditions[i].min_date = today()
---
code: |
- tenant_repair_default_date = min([c.min_date for c in bad_conditions.elements.values()])
+ tenant_repair_default_date = min([c.min_date for c in bad_conditions.elements.values()])
---
id: include citations?
question: |
@@ -764,7 +783,7 @@ content: |
###############
---
code: |
- tenant_repair_issue_date
+ tenant_repair_issue_date
---
id: tenant_repair_issue_date
question: |
@@ -817,7 +836,7 @@ fields:
#################################################################
---
code: |
- repairs_request_date = tenant_repair_issue_date # From
+ repairs_request_date = tenant_repair_issue_date # From
---
id: Issue s Description
question: |
@@ -1083,7 +1102,7 @@ help: |
working from home, permitted construction may still be allowed)
* Unsafe living conditions that your landlord isn't fixing
- [Read more](https://www.masslegalhelp.org/housing-apartments-shelter/repairs-bad-conditions/your-right-decent-place-live)
+ [Read more about the right to a decent place to live](https://www.masslegalhelp.org/housing-apartments-shelter/repairs-bad-conditions/your-right-decent-place-live)
---
#########################################
## Petition to enforce Sanitary Code
@@ -1100,6 +1119,7 @@ help: |
# We will leave this form out of your final packet.
#continue button field: kick_out
#---
+id: review request housing inspection
event: review_request_housing_inspection
question: |
Review your request for a housing inspection
@@ -1392,7 +1412,10 @@ validation code: |
if damage_calculation_method == "uptocode_calculation":
tenant_time_estimate_denominator = 365
if tenant_percentage_estimate < 5:
- validation_error("Select a percentage that is greater than 0", field="tenant_percentage_estimate")
+ validation_error(
+ "Select a percentage that is greater than 0",
+ field="tenant_percentage_estimate",
+ )
---
variable name: damage_tenant_severity_estimate_text
use objects: True
@@ -1412,7 +1435,7 @@ content: |
You need to know
* **UpToCode does not provide legal advice**. If you need legal advice, you can use the [Massachusetts Legal Resource Finder](https://masslrf.org) to find a lawyer.
- * The information and documents on UpToCode have no warranty. We provide the information “as-is.” By using UpToCode, you agree not to hold GBLS or the information providers on UpToCode liable.
+ * The information and documents on UpToCode have no warranty. We provide the information "as-is." By using UpToCode, you agree not to hold GBLS or the information providers on UpToCode liable.
* We work hard to keep the information on UpToCode up to date. Lawyers drafted and reviewed the documents UpToCode uses. But laws and local rules change over time. These changes can make a document out of date when you use it.
* We do our best to keep UpToCode working! To do that, we allow you to submit feedback so we can track problems on UpToCode. But we cannot provide individual technical support.
@@ -1711,7 +1734,9 @@ fields:
show if: fees['Other cost'].waive
validation code: |
if len([fee for fee in fees if fees[fee].waive]) < 1:
- validation_error("You need to choose at least one.", field="fees['Other cost'].waive")
+ validation_error(
+ "You need to choose at least one.", field="fees['Other cost'].waive"
+ )
---
template: what_fee_amount_should_i_write_template
subject: |
@@ -1983,9 +2008,14 @@ fields:
field: users[0].jobs[i].is_self_employed
datatype: yesno
- code: |
- users[0].jobs[i].employer.name_fields(person_or_business='unsure', show_if={'variable': 'users[0].jobs[i].is_self_employed', 'is': 'False'})
+ users[0].jobs[i].employer.name_fields(
+ person_or_business="unsure",
+ show_if={"variable": "users[0].jobs[i].is_self_employed", "is": "False"},
+ )
- code: |
- users[0].jobs[i].employer.address.address_fields(show_if={'variable': 'users[0].jobs[i].is_self_employed', 'is': 'False'})
+ users[0].jobs[i].employer.address.address_fields(
+ show_if={"variable": "users[0].jobs[i].is_self_employed", "is": "False"}
+ )
- Phone number: users[0].jobs[i].employer.phone_number
required: False
show if:
@@ -2067,6 +2097,7 @@ fields:
datatype: currency
required: False
---
+id: itemized job has other incomes or deductions
generic object: ALItemizedJob
question: |
% if person_answering == "tenant":
@@ -2083,6 +2114,7 @@ fields:
datatype: yesnoradio
---
#id: other itemized job income name
+id: other itemized job income name
generic object: ALItemizedJob
question: |
Other incomes
@@ -2096,7 +2128,9 @@ fields:
- Type of income: x.to_add.new_item_name
validation code: |
if x.to_add.new_item_name in x.to_add.complete_elements().keys():
- validation_error(f'You already told us about { job_items_names.get(x.to_add.new_item_name, x.to_add.new_item_name) } that pays { currency( x.to_add[ x.to_add.new_item_name ].value )}. Pick a different name.')
+ validation_error(
+ f"You already told us about { job_items_names.get(x.to_add.new_item_name, x.to_add.new_item_name) } that pays { currency( x.to_add[ x.to_add.new_item_name ].value )}. Pick a different name."
+ )
---
id: other itemized job reduction value
generic object: ALItemizedJob
@@ -2236,6 +2270,7 @@ subquestion: |
field: review_income_screen
---
+id: confirm itemized income can skip supplement
question: |
% if person_answering == "tenant":
You might not need to complete this supplement
@@ -2273,6 +2308,7 @@ fields:
variable: confirm_can_skip_supplement
is: false
---
+id: edit itemized job deductions
generic object: ALItemizedJob
continue button field: x.to_subtract.revisit
question: |
@@ -2365,7 +2401,8 @@ question: |
Does the tenant own a home?
% endif
fields:
- - no label: user_owns_home
+ - label: Home ownership
+ field: user_owns_home
datatype: yesnoradio
- What is the value of the home?: user_home_value
show if: user_owns_home
@@ -2393,7 +2430,8 @@ question: |
Does the tenant own a car?
% endif
fields:
- - no label: user_owns_car
+ - label: Car ownership
+ field: user_owns_car
datatype: yesnoradio
- "Car year": user_car_year
show if: user_owns_car
@@ -2472,6 +2510,7 @@ fields:
- no label: users[0].accounts.there_is_another
datatype: yesnoradio
---
+id: other property ownership
question: |
% if person_answering == "tenant":
Do you own any property you haven't told us about?
@@ -2617,4 +2656,4 @@ question: |
What is the name of the tenant's ${ ordinal(i) } household member?
% endif
fields:
- code: household[i].name_fields()
\ No newline at end of file
+ code: household[i].name_fields()
diff --git a/docassemble/HousingCodeChecklist/data/questions/discovery.yml b/docassemble/HousingCodeChecklist/data/questions/discovery.yml
index d6cf905..a13ddd6 100644
--- a/docassemble/HousingCodeChecklist/data/questions/discovery.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/discovery.yml
@@ -112,7 +112,7 @@ subquestion: |
---
code: |
# Backport a few variables just to be used for discovery calculations
- screen_tenant_facing_eviction_is_notice = screen_tenant_facing_eviction["notice only"]
+ screen_tenant_facing_eviction_is_notice = screen_tenant_facing_eviction["notice only"]
screen_tenant_facing_eviction_is_pending = screen_tenant_facing_eviction["pending"]
screen_tenant_facing_eviction_is_case = screen_tenant_facing_eviction["has case"]
screen_tenant_facing_eviction_is_closed = screen_tenant_facing_eviction["closed"]
\ No newline at end of file
diff --git a/docassemble/HousingCodeChecklist/data/questions/feedback.yml b/docassemble/HousingCodeChecklist/data/questions/feedback.yml
index cf5e212..86375db 100644
--- a/docassemble/HousingCodeChecklist/data/questions/feedback.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/feedback.yml
@@ -43,23 +43,23 @@ image sets:
mandatory: True
code: |
intro
- if reason == 'bug':
+ if reason == "bug":
bug_details
issue_template = bug_report
- elif reason == 'confusing':
+ elif reason == "confusing":
confusing_details
issue_template = confusing_report
- elif reason == 'else':
+ elif reason == "else":
other_feedback
issue_template = other_feedback_report
- elif reason == 'help':
+ elif reason == "help":
gentle_exit
else:
- value(reason)
+ value(reason)
issue_template = generic_report[reason]
send_to_github
prevent_going_back()
- store_variables_snapshot(persistent=True) # this is mostly just for backup reasons
+ store_variables_snapshot(persistent=True) # this is mostly just for backup reasons
end_results
---
code: github_user = url_args.get('github_user', default_github_user_or_organization)
@@ -73,15 +73,15 @@ code: question_id = url_args.get('question_id')
code: package_version = url_args.get('package_version')
---
code: |
- if not task_performed('sent to github', persistent=True):
+ if not task_performed("sent to github", persistent=True):
if github_user in allowed_github_users:
issue_url = make_github_issue(github_user, github_repo, template=issue_template)
- mark_task_as_performed('sent to github', persistent=True)
+ mark_task_as_performed("sent to github", persistent=True)
send_to_github = True
---
if: |
not get_config('debug')
-id: intro
+id: public feedback intro
question: |
Tell us how we're doing
decoration: opinion
@@ -111,7 +111,7 @@ continue button field: intro
---
if: |
get_config('debug')
-id: intro
+id: tester feedback intro
question: |
Tester feedback form
decoration: opinion
@@ -180,11 +180,11 @@ fields:
code: maturity_levels
show if:
code: |
- get_config('debug')
+ get_config("debug")
- Who are you? Just tell us your name or github username, not email. This will be public.: user_contact_info
show if:
code: |
- get_config('debug')
+ get_config("debug")
- label: |
**Tell us the steps that you followed before you noticed the problem.** [BR]
For example: 1. I opened the interview. 2. On the first page, I put in just my first name. 3. On the second page, I put in my phone number. 4. I pressed a button to go to the next page.
@@ -231,16 +231,16 @@ fields:
field: page_title
show if:
code: |
- not question_id
+ not question_id
- When should this fix be implemented?: maturity_level
code: maturity_levels
show if:
code: |
- get_config('debug')
+ get_config("debug")
- Who are you? Just tell us your name or github username, not email. This will be public.: user_contact_info
show if:
code: |
- get_config('debug')
+ get_config("debug")
- label: |
**What was confusing or missing information? **
field: confusing_details
@@ -273,7 +273,7 @@ fields:
- Who are you? Just tell us your name or github username, not email. This will be public.: user_contact_info
show if:
code: |
- get_config('debug')
+ get_config("debug")
- Other (please specify): user_type
show if:
variable: user_type
@@ -294,16 +294,16 @@ fields:
field: page_title
show if:
code: |
- not question_id
+ not question_id
- When should this fix be implemented?: maturity_level
code: maturity_levels
show if:
code: |
- get_config('debug')
+ get_config("debug")
- Who are you? Just tell us your name or github username, not email. This will be public.: user_contact_info
show if:
code: |
- get_config('debug')
+ get_config("debug")
- label: |
**What language fix is needed? **
field: language
@@ -326,16 +326,16 @@ fields:
field: page_title
show if:
code: |
- not question_id
+ not question_id
- When should this fix be implemented?: maturity_level
code: maturity_levels
show if:
code: |
- get_config('debug')
+ get_config("debug")
- Who are you? Just tell us your name or github username, not email. This will be public.: user_contact_info
show if:
code: |
- get_config('debug')
+ get_config("debug")
- label: |
**What logic fix is needed? **
field: logic
@@ -356,11 +356,11 @@ fields:
code: maturity_levels
show if:
code: |
- get_config('debug')
+ get_config("debug")
- Who are you? Just tell us your name or github username, not email. This will be public.: user_contact_info
show if:
code: |
- get_config('debug')
+ get_config("debug")
- label: |
**What enhancement do you propose? **
field: enhancement
@@ -518,4 +518,4 @@ content: |
Package version | `${ package_version }`
% endif
Maturity target | ${ maturity_level }
- Tester contact info | ${ user_contact_info }
\ No newline at end of file
+ Tester contact info | ${ user_contact_info }
diff --git a/docassemble/HousingCodeChecklist/data/questions/housing_code_interview.yml b/docassemble/HousingCodeChecklist/data/questions/housing_code_interview.yml
index 413a0ef..2128616 100644
--- a/docassemble/HousingCodeChecklist/data/questions/housing_code_interview.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/housing_code_interview.yml
@@ -145,10 +145,10 @@ code: |
users[0].attorney.target_number = 0
intro_terms_of_use
if initial_action_selection == "help_in_court":
- nav.set_section('review_conditions')
+ nav.set_section("review_conditions")
kind_of_lawsuit
set_document_choice_by_lawsuit_kind
- if initial_screen_tenant_facing_eviction in('pending', 'has case'):
+ if initial_screen_tenant_facing_eviction in ("pending", "has case"):
warn_eviction
if kind_of_lawsuit.any_true("get_emergency_repairs", "past_repair_needs"):
if not tenant_sent_ll_notice:
@@ -156,19 +156,19 @@ code: |
if not tenant_called_inspector:
add_inspection_letter
interview_order_navigate_conditions
-
+
snapshot_interview_state
-
+
if initial_action_selection in ["document_by_room", "give_notice"]:
interview_order_navigate_conditions
- nav.set_section('main_triage_screen')
+ nav.set_section("main_triage_screen")
screen_ll_knows_problem
- reconsider('snapshot_interview_state')
- nav.set_section('provide_details')
-
+ reconsider("snapshot_interview_state")
+ nav.set_section("provide_details")
+
if not kind_of_lawsuit["file_contempt_complaint"] and not len(kind_of_lawsuit) == 1:
- include_conditions_in_complaint # Evaluate so it is available in complaint template
-
+ include_conditions_in_complaint # Evaluate so it is available in complaint template
+
if not screen_ll_knows_problem:
reconsider("al_nav_sections")
nav.set_section("review_tenant_repair_request")
@@ -178,38 +178,38 @@ code: |
else:
explain_documents
reconsider("al_nav_sections")
- if screen_ll_knows_problem and document_choice['get_report']:
+ if screen_ll_knows_problem and document_choice["get_report"]:
nav.set_section("review_checklist")
for user in users.complete_elements():
user.email
other_parties.gather()
- if screen_ll_knows_problem and document_choice['tell_landlord']:
+ if screen_ll_knows_problem and document_choice["tell_landlord"]:
nav.set_section("review_tenant_repair_request")
for user in users.complete_elements():
user.email
interview_order_tenant_repair_request
- #if screen_ll_knows_problem and document_choice['share_with_tenants']:
+ # if screen_ll_knows_problem and document_choice['share_with_tenants']:
# nav.set_section("share_with_tenants")
# explain_sharing
# store_for_tenant_sharing
- if screen_ll_knows_problem and document_choice['organize_tenants']:
+ if screen_ll_knows_problem and document_choice["organize_tenants"]:
nav.set_section("organizing_interstitial")
try:
users[0].address.geocode()
except:
pass
organizing_interstitial
- if screen_ll_knows_problem and document_choice['get_inspection']:
+ if screen_ll_knows_problem and document_choice["get_inspection"]:
nav.set_section("review_request_housing_inspection")
for user in users.complete_elements():
user.email
interview_order_request_housing_inspection
- if screen_ll_knows_problem and document_choice['demand_letter_93a']:
+ if screen_ll_knows_problem and document_choice["demand_letter_93a"]:
nav.set_section("review_Repair_Demand_Letter")
for user in users.complete_elements():
user.email
interview_order_Repair_Demand_Letter
- if screen_ll_knows_problem and document_choice['sue_landlord']:
+ if screen_ll_knows_problem and document_choice["sue_landlord"]:
nav.set_section("review_verified_complaint_and_motion")
for user in users.complete_elements():
user.email
@@ -219,19 +219,19 @@ code: |
user.email
other_parties.gather()
interview_order_contempt_complaint
-
- nav.set_section('review_and_sign')
+
+ nav.set_section("review_and_sign")
uptocode_review
basic_questions_signature_flow
-
+
if document_choice["get_inspection"] and users[0].address.city.lower() == "chelsea":
direct_inspection_email
else:
direct_inspection_email = False
-
+
reached_download_screen = True
- reconsider('snapshot_interview_state')
- nav.set_section('download_conditions_checklist_docs')
+ reconsider("snapshot_interview_state")
+ nav.set_section("download_conditions_checklist_docs")
# Kick off the background assembly tasks
tasks_to_monitor = []
@@ -240,10 +240,16 @@ code: |
tasks_to_monitor.append(housing_code_bundle.generate_downloads_with_docx_task)
tenant_repair_letter_bundle.generate_downloads_with_docx_task
tasks_to_monitor.append(tenant_repair_letter_bundle.generate_downloads_with_docx_task)
- if screen_ll_knows_problem and document_choice['sue_landlord'] or document_choice["contempt_complaint"]:
+ if (
+ screen_ll_knows_problem
+ and document_choice["sue_landlord"]
+ or document_choice["contempt_complaint"]
+ ):
affirmative_complaint_bundle.generate_downloads_with_docx_task
- tasks_to_monitor.append(affirmative_complaint_bundle.generate_downloads_with_docx_task)
-
+ tasks_to_monitor.append(
+ affirmative_complaint_bundle.generate_downloads_with_docx_task
+ )
+
if not all(task.ready() for task in tasks_to_monitor):
al_download_waiting_screen
@@ -253,10 +259,12 @@ code: |
if person_answering == "attorney" and representation_type == "entering_appearance":
signature_fields = ["users[0].attorney.signature"]
else:
- signature_fields = [user.attr_name("signature") for user in users.complete_elements()]
+ signature_fields = [
+ user.attr_name("signature") for user in users.complete_elements()
+ ]
---
code: |
- nav.set_section('review_conditions')
+ nav.set_section("review_conditions")
bad_conditions["common problems"].claims
for claim in bad_conditions["common problems"].claims.true_values():
bad_conditions["common problems"].details[claim].condition_existed_at_start
@@ -266,8 +274,16 @@ code: |
if bad_conditions.count_conditions() > 0:
# This is a bit of a workaround
for room in bad_conditions:
- for condition in bad_conditions[room].claims.true_values().difference(bad_conditions.get("common problems",DAEmpty()).claims.true_values()):
- bad_conditions[room].details[condition].condition_existed_at_start
+ for condition in (
+ bad_conditions[room]
+ .claims.true_values()
+ .difference(
+ bad_conditions.get(
+ "common problems", DAEmpty()
+ ).claims.true_values()
+ )
+ ):
+ bad_conditions[room].details[condition].condition_existed_at_start
review_conditions
else:
warn_add_conditions
@@ -483,6 +499,7 @@ comment: |
#
#
---
+id: terms of use for court
continue button field: intro_and_terms_of_use_in_court
question: |
Get an order from a judge
@@ -695,31 +712,29 @@ modules:
---
code: |
stuff_to_snapshot = {
- 'start_time': str(start_time().format('yyyy-MM-dd')),
- 'address_city': showifdef('users[0].address.city'),
- 'zip': showifdef('users[0].address.zip'),
- 'language': user_language,
- }
- try:
- stuff_to_snapshot['document_choice'] = comma_list(document_choice.true_values())
- stuff_to_snapshot['reached_document_choice_screen'] = True
+ "start_time": str(start_time().format("yyyy-MM-dd")),
+ "address_city": showifdef("users[0].address.city"),
+ "zip": showifdef("users[0].address.zip"),
+ "language": user_language,
+ }
+ try:
+ stuff_to_snapshot["document_choice"] = comma_list(document_choice.true_values())
+ stuff_to_snapshot["reached_document_choice_screen"] = True
except:
- pass
+ pass
flattened_conditions = []
if defined("bad_conditions") and include_conditions_in_complaint:
for category in bad_conditions.complete_elements():
flattened_conditions.extend(bad_conditions[category].claims.true_values())
- stuff_to_snapshot['bad_conditions'] = comma_list(flattened_conditions)
- if defined('reached_download_screen'):
- stuff_to_snapshot['reached_download_screen'] = True
-
+ stuff_to_snapshot["bad_conditions"] = comma_list(flattened_conditions)
+ if defined("reached_download_screen"):
+ stuff_to_snapshot["reached_download_screen"] = True
+
log(stuff_to_snapshot)
- store_variables_snapshot(
- data=stuff_to_snapshot, persistent=True
- )
+ store_variables_snapshot(data=stuff_to_snapshot, persistent=True)
snapshot_interview_state = True
- log('saved the snapshot')
+ log("saved the snapshot")
---
id: launch made
continue button field: launch_made
@@ -1039,7 +1054,11 @@ depends on:
code: |
bad_conditions[i].claims
bad_conditions[i].df
- for condition in bad_conditions[i].claims.true_values().difference(bad_conditions.get("common problems",DAEmpty()).claims.true_values()):
+ for condition in (
+ bad_conditions[i]
+ .claims.true_values()
+ .difference(bad_conditions.get("common problems", DAEmpty()).claims.true_values())
+ ):
bad_conditions[i].details[condition].condition_existed_at_start
bad_conditions[i].complete = True
---
@@ -1418,7 +1437,7 @@ subquestion: |
field: bad_conditions.new_item_name
buttons:
code: |
- [button for button in available_buttons if next(iter(button)) not in bad_conditions ]
+ [button for button in available_buttons if next(iter(button)) not in bad_conditions]
back button label: |
Back
under: |
@@ -1495,10 +1514,16 @@ fields:
datatype: checkboxes
required: False
code: |
- conditions_with_help(dataloader, "24 hours", search_column="Deadline", language=al_user_language)
+ conditions_with_help(
+ dataloader, "24 hours", search_column="Deadline", language=al_user_language
+ )
default:
code: |
- bad_conditions[i].claims.true_values() if defined('bad_conditions[i].claims') else [] + bad_conditions["common problems"].claims.true_values()
+ (
+ bad_conditions[i].claims.true_values()
+ if defined("bad_conditions[i].claims")
+ else [] + bad_conditions["common problems"].claims.true_values()
+ )
---
template: emergency_sanitary_code_template
subject: |
@@ -1534,7 +1559,11 @@ fields:
conditions_with_help(dataloader, i, language=al_user_language)
default:
code: |
- bad_conditions[i].claims.true_values() if defined('bad_conditions[i].claims') else [] + bad_conditions["common problems"].claims.true_values()
+ (
+ bad_conditions[i].claims.true_values()
+ if defined("bad_conditions[i].claims")
+ else [] + bad_conditions["common problems"].claims.true_values()
+ )
---
template: sanitary_code_explanation_template
subject: |
@@ -1562,11 +1591,14 @@ subquestion: |
Select "yes" if you want to look at problems in another room or category.
Select "no" if you want to skip other rooms and categories and continue to a solution.
-yesno: bad_conditions.there_is_another
+fields:
+ - label: List problems in another room or category
+ field: bad_conditions.there_is_another
+ datatype: yesno
---
code: |
# available buttons doesn't include the "short" list
- if len(bad_conditions.complete_elements()) >= len(available_buttons) + 1:
+ if len(bad_conditions.complete_elements()) >= len(available_buttons) + 1:
bad_conditions.there_is_another = False
---
code: |
@@ -1577,10 +1609,14 @@ depends on:
- bad_conditions[i].claims
code: |
if i != "common problems":
- overlapping_conditions = bad_conditions.get("common problems",DAEmpty()).claims.true_values()
+ overlapping_conditions = bad_conditions.get(
+ "common problems", DAEmpty()
+ ).claims.true_values()
else:
overlapping_conditions = []
- bad_conditions[i].df = dataloader.load_rows(bad_conditions[i].claims.true_values().difference(overlapping_conditions))
+ bad_conditions[i].df = dataloader.load_rows(
+ bad_conditions[i].claims.true_values().difference(overlapping_conditions)
+ )
---
continue button field: review_conditions
id: review conditions
@@ -1660,6 +1696,7 @@ content: |
If you are done selecting, listing, and editing problems by room and
category, continue to start working on a solution.
---
+id: warn no conditions added
event: warn_add_conditions
question: |
You haven't added any problems yet
@@ -1884,7 +1921,6 @@ fields:
default:
code: |
["get_report", "sue_landlord"] if kind_of_lawsuit.any_true() else ["get_report"]
-
- no label: document_choice
required: False
datatype: checkboxes
@@ -1931,7 +1967,13 @@ fields:
none of the above: False
default:
code: |
- ["get_report", "contempt_complaint"] if kind_of_lawsuit["file_contempt_complaint"] else ["get_report", "sue_landlord"] if kind_of_lawsuit.any_true() else ["get_report"]
+ (
+ ["get_report", "contempt_complaint"]
+ if kind_of_lawsuit["file_contempt_complaint"]
+ else (
+ ["get_report", "sue_landlord"] if kind_of_lawsuit.any_true() else ["get_report"]
+ )
+ )
validation code: |
if screen_ll_knows_problem and len(document_choice.true_values()) < 1:
validation_error("Pick at least one.", field="document_choice")
@@ -1965,16 +2007,13 @@ code: |
screen_contacted_housing_inspector = tenant_called_inspector
if not tenant_called_inspector:
document_choice["get_inspection"] = add_inspection_letter
- if (
- not tenant_sent_ll_notice
- and confirm_suing_choice == "give_notice_first"
- ):
+ if not tenant_sent_ll_notice and confirm_suing_choice == "give_notice_first":
screen_ll_knows_problem = False
document_choice["sue_landlord"] = False
document_choice["tell_landlord"] = True
else:
document_choice["sue_landlord"] = True
- elif kind_of_lawsuit["file_contempt_complaint"]: # shouldn't start a new lawsuit
+ elif kind_of_lawsuit["file_contempt_complaint"]: # shouldn't start a new lawsuit
screen_contacted_housing_inspector = None
initial_screen_tenant_facing_eviction = None
screen_ll_knows_problem = True
@@ -2015,10 +2054,20 @@ code: |
interview_order_request_housing_inspection = True
---
code: |
- if users[0].normalized_address().city.lower() in ['boston', 'charlestown', 'dorchester','roxbury', 'jamaica plain', 'brighton', 'allston']:
+ if users[0].normalized_address().city.lower() in [
+ "boston",
+ "charlestown",
+ "dorchester",
+ "roxbury",
+ "jamaica plain",
+ "brighton",
+ "allston",
+ ]:
inspector_information = inspector_loader.load_row("Boston").fillna("")
else:
- inspector_information = inspector_loader.load_row(users[0].normalized_address().city).fillna("")
+ inspector_information = inspector_loader.load_row(
+ users[0].normalized_address().city
+ ).fillna("")
if inspector_information.empty:
inspector_information = DAEmpty()
---
@@ -2087,9 +2136,11 @@ fields:
id: direct_inspection_email_success
code: |
if direct_inspection_email == True:
- chelsea_email = "housingcomplaints@chelseama.gov"
- # chelsea_email = "quinten@lemmalegal.com"
- direct_inspection_email_success = inspector_bundle.send_email(to=chelsea_email, template=chelsea_inspection_email_template)
+ chelsea_email = "housingcomplaints@chelseama.gov"
+ # chelsea_email = "quinten@lemmalegal.com"
+ direct_inspection_email_success = inspector_bundle.send_email(
+ to=chelsea_email, template=chelsea_inspection_email_template
+ )
---
template: chelsea_inspection_email_template
subject: |
@@ -2165,7 +2216,7 @@ subquestion: |
A unit can be {condemned} in these circumstances.
- Find legal aid organizations in your area by answering a few questions [here](https://masslrf.org/en/triage/start/housing).
+ [Find legal aid organizations in your area](https://masslrf.org/en/triage/start/housing) by answering a few questions.
% endif
To call the housing inspector for your city or town
@@ -2186,7 +2237,7 @@ subquestion: |
A unit can be {condemned} in these circumstances.
- Find legal aid organizations in the tenant's area by answering a few questions [here](https://masslrf.org/en/triage/start/housing).
+ [Find legal aid organizations in the tenant's area](https://masslrf.org/en/triage/start/housing) by answering a few questions.
% endif
To call the housing inspector for your city or town
@@ -2347,7 +2398,7 @@ fields:
- Day: bad_conditions[i].details[j].start_day
datatype: integer
code: |
- range(1,31+1)
+ range(1, 31 + 1)
required: False
show if:
variable: bad_conditions[i].details[j].condition_existed_at_start
@@ -2398,24 +2449,45 @@ fields:
validation code: |
# Transform the approximate date into a real DADateTime object
if not bad_conditions[i].details[j].condition_existed_at_start:
- bad_conditions[i].details[j].start_date = today().replace(day=1, month=1) # otherwise if the current day is past 28 might get a value error
+ bad_conditions[i].details[j].start_date = today().replace(
+ day=1, month=1
+ ) # otherwise if the current day is past 28 might get a value error
try:
if bad_conditions[i].details[j].start_year:
- bad_conditions[i].details[j].start_date = bad_conditions[i].details[j].start_date.replace(year=int(bad_conditions[i].details[j].start_year))
- if int(bad_conditions[i].details[j].start_month) in range(1,12):
- bad_conditions[i].details[j].start_date = bad_conditions[i].details[j].start_date.replace(month=int(bad_conditions[i].details[j].start_month))
+ bad_conditions[i].details[j].start_date = (
+ bad_conditions[i]
+ .details[j]
+ .start_date.replace(year=int(bad_conditions[i].details[j].start_year))
+ )
+ if int(bad_conditions[i].details[j].start_month) in range(1, 12):
+ bad_conditions[i].details[j].start_date = (
+ bad_conditions[i]
+ .details[j]
+ .start_date.replace(month=int(bad_conditions[i].details[j].start_month))
+ )
bad_conditions[i].details[j].approximate_month = False
else:
- bad_conditions[i].details[j].start_date = bad_conditions[i].details[j].start_date.replace(month=1)
+ bad_conditions[i].details[j].start_date = (
+ bad_conditions[i].details[j].start_date.replace(month=1)
+ )
bad_conditions[i].details[j].approximate_month = True
- if int(bad_conditions[i].details[j].start_day) in range(1,31):
- bad_conditions[i].details[j].start_date = bad_conditions[i].details[j].start_date.replace(day=int(bad_conditions[i].details[j].start_day))
+ if int(bad_conditions[i].details[j].start_day) in range(1, 31):
+ bad_conditions[i].details[j].start_date = (
+ bad_conditions[i]
+ .details[j]
+ .start_date.replace(day=int(bad_conditions[i].details[j].start_day))
+ )
bad_conditions[i].details[j].approximate_day = False
else:
- bad_conditions[i].details[j].start_date = bad_conditions[i].details[j].start_date.replace(day=1)
+ bad_conditions[i].details[j].start_date = (
+ bad_conditions[i].details[j].start_date.replace(day=1)
+ )
bad_conditions[i].details[j].approximate_day = True
except ValueError:
- validation_error(f"The date {bad_conditions[i].details[j].start_month or 1}/{bad_conditions[i].details[j].start_day or 1}/{bad_conditions[i].details[j].start_year} is not a valid date. Check the day of the month or leave it blank.", field="bad_conditions[i].details[j].start_day")
+ validation_error(
+ f"The date {bad_conditions[i].details[j].start_month or 1}/{bad_conditions[i].details[j].start_day or 1}/{bad_conditions[i].details[j].start_year} is not a valid date. Check the day of the month or leave it blank.",
+ field="bad_conditions[i].details[j].start_day",
+ )
---
if: |
not document_choice['sue_landlord']
@@ -2485,12 +2557,14 @@ subquestion: |
themself or to send them to someone else. The tenant should download and email a copy of each document to themself or a trusted friend or family member so that they always have a copy and can **print** them if they need to in the future.
% endif
---
+id: explain sharing information
continue button field: explain_sharing
question: |
Thank you for sharing your information
subquestion: |
Your name and apartment number will stay private.
---
+id: review housing code checklist
event: review_checklist
question: |
Edit answers on your housing code checklist
@@ -2898,38 +2972,58 @@ code: |
feedback_form = user_info().package + ":feedback.yml"
---
code: |
- organize_tenants_attachment.enabled = screen_ll_knows_problem and document_choice['organize_tenants']
+ organize_tenants_attachment.enabled = (
+ screen_ll_knows_problem and document_choice["organize_tenants"]
+ )
---
code: |
conditions_report_attachment.enabled = (
- action_argument('enabled')
- or (screen_ll_knows_problem and document_choice['get_report'] and include_conditions_in_complaint)
+ action_argument("enabled")
+ or (
+ screen_ll_knows_problem
+ and document_choice["get_report"]
+ and include_conditions_in_complaint
+ )
or direct_inspection_email
)
---
code: |
- request_housing_inspection_attachment.enabled = screen_ll_knows_problem and document_choice['get_inspection'] or direct_inspection_email
+ request_housing_inspection_attachment.enabled = (
+ screen_ll_knows_problem
+ and document_choice["get_inspection"]
+ or direct_inspection_email
+ )
---
code: |
- tenant_repair_request_attachment.enabled = not screen_ll_knows_problem or document_choice['tell_landlord']
+ tenant_repair_request_attachment.enabled = (
+ not screen_ll_knows_problem or document_choice["tell_landlord"]
+ )
---
code: |
- letter_to_notify_landlord_instructions_attachment.enabled = not screen_ll_knows_problem or document_choice['tell_landlord']
+ letter_to_notify_landlord_instructions_attachment.enabled = (
+ not screen_ll_knows_problem or document_choice["tell_landlord"]
+ )
---
code: |
- Repair_Demand_Letter_attachment.enabled = screen_ll_knows_problem and document_choice['demand_letter_93a']
+ Repair_Demand_Letter_attachment.enabled = (
+ screen_ll_knows_problem and document_choice["demand_letter_93a"]
+ )
---
code: |
- Repair_Demand_Letter_post_interview_instructions.enabled = screen_ll_knows_problem and document_choice['demand_letter_93a']
+ Repair_Demand_Letter_post_interview_instructions.enabled = (
+ screen_ll_knows_problem and document_choice["demand_letter_93a"]
+ )
---
code: |
verified_complaint_attachment.enabled = document_choice["sue_landlord"]
---
code: |
- next_steps_for_court_attachment.enabled = document_choice['sue_landlord']
+ next_steps_for_court_attachment.enabled = document_choice["sue_landlord"]
---
code: |
- verified_complaint_attachment.enabled = screen_ll_knows_problem and document_choice['sue_landlord']
+ verified_complaint_attachment.enabled = (
+ screen_ll_knows_problem and document_choice["sue_landlord"]
+ )
---
code: |
temporary_order.enabled = verified_complaint_attachment.enabled
@@ -2947,7 +3041,9 @@ code: |
order_of_notice.enabled = False
---
code: |
- contempt_complaint.enabled = screen_ll_knows_problem and document_choice['contempt_complaint']
+ contempt_complaint.enabled = (
+ screen_ll_knows_problem and document_choice["contempt_complaint"]
+ )
---
objects:
- inspector_bundle: ALDocumentBundle.using(elements=[
@@ -2986,7 +3082,9 @@ attachment:
docx template file: next_steps_request_for_repairs_letter.docx
---
code: |
- request_housing_inspection_instructions_attachment.enabled = request_housing_inspection_attachment.enabled
+ request_housing_inspection_instructions_attachment.enabled = (
+ request_housing_inspection_attachment.enabled
+ )
---
objects:
- housing_code_bundle: ALDocumentBundle.using(elements=[
@@ -3154,7 +3252,7 @@ subquestion: |
1. Your unit is {overcrowded}.
1. Your unit is {uninhabitable}.
- Find legal aid organizations in your area by answering a few questions [here](https://masslrf.org/en/triage/start/housing).
+ [Find legal aid organizations in your area](https://masslrf.org/en/triage/start/housing) by answering a few questions.
% else:
A unit can be {condemned} in certain circumstances.
@@ -3164,5 +3262,5 @@ subquestion: |
1. Their unit is {overcrowded}.
1. Their unit is {uninhabitable}.
- Find legal aid organizations in the tenant's area by answering a few questions [here](https://masslrf.org/en/triage/start/housing).
- % endif
\ No newline at end of file
+ [Find legal aid organizations in the tenant's area](https://masslrf.org/en/triage/start/housing) by answering a few questions.
+ % endif
diff --git a/docassemble/HousingCodeChecklist/data/questions/language.yml b/docassemble/HousingCodeChecklist/data/questions/language.yml
index 012a257..20a9a15 100644
--- a/docassemble/HousingCodeChecklist/data/questions/language.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/language.yml
@@ -337,7 +337,9 @@ objects:
- letter_to_notify_landlord_instructions_attachment_es: ALDocument.using(title="Instrucciones para notificar al arrendador", filename="next_steps_request_for_repairs_letter.docx", has_addendum=False)
---
code: |
- next_steps_for_court_attachment_es.enabled = (al_user_language == "es") and next_steps_for_court_attachment.enabled
+ next_steps_for_court_attachment_es.enabled = (
+ al_user_language == "es"
+ ) and next_steps_for_court_attachment.enabled
---
attachments:
- name: Tus próximos pasos en corte
@@ -347,7 +349,9 @@ attachments:
docx template file: next_steps_for_courtes-419.docx
---
code: |
- verified_complaint_attachment_es.enabled = (al_user_language == "es") and verified_complaint_attachment.enabled
+ verified_complaint_attachment_es.enabled = (
+ al_user_language == "es"
+ ) and verified_complaint_attachment.enabled
---
attachments:
- name: Demanda verificada
@@ -357,7 +361,9 @@ attachments:
docx template file: verified_complaintes-419.docx
---
code: |
- motion_for_injunctive_relief_attachment_es.enabled = (al_user_language == "es") and motion_for_injunctive_relief_attachment.enabled
+ motion_for_injunctive_relief_attachment_es.enabled = (
+ al_user_language == "es"
+ ) and motion_for_injunctive_relief_attachment.enabled
---
attachments:
- name: Moción para alivio cautelar
@@ -367,7 +373,9 @@ attachments:
docx template file: motion_for_injunctive_reliefes-419.docx
---
code: |
- Repair_Demand_Letter_post_interview_instructions_es.enabled = (al_user_language == "es") and Repair_Demand_Letter_post_interview_instructions.enabled
+ Repair_Demand_Letter_post_interview_instructions_es.enabled = (
+ al_user_language == "es"
+ ) and Repair_Demand_Letter_post_interview_instructions.enabled
---
attachments:
- name: Instrucciones posteriores a la entrevista de la carta de demanda de reparación
@@ -377,7 +385,9 @@ attachments:
docx template file: next_steps_demand_letteres-419.docx
---
code: |
- request_housing_inspection_instructions_attachment_es.enabled = (al_user_language == "es") and request_housing_inspection_instructions_attachment.enabled
+ request_housing_inspection_instructions_attachment_es.enabled = (
+ al_user_language == "es"
+ ) and request_housing_inspection_instructions_attachment.enabled
---
attachments:
- name: Instrucciones para solicitar inspección de vivienda
@@ -387,7 +397,9 @@ attachments:
docx template file: next_steps_inspection_request_letteres-419.docx
---
code: |
- letter_to_notify_landlord_instructions_attachment_es.enabled = (al_user_language == "es") and letter_to_notify_landlord_instructions_attachment.enabled
+ letter_to_notify_landlord_instructions_attachment_es.enabled = (
+ al_user_language == "es"
+ ) and letter_to_notify_landlord_instructions_attachment.enabled
---
attachments:
- name: Instrucciones para notificar al arrendador
diff --git a/docassemble/HousingCodeChecklist/data/questions/load_answers.yml b/docassemble/HousingCodeChecklist/data/questions/load_answers.yml
index 953675b..7e3eaac 100644
--- a/docassemble/HousingCodeChecklist/data/questions/load_answers.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/load_answers.yml
@@ -45,14 +45,23 @@ objects:
- uptocode_logo: DAStaticFile.using(filename="horiztonal-white1.5x_blue.svg")
---
code: |
- answers = get_saved_interview_list(filename=f"{user_info().package}:housing_code_interview.yml", exclude_newly_started_sessions=True)
+ answers = get_saved_interview_list(
+ filename=f"{user_info().package}:housing_code_interview.yml",
+ exclude_newly_started_sessions=True,
+ )
first_answer = dict(next(iter(answers)))
---
code: |
if len(answers) == 1:
- response(url=interview_url(i=f"{user_info().package}:housing_code_interview.yml", session=first_answer.get("key")))
+ response(
+ url=interview_url(
+ i=f"{user_info().package}:housing_code_interview.yml",
+ session=first_answer.get("key"),
+ )
+ )
load_answers
---
+id: load saved UpToCode session
mandatory: True
event: load_answers
question: |
diff --git a/docassemble/HousingCodeChecklist/data/questions/verified_complaint_and_motions_standalone.yml b/docassemble/HousingCodeChecklist/data/questions/verified_complaint_and_motions_standalone.yml
index 9dd1d84..a08a32c 100644
--- a/docassemble/HousingCodeChecklist/data/questions/verified_complaint_and_motions_standalone.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/verified_complaint_and_motions_standalone.yml
@@ -18,7 +18,7 @@ metadata:
- Sofija Belajcic
---
code: |
- interview_metadata['main_interview_key'] = 'verified_complaint_and_motions'
+ interview_metadata["main_interview_key"] = "verified_complaint_and_motions"
---
code: |
# This controls the default country and list of states in address field questions
@@ -29,13 +29,13 @@ code: |
AL_DEFAULT_STATE = "MA"
---
code: |
- github_repo_name = 'docassemble-VerifiedComplaintAndMotions'
+ github_repo_name = "docassemble-VerifiedComplaintAndMotions"
---
code: |
interview_short_title = "File a Verified Complaint Form"
---
code: |
- al_form_type = 'starts_case'
+ al_form_type = "starts_case"
---
code: |
landlord_name_is_optional = False
@@ -58,7 +58,7 @@ code: |
interview_order_verified_complaint_and_motions
signature_date
# Save anonymized interview statistics (customize the saved data below)
- store_variables_snapshot(data={'zip': users[0].address.zip})
+ store_variables_snapshot(data={"zip": users[0].address.zip})
verified_complaint_and_motions_preview_question
basic_questions_signature_flow
verified_complaint_and_motions_download
@@ -129,4 +129,6 @@ objects:
- al_court_bundle: ALDocumentBundle.using(elements=[verified_complaint_and_motions_attachment], filename="verified_complaint_and_motions", title="All forms to download for your records", enabled=True)
---
code: |
- verified_complaint_and_motions_attachment.enabled = screen_ll_knows_problem and document_choice['sue_landlord']
\ No newline at end of file
+ verified_complaint_and_motions_attachment.enabled = (
+ screen_ll_knows_problem and document_choice["sue_landlord"]
+ )
\ No newline at end of file
diff --git a/docassemble/HousingCodeChecklist/data/questions/verified_complaint_and_motions_to_include.yml b/docassemble/HousingCodeChecklist/data/questions/verified_complaint_and_motions_to_include.yml
index 5b597d2..a2622f9 100644
--- a/docassemble/HousingCodeChecklist/data/questions/verified_complaint_and_motions_to_include.yml
+++ b/docassemble/HousingCodeChecklist/data/questions/verified_complaint_and_motions_to_include.yml
@@ -39,8 +39,8 @@ id: interview_order_verified_complaint_and_motions
code: |
# Set the allowed courts for this interview
allowed_courts = interview_metadata["verified_complaint_and_motions"]["allowed courts"]
- user_role = 'plaintiff'
- user_ask_role = 'plaintiff'
+ user_role = "plaintiff"
+ user_ask_role = "plaintiff"
File_a_Verified_Complaint_Form
users[0].email
users.gather()
@@ -53,7 +53,7 @@ code: |
confirm_ask_for_damages
update_ask_for_damages
verified_complaint_claims.gathered
- tenant_gets_rent_subsidy # from Repair_Demand_letter_to_include.yml
+ tenant_gets_rent_subsidy # from Repair_Demand_letter_to_include.yml
if complaint_ask_for_damages:
tenant_unit_rent
if tenant_gets_rent_subsidy and tenant_subsidy_is_voucher:
@@ -70,13 +70,13 @@ code: |
claim_jurytrial
verified_complaint_wants_fee_waiver
if verified_complaint_wants_fee_waiver == "wants_fee_waiver":
- document_choice["fee_waiver"] = True
- reconsider("al_nav_sections")
- nav.set_section("review_fee_waiver")
- set_fee_waiver_defaults
- case_name
- docket_numbers
- ask_affidavit_questions
+ document_choice["fee_waiver"] = True
+ reconsider("al_nav_sections")
+ nav.set_section("review_fee_waiver")
+ set_fee_waiver_defaults
+ case_name
+ docket_numbers
+ ask_affidavit_questions
service_method
interview_order_verified_complaint_and_motions = True
---
@@ -91,7 +91,7 @@ code: |
customize_discovery_choice
if customize_discovery_choice == "customize_discovery":
customize_discovery_requests
-
+
interview_order_discovery = True
---
code: |
@@ -111,7 +111,11 @@ code: |
motion_for_injunctive_relief_attachment.enabled = verified_complaint_attachment.enabled
---
code: |
- affidavitofindigency_attachment.enabled = document_choice['sue_landlord'] and verified_complaint_wants_fee_waiver == "wants_fee_waiver" and is_indigent
+ affidavitofindigency_attachment.enabled = (
+ document_choice["sue_landlord"]
+ and verified_complaint_wants_fee_waiver == "wants_fee_waiver"
+ and is_indigent
+ )
---
comment: |
This question is used to introduce your interview. Please customize
@@ -131,18 +135,20 @@ code: |
elif trial_court.department in ["District Court", "Boston Municipal Court"]:
verified_complaint_tro_fee = 0
verified_complaint_entry_of_action_Fee = 195
- else: # Superior Court
+ else: # Superior Court
verified_complaint_tro_fee = 90
verified_complaint_entry_of_action_Fee = 240
---
code: |
- fees['Filing fee'].waive = True
- fees['Filing fee'].amount = verified_complaint_tro_fee + verified_complaint_entry_of_action_Fee
- fees['Service'].waive = True
+ fees["Filing fee"].waive = True
+ fees["Filing fee"].amount = (
+ verified_complaint_tro_fee + verified_complaint_entry_of_action_Fee
+ )
+ fees["Service"].waive = True
if trial_court.department in ["District Court", "Boston Municipal Court"]:
- fees['Service'].amount = 60
+ fees["Service"].amount = 60
else:
- fees['Service'].amount = 45
+ fees["Service"].amount = 45
set_fee_waiver_defaults = True
---
id: review discovery
@@ -955,7 +961,7 @@ only sets:
code: |
if confirm_ask_for_damages == "postpone_damages":
complaint_ask_for_damages = False
- update_ask_for_damages = True
+ update_ask_for_damages = True
---
code: |
addresses_to_search = [user.address for user in users]
@@ -1173,6 +1179,7 @@ review:
Would you like to find out if you qualify to file for free?: ${ word(yesno(verified_complaint_wants_fee_waiver)) }
---
+id: edit verified complaint landlords
continue button field: other_parties.revisit
question: |
Edit landlords
@@ -1195,6 +1202,7 @@ edit:
- address.address
confirm: True
---
+id: edit verified complaint tenants
continue button field: users.revisit
question: |
Edit tenant information
@@ -1380,4 +1388,8 @@ attachment:
---
code: |
# This gets overridden inside UpToCode interview
- tenant_repair_default_date = next(item.date for item in sorted(verified_complaint_claims.items(), key=lambda y: y.date) if item.has_claim)
\ No newline at end of file
+ tenant_repair_default_date = next(
+ item.date
+ for item in sorted(verified_complaint_claims.items(), key=lambda y: y.date)
+ if item.has_claim
+ )
diff --git a/docassemble/HousingCodeChecklist/data/sources/dummy_photo1.jpg b/docassemble/HousingCodeChecklist/data/sources/dummy_photo1.jpg
new file mode 100644
index 0000000..615bb3b
Binary files /dev/null and b/docassemble/HousingCodeChecklist/data/sources/dummy_photo1.jpg differ
diff --git a/docassemble/HousingCodeChecklist/data/sources/dummy_photo2.jpg b/docassemble/HousingCodeChecklist/data/sources/dummy_photo2.jpg
new file mode 100644
index 0000000..e7203c6
Binary files /dev/null and b/docassemble/HousingCodeChecklist/data/sources/dummy_photo2.jpg differ
diff --git a/docassemble/HousingCodeChecklist/data/sources/housing_code_test.feature b/docassemble/HousingCodeChecklist/data/sources/housing_code_test.feature
deleted file mode 100644
index 999122c..0000000
--- a/docassemble/HousingCodeChecklist/data/sources/housing_code_test.feature
+++ /dev/null
@@ -1,198 +0,0 @@
-@interviews_start
-Feature: The interviews run without erroring
-
-This file:
-[x] Test that each interview starts without an error.
-[x] Contains some additional example Steps. They use fake values and are commented out with a "#" so they won't run.
-
-These tests are made to work with the ALKiln testing framework, an automated testing framework made under the Document Assembly Line Project.
-
-Want to disable the tests? Want to learn more? See ALKiln's docs: https://suffolklitlab.github.io/docassemble-AssemblyLine-documentation/docs/automated_integrated_testing
-
-@1
-Scenario: housing_code_interview.yml tenant runs, one plantiff, rent subsidy
- Given I start the interview at "housing_code_interview.yml"
- And the maximum seconds for each Step in this Scenario is 25
- Then I tap the "#start_your_list" element
- And I get to the question id "download_conditions_checklist_docs" with this data:
- | var | value | trigger |
- | acknowledged_information_use['I accept the Terms of Use.'] | True | acknowledged_information_use |
- | person_answering | tenant | |
- | users[0].name.first | Joe | |
- | users[0].name.last | Carpenter | |
- | bad_conditions["common problems"].claims['heat_not_working'] | True | |
- | kind_of_lawsuit['illegal_lockout'] | True | |
- | bad_conditions[i].details[j].condition_existed_at_start | True | |
- | wants_detailed_conditions | False | |
- | screen_tenant_facing_eviction | notice only | screen_tenant_facing_eviction |
- | screen_ll_knows_problem | True | |
- | screen_ll_already_fixing | False | screen_ll_knows_problem |
- | screen_other_tenants_with_problem | False | screen_ll_knows_problem |
- | screen_contacted_housing_inspector | True | screen_ll_knows_problem |
- | has_tro | False | screen_ll_knows_problem |
- | document_choice['get_report'] | True | |
- | users[0].address.address | Commonwealth Avenue | |
- | users[0].address.city | Boston | |
- | other_parties[0].person_type | business | |
- | other_parties[0].name.first | ll_business | other_parties[0].person_type |
- | other_parties[0].address.address | Landlord address | |
- | other_parties[0].address.city | City | |
- | complaint_ask_for_damages| True | |
- | landlord_is_housing_authority | False | |
- | landlord_is_government | False | landlord_is_housing_authority |
- | landlord_lives_in_building | True | landlord_is_government |
- | building_larger_than_4_units | True | landlord_lives_in_building |
- | demand_letter_sent | True | |
- | date_of_93A_notice | 11/11/2000 | demand_letter_sent |
- | got_93a_settlement_offer | True | |
- | verified_complaint_claims[i].details | something| |
- | verified_complaint_claims[i].date | 2023 | |
- | tenant_gets_rent_subsidy | True | |
- | tenant_rent_share | 500 | |
- | tenant_unit_rent | 750 | |
- | tenant_subsidy_is_voucher | True | |
- | verified_complaint_tenant_voucher_at_risk | True | tenant_subsidy_is_voucher |
- | complaint_ask_for_tro | False | |
- | complaint_ask_for_relocation | True | |
- | other_parties[0].email | test@example.com | |
- | users[0].email | test@example.com | |
- | verified_complaint_wants_fee_waiver | False | |
- | signature_choice | this_device | signature_choice |
- | users[0].states_above_true['states_true'] | True | signature_choice |
- | users[0].signature | | users[0].signature |
- Then I take a screenshot
-
-@2
-Scenario: housing_code_interview.yml tenant runs, one plantiff, rent subsidy
- Given I start the interview at "housing_code_interview.yml"
- And the maximum seconds for each Step in this Scenario is 80
- Then I tap the "#start_your_list" element
- And I get to the question id "download_conditions_checklist_docs" with this data:
- | var | value | trigger |
- | acknowledged_information_use['I accept the Terms of Use.'] | True | |
- | person_answering | attorney | |
- | representation_type| entering_appearance | person_answering |
- | users[0].name.first | Joe | |
- | users[0].name.last | Carpenter | |
- | users[0].attorney.organization | law_firm | |
- | users[0].attorney.name.first | Lawyer | |
- | users[0].attorney.name.last | Name | |
- | bad_conditions["common problems"].claims['heat_not_working'] | True | |
- | kind_of_lawsuit['illegal_lockout'] | True | |
- | kind_of_lawsuit['entered_without_permission'] | True ||
- | bad_conditions[i].details[j].condition_existed_at_start | False | |
- | bad_conditions[i].details[j].start_year | 2004 | |
- | wants_detailed_conditions | False | |
- | screen_tenant_facing_eviction | has case | screen_tenant_facing_eviction |
- | screen_ll_knows_problem | True | |
- | screen_ll_already_fixing | True | screen_ll_knows_problem |
- | screen_other_tenants_with_problem | True | screen_ll_knows_problem |
- | screen_contacted_housing_inspector | True | screen_ll_knows_problem |
- | has_tro | False | screen_ll_knows_problem |
- | document_choice['tell_landlord'] | True | |
- | users[0].address.address | Commonwealth Avenue | |
- | users[0].address.city | Boston | |
- | users[0].has_separate_mailing_address | True | |
- | users[0].mailing_address.address | Dartmouth | |
- | users[0].mailing_address.city | Boston | |
- | other_parties[0].person_type | individual | |
- | other_parties[0].name.first | ll_business | other_parties[0].person_type |
- | other_parties[0].name.last | name | other_parties[0].person_type |
- | ll_address_unknown | True | |
- | users[0].email | test@example.com | |
- | tenant_repair_issue_date | 11/11/2001| |
- | sanitary_code_citation_style | detailed_cites | sanitary_code_citation_style |
- | users[0].move_in_date | 11/11/2001 | |
- | notification_date | 2023 | |
- | written_notification | True | |
- | letter_date | 2021 | written_notification |
- | effect_of_conditions | something | |
- | damage_calculation_method | skip_amount | |
- | users[0].attorney.address.address | Newbury | |
- | users[0].attorney.address.city | Boston | |
- | complaint_ask_for_damages | False | |
- | landlord_is_housing_authority | True | |
- | complaint_utility_shutoff['gas'] | True | |
- | complaint_utility_not_paid['electricity'] | True | |
- | verified_complaint_claims[i].details | something | |
- | verified_complaint_claims[i].date | 2023 | |
- | tenant_gets_rent_subsidy | True | |
- | tenant_subsidy_is_voucher | False | |
- | complaint_ask_for_tro | False | |
- | complaint_ask_for_relocation | False | |
- | other_parties[0].email | test@example.com | |
- | verified_complaint_wants_fee_waiver | True | |
- | public_assistance_kinds['TAFDC'] | True | |
- | signature_choice | this_device | |
- | users[0].states_above_true['states_true'] | True | signature_choice |
- | users[0].attorney.signature | | users[0].attorney.signature |
- | users[0].signature | | users[0].signature |
- Then I take a screenshot
-
-
-@3
-Scenario: housing_code_interview.yml tenant runs, one plantiff, rent subsidy
- Given I start the interview at "housing_code_interview.yml"
- And the maximum seconds for each Step in this Scenario is 80
- Then I tap the "#start_your_list" element
- And I get to the question id "download_conditions_checklist_docs" with this data:
- | var | value | trigger |
- | acknowledged_information_use['I accept the Terms of Use.'] | True | |
- | person_answering | attorney | |
- | representation_type| entering_appearance | person_answering |
- | users[0].name.first | Joe | |
- | users[0].name.last | Carpenter | |
- | users[0].attorney.organization | law_firm | |
- | users[0].attorney.name.first | Lawyer | |
- | users[0].attorney.name.last | Name | |
- | bad_conditions["common problems"].claims['heat_not_working'] | True | |
- | kind_of_lawsuit['illegal_lockout'] | True | |
- | kind_of_lawsuit['entered_without_permission'] | True ||
- | bad_conditions[i].details[j].condition_existed_at_start | False | |
- | bad_conditions[i].details[j].start_year | 2004 | |
- | wants_detailed_conditions | False | |
- | screen_tenant_facing_eviction | pending | screen_tenant_facing_eviction |
- | screen_ll_knows_problem | True | |
- | screen_ll_already_fixing | True | screen_ll_knows_problem |
- | screen_other_tenants_with_problem | True | screen_ll_knows_problem |
- | screen_contacted_housing_inspector | True | screen_ll_knows_problem |
- | has_tro | False | screen_ll_knows_problem |
- | document_choice['get_report'] | True | |
- | users[0].address.address | Commonwealth Avenue | |
- | users[0].address.city | Boston | |
- | users[0].has_separate_mailing_address | True | |
- | users[0].mailing_address.address | Dartmouth | |
- | users[0].mailing_address.city | Boston | |
- | other_parties[0].person_type | individual | |
- | other_parties[0].name.first | ll_business | other_parties[0].person_type |
- | other_parties[0].name.last | name | other_parties[0].person_type |
- | ll_address_unknown | True | |
- | users[0].email | test@example.com | |
- | tenant_repair_issue_date | 11/11/2001| |
- | sanitary_code_citation_style | detailed_cites | sanitary_code_citation_style |
- | users[0].move_in_date | 11/11/2001 | |
- | notification_date | 2023 | |
- | written_notification | True | |
- | letter_date | 2021 | written_notification |
- | effect_of_conditions | something | |
- | damage_calculation_method | skip_amount | |
- | users[0].attorney.address.address | Newbury | |
- | users[0].attorney.address.city | Boston | |
- | complaint_ask_for_damages | False | |
- | landlord_is_housing_authority | True | |
- | complaint_utility_shutoff['gas'] | True | |
- | complaint_utility_not_paid['electricity'] | True | |
- | verified_complaint_claims[i].details | something | |
- | verified_complaint_claims[i].date | 2023 | |
- | tenant_gets_rent_subsidy | True | |
- | tenant_subsidy_is_voucher | False | |
- | complaint_ask_for_tro | False | |
- | complaint_ask_for_relocation | False | |
- | other_parties[0].email | test@example.com | |
- | verified_complaint_wants_fee_waiver | True | |
- | public_assistance_kinds['TAFDC'] | True | |
- | signature_choice | this_device | |
- | users[0].states_above_true['states_true'] | True | signature_choice |
- | users[0].attorney.signature | | users[0].attorney.signature |
- | users[0].signature | | users[0].signature |
- Then I take a screenshot
\ No newline at end of file
diff --git a/docassemble/HousingCodeChecklist/data/sources/interviews_run.feature b/docassemble/HousingCodeChecklist/data/sources/interviews_run.feature
deleted file mode 100644
index b7ea74b..0000000
--- a/docassemble/HousingCodeChecklist/data/sources/interviews_run.feature
+++ /dev/null
@@ -1,19 +0,0 @@
-@interviews_start
-Feature: The interviews run without erroring
-
-This file:
-[x] Test that each interview starts without an error.
-[x] Contains some additional example Steps. They use fake values and are commented out with a "#" so they won't run.
-
-These tests are made to work with the ALKiln testing framework, an automated testing framework made under the Document Assembly Line Project.
-
-Want to disable the tests? Want to learn more? See ALKiln's docs: https://suffolklitlab.github.io/docassemble-AssemblyLine-documentation/docs/automated_integrated_testing
-
-@housingcodeinterview
-Scenario: housing_code_interview.yml runs
- Given I start the interview at "housing_code_interview.yml"
- #And the maximum seconds for each Step in this Scenario is 50
- #And I get to the question id "downloads" with this data:
- # | var | value | trigger |
- # | users[0].name.first | Uli | users[0].name.first |
- # | users[0].name.last | User1 | users[0].name.first |
\ No newline at end of file
diff --git a/docassemble/HousingCodeChecklist/data/sources/maximalist_path.feature b/docassemble/HousingCodeChecklist/data/sources/maximalist_path.feature
new file mode 100644
index 0000000..6df43c2
--- /dev/null
+++ b/docassemble/HousingCodeChecklist/data/sources/maximalist_path.feature
@@ -0,0 +1,589 @@
+Feature: Generated docassemble test
+
+Scenario: Maximalist Path generated from session
+ Given I start the interview at "housing_code_interview.yml"
+ And I tap the "text=Get help in court" element and go to the next page
+ And the maximum seconds for each Step is 660
+ And the user gets to any of the question ids ["download_conditions_checklist_docs", "waiting-screen"] with this data:
+ | var | value |
+ | redis_panel_emails_key | docassemble-GithubFeedbackForm:panel_emails |
+ | initial_action_selection | help_in_court |
+ | initial_action_display_cards | True |
+ | acknowledged_information_use['I accept the Terms of Use.'] | True |
+ | intro_and_terms_of_use_in_court | True |
+ | person_answering | attorney |
+ | representation_type | entering_appearance |
+ | users.target_number | 1 |
+ | users[0].name.first | Rerum laboriosam am |
+ | users[0].name.middle | Atque quis soluta ve |
+ | users[0].name.last | Tenetur ipsum aliqui |
+ | users[0].name.suffix | Sr. |
+ | users[0].address.location.known | True |
+ | users[0].address.location.description | 197 Friend Street [NEWLINE] Boston, MA 02114 |
+ | users[0].address.address | 197 Friend Street |
+ | users[0].address.unit | |
+ | users[0].address.city | Boston |
+ | users[0].address.state | MA |
+ | users[0].address.zip | 02114 |
+ | users[0].address.one_line | 197 Friend St, Boston, MA 02114, USA |
+ | users[0].address.street_number | 197 |
+ | users[0].address.street | Friend St |
+ | users[0].address.neighborhood | Bulfinch Triangle Historic District |
+ | users[0].address.locality | Boston |
+ | users[0].address.political | Boston |
+ | users[0].address.county | Suffolk County |
+ | users[0].address.administrative_area_level_1 | Massachusetts |
+ | users[0].address.country | US |
+ | users[0].address.postal_code | 02114 |
+ | users[0].address.postal_code_suffix | 2004 |
+ | users[0].address.zip4 | 02114-2004 |
+ | users[0].location.known | False |
+ | users[0].previous_addresses.target_number | 0 |
+ | users[0].other_addresses.target_number | 0 |
+ | users[0].mailing_address | users[0].address |
+ | users[0].mailing_address.location | users[0].address.location |
+ | users[0].mailing_address.location.known | True |
+ | users[0].mailing_address.location.description | 197 Friend Street [NEWLINE] Boston, MA 02114 |
+ | users[0].mailing_address.address | 197 Friend Street |
+ | users[0].mailing_address.unit | |
+ | users[0].mailing_address.city | Boston |
+ | users[0].mailing_address.state | MA |
+ | users[0].mailing_address.zip | 02114 |
+ | users[0].mailing_address.one_line | 197 Friend St, Boston, MA 02114, USA |
+ | users[0].mailing_address.street_number | 197 |
+ | users[0].mailing_address.street | Friend St |
+ | users[0].mailing_address.neighborhood | Bulfinch Triangle Historic District |
+ | users[0].mailing_address.locality | Boston |
+ | users[0].mailing_address.political | Boston |
+ | users[0].mailing_address.county | Suffolk County |
+ | users[0].mailing_address.administrative_area_level_1 | Massachusetts |
+ | users[0].mailing_address.country | US |
+ | users[0].mailing_address.postal_code | 02114 |
+ | users[0].mailing_address.postal_code_suffix | 2004 |
+ | users[0].mailing_address.zip4 | 02114-2004 |
+ | users[0].service_address.location.known | False |
+ | users[0].previous_names.target_number | 0 |
+ | users[0].aliases.target_number | 0 |
+ | users[0].has_separate_mailing_address | False |
+ | users[0].complete | True |
+ | users[0].attorney.name.first | Quinten |
+ | users[0].attorney.name.last | Steenhuis |
+ | users[0].attorney.name.suffix | Esq. |
+ | users[0].attorney.address.location.known | False |
+ | users[0].attorney.address.address | Cupiditate alias exp |
+ | users[0].attorney.address.unit | Ex ipsam nemo praese |
+ | users[0].attorney.address.city | Ut id inventore arch |
+ | users[0].attorney.address.state | MA |
+ | users[0].attorney.address.zip | 13185 |
+ | users[0].attorney.location.known | False |
+ | users[0].attorney.previous_addresses.target_number | 0 |
+ | users[0].attorney.other_addresses.target_number | 0 |
+ | users[0].attorney.mailing_address.location.known | False |
+ | users[0].attorney.service_address.location.known | False |
+ | users[0].attorney.previous_names.target_number | 0 |
+ | users[0].attorney.aliases.target_number | 0 |
+ | users[0].attorney.target_number | 1 |
+ | users[0].attorney.organization | Petersen Morgan Inc |
+ | users[0].attorney.middle | |
+ | users[0].attorney.bbo_number | 149 |
+ | users[0].attorney.phone_number | +1 (617) 303-9933 |
+ | users[0].attorney.email | wycojap@mailinator.com |
+ | users[0].attorney.signature.str | |
+ | users[0].mobile_number | |
+ | users[0].phone_number | +1 (267) 648-2259 |
+ | users[0].email | qimisys@mailinator.com |
+ | users[0].no_contact_method | False |
+ | users.revisit | True |
+ | kind_of_lawsuit['get_emergency_repairs'] | True |
+ | kind_of_lawsuit['past_repair_needs'] | True |
+ | kind_of_lawsuit['illegal_lockout'] | True |
+ | kind_of_lawsuit['entered_without_permission'] | True |
+ | kind_of_lawsuit['insufficient_notice'] | True |
+ | kind_of_lawsuit['utilities_no_agreement'] | True |
+ | kind_of_lawsuit['utility_shutoff'] | True |
+ | kind_of_lawsuit['other_landlord_tenant'] | True |
+ | kind_of_lawsuit['file_contempt_complaint'] | True |
+ | review_conditions | True |
+ | intro_terms_of_use | True |
+ | document_choice['get_report'] | True |
+ | document_choice['tell_landlord'] | False |
+ | document_choice['organize_tenants'] | False |
+ | document_choice['get_inspection'] | False |
+ | document_choice['demand_letter_93a'] | False |
+ | document_choice['sue_landlord'] | True |
+ | document_choice['contempt_complaint'] | False |
+ | document_choice['discovery'] | True |
+ | document_choice['fee_waiver'] | True |
+ | initial_screen_tenant_facing_eviction | no case |
+ | tenant_sent_ll_notice | True |
+ | tenant_called_inspector | True |
+ | screen_contacted_housing_inspector | True |
+ | set_document_choice_by_lawsuit_kind | True |
+ | bad_conditions[i].details[j].condition_existed_at_start | True |
+ | bad_conditions[i].details[j].condition_ended | False |
+ | bad_conditions[i].details[j].description | |
+ | bad_conditions[i].details[j].has_file_to_upload | False |
+ | bad_conditions[i].details[j].picture | dummy_photo1.jpg |
+ | bad_conditions[i].details[j].start_year | 2017 |
+ | bad_conditions[i].details[j].start_month | 9 |
+ | bad_conditions[i].details[j].start_day | 12 |
+ | bad_conditions[i].details[j].end_date | 09/17/2021 |
+ | bad_conditions[i].details[j].start_date | 09/12/2017 |
+ | bad_conditions[i].details[j].approximate_month | False |
+ | bad_conditions[i].details[j].approximate_day | False |
+ | bad_conditions['common problems'].details['there_are_any'] | True |
+ | bad_conditions['common problems'].claims['heat_not_working'] | True |
+ | bad_conditions['common problems'].claims['no_hot_water'] | True |
+ | bad_conditions['common problems'].claims['locks_missing_unit'] | True |
+ | bad_conditions['common problems'].claims['outside_windows_not_lockable'] | True |
+ | bad_conditions['common problems'].claims['mouse_rats'] | True |
+ | bad_conditions['common problems'].claims['roach_insects'] | True |
+ | bad_conditions['common problems'].claims['bedbug_insects'] | True |
+ | bad_conditions['common problems'].claims['other_insects'] | True |
+ | bad_conditions['common problems'].claims['electric_general_maintenance'] | True |
+ | bad_conditions['common problems'].claims['lead_paint_child'] | True |
+ | bad_conditions['common problems'].claims['window_structural'] | True |
+ | bad_conditions['common problems'].claims['ceiling_living_room'] | True |
+ | bad_conditions['common problems'].claims['floor_living_room'] | True |
+ | bad_conditions['common problems'].df | {\"Deadline\":{\"outside_windows_not_lockable\":\"24 hours\",\"electric_general_maintenance\":\"30 days\",\"other_insects\":\"24 hours\",\"bedbug_insects\":\"24 hours\",\"lead_paint_child\":\"24 hours\",\"floor_living_room\":\"24 hours\",\"heat_not_working\":\"24 hours\",\"ceiling_living_room\":\"24 hours\",\"roach_insects\":\"24 hours\",\"locks_missing_unit\":\"24 hours\",\"mouse_rats\":\"24 hours\",\"window_structural\":\"24 hours\",\"no_hot_water\":\"24 hours\"},\"Category\":{\"outside_windows_not_lockable\":\"Safety\",\"electric_general_maintenance\":\"General Maintenance\",\"other_insects\":\"Rodents and insects\",\"bedbug_insects\":\"Rodents and insects\",\"lead_paint_child\":\"Lead paint\",\"floor_living_room\":\"Living area\",\"heat_not_working\":\"Heat\",\"ceiling_living_room\":\"Living area\",\"roach_insects\":\"Rodents and insects\",\"locks_missing_unit\":\"Safety\",\"mouse_rats\":\"Rodents and insects\",\"window_structural\":\"Building Structure\",\"no_hot_water\":\"Water\"},\"Letter description\":{\"outside_windows_not_lockable\":null,\"electric_general_maintenance\":null,\"other_insects\":null,\"bedbug_insects\":null,\"lead_paint_child\":null,\"floor_living_room\":null,\"heat_not_working\":null,\"ceiling_living_room\":null,\"roach_insects\":null,\"locks_missing_unit\":null,\"mouse_rats\":null,\"window_structural\":null,\"no_hot_water\":null},\"Interview description\":{\"outside_windows_not_lockable\":\"Common area windows or doors do not lock.\",\"electric_general_maintenance\":\"Problem with electric fixtures or wiring.\",\"other_insects\":\"Flies, ants, or other insects infestation.\",\"bedbug_insects\":\"Bedbugs\",\"lead_paint_child\":\"Lead paint on surfaces that a child under the age of 6 can reach.\",\"floor_living_room\":\"Floor has holes or cracks so weather, moisture, or pests can get in.\",\"heat_not_working\":\"No heat or not enough heat between September 15 and May 31.\",\"ceiling_living_room\":\"Living room ceiling has holes or cracks so weather, moisture, or pests can get in.\",\"roach_insects\":\"Cockroaches\",\"locks_missing_unit\":\"Locks for the apartment are missing or not secure.\",\"mouse_rats\":\"Mice or rats\",\"window_structural\":\"Windows leak.\",\"no_hot_water\":\"Not enough hot or cold water for more than 24 hours.\"},\"Description_ES\":{\"outside_windows_not_lockable\":\"Las ventanas o puertas de las \\u00e1reas comunes no cierran con llave.\",\"electric_general_maintenance\":\"Problema con elementos o cableado el\\u00e9ctricos.\",\"other_insects\":\"Infestaci\\u00f3n de moscas, hormigas u otros insectos.\",\"bedbug_insects\":\"Chinches\",\"lead_paint_child\":\"Pintura con plomo en superficies que un ni\\u00f1o menor de 6 a\\u00f1os pueda alcanzar.\",\"floor_living_room\":\"El piso tiene agujeros o grietas, as\\u00ed que pueden entrar agua, humedad o plagas.\",\"heat_not_working\":\"No hay calefacci\\u00f3n o hay calefacci\\u00f3n insuficiente entre el 15 de septiembre y el 31 de mayo.\",\"ceiling_living_room\":\"El techo de la sala de estar tiene agujeros o grietas, as\\u00ed que pueden entrar agua, humedad o plagas.\",\"roach_insects\":\"Cucarachas\",\"locks_missing_unit\":\"Faltan cerraduras en el apartamento o no son seguras.\",\"mouse_rats\":\"Ratones o ratas\",\"window_structural\":\"Las ventanas tienen filtraciones de agua.\",\"no_hot_water\":\"No hay suficiente agua fr\\u00eda o caliente durante m\\u00e1s de 24 horas.\"},\"Help\":{\"outside_windows_not_lockable\":\"The landlord must make sure that all exterior windows that open and all entry doors have working locks.\",\"electric_general_maintenance\":\"The landlord must install correctly and keep free of leaks, blocks, and other defects all electrical fixtures, outlets, and wiring.\",\"other_insects\":\"No insects are allowed in the apartment or building. The landlord must exterminate them when they are found in common areas or in any individual apartment in buildings with two or more units.\",\"bedbug_insects\":\"No bedbugs or other insects are allowed in the apartment or building. The landlord must exterminate them when they are found in common areas or in any individual apartment in buildings with two or more units.\",\"lead_paint_child\":\"If you have a child under the age of 6, your landlord must\\nremove or properly cover lead paint up to 5 feet from the\\nfloor. Repainting with a non-lead paint is not good enough. \",\"floor_living_room\":\"Floor must be weathertight, free from excess moisture, insect-proof, or rodent-proof. It cannot have holes, cracks, loose plaster, or other defects.\",\"heat_not_working\":\"From September 15 to May 31, the landlord must provide equipment and appliances to heat every habitable room and bathroom to at least: 68 degrees Fahrenheit between 7 a.m. and 11 p.m. and 64 degrees between 11 p.m. and 7 a.m.\",\"ceiling_living_room\":\"Ceiling must be weathertight, free from excess moisture, insect-proof, or rodent-proof. It cannot have holes, cracks, loose plaster and other defects.\",\"roach_insects\":\"No roaches or other insects are allowed in the apartment or building. The landlord must exterminate them when they are found in common areas or in any individual apartment in buildings with two or more units.\",\"locks_missing_unit\":\"Entry doors for the apartment have no locks or inadequate locks.\",\"mouse_rats\":\"No rats or mice are allowed in the apartment or building. The landlord must exterminate them when they are found in common areas or in any individual apartment in buildings with two or more units.\",\"window_structural\":\"Windows must have good weather stripping or storm window or storm door. All glass panes must be unbroken and caulked correctly.\",\"no_hot_water\":\"No or not enough hot or cold water (including amount, pressure, and temperature) for 24 hours or longer.\"},\"Help_ES\":{\"outside_windows_not_lockable\":\"El arrendador debe asegurarse de que todas las ventanas exteriores que se abren y todas las puertas de entrada tengan cerraduras que funcionen.\",\"electric_general_maintenance\":\"El arrendador debe instalar correctamente y mantener libres de fugas, obstrucciones y otros defectos todos los accesorios, enchufes y cableado el\\u00e9ctricos.\",\"other_insects\":\"No debe haber insectos en el apartamento o edificio. El arrendador debe exterminarlos cuando se encuentren en \\u00e1reas comunes o en cualquier apartamento individual en edificios de dos o m\\u00e1s unidades.\",\"bedbug_insects\":\"No debe haber chinches u otros insectos en el apartamento o edificio. El arrendador debe exterminarlos cuando se encuentren en \\u00e1reas comunes o en cualquier apartamento individual en edificios de dos o m\\u00e1s unidades.\",\"lead_paint_child\":\"Si tiene un ni\\u00f1o menor de 6 a\\u00f1os, su arrendador debe\\nretirar o cubrir adecuadamente la pintura con plomo hasta 5 pies de distancia del\\npiso. Repintar con pintura sin plomo no es suficiente. \",\"floor_living_room\":\"El piso debe ser impermeable, estar libre de exceso de humedad, y ser a prueba de insectos o roedores. No debe tener agujeros, grietas, yeso suelto u otros defectos.\",\"heat_not_working\":\"Del 15 de septiembre al 31 de mayo, el arrendador debe proporcionar equipos y electrodom\\u00e9sticos para calentar cada habitaci\\u00f3n habitable y ba\\u00f1o a al menos: 68\\u00a0\\u00b0F entre las 7\\u00a0a.m. y las 11\\u00a0p.m., y 64\\u00a0\\u00b0F entre las 11\\u00a0p.m. y las 7\\u00a0a.m.\",\"ceiling_living_room\":\"El techo debe ser impermeable, estar libre de exceso de humedad, y ser a prueba de insectos o roedores. No debe tener agujeros, grietas, yeso suelto u otros defectos.\",\"roach_insects\":\"No debe haber cucarachas u otros insectos en el apartamento o edificio. El arrendador debe exterminarlos cuando se encuentren en \\u00e1reas comunes o en cualquier apartamento individual en edificios de dos o m\\u00e1s unidades.\",\"locks_missing_unit\":\"Las puertas de entrada al apartamento no tienen cerraduras o tienen cerraduras inadecuadas.\",\"mouse_rats\":\"No debe haber ratas ni ratones en el apartamento ni en el edificio. El arrendador debe exterminarlos cuando se encuentren en \\u00e1reas comunes o en cualquier apartamento individual en edificios de dos o m\\u00e1s unidades.\",\"window_structural\":\"Las ventanas deben tener buenos burletes o una ventana o puerta contra tormentas. Todos los paneles de vidrio deben estar intactos y sellados correctamente.\",\"no_hot_water\":\"No hay suficiente agua caliente o fr\\u00eda (incluida cantidad, presi\\u00f3n y temperatura) durante 24 horas o m\\u00e1s.\"},\"Sanitary Code Section\":{\"outside_windows_not_lockable\":\"105 C.M.R. 410.270\",\"electric_general_maintenance\":\"105 C.M.R. 410.320\",\"other_insects\":\"105 C.M.R. 410.550\",\"bedbug_insects\":\"105 C.M.R. 410.550\",\"lead_paint_child\":\"105 C.M.R. 410.470, G.L. c. 111, \\u00a7 190-199\",\"floor_living_room\":\"105 C.M.R. 410.500\",\"heat_not_working\":\"105 C.M.R. 410.160, 180\",\"ceiling_living_room\":\"105 C.M.R. 410.500\",\"roach_insects\":\"105 C.M.R. 410.550\",\"locks_missing_unit\":\"105 C.M.R. 410.270\",\"mouse_rats\":\"105 C.M.R. 410.550\",\"window_structural\":\"105 C.M.R. 410.500(B), 530\",\"no_hot_water\":\"105 C.M.R. 410.130, 140, 235, 630\"}} |
+ | bad_conditions.there_are_any | True |
+ | dataloader.filename | housing_code_checklist.xlsx |
+ | simple_conditions_list[0] | heat_not_working |
+ | simple_conditions_list[1] | no_hot_water |
+ | simple_conditions_list[2] | locks_missing_unit |
+ | simple_conditions_list[3] | outside_windows_not_lockable |
+ | simple_conditions_list[4] | mouse_rats |
+ | simple_conditions_list[5] | roach_insects |
+ | simple_conditions_list[6] | bedbug_insects |
+ | simple_conditions_list[7] | other_insects |
+ | simple_conditions_list[8] | electric_general_maintenance |
+ | simple_conditions_list[9] | lead_paint_child |
+ | simple_conditions_list[10] | window_structural |
+ | simple_conditions_list[11] | ceiling_living_room |
+ | simple_conditions_list[12] | floor_living_room |
+ | kind_of_lawsuit_text['utilities_no_agreement']['question'] | The tenant's landlord made the tenant pay for utilities, but they did not have a written agreement\n |
+ | kind_of_lawsuit_text['utilities_no_agreement']['document'] | The tenant's landlord made the tenant pay for utilities, but they did not have a written agreement\n |
+ | kind_of_lawsuit_text['utilities_no_agreement'].kwargs['question'] | The tenant's landlord made the tenant pay for utilities, but they did not have a written agreement\n |
+ | kind_of_lawsuit_text['utilities_no_agreement'].kwargs['document'] | The tenant's landlord made the tenant pay for utilities, but they did not have a written agreement\n |
+ | kind_of_lawsuit_text['illegal_lockout']['question'] | The tenant's landlord changed their locks, moved their things or threatened to do so\n |
+ | kind_of_lawsuit_text['illegal_lockout']['document'] | The tenant's landlord changed their locks, moved their things or threatened to do so\n |
+ | kind_of_lawsuit_text['illegal_lockout'].kwargs['question'] | The tenant's landlord changed their locks, moved their things or threatened to do so\n |
+ | kind_of_lawsuit_text['illegal_lockout'].kwargs['document'] | The tenant's landlord changed their locks, moved their things or threatened to do so\n |
+ | kind_of_lawsuit_text['entered_without_permission']['question'] | The tenant's landlord went into the tenant's home without permission\n |
+ | kind_of_lawsuit_text['entered_without_permission']['document'] | The tenant's landlord went into the tenant's home without permission\n |
+ | kind_of_lawsuit_text['entered_without_permission'].kwargs['question'] | The tenant's landlord went into the tenant's home without permission\n |
+ | kind_of_lawsuit_text['entered_without_permission'].kwargs['document'] | The tenant's landlord went into the tenant's home without permission\n |
+ | kind_of_lawsuit_text['insufficient_notice']['question'] | The tenant's landlord went into the tenant's home without giving them enough notice\n |
+ | kind_of_lawsuit_text['insufficient_notice']['document'] | The tenant's landlord went into the tenant's home without giving them enough notice\n |
+ | kind_of_lawsuit_text['insufficient_notice'].kwargs['question'] | The tenant's landlord went into the tenant's home without giving them enough notice\n |
+ | kind_of_lawsuit_text['insufficient_notice'].kwargs['document'] | The tenant's landlord went into the tenant's home without giving them enough notice\n |
+ | kind_of_lawsuit_text['utility_shutoff']['question'] | The tenant's utilities were shutoff\n |
+ | kind_of_lawsuit_text['utility_shutoff']['document'] | The tenant's utilities were shutoff\n |
+ | kind_of_lawsuit_text['utility_shutoff'].kwargs['question'] | The tenant's utilities were shutoff\n |
+ | kind_of_lawsuit_text['utility_shutoff'].kwargs['document'] | The tenant's utilities were shutoff\n |
+ | kind_of_lawsuit_text['file_contempt_complaint']['question'] | The landlord is ignoring a court order\n |
+ | kind_of_lawsuit_text['file_contempt_complaint']['document'] | The landlord is ignoring a court order\n |
+ | kind_of_lawsuit_text['file_contempt_complaint'].kwargs['question'] | The landlord is ignoring a court order\n |
+ | kind_of_lawsuit_text['file_contempt_complaint'].kwargs['document'] | The landlord is ignoring a court order\n |
+ | claim | other |
+ | wants_detailed_conditions | False |
+ | user_language | en |
+ | stuff_to_snapshot['start_time'] | 2026-06-10 |
+ | stuff_to_snapshot['address_city'] | Boston |
+ | stuff_to_snapshot['zip'] | 02114 |
+ | stuff_to_snapshot['language'] | en |
+ | stuff_to_snapshot['document_choice'] | discovery, fee_waiver, get_report, sue_landlord |
+ | stuff_to_snapshot['reached_document_choice_screen'] | True |
+ | stuff_to_snapshot['bad_conditions'] | |
+ | stuff_to_snapshot['reached_download_screen'] | True |
+ | screen_ll_knows_problem | True |
+ | explain_documents | True |
+ | user | users[0] |
+ | user.name | users[0].name |
+ | user.name.first | Rerum laboriosam am |
+ | user.name.middle | Atque quis soluta ve |
+ | user.name.last | Tenetur ipsum aliqui |
+ | user.name.suffix | Sr. |
+ | user.address | users[0].address |
+ | user.address.location | users[0].address.location |
+ | user.address.location.known | True |
+ | user.address.location.description | 197 Friend Street [NEWLINE] Boston, MA 02114 |
+ | user.address.address | 197 Friend Street |
+ | user.address.unit | |
+ | user.address.city | Boston |
+ | user.address.state | MA |
+ | user.address.zip | 02114 |
+ | user.address.one_line | 197 Friend St, Boston, MA 02114, USA |
+ | user.address.street_number | 197 |
+ | user.address.street | Friend St |
+ | user.address.neighborhood | Bulfinch Triangle Historic District |
+ | user.address.locality | Boston |
+ | user.address.political | Boston |
+ | user.address.county | Suffolk County |
+ | user.address.administrative_area_level_1 | Massachusetts |
+ | user.address.country | US |
+ | user.address.postal_code | 02114 |
+ | user.address.postal_code_suffix | 2004 |
+ | user.address.zip4 | 02114-2004 |
+ | user.location | users[0].location |
+ | user.location.known | False |
+ | user.previous_addresses | users[0].previous_addresses |
+ | user.previous_addresses.target_number | 0 |
+ | user.other_addresses | users[0].other_addresses |
+ | user.other_addresses.target_number | 0 |
+ | user.mailing_address | users[0].address |
+ | user.mailing_address.location | users[0].address.location |
+ | user.mailing_address.location.known | True |
+ | user.mailing_address.location.description | 197 Friend Street [NEWLINE] Boston, MA 02114 |
+ | user.mailing_address.address | 197 Friend Street |
+ | user.mailing_address.unit | |
+ | user.mailing_address.city | Boston |
+ | user.mailing_address.state | MA |
+ | user.mailing_address.zip | 02114 |
+ | user.mailing_address.one_line | 197 Friend St, Boston, MA 02114, USA |
+ | user.mailing_address.street_number | 197 |
+ | user.mailing_address.street | Friend St |
+ | user.mailing_address.neighborhood | Bulfinch Triangle Historic District |
+ | user.mailing_address.locality | Boston |
+ | user.mailing_address.political | Boston |
+ | user.mailing_address.county | Suffolk County |
+ | user.mailing_address.administrative_area_level_1 | Massachusetts |
+ | user.mailing_address.country | US |
+ | user.mailing_address.postal_code | 02114 |
+ | user.mailing_address.postal_code_suffix | 2004 |
+ | user.mailing_address.zip4 | 02114-2004 |
+ | user.service_address | users[0].service_address |
+ | user.service_address.location | users[0].service_address.location |
+ | user.service_address.location.known | False |
+ | user.previous_names | users[0].previous_names |
+ | user.previous_names.target_number | 0 |
+ | user.aliases | users[0].aliases |
+ | user.aliases.target_number | 0 |
+ | user.preferred_name | users[0].preferred_name |
+ | user.has_separate_mailing_address | False |
+ | user.complete | True |
+ | user.attorney | users[0].attorney |
+ | user.attorney.name | users[0].attorney.name |
+ | user.attorney.name.first | Quinten |
+ | user.attorney.name.last | Steenhuis |
+ | user.attorney.name.suffix | Esq. |
+ | user.attorney.address | users[0].attorney.address |
+ | user.attorney.address.location | users[0].attorney.address.location |
+ | user.attorney.address.location.known | False |
+ | user.attorney.address.address | Cupiditate alias exp |
+ | user.attorney.address.unit | Ex ipsam nemo praese |
+ | user.attorney.address.city | Ut id inventore arch |
+ | user.attorney.address.state | MA |
+ | user.attorney.address.zip | 13185 |
+ | user.attorney.location | users[0].attorney.location |
+ | user.attorney.location.known | False |
+ | user.attorney.previous_addresses | users[0].attorney.previous_addresses |
+ | user.attorney.previous_addresses.target_number | 0 |
+ | user.attorney.other_addresses | users[0].attorney.other_addresses |
+ | user.attorney.other_addresses.target_number | 0 |
+ | user.attorney.mailing_address | users[0].attorney.mailing_address |
+ | user.attorney.mailing_address.location | users[0].attorney.mailing_address.location |
+ | user.attorney.mailing_address.location.known | False |
+ | user.attorney.service_address | users[0].attorney.service_address |
+ | user.attorney.service_address.location | users[0].attorney.service_address.location |
+ | user.attorney.service_address.location.known | False |
+ | user.attorney.previous_names | users[0].attorney.previous_names |
+ | user.attorney.previous_names.target_number | 0 |
+ | user.attorney.aliases | users[0].attorney.aliases |
+ | user.attorney.aliases.target_number | 0 |
+ | user.attorney.preferred_name | users[0].attorney.preferred_name |
+ | user.attorney.target_number | 1 |
+ | user.attorney.organization | Petersen Morgan Inc |
+ | user.attorney.middle | |
+ | user.attorney.bbo_number | 149 |
+ | user.attorney.phone_number | +1 (617) 303-9933 |
+ | user.attorney.email | wycojap@mailinator.com |
+ | user.attorney.signature.str | |
+ | user.mobile_number | |
+ | user.phone_number | +1 (267) 648-2259 |
+ | user.email | qimisys@mailinator.com |
+ | user.no_contact_method | False |
+ | other_parties.target_number | 1 |
+ | other_parties[0].name.first | Darrel Waller |
+ | other_parties[0].address.location.known | False |
+ | other_parties[0].address.address | 99 High Street |
+ | other_parties[0].address.unit | |
+ | other_parties[0].address.city | Boston |
+ | other_parties[0].address.state | MA |
+ | other_parties[0].address.zip | 02110 |
+ | other_parties[0].location.known | False |
+ | other_parties[0].previous_addresses.target_number | 0 |
+ | other_parties[0].other_addresses.target_number | 0 |
+ | other_parties[0].mailing_address.location.known | False |
+ | other_parties[0].service_address.location.known | False |
+ | other_parties[0].previous_names.target_number | 0 |
+ | other_parties[0].aliases.target_number | 0 |
+ | other_parties[0].person_type | business |
+ | other_parties[0].phone_number | +1 (857) 281-1269 |
+ | other_parties[0].email | suqinerino@mailinator.com |
+ | other_parties[0].complete | True |
+ | other_parties.revisit | True |
+ | landlord_name_is_optional | False |
+ | ll_name_unknown | False |
+ | user_ask_role | plaintiff |
+ | addresses_to_search[0] | users[0].address |
+ | addresses_to_search[0].location | users[0].address.location |
+ | addresses_to_search[0].location.known | True |
+ | addresses_to_search[0].location.description | 197 Friend Street [NEWLINE] Boston, MA 02114 |
+ | addresses_to_search[0].address | 197 Friend Street |
+ | addresses_to_search[0].unit | |
+ | addresses_to_search[0].city | Boston |
+ | addresses_to_search[0].state | MA |
+ | addresses_to_search[0].zip | 02114 |
+ | addresses_to_search[0].one_line | 197 Friend St, Boston, MA 02114, USA |
+ | addresses_to_search[0].street_number | 197 |
+ | addresses_to_search[0].street | Friend St |
+ | addresses_to_search[0].neighborhood | Bulfinch Triangle Historic District |
+ | addresses_to_search[0].locality | Boston |
+ | addresses_to_search[0].political | Boston |
+ | addresses_to_search[0].county | Suffolk County |
+ | addresses_to_search[0].administrative_area_level_1 | Massachusetts |
+ | addresses_to_search[0].country | US |
+ | addresses_to_search[0].postal_code | 02114 |
+ | addresses_to_search[0].postal_code_suffix | 2004 |
+ | addresses_to_search[0].zip4 | 02114-2004 |
+ | all_matches[0] | all_courts[22] |
+ | all_matches[0].address | all_courts[22].address |
+ | all_matches[0].address.location | all_courts[22].address.location |
+ | all_matches[0].address.location.known | False |
+ | all_matches[0].address.address | 24 New Chardon Street |
+ | all_matches[0].address.city | Edward W. Brooke Courthouse, Boston |
+ | all_matches[0].address.state | MA |
+ | all_matches[0].address.zip | 02114 |
+ | all_matches[0].address.county | Suffolk County |
+ | all_matches[0].location | all_courts[22].location |
+ | all_matches[0].location.known | False |
+ | all_matches[0].tyler_code | 1245 |
+ | all_matches[0].tyler_lower_court_code | 1754 |
+ | all_matches[0].tyler_prod_lower_court_code | 6983 |
+ | all_matches[0].name | Central Division, Boston Municipal Court |
+ | all_matches[0].phone | (617) 788-8600 |
+ | all_matches[0].description | This court serves the Downtown Boston area, Chinatown, North End, South End through Massachusetts Avenue, West End, and Beacon Hill. |
+ | all_matches[0].ada_coordinators[0]['name'] | Denise Donovan |
+ | all_matches[0].ada_coordinators[0]['phone'] | 617-788-8668 |
+ | all_matches[0].ada_coordinators[0]['email'] | denise.donovan@jud.state.ma.us |
+ | all_matches[0].ada_coordinators[1]['name'] | Marcella Gerardi |
+ | all_matches[0].ada_coordinators[1]['phone'] | 617-788-8772 |
+ | all_matches[0].ada_coordinators[1]['email'] | marcella.gerardi@jud.state.ma.us |
+ | all_matches[1] | all_courts[44] |
+ | all_matches[1].address | all_courts[44].address |
+ | all_matches[1].address.location | all_courts[44].address.location |
+ | all_matches[1].address.location.known | False |
+ | all_matches[1].address.address | 24 New Chardon St. |
+ | all_matches[1].address.city | Boston |
+ | all_matches[1].address.state | MA |
+ | all_matches[1].address.zip | 02114 |
+ | all_matches[1].address.county | Suffolk County |
+ | all_matches[1].location | all_courts[44].location |
+ | all_matches[1].location.known | False |
+ | all_matches[1].tyler_code | 537 |
+ | all_matches[1].tyler_lower_court_code | 1827 |
+ | all_matches[1].tyler_prod_lower_court_code | 7056 |
+ | all_matches[1].name | Eastern Housing Court |
+ | all_matches[1].phone | (617) 788-8485 |
+ | all_matches[1].description | The Eastern Division of the Housing Court serves Boston, Brookline and Newton. |
+ | all_matches[1].ada_coordinators[0]['name'] | Natasha Woodley |
+ | all_matches[1].ada_coordinators[0]['phone'] | (617) 788-6523 |
+ | all_matches[1].ada_coordinators[0]['email'] | Natasha.woodley@jud.state.ma.us |
+ | all_matches[2] | all_courts[154] |
+ | all_matches[2].address | all_courts[154].address |
+ | all_matches[2].address.location | all_courts[154].address.location |
+ | all_matches[2].address.location.known | False |
+ | all_matches[2].address.address | 3 Pemberton Square |
+ | all_matches[2].address.city | Boston |
+ | all_matches[2].address.state | MA |
+ | all_matches[2].address.zip | 02108 |
+ | all_matches[2].address.county | Suffolk County |
+ | all_matches[2].location | all_courts[154].location |
+ | all_matches[2].location.known | False |
+ | all_matches[2].tyler_code | None |
+ | all_matches[2].tyler_lower_court_code | 1882 |
+ | all_matches[2].tyler_prod_lower_court_code | 7111 |
+ | all_matches[2].name | Suffolk County Superior Court |
+ | all_matches[2].phone | (617) 788-8175 |
+ | all_matches[2].description | This court serves Boston, Winthrop, Chelsea, and Revere. |
+ | all_matches[2].ada_coordinators[0]['name'] | Margaret Buckley |
+ | all_matches[2].ada_coordinators[0]['phone'] | (617) 788-8110 |
+ | all_matches[2].ada_coordinators[0]['email'] | margaret.buckley@jud.state.ma.us |
+ | all_matches[2].ada_coordinators[1]['name'] | Paul Kenneally |
+ | all_matches[2].ada_coordinators[1]['phone'] | (617) 788-8172 |
+ | all_matches[2].ada_coordinators[1]['email'] | paul.kenneally@jud.state.ma.us |
+ | all_matches[2].ada_coordinators[2]['name'] | Abigail Bryan |
+ | all_matches[2].ada_coordinators[2]['phone'] | (617) 788-7769 |
+ | all_matches[2].ada_coordinators[2]['email'] | abigail.bryan@jud.state.ma.us |
+ | trial_court | all_courts[44] |
+ | trial_court.address | all_courts[44].address |
+ | trial_court.address.location | all_courts[44].address.location |
+ | trial_court.address.location.known | False |
+ | trial_court.address.address | 24 New Chardon St. |
+ | trial_court.address.city | Boston |
+ | trial_court.address.state | MA |
+ | trial_court.address.zip | 02114 |
+ | trial_court.address.county | Suffolk County |
+ | trial_court.location | all_courts[44].location |
+ | trial_court.location.known | False |
+ | trial_court.tyler_code | 537 |
+ | trial_court.tyler_lower_court_code | 1827 |
+ | trial_court.tyler_prod_lower_court_code | 7056 |
+ | trial_court.name | Eastern Housing Court |
+ | trial_court.phone | (617) 788-8485 |
+ | trial_court.description | The Eastern Division of the Housing Court serves Boston, Brookline and Newton. |
+ | trial_court.ada_coordinators[0]['name'] | Natasha Woodley |
+ | trial_court.ada_coordinators[0]['phone'] | (617) 788-6523 |
+ | trial_court.ada_coordinators[0]['email'] | Natasha.woodley@jud.state.ma.us |
+ | verified_complaint_tro_fee | 90 |
+ | verified_complaint_entry_of_action_Fee | 135 |
+ | File_a_Verified_Complaint_Form | True |
+ | complaint_ask_for_damages | True |
+ | landlord_is_housing_authority | False |
+ | landlord_is_government | False |
+ | landlord_lives_in_building | False |
+ | is_landlord_subject_to_93a | True |
+ | demand_letter_sent | False |
+ | confirm_ask_for_damages | keep_on_suing |
+ | update_ask_for_damages | True |
+ | verified_complaint_claims[i].has_claim | True |
+ | verified_complaint_claims[i].details | Cupidatat aut tempor |
+ | verified_complaint_claims[i].date | 1974 |
+ | verified_complaint_claims['complete_element'][0] | has_claim |
+ | verified_complaint_claims['complete_element'][1] | date |
+ | verified_complaint_claims['there_are_any'] | True |
+ | verified_complaint_claims_terms['illegal lockout']['question'] | The tenant's landlord illegally locked the tenant out of the apartment or moved their belongings out, or threatened to do so\n |
+ | verified_complaint_claims_terms['illegal lockout']['document'] | locked me out of my home or removed my belongings without lawful authority\n |
+ | verified_complaint_claims_terms['illegal lockout']['direct'] | locked the tenant out of their home or removed their belongings without lawful authority\n |
+ | verified_complaint_claims_terms['entered without permission']['question'] | Went into the tenant's home without permission\n |
+ | verified_complaint_claims_terms['entered without permission']['document'] | entered my home without permission\n |
+ | verified_complaint_claims_terms['entered without permission']['direct'] | entered the tenant's home without permission\n |
+ | verified_complaint_claims_terms['utility shutoff']['question'] | Turned off the gas, electricity or oil service or did not turn it back on |
+ | verified_complaint_claims_terms['utility shutoff']['document'] | turned off or failed to restore a utility service |
+ | verified_complaint_claims_terms['utility shutoff']['direct'] | turned off or failed to restore a utility service |
+ | verified_complaint_claims_terms['utility no agreement']['question'] | Made the tenant pay for utilities without a written agreement\n |
+ | verified_complaint_claims_terms['utility no agreement']['document'] | required me to pay for utilities without a written agreement\n |
+ | verified_complaint_claims_terms['utility no agreement']['direct'] | required the tenant to pay for utilities without a written agreement\n |
+ | verified_complaint_claims_terms['insufficient notice']['question'] | Made repairs without giving the tenant reasonable warning of the time and day they would come\n |
+ | verified_complaint_claims_terms['insufficient notice']['document'] | did not give me reasonable notice to make repairs\n |
+ | verified_complaint_claims_terms['insufficient notice']['direct'] | did not give the tenant reasonable notice to make repairs\n |
+ | verified_complaint_claims_terms['other']['question'] | other |
+ | verified_complaint_claims_terms['other']['document'] | other |
+ | verified_complaint_claims_terms['other']['direct'] | other |
+ | verified_complaint_claims['illegal lockout'].details | Cupidatat aut tempor |
+ | verified_complaint_claims['illegal lockout'].date | 01/01/2023 |
+ | verified_complaint_claims['entered without permission'].details | Cupidatat aut tempor |
+ | verified_complaint_claims['entered without permission'].date | 01/01/2023 |
+ | verified_complaint_claims['utility shutoff'].details | Cupidatat aut tempor |
+ | verified_complaint_claims['utility shutoff'].date | 01/01/2023 |
+ | verified_complaint_claims['utility no agreement'].details | Cupidatat aut tempor |
+ | verified_complaint_claims['utility no agreement'].date | 01/01/2023 |
+ | verified_complaint_claims['insufficient notice'].details | Cupidatat aut tempor |
+ | verified_complaint_claims['insufficient notice'].date | 01/01/2023 |
+ | verified_complaint_claims['other'].details | Cupidatat aut tempor |
+ | verified_complaint_claims['other'].date | 01/01/2023 |
+ | complaint_utility_shutoff['gas'] | True |
+ | complaint_utility_shutoff['fuel oil'] | False |
+ | complaint_utility_shutoff['electricity'] | False |
+ | complaint_utility_not_paid['gas'] | False |
+ | complaint_utility_not_paid['fuel oil'] | True |
+ | complaint_utility_not_paid['electricity'] | False |
+ | verified_complaint_nota | False |
+ | tenant_gets_rent_subsidy | True |
+ | tenant_rent_share | 677.0 |
+ | tenant_unit_rent | 799.0 |
+ | tenant_subsidy_is_voucher | True |
+ | verified_complaint_tenant_voucher_at_risk | True |
+ | complaint_ask_for_tro | True |
+ | verified_complaint_other_emergency_basis | Deserunt incididunt |
+ | complaint_ask_for_relocation | True |
+ | complaint_raft_or_other_assistance | True |
+ | complaint_retaliation | True |
+ | wants_discovery | True |
+ | customize_discovery_choice | default_discovery |
+ | interview_order_discovery | True |
+ | claim_jurytrial | True |
+ | verified_complaint_wants_fee_waiver | wants_fee_waiver |
+ | fees['Filing fee'].waive | True |
+ | fees['Filing fee'].amount | 225.0 |
+ | fees['Service'].waive | True |
+ | fees['Service'].amount | 45.0 |
+ | fees['Costs of an expert witness'].str | |
+ | fees['Depositions'].str | |
+ | fees['Appeal cost'].str | |
+ | fees['Appeal bond'].str | |
+ | fees['recordings'].str | |
+ | fees['transcript'].str | |
+ | fees['Other'].str | |
+ | fees['Other cost'].str | |
+ | fees['there_are_any'] | True |
+ | set_fee_waiver_defaults | True |
+ | docket_numbers.str | |
+ | affidavit_is_standalone | False |
+ | public_assistance_kinds['TAFDC'] | True |
+ | public_assistance_kinds['Medicaid'] | False |
+ | public_assistance_kinds['EAEDC'] | False |
+ | public_assistance_kinds['VA Benefits'] | False |
+ | public_assistance_kinds['SSI'] | False |
+ | is_indigent | True |
+ | need_supplement | False |
+ | need_income | False |
+ | qualify_interstitial | True |
+ | fees_interstitial | True |
+ | tried_geolocating | True |
+ | affidavit_of_indigency_filing_court | all_courts[44] |
+ | affidavit_of_indigency_filing_court.address | all_courts[44].address |
+ | affidavit_of_indigency_filing_court.address.location | all_courts[44].address.location |
+ | affidavit_of_indigency_filing_court.address.location.known | False |
+ | affidavit_of_indigency_filing_court.address.address | 24 New Chardon St. |
+ | affidavit_of_indigency_filing_court.address.city | Boston |
+ | affidavit_of_indigency_filing_court.address.state | MA |
+ | affidavit_of_indigency_filing_court.address.zip | 02114 |
+ | affidavit_of_indigency_filing_court.address.county | Suffolk County |
+ | affidavit_of_indigency_filing_court.location | all_courts[44].location |
+ | affidavit_of_indigency_filing_court.location.known | False |
+ | affidavit_of_indigency_filing_court.tyler_code | 537 |
+ | affidavit_of_indigency_filing_court.tyler_lower_court_code | 1827 |
+ | affidavit_of_indigency_filing_court.tyler_prod_lower_court_code | 7056 |
+ | affidavit_of_indigency_filing_court.name | Eastern Housing Court |
+ | affidavit_of_indigency_filing_court.phone | (617) 788-8485 |
+ | affidavit_of_indigency_filing_court.description | The Eastern Division of the Housing Court serves Boston, Brookline and Newton. |
+ | affidavit_of_indigency_filing_court.ada_coordinators[0]['name'] | Natasha Woodley |
+ | affidavit_of_indigency_filing_court.ada_coordinators[0]['phone'] | (617) 788-6523 |
+ | affidavit_of_indigency_filing_court.ada_coordinators[0]['email'] | Natasha.woodley@jud.state.ma.us |
+ | fee | Other cost |
+ | set_empty_fees | True |
+ | ask_affidavit_questions | True |
+ | service_method | email and mail |
+ | service_today | True |
+ | interview_order_verified_complaint_and_motions | True |
+ | uptocode_review | True |
+ | signature_choice | sign_after_printing |
+ | saw_signature_choice | True |
+ | signature | users[0].attorney.signature |
+ | basic_questions_signature_flow | True |
+ | direct_inspection_email | False |
+ | reached_download_screen | True |
+ | tasks_to_monitor[0] | None |
+ | tasks_to_monitor[1] | None |
+ | tasks_to_monitor[2] | None |
+ | snapshot_interview_state | True |
+ | did_react | False |
+ | sharing_choices[0]['tell_friend'] | Tell a friend about this website |
+ | sharing_choices[1]['share_answers'] | Share my answers and progress with someone |
+
+ And I wait 600 seconds
+ And the question id should be "download_conditions_checklist_docs"
+ And the maximum seconds for each Step is 30
+ And I download "housing_conditions_report.docx"
+ And I download "next_steps_for_court.docx"
+ And I download "verified_complaint.docx"
+ And I download "motion_for_injunctive_relief.docx"
+ And I download "temporary_order.docx"
+ And I download "simple_temporary_order.docx"
+ And I download "preliminary_injunction.docx"
+ And I download "simple_preliminary_injunction.docx"
+ And I download "Discovery.docx"
+ And I download "motion_to_compel_discovery.docx"
+ And I download "affidavit_of_indigency.pdf"
diff --git a/docassemble/HousingCodeChecklist/discovery.py b/docassemble/HousingCodeChecklist/discovery.py
index eed7588..fd32820 100644
--- a/docassemble/HousingCodeChecklist/discovery.py
+++ b/docassemble/HousingCodeChecklist/discovery.py
@@ -1,7 +1,16 @@
-from docassemble.base.util import DAObject, DADict, DAList, value, showifdef, path_and_mimetype, log
+from docassemble.base.util import (
+ DAObject,
+ DADict,
+ DAList,
+ value,
+ showifdef,
+ path_and_mimetype,
+ log,
+)
import yaml
from typing import Optional, List, Dict, Union
+
class DiscoveryItem(DAObject):
"""
A single item in a discovery request.
@@ -13,7 +22,7 @@ class DiscoveryItem(DAObject):
content (str): The content of the discovery item (e.g., interrogatory question).
This is only defined for "custom" interrogatories.
default_check (bool): Indicates that the discovery item is relevant to all cases.
- soft_check (bool): Indicates that the discovery item is probably relevant,
+ soft_check (bool): Indicates that the discovery item is probably relevant,
but it may or may not be included dependent on priority.
checked (bool): Whether the discovery item is checked.
category (str): The category of the discovery item.
@@ -25,7 +34,7 @@ def init(self, *pargs, **kwargs):
super().init(*pargs, **kwargs)
if not hasattr(self, "checked"):
self.checked = False
-
+
if not hasattr(self, "soft_check"):
self.soft_check = False
@@ -34,7 +43,7 @@ def init(self, *pargs, **kwargs):
if not hasattr(self, "conditions"):
self.conditions = []
-
+
if not hasattr(self, "priority"):
self.priority = 0
@@ -43,21 +52,21 @@ def init(self, *pargs, **kwargs):
def __bool__(self):
return self.checked
-
+
def __str__(self):
return self.name
-
+
def applies(self) -> bool:
"""
Check if the discovery item is relevant in the interview's context.
Note: this is not a pure function; it depends on the Docassemble interview's context.
- It will evaluate each condition assigned to the request in order with `showifdef`
+ It will evaluate each condition assigned to the request in order with `showifdef`
and return True if any condition is True.
Args:
conditions (List[str]): The conditions (inclusive) that may be met for the discovery item to apply.
-
+
Returns:
bool: Whether the discovery item applies to the given conditions.
"""
@@ -66,19 +75,20 @@ def applies(self) -> bool:
if not hasattr(self, "conditions") or not self.conditions:
return False
return any(showifdef(condition) for condition in self.conditions)
-
+
def ask_about(self):
return {
- "label": f"{self.description}",
- "field": f"{self.instanceName}.checked",
- "default": self.checked if hasattr(self, "checked") else False,
- "datatype": "yesnowide"
- }
-
+ "label": f"{self.description}",
+ "field": f"{self.instanceName}.checked",
+ "default": self.checked if hasattr(self, "checked") else False,
+ "datatype": "yesnowide",
+ }
+
+
class DiscoveryDict(DADict):
"""
A dictionary of discovery items.
-
+
Methods:
precheck_items: Pre-check discovery items based on their priority, up to a limit.
ask_about_items: Returns the Docassemble question code for asking about discovery items.
@@ -89,6 +99,7 @@ class DiscoveryDict(DADict):
any_in_category: Returns whether any discovery items from a given category are checked.
count_checked: Returns the number of checked discovery items.
"""
+
def init(self, *pargs, **kwargs):
super().init(*pargs, **kwargs)
self.object_type = DiscoveryItem
@@ -96,21 +107,22 @@ def init(self, *pargs, **kwargs):
self.auto_gather = False
if hasattr(self, "yaml_source"):
- if not self.yaml_source.startswith("/"): # A relative path using docassemble package notation
+ if not self.yaml_source.startswith(
+ "/"
+ ): # A relative path using docassemble package notation
self._load_from_yaml(path_and_mimetype(self.yaml_source)[0])
else:
# We have the canonical path to the file
self._load_from_yaml(self.yaml_source)
-
- def _load_from_yaml(self, yaml_path:str):
+ def _load_from_yaml(self, yaml_path: str):
"""
Load discovery items from a YAML file.
-
+
Args:
yaml_path (str): The path to the YAML file.
"""
- with open(yaml_path, 'r') as stream:
+ with open(yaml_path, "r") as stream:
try:
yaml_items = yaml.safe_load(stream)
except yaml.YAMLError as exc:
@@ -119,17 +131,19 @@ def _load_from_yaml(self, yaml_path:str):
for item in yaml_items:
if item["category"] not in self.categories:
self.categories.append(item["category"])
- dict_item = self.initializeObject(item["name"]) # ensure proper instance name
- dict_item.name=item["name"]
- dict_item.description=item.get("description", item["name"])
- dict_item.category=item["category"]
- dict_item.priority=int(item["priority"])
- dict_item.conditions=item.get("conditions", [])
- dict_item.default_check=item.get("default_check", False)
-
+ dict_item = self.initializeObject(
+ item["name"]
+ ) # ensure proper instance name
+ dict_item.name = item["name"]
+ dict_item.description = item.get("description", item["name"])
+ dict_item.category = item["category"]
+ dict_item.priority = int(item["priority"])
+ dict_item.conditions = item.get("conditions", [])
+ dict_item.default_check = item.get("default_check", False)
+
self.gathered = True
- def precheck_items(self, limit:int = 30):
+ def precheck_items(self, limit: int = 30):
"""
Pre-check discovery items based on their priority, up to a limit.
@@ -141,42 +155,40 @@ def precheck_items(self, limit:int = 30):
if val.applies():
val.soft_check = True
candidate_list.append(val)
-
+
candidate_list.sort(key=lambda x: x.priority, reverse=True)
for item in candidate_list[:limit]:
item.checked = True
- def ask_about_items(self, show_category_notes:bool = True, category:Optional[str] = None):
+ def ask_about_items(
+ self, show_category_notes: bool = True, category: Optional[str] = None
+ ):
"""Returns the Docassemble question code for asking about discovery items.
-
+
Args:
show_category_notes (bool): Whether to include a heading with the category of each discovery item.
category (Optional[str]): The category of discovery items to ask about. If None, all categories
will be included. If defined, `show_category_notes` has no effect.
-
+
Returns:
List[Dict[str, Union[str, bool]]]: A list of dictionaries representing Docassemble questions.
"""
categories = self.get_categories()
fields = []
-
+
if category is not None:
for key in self.matches_from_category(category, checked_only=False):
fields.append(self[key].ask_about())
- else:
+ else:
for category in categories:
if show_category_notes:
- fields.append(
- {
- "note": f"## {category}"
- }
- )
+ fields.append({"note": f"## {category}"})
for key in self.matches_from_category(category, checked_only=False):
fields.append(self[key].ask_about())
return fields
-
+
def get_categories(self):
"""Returns a list of categories for the discovery items."""
if hasattr(self, "categories"):
@@ -185,32 +197,41 @@ def get_categories(self):
def checked_values(self):
"""Returns a list of checked discovery items."""
- return DAList(elements=[key for key,value in self.iteritems() if value.checked is True])
-
+ return DAList(
+ elements=[key for key, value in self.iteritems() if value.checked is True]
+ )
+
def unchecked_values(self):
"""Returns a list of unchecked discovery items."""
- return DAList(elements=[key for key,value in self.iteritems() if value.checked is False])
+ return DAList(
+ elements=[key for key, value in self.iteritems() if value.checked is False]
+ )
def matches_from_category(self, category, checked_only=True):
"""Returns a list of discovery items from a given category."""
if checked_only:
- return [key for key in self.elements if self.elements[key].checked and self.elements[key].category == category]
+ return [
+ key
+ for key in self.elements
+ if self.elements[key].checked
+ and self.elements[key].category == category
+ ]
return [key for key in self.elements if self.elements[key].category == category]
-
+
def any_in_category(self, category):
for key in self.elements:
if self.elements[key].checked and self.elements[key].category == category:
return True
return False
-
+
def count_checked(self):
"""Returns the number of checked discovery items."""
n = 0
for key in self.elements:
- if self.elements[key].checked:
+ if self.elements[key].checked:
n += 1
return n
-
+
def hook_after_gather(self):
if not hasattr(self, "categories"):
self.categories = []
@@ -221,4 +242,4 @@ def hook_after_gather(self):
def __getitem__(self, key):
if key in self.elements:
return self.elements[key]
- return None
\ No newline at end of file
+ return None
diff --git a/docassemble/HousingCodeChecklist/language.py b/docassemble/HousingCodeChecklist/language.py
index c841d3e..417a34b 100644
--- a/docassemble/HousingCodeChecklist/language.py
+++ b/docassemble/HousingCodeChecklist/language.py
@@ -1,74 +1,89 @@
# coding=utf-8
from docassemble.base.functions import url_action
+
def get_tuples(lang_codes):
- """ Returns a list of tuples representing the language name, followed by language ISO 639-1 code.
- Right now only lists languages in use by Massachusetts Defense for Eviction (MADE)."""
- long_langs = {'en': 'English',
- 'es': u'Español',
- 'vi': u'Tiếng Việt',
- 'ht': u'Kreyòl',
- 'zh-t': u'中文',
- 'pt': u'Português'
- }
- tuples = []
- for lang in lang_codes:
- if lang in long_langs:
- tuples.append((long_langs[lang],lang))
- return tuples
-
+ """Returns a list of tuples representing the language name, followed by language ISO 639-1 code.
+ Right now only lists languages in use by Massachusetts Defense for Eviction (MADE).
+ """
+ long_langs = {
+ "en": "English",
+ "es": "Español",
+ "vi": "Tiếng Việt",
+ "ht": "Kreyòl",
+ "zh-t": "中文",
+ "pt": "Português",
+ }
+ tuples = []
+ for lang in lang_codes:
+ if lang in long_langs:
+ tuples.append((long_langs[lang], lang))
+ return tuples
+
-def get_language_list(languages, current=''):
- """ given a list of ordered tuples with (Description, language_code), returns
- an Bootstrap-formatted unordered inline list. The current language will not be a link."""
- list_start = """
+def get_language_list(languages, current=""):
+ """given a list of ordered tuples with (Description, language_code), returns
+ an Bootstrap-formatted unordered inline list. The current language will not be a link.
+ """
+ list_start = """
"""
- for language in languages:
- if language[1] == current:
- list_start += get_language_list_item(language, link=False)
- else:
- list_start += get_language_list_item(language)
- return list_start + list_end
+ for language in languages:
+ if language[1] == current:
+ list_start += get_language_list_item(language, link=False)
+ else:
+ list_start += get_language_list_item(language)
+ return list_start + list_end
+
def get_language_list_item(language, link=True):
- """ Given an ordered tuple, returns a link to the current interview with lang=language code and the link title
+ """Given an ordered tuple, returns a link to the current interview with lang=language code and the link title
given in the first part of the tuple."""
-
- if link:
- return f"""{ language[0] }"""
- else:
- return f'{ language[0] }'
-
-def get_language_list_inline(languages, current=''):
- """ given a list of ordered tuples with (Description, language_code), returns
- an Bootstrap-formatted unordered inline list. The current language will not be a link."""
- list_start = ''
- list_start += '- Language:
'
- list_end = '
'
- for language in languages:
- if language[1] == current:
- list_start += get_language_list_item_inline(language, link=False)
+ if link:
+ return f"""{ language[0] }"""
else:
- list_start += get_language_list_item_inline(language)
- return list_start + list_end
+ return f'{ language[0] }'
+
+
+def get_language_list_inline(languages, current=""):
+ """given a list of ordered tuples with (Description, language_code), returns
+ an Bootstrap-formatted unordered inline list. The current language will not be a link.
+ """
+ list_start = ''
+ list_start += '- Language:
'
+ list_end = "
"
+ for language in languages:
+ if language[1] == current:
+ list_start += get_language_list_item_inline(language, link=False)
+ else:
+ list_start += get_language_list_item_inline(language)
+ return list_start + list_end
+
def get_language_list_item_inline(language, link=True):
- """ Given an ordered tuple, returns a link to the current interview with lang=language code and the link title
+ """Given an ordered tuple, returns a link to the current interview with lang=language code and the link title
given in the first part of the tuple."""
- li_start = ''
- li_end = ''
-
- if link:
- iurl = url_action('change_language', lang = language[1])
- return li_start + '' + language[0] + '' + li_end
- else:
- return li_start + language[0] + li_end
\ No newline at end of file
+ li_start = ''
+ li_end = ""
+
+ if link:
+ iurl = url_action("change_language", lang=language[1])
+ return (
+ li_start
+ + ''
+ + language[0]
+ + ""
+ + li_end
+ )
+ else:
+ return li_start + language[0] + li_end
diff --git a/docassemble/HousingCodeChecklist/load_data.py b/docassemble/HousingCodeChecklist/load_data.py
index 8c5d643..840cc07 100644
--- a/docassemble/HousingCodeChecklist/load_data.py
+++ b/docassemble/HousingCodeChecklist/load_data.py
@@ -82,7 +82,7 @@ def load_rows(self, loci: List[Union[int, str]]) -> pd.DataFrame:
"""
df = self._load_data()
existing = [l for l in loci if l in df.index]
- missing = [l for l in loci if l not in df.index]
+ missing = [l for l in loci if l not in df.index]
for locus in missing:
log(f"Locus {locus!r} not found in data; skipping.")
@@ -133,14 +133,13 @@ def _load_data(self) -> pd.DataFrame:
) # Our XLSX file has a column 'ID' with a text invariant identifier
return df
+
class InspectorLoader(BaseDataLoader):
def _load_data(self) -> pd.DataFrame:
df = super()._load_data()
- df.set_index(
- "City", inplace=True
- )
+ df.set_index("City", inplace=True)
return df
-
+
def load_row(self, index: Union[int, str]) -> Union[pd.Series, pd.DataFrame]:
"""
Retrieve all of the data in a single row of the DataFrame
@@ -152,6 +151,7 @@ def load_row(self, index: Union[int, str]) -> Union[pd.Series, pd.DataFrame]:
return pd.DataFrame()
return row
+
class Condition(DAObject):
def init(self, *pargs, **kwargs):
super().init(*pargs, **kwargs)
@@ -178,7 +178,7 @@ def as_merged_list(self):
"""Merge condition details with original DF row"""
results = pd.concat([self[c].df for c in self])
- def as_list(self, language:str="en"):
+ def as_list(self, language: str = "en"):
flattened = DAList(auto_gather=False, gathered=True)
for category in self.elements:
for index, row in self[category].df.iterrows():
@@ -191,9 +191,8 @@ def as_list(self, language:str="en"):
the_condition.row = row
flattened.append(the_condition)
return flattened
-
-
- def has_condition(self, condition:Union[List[str], str]) -> bool:
+
+ def has_condition(self, condition: Union[List[str], str]) -> bool:
"""
Return True if and only if the specified condition or list of conditions
intersects with the conditions the user selected.
@@ -201,16 +200,20 @@ def has_condition(self, condition:Union[List[str], str]) -> bool:
for category in self.elements:
if isinstance(condition, list):
if any(
- cond in self.elements[category].claims and self.elements[category].claims[cond]
+ cond in self.elements[category].claims
+ and self.elements[category].claims[cond]
for cond in condition
):
return True
else:
- if condition in self.elements[category].claims and self.elements[category].claims[condition]:
+ if (
+ condition in self.elements[category].claims
+ and self.elements[category].claims[condition]
+ ):
return True
return False
- def active_conditions(self, language:str="en"):
+ def active_conditions(self, language: str = "en"):
return DAList(
auto_gather=False,
gathered=True,
@@ -223,7 +226,7 @@ def active_conditions(self, language:str="en"):
],
)
- def resolved_conditions(self, language:str="en"):
+ def resolved_conditions(self, language: str = "en"):
return DAList(
auto_gather=False,
gathered=True,
@@ -234,18 +237,21 @@ def resolved_conditions(self, language:str="en"):
],
)
- def emergency_conditions(self, condition_ended:bool=False, language:str="en"):
+ def emergency_conditions(self, condition_ended: bool = False, language: str = "en"):
return DAList(
auto_gather=False,
gathered=True,
elements=[
condition
for condition in self.as_list(language=language)
- if condition.deadline == "24 hours" and condition.condition_ended == condition_ended
+ if condition.deadline == "24 hours"
+ and condition.condition_ended == condition_ended
],
)
- def conditions_start(self, default_date:Optional[Union[DADateTime,str]]=None) -> DADateTime:
+ def conditions_start(
+ self, default_date: Optional[Union[DADateTime, str]] = None
+ ) -> DADateTime:
if not default_date:
default_date = today()
if not isinstance(default_date, DADateTime):
@@ -254,38 +260,55 @@ def conditions_start(self, default_date:Optional[Union[DADateTime,str]]=None) ->
except:
default_date = today()
try:
- return min([
- condition.start_date
- for condition
- in self.as_list()
- if hasattr(condition, "start_date") and condition.start_date
- ], default=default_date) or default_date
+ return (
+ min(
+ [
+ condition.start_date
+ for condition in self.as_list()
+ if hasattr(condition, "start_date") and condition.start_date
+ ],
+ default=default_date,
+ )
+ or default_date
+ )
except:
return default_date
- def conditions_end(self, default_date:Optional[Union[DADateTime,str]]=None) -> DADateTime:
+ def conditions_end(
+ self, default_date: Optional[Union[DADateTime, str]] = None
+ ) -> DADateTime:
if not default_date:
default_date = today()
try:
- return max([
- condition.end_date
- for condition
- in self.as_list()
- if hasattr(condition, "end_date") and condition.end_date
- ], default=default_date) or default_date
+ return (
+ max(
+ [
+ condition.end_date
+ for condition in self.as_list()
+ if hasattr(condition, "end_date") and condition.end_date
+ ],
+ default=default_date,
+ )
+ or default_date
+ )
except:
return default_date
- def conditions_days(self,default_date:Optional[Union[DADateTime,str]]=None) -> int:
- return abs( (self.conditions_end(default_date) - self.conditions_start(default_date)).days )
-
+ def conditions_days(
+ self, default_date: Optional[Union[DADateTime, str]] = None
+ ) -> int:
+ return abs(
+ (
+ self.conditions_end(default_date) - self.conditions_start(default_date)
+ ).days
+ )
def conditions_from_list(
dataloader: DataLoader, loci: List[Union[int, str]], language: str = "en"
) -> List[Dict[str, str]]:
df = dataloader.load_rows(loci=loci)
- conditions:List[Dict[str, str]] = []
+ conditions: List[Dict[str, str]] = []
for row in df.iterrows():
if language == "es":
conditions.append(
@@ -330,6 +353,3 @@ def tr_category(category, available_buttons):
if category == cat.get("value"):
return cat.get("label")
return category
-
-
-
diff --git a/docassemble/__init__.py b/docassemble/__init__.py
index 8d17c21..5284146 100644
--- a/docassemble/__init__.py
+++ b/docassemble/__init__.py
@@ -1,2 +1 @@
-__import__('pkg_resources').declare_namespace(__name__)
-
+__import__("pkg_resources").declare_namespace(__name__)