132 lines
4 KiB
Python
132 lines
4 KiB
Python
# simple_policy.py
|
||
from datetime import date
|
||
from policy import Policy, Section
|
||
|
||
# - For the rules, should one refer to fields by 'section.fields.x'
|
||
# or by the section name eg. 'general_section.fields.x'?
|
||
|
||
|
||
#### General
|
||
#### Section 0
|
||
general_section = Section(
|
||
title="General Info",
|
||
html_description="",
|
||
fields={
|
||
"destination": {"label": "Destination City", "type": "string"}
|
||
}
|
||
)
|
||
|
||
general_section.add_rule(
|
||
title="Destination city check",
|
||
rule=lambda report, section: section.field.destination == "Timbuktu",
|
||
rule_break_text="What did the cowboy say about Tim, his wild horse?"
|
||
)
|
||
|
||
Policy.add_section(general_section)
|
||
|
||
#### Flight
|
||
#### Section 1
|
||
flight_section = Section(
|
||
title="Flight Info",
|
||
html_description="<p>Enter flight details here.</p>",
|
||
fields={
|
||
"international": {"label": "Is this an international flight?", "type": "boolean"},
|
||
"departure_date": {"label": "Departure date", "type": "date"},
|
||
"return_date": {"label": "Return date", "type": "date"},
|
||
"fare": {"label": "Fare", "type": "decimal"},
|
||
}
|
||
)
|
||
|
||
flight_section.add_rule(
|
||
title="Airline fare pre-approval check",
|
||
rule=lambda report, section: section.fields.fare < 500,
|
||
rule_break_text="Fares cannot be more than $500"
|
||
)
|
||
|
||
Policy.add_section(flight_section)
|
||
|
||
#### Lodging
|
||
#### Section 2
|
||
lodging_section = Section(
|
||
title="Hotel Info",
|
||
html_description="<p>Enter hotel info here.\nPer diem rates can be found at <a href='https://www.gsa.gov/travel/plan-book/per-diem-rates'></a></p>",
|
||
fields={
|
||
"check-in_date": {"label": "Check-in date", "type": "date"},
|
||
"check-out_date": {"label": "Check-out date", "type": "date"},
|
||
"rate": {"label": "Per diem nightly rate", "type": "decimal"},
|
||
"cost": {"label": "Total Cost", "type": "decimal"}
|
||
}
|
||
)
|
||
|
||
def nightly_rate_check(report, section):
|
||
checkin_date = date(section.fields.checkin_date)
|
||
checkout_date = date(section.fields.checkout_date)
|
||
duration = checkout_date - checkin_date
|
||
return section.fields.cost <= duration * section.fields.rate
|
||
|
||
section.add_rule(
|
||
title="",
|
||
rule=nightly_rate_check,
|
||
rule_break_text="The average nightly rate cannot be more than the USGSA rate."
|
||
)
|
||
|
||
Policy.add_section(lodging_section)
|
||
|
||
#### Local Transportation
|
||
#### Section 3
|
||
transport_section = Section(
|
||
title="Local Transportation",
|
||
html_description="<p>How much did you spend on local transportation, in total?</p>",
|
||
fields={
|
||
"duration": {"label": "How many days was your trip?", "type": "decimal"},
|
||
"cost": {"label": "Total cost", "type": "decimal"}
|
||
}
|
||
)
|
||
|
||
transport_section.add_rule(
|
||
title="Total cost check",
|
||
rule=lambda report, section: section.fields.cost <= section.fields.duration * 10,
|
||
rule_break_text="Local transportation costs must be less than $10 per day, on average."
|
||
)
|
||
|
||
Policy.add_section(transport_section)
|
||
|
||
#### Per Diem
|
||
#### Section 4
|
||
per_diem_section = Section(
|
||
title="Per Diem",
|
||
html_description="<p>Enter info about meals and incidentals here.\nPer diem rates can be found at <a href='https://www.gsa.gov/travel/plan-book/per-diem-rates'></a></p>",
|
||
fields={
|
||
"duration": {"label": "How many days was your trip?", "type": "decimal"},
|
||
"rate": {"label": "What is the per diem rate for your destination?", "type": "decimal"},
|
||
"cost": {"label": "Total Cost for meals and incidentals", "type": "decimal"}
|
||
}
|
||
)
|
||
|
||
per_diem_section.add_rule(
|
||
title="Per Diem Cost Check",
|
||
rule=lambda report, section: section.fields.cost <= section.fields.duration * section.fields.rate,
|
||
rule_break_text="The average cost per day for per diem expenses cannot be more than the rate specified by the USGSA."
|
||
)
|
||
|
||
Policy.add_section(per_diem_section)
|
||
|
||
'''
|
||
Section(
|
||
title="",
|
||
html_description="<p></p>",
|
||
fields={
|
||
"": {"label": "", "type": ""}
|
||
}
|
||
)
|
||
|
||
section.add_rule(
|
||
title="",
|
||
rule=lambda report, section: boolean_statement,
|
||
rule_break_text=""
|
||
)
|
||
|
||
#// or, for a rule which doesn’t apply to a specific section...
|
||
#//
|
||
#// add_general_rule(...)
|
||
'''
|