Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Visits Backend #245

Draft
wants to merge 10 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all 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
9 changes: 9 additions & 0 deletions backend/python/app/models/visiting_members.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from . import db
from .base_mixin import BaseMixin


class VisitingMember(db.Model, BaseMixin):
__tablename__ = "visiting_members"

id = db.Column(db.Integer, primary_key=True, nullable=False)
location = db.Column(db.String, nullable=False)
23 changes: 22 additions & 1 deletion backend/python/app/resources/visit_dto.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,26 @@ def __init__(self, **kwargs):
self.notes = kwargs.get("notes")
self.childAndFamilySupportWorker = kwargs.get("childAndFamilySupportWorker")

class CreateVisitDTO(object):
def __init__(self, **kwargs):
super().__init__(**kwargs)

def validate(self):
pass
error_list = []

if not self.user_id or not isinstance(self.user_id, int):
error_list.append("user_id is invalid")
if not self.childInformation:
error_list.append("childInformation is invalid")
if not self.visitTimestamp:
error_list.append("visitTimestamp is invalid")
if not self.attendance:
error_list.append("attendance is invalid")
if not self.transportation:
error_list.append("transportation is invalid")
if not self.notes:
error_list.append("notes is invalid")
if not self.childAndFamilySupportWorker:
error_list.append("childAndFamilySupportWorker is invalid")

return error_list
55 changes: 51 additions & 4 deletions backend/python/app/rest/visit_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from ..middlewares.auth import require_authorization_by_role
from ..middlewares.validate import validate_request
from ..resources.visit_dto import VisitDTO
from ..resources.visit_dto import VisitDTO, CreateVisitDTO
from ..services.implementations.visit_service import VisitService

# define instance of VisitService
Expand All @@ -15,7 +15,54 @@


@blueprint.route("/", methods=["POST"], strict_slashes=False)
@require_authorization_by_role({"User", "Admin"})
@validate_request("VisitDTO")
# @require_authorization_by_role({"User", "Admin"})
# @validate_request("VisitDTO")
def create_visit():
pass

# undos = []
#
# def run_undos():
# for undo in undos:
# service, fn, arg = undo
# service.__dict__[fn](arg)
#
# # visits
visit = {
"user_id": request.json["user_i_d"],
"case_id": request.json["case_i_d"],
"family_name": request.json["child_details"]["family_name"],
"children": request.json["child_details"]["children"],
"child_service_worker": request.json["child_details"]["child_service_worker"],
"child_protection_worker": request.json["child_details"]["child_protection_worker"],
"foster_care_coordinator": request.json["child_details"]["foster_care_coordinator"],
"visit_date": request.json["visit_details"]["visit_date"],
"visit_day": request.json["visit_details"]["visit_day"],
"visit_supervision": request.json["visit_details"]["visit_supervision"],
"start_time": request.json["visit_details"]["start_time"],
"end_time": request.json["visit_details"]["end_time"],
"location": request.json["visit_details"]["location"],
# TODO FIX THIS
"visiting_members": request.json["attendance_entries"]["entries"][0]["visiting_members"],
"visitor_relationship": request.json["attendance_entries"]["entries"][0]["visitor_relationship"],
"visiting_member_name": request.json["attendance_entries"]["entries"][0]["visiting_member_name"],
"visit_attendance": request.json["attendance_entries"]["entries"][0]["visit_attendance"],
"absence_reason": request.json["attendance_entries"]["entries"][0]["absence_reason"],
}
#
# try:
# validate_request("CreateVisitDTO")
# visit = CreateVisitDTO(**visit)
# new_visit = visit_service.create_visit(visit)
# undos.append((visit_service, "delete_visit", new_visit.id))
# except Exception as error:
# print("invalid")
# run_undos()
# return jsonify(str(error)), 400
#
# print(new_visit.__dict__)
# return jsonify(new_visit.__dict__), 201

from pprint import pprint
pprint(visit)

return jsonify(visit), 201
15 changes: 12 additions & 3 deletions backend/python/app/services/implementations/visit_service.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
from ...models import db
from ..interfaces.visit_service import IVisitService

from ...resources.visit_dto import CreateVisitDTO, VisitDTO

class VisitService(IVisitService):
def __init__(self, logger):
self.logger = logger

def create_visit():
pass
def create_visit(self, visit: CreateVisitDTO):
try:
if not visit:
raise Exception(
"Empty visit DTO/None passed to create_intake function"
)
if not isinstance(visit, CreateVisitDTO):
pass
except Exception as error:
pass

