Skip to content
Draft
Show file tree
Hide file tree
Changes from 14 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions backend/python/app/models/caregiver.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,18 @@
from .base_mixin import BaseMixin

relationship_to_child_enum = db.Enum(
"FOSTER_CAREGIVER",
"KINSHIP_CAREGIVER",
"BIOLOGICAL_FAMILY",
"ADOPTIVE_PARENT",
"FOSTER_PARENT",
"BIOLOGICAL_PARENT",
"STEP_PARENT",
"MATERNAL_GRANDPARENT",
"PATERNAL_GRANDPARENT",
"SIBLING",
"STEP_SIBLING",
"HALF_SIBLING",
"UNCLE/AUNT",
"OTHER_RELATIVE",
"OTHER",
name="caregivers_relationship_to_child",
)

Expand All @@ -18,7 +27,7 @@ class Caregiver(db.Model, BaseMixin):
individual_considerations = db.Column(db.String, nullable=True)
primary_phone_number = db.Column(db.String, nullable=False)
secondary_phone_number = db.Column(db.String, nullable=True)
email = db.Column(db.String, nullable=False)
email = db.Column(db.String, nullable=True)
address = db.Column(db.String, nullable=False)
relationship_to_child = db.Column(relationship_to_child_enum, nullable=False)
additional_contact_notes = db.Column(db.String, nullable=True)
Expand Down
28 changes: 28 additions & 0 deletions backend/python/app/rest/caregiver_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,20 @@ def get_all_caregivers():
return jsonify(error), 400


# get all caregivers by intake_id
@blueprint.route("/<int:intake_id>", methods=["GET"], strict_slashes=False)
# @require_authorization_by_role({"Admin"})
def get_caregivers_by_intake_id(intake_id):
if intake_id:
if type(intake_id) is not int:
return jsonify({"error:" "intake_id query parameter must be an int"})
try:
caregivers = caregiver_service.get_all_caregivers()
return jsonify(list(map(lambda user: user.__dict__, caregivers))), 200
except Exception as error:
return jsonify(error), 400

Check warning

Code scanning / CodeQL

Information exposure through an exception

[Stack trace information](1) flows to this location and may be exposed to an external user.


# create a caregiver
@blueprint.route("/", methods=["POST"], strict_slashes=False)
# @require_authorization_by_role({"Admin"})
Expand All @@ -32,3 +46,17 @@ def create_caregiver():
return jsonify(new_caregiver.__dict__), 201
except Exception as error:
return jsonify(str(error)), 400


# update a caregiver
@blueprint.route("/<int:caregiver_id>", methods=["PUT"], strict_slashes=False)
def update_caregiver(caregiver_id):
try:
new_caregiver = request.json
updated_caregiver = caregiver_service.update_caregiver(
caregiver_id, new_caregiver
)
return jsonify(updated_caregiver.__dict__), 200

except Exception as error:
return jsonify(str(error)), 400

Check warning

Code scanning / CodeQL

Information exposure through an exception

[Stack trace information](1) flows to this location and may be exposed to an external user.
165 changes: 159 additions & 6 deletions backend/python/app/rest/child_routes.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,172 @@
import json

import sys
from flask import Blueprint, current_app, jsonify, request

from ..middlewares.auth import require_authorization_by_role
from ..middlewares.validate import validate_request
from ..resources.daytime_contact_dto import DaytimeContactDTO, CreateDaytimeContactDTO
from ..resources.child_dto import ChildDTO, CreateChildDTO
from ..services.implementations.child_service import ChildService
from ..services.implementations.provider_service import ProviderService
from ..services.implementations.daytime_contact_service import DaytimeContactService

child_service = ChildService(current_app.logger)
provider_service = ProviderService(current_app.logger)
daytimeContact_service = DaytimeContactService(current_app.logger)

blueprint = Blueprint("child", __name__, url_prefix="/children")

@blueprint.route("/", methods=["GET"], strict_slashes=False)
# @require_authorization_by_role({"Admin"})
def get_child():
try:
args = request.args
intake_id = args.get("intake_id")
just_children = child_service.get_children_by_intake_id(intake_id)
new_children = []
for child in just_children:
providers = provider_service.get_providers_by_child_id(child.id)
child_info = {
"childName": child.first_name,
"dateOfBirth": child.date_of_birth,
"cpinFileNumber": child.cpin_number,
"workerName": child.service_worker,
"specialNeeds": child.special_needs,
"concerns": [],
"childId": child.id
}

#need to get by child_id instead
daytime_contact = (
daytimeContact_service.get_daytime_contact_by_intake_id(intake_id)
)

provider_list = []
for provider in providers:
provider_list.append(
{
"providerName": provider.name,
"providerFileNo": provider.file_number,
"primaryPhoneNo": provider.primary_phone_number,
"secondaryPhoneNo": provider.secondary_phone_number,
"email": provider.email,
"address": provider.address,
"relationship": provider.relationship_to_child,
"contactNotes": provider.additional_contact_notes,
"status": "previous"
}
)