1 change: 1 addition & 0 deletions frontend/src/APIClients/IntakeAPIClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
AUTHENTICATED_USER_KEY,
"access_token",
)}`;
console.log(bearerToken);

Check warning on line 39 in frontend/src/APIClients/IntakeAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Unexpected console statement
try {
const { data } = await baseAPIClient.post("/intake", formData, {
headers: { Authorization: bearerToken },
Expand Down
83 changes: 83 additions & 0 deletions frontend/src/APIClients/VisitAPIClient.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import baseAPIClient from "./BaseAPIClient";
import AUTHENTICATED_USER_KEY from "../constants/AuthConstants";
import { getLocalStorageObjProperty } from "../utils/LocalStorageUtils";
import { Case } from "../types/CasesContextTypes";

interface Visit {

Check warning on line 6 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

'Visit' is defined but never used
user_id: number;

Check warning on line 7 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Delete `··`
case_id: number;

Check warning on line 8 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Delete `··`
childDetails: {

Check warning on line 9 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Delete `··`
familyName: string;

Check warning on line 10 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Replace `········` with `····`
children: string[];

Check warning on line 11 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Replace `········` with `····`
childServiceWorker: string;

Check warning on line 12 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Delete `····`
childProtectionWorker: string;

Check warning on line 13 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Replace `········` with `····`
fosterCareCoordinator: string;

Check warning on line 14 in frontend/src/APIClients/VisitAPIClient.ts

View workflow job for this annotation

GitHub Actions / run-lint

Replace `········` with `····`
};
visitDetails: {
visitDate: string;
visitDay: string;
visitSupervision: string;
startTime: string;
endTime: string;
location: string;
};
attendanceEntries: {
visitingMembers: string;
visitorRelationship: string;
description: string;
visitingMemberName: string;
visitAttendance: string;
absenceReason: string;
}[];
transportationEntries: {
gaurdian: string;
name: string;
duration: string;
}[];
}

// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any
const post = async (formData: any): Promise<Case> => {
const bearerToken = `Bearer ${getLocalStorageObjProperty(
AUTHENTICATED_USER_KEY,
"access_token",
)}`;
console.log(bearerToken);
try {
const { data } = await baseAPIClient.post("/visits", formData, {
headers: { Authorization: bearerToken },
});

console.log(data);
return data;
} catch (error) {
return error;
}
};

const put = async ({
changedData,
intakeID,
}: {
changedData: Record<string, string>;
intakeID: number;
}): Promise<Case> => {
const bearerToken = `Bearer ${getLocalStorageObjProperty(
AUTHENTICATED_USER_KEY,
"access_token",
)}`;
try {
const { data } = await baseAPIClient.put(
`/visits/${intakeID}`,
changedData,
{
headers: { Authorization: bearerToken },
},
);
return data;
} catch (error) {
return error;
}
};

export default { post, put };
5 changes: 5 additions & 0 deletions frontend/src/components/pages/CaseOverview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ const CaseOverviewBody = (): React.ReactElement => {
history.push("/intake");
};

const goToVisitation = () => {
history.push(`/visit/${caseNumber}`)
}

const goToHomepage = () => {
history.push("/");
};
Expand Down Expand Up @@ -384,6 +388,7 @@ const CaseOverviewBody = (): React.ReactElement => {
right="4"
borderColor={colors.blue[300]}
backgroundColor={colors.blue[100]}
onClick={goToVisitation}
>
<div style={{ paddingRight: "10px" }}>
<UserPlus width="13px" />
Expand Down
21 changes: 17 additions & 4 deletions frontend/src/components/pages/VisitPage.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React, { useState } from "react";
import {useParams} from 'react-router-dom'
import {
Box,
Button,
Expand All @@ -20,8 +21,8 @@ import OptionalLabel from "../intake/OptionalLabel";
import VisitFormFooter from "../visit/VisitFormFooter";

const Visit = (): React.ReactElement => {
// url is /visit/caseId/visitId, commented for now to avoid lint
// const params = useParams();
const { caseId } = useParams<{ caseId: string}>();
const caseNumber: number = parseInt(caseId, 10);

const DEFAULT_CHILD_DETAILS = {
familyName: "",
Expand All @@ -31,6 +32,8 @@ const Visit = (): React.ReactElement => {
fosterCareCoordinator: "",
};

// Attendance Sheet

const DEFAULT_VISIT_DETAILS = {
visitDate: "",
visitDay: "",
Expand All @@ -40,6 +43,8 @@ const Visit = (): React.ReactElement => {
location: "",
};

// Attendance Records

const DEFAULT_ATTENDANCE_DETAILS = {
entries: [
{
Expand All @@ -53,6 +58,8 @@ const Visit = (): React.ReactElement => {
],
};

// Visting Member

const DEDAULT_TRANSPORTATION_DETAILS = {
entries: [
{
Expand All @@ -63,6 +70,7 @@ const Visit = (): React.ReactElement => {
],
};

// Transportation
const [childDetails, setChildDetails] = useState<ChildDetails>(
DEFAULT_CHILD_DETAILS,
);
Expand Down Expand Up @@ -130,7 +138,7 @@ const Visit = (): React.ReactElement => {
gap="8px"
>
<Button variant="ghost" width="fit-content">
<ArrowLeft /> Save and Exit {/* TODO implement save and exit */}
<ArrowLeft /> Save and Exit
</Button>
</Box>
<Button
Expand Down Expand Up @@ -258,7 +266,12 @@ const Visit = (): React.ReactElement => {
</Box>
</Box>
</Box>
<VisitFormFooter />
<VisitFormFooter
childDetails={childDetails}
visitDetails={visitDetails}
attendanceEntries={attendanceEntries}
transportationEntries={transportationEntries}
/>
</>
);
};
Expand Down
Loading
Loading