new_child = {
"childDetails": child_info,
"schoolDetails": daytime_contact,
"providers": provider_list,
}

new_children.append(new_child)

return jsonify(list(new_children)), 200

except Exception as error:
return jsonify(error), 400

Check warning

Code scanning / CodeQL

Information exposure through an exception

[Stack trace information](1) flows to this location and may be exposed to an external user.


@blueprint.route("/<int:intake_id>", methods=["POST"], strict_slashes=False)
# @require_authorization_by_role({"Admin"})
# @validate_request("ChildDTO")
def create_child(intake_id):
undos = []

def run_undos():
for undo in undos:
service, fn, arg = undo
service.__dict__[fn](arg)

child_details = request.json["child_details"]
daytimeContact_details = request.json["school_details"]
providers = request.json["providers"]

daytimeContact_obj = {
"name": daytimeContact_details["school_name"],
"address": daytimeContact_details["school_address"],
"contact_information": daytimeContact_details["school_phone_no"],
"dismissal_time": daytimeContact_details["dismissal_time"],
}

try:
daytime_response = daytimeContact_service.create_new_daytime_contact(CreateDaytimeContactDTO(**daytimeContact_obj))
print(daytime_response, file=sys.stderr)
undos.append((daytime_response,"delete_daytime_contact", daytime_response.id))
except Exception as error:
run_undos()
return jsonify(error), 400

Check warning

Code scanning / CodeQL

Information exposure through an exception

[Stack trace information](1) flows to this location and may be exposed to an external user.

child_obj = {
"first_name": child_details["child_name"],
"last_name": ".",
"intake_id": intake_id,
"date_of_birth": child_details["date_of_birth"],
"cpin_number": child_details["cpin_file_number"],
"service_worker": child_details["worker_name"],
"special_needs": child_details["special_needs"],
"daytime_contact_id": daytime_response.id
}

try:
child_response = child_service.add_new_child(CreateChildDTO(**child_obj))
print(child_response, file=sys.stderr)
undos.append((child_service, "delete_child", child_response.id))
except Exception as error:
run_undos()
return jsonify(error), 400

Check warning

Code scanning / CodeQL

Information exposure through an exception

[Stack trace information](1) flows to this location and may be exposed to an external user.

return jsonify(child_response.__dict__), 201


@blueprint.route("/<int:intake_id>", methods=["PUT"], strict_slashes=False)
# @require_authorization_by_role({"Admin"})
# @validate_request("ChildDTO")
def edit_child(intake_id):
undos = []

def run_undos():
for undo in undos:
service, fn, arg = undo
service.__dict__[fn](arg)

child_details = request.json["child_details"]
daytimeContact_details = request.json["school_details"]
providers = request.json["providers"]

child_obj = {
"first_name": child_details["child_name"],
"last_name": ".",
"date_of_birth": child_details["date_of_birth"],
"cpin_number": child_details["cpin_file_number"],
"service_worker": child_details["worker_name"],
"special_needs": child_details["special_needs"],
}

try:
child_response = child_service.edit_child(child_obj, child_details["child_id"])
#print(child_response, file=sys.stderr)
# undos.append((child_service, "delete_child", child_response.id))
except Exception as error:
# run_undos()
return jsonify(error),400

Check warning

Code scanning / CodeQL

Information exposure through an exception

[Stack trace information](1) flows to this location and may be exposed to an external user.

# daytimeContact_obj ={
# "name": daytimeContact_details["school_name"],
# "contact_information": daytimeContact_details["school_phone_no"],
# "address": daytimeContact_details["school_address"],
# "dismissal_time": daytimeContact_details["dismissal_time"],
# }

# try:
# daytime_response = daytimeContact_service.edit_daytime_contact(daytimeContact_obj, daytimeContact_details["school_id"])
# except Exception as error:
# # run_undos()
# return jsonify(error),400


@blueprint.route("/", methods=["POST"], strict_slashes=False)
@require_authorization_by_role({"Admin"})
@validate_request("ChildDTO")
def create_child():
pass
return jsonify(child_response.__dict__), 200
1 change: 1 addition & 0 deletions backend/python/app/rest/testbad.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"(psycopg2.errors.InvalidTextRepresentation) invalid input value for enum intakes_court_status: \"i am not a valid court status\"\nLINE 1: ...1-01', 'Family Name', '1234321', 'INVESTIGATION', 'i am not ...\n ^\n\n[SQL: INSERT INTO intakes (user_id, intake_status, referring_worker_name, referring_worker_contact, referral_date, family_name, cpin_number, cpin_file_type, court_status, court_order_file, first_nation_heritage, first_nation_band, transportation_requirements, scheduling_requirements, suggested_start_date, date_accepted, access_location, lead_access_worker_id, denial_reason) VALUES (%(user_id)s, %(intake_status)s, %(referring_worker_name)s, %(referring_worker_contact)s, %(referral_date)s, %(family_name)s, %(cpin_number)s, %(cpin_file_type)s, %(court_status)s, %(court_order_file)s, %(first_nation_heritage)s, %(first_nation_band)s, %(transportation_requirements)s, %(scheduling_requirements)s, %(suggested_start_date)s, %(date_accepted)s, %(access_location)s, %(lead_access_worker_id)s, %(denial_reason)s) RETURNING intakes.id]\n[parameters: {'user_id': 1, 'intake_status': 'SUBMITTED', 'referring_worker_name': 'Referring Worker', 'referring_worker_contact': 'unused', 'referral_date': '2019-01-01', 'family_name': 'Family Name', 'cpin_number': '1234321', 'cpin_file_type': 'INVESTIGATION', 'court_status': 'i am not a valid court status', 'court_order_file': 'file binary', 'first_nation_heritage': 'i am also invalid', 'first_nation_band': 'first nation band', 'transportation_requirements': 'transport requirements', 'scheduling_requirements': 'scheduling requirements', 'suggested_start_date': '2019-01-01', 'date_accepted': None, 'access_location': None, 'lead_access_worker_id': None, 'denial_reason': None}]\n(Background on this error at: http://sqlalche.me/e/13/9h9h)"
73 changes: 73 additions & 0 deletions backend/python/app/rest/testbad.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{
"userId": 1,
"caseReferral": {
"referringWorker": "Referring Worker",
"referringWorkerContact": "unused",
"cpinFileNumber": "1234321",
"cpinFileType": "INVESTIGATION",
"familyName": "Family Name",
"referralDate": "2019-01-01"
},
"courtInformation": {
"courtStatus": "i am not a valid court status",
"orderReferral": "file binary",
"firstNationHeritage": "i am also invalid",
"firstNationBand": "first nation band"
},
"children": [
{
"childInfo": {
"name": "Child Name",
"dateOfBirth": "2019-01-01",
"cpinFileNumber": "1234321",
"serviceWorker": "Service Worker",
"specialNeeds": "special needs",
"concerns": ["concern1", "concern2"]
},
"daytimeContact": {
"name": "Daytime Contact",
"contactInfo": "contact info",
"address": "address",
"dismissalTime": "dismissal time"
},
"provider": [
{
"name": "Provider Name",
"fileNumber": "1234321",
"primaryPhoneNumber": "primary phone number",
"secondaryPhoneNumber": "secondary phone number",
"additionalContactNotes": "additional contact notes",
"relationshipToChild": "FOSTER_CAREGIVER"
}
]
}
],
"caregivers": [
{
"name": "Caregiver Name",
"dateOfBirth": "2019-01-01",
"primaryPhoneNumber": "primary phone number",
"secondaryPhoneNumber": "secondary phone number",
"additionalContactNotes": "additional contact notes",
"address": "address",
"relationshipToChild": "FOSTER_CAREGIVER",
"individualConsiderations": "individual considerations"
}
],
"programDetails": {
"transportRequirements": "transport requirements",
"schedulingRequirements": "scheduling requirements",
"suggestedStartDate": "2019-01-01",
"shortTermGoals": ["goal1", "goal2"],
"longTermGoals": ["goal3", "goal4"],
"familialConcerns": ["concern1", "concern2"],
"permittedIndividuals": [
{
"name": "Permitted Individual Name",
"phoneNumber": "phone number",
"relationshipToChildren": "relationship to children",
"additionalNotes": "additional notes"
}
]
}
}
1 change: 1 addition & 0 deletions backend/python/app/rest/testbad.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
curl -X POST -H "Content-Type: application/json" -d @testbad.json http://localhost:5000/intake > testbad.html
22 changes: 22 additions & 0 deletions backend/python/app/rest/testgood.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"access_location": null,
"court_order_file": "file binary",
"court_status": "INTERIM_CARE",
"cpin_file_type": "INVESTIGATION",
"cpin_number": "1234321",
"date_accepted": null,
"denial_reason": null,
"family_name": "Family Name",
"first_nation_band": "first nation band",
"first_nation_heritage": "FIRST_NATION_REGISTERED",
"id": 8,
"intake_status": "SUBMITTED",
"lead_access_worker_id": null,
"referral_date": "Tue, 01 Jan 2019 00:00:00 GMT",
"referring_worker_contact": "unused",
"referring_worker_name": "Referring Worker",
"scheduling_requirements": "scheduling requirements",
"suggested_start_date": "Tue, 01 Jan 2019 00:00:00 GMT",
"transportation_requirements": "transport requirements",
"user_id": 1
}
Loading