alcehmy and event functions updated

This commit is contained in:
2024-11-09 22:31:12 +03:00
parent e7a9b8c313
commit 1f75e49a07
23 changed files with 709 additions and 505 deletions

View File

@@ -18,7 +18,7 @@ from api_validations.validations_request import (
from api_events.events.abstract_class import MethodToEvent, ActionsSchema
from api_objects.auth.token_objects import EmployeeTokenObject, OccupantTokenObject
from api_validations.core_response import AlchemyJsonResponse
from api_library.date_time_actions.date_functions import DateTimeLocal
from api_library.date_time_actions.date_functions import DateTimeLocal, system_arrow
class DecisionBookListEventMethods(MethodToEvent):
@@ -46,15 +46,17 @@ class DecisionBookListEventMethods(MethodToEvent):
status_code=status.HTTP_404_NOT_FOUND,
detail=f"No building is match with given Employee UUID {token_dict.selected_company.employee_uu_id}",
)
records = BuildDecisionBook.filter_active(
records = BuildDecisionBook.filter_all(
BuildDecisionBook.build_id.in_([build.id for build in build_id_list]),
*BuildDecisionBook.get_smart_query(list_options.query),
)
BuildDecisionBook.active == True,
).data
elif isinstance(token_dict, OccupantTokenObject):
records = BuildDecisionBook.filter_active(
records = BuildDecisionBook.filter_all(
BuildDecisionBook.build_id == token_dict.selected_occupant.build_id,
*BuildDecisionBook.get_smart_query(list_options.query),
)
BuildDecisionBook.active == True,
).data
return AlchemyJsonResponse(
completed=True,
message="DecisionBook are listed successfully",
@@ -80,15 +82,16 @@ class DecisionBookCreateEventMethods(MethodToEvent):
Build.pre_query = Build.select_action(
employee_id=token_dict.selected_company.employee_id
)
build = Build.filter_active(
build = Build.filter_one(
Build.uu_id == data.build_uu_id,
)
if not build.data:
Build.active == True,
).get(1)
if not build:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Emloyee UUID {token_dict.selected_company.employee_uu_id} has no build with given UUID {data_dict.get('build_uu_id')}",
)
data_dict["build_id"] = build.data[0].id
data_dict["build_id"] = build.id
if data.resp_company_uu_id:
Companies.pre_query = Companies.select_action(
duty_id_list=[
@@ -96,21 +99,22 @@ class DecisionBookCreateEventMethods(MethodToEvent):
token_dict.selected_company.bulk_duties_id,
]
)
company = Companies.filter_active(
Companies.uu_id == data.resp_company_uu_id
)
if not company.data:
company = Companies.filter_one(
Companies.uu_id == data.resp_company_uu_id,
Companies.active == True,
).get(1)
if not company:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Duty UUID {token_dict.selected_company.duty_uu_id} has no company with given UUID {data_dict.get('resp_company_uu_id')}",
)
data_dict["resp_company_id"] = company.data[0].id
data_dict["resp_company_uu_id"] = str(company.data[0].uu_id)
data_dict["resp_company_id"] = company.id
data_dict["resp_company_uu_id"] = str(company.uu_id)
build_object = build.data[0]
decision_period_date = DateTimeLocal.get(build_object.decision_period_date)
decision_period_date = DateTimeLocal.get(build.decision_period_date)
data_dict["expiry_starts"] = DateTimeLocal.get(
DateTimeLocal.now().date().year,
system_arrow.now().date().year,
int(decision_period_date.date().month),
int(decision_period_date.date().day),
)
@@ -138,20 +142,24 @@ class DecisionBookCreateEventMethods(MethodToEvent):
detail="Only Build Manager can create decision book",
)
occupant_build = Build.find_one(id=token_dict.selected_occupant.build_id)
occupant_build = Build.filter_one(
Build.id==token_dict.selected_occupant.build_id,
Build.active == True,
).get(1)
occupant_company = Companies.find_one(
id=token_dict.selected_occupant.responsible_company_id
)
Companies.id==token_dict.selected_occupant.responsible_company_id,
Companies.active == True,
).get(1)
data_dict["build_id"] = occupant_build.id
data_dict["build_uu_id"] = str(occupant_build.uu_id)
data_dict["resp_company_id"] = occupant_company.id
data_dict["resp_company_uu_id"] = str(occupant_company.uu_id)
decision_period_date = DateTimeLocal.get(
decision_period_date = system_arrow.get(
occupant_build.decision_period_date
)
data_dict["expiry_starts"] = DateTimeLocal.get(
DateTimeLocal.now().date().year,
system_arrow.now().date().year,
int(decision_period_date.date().month),
int(decision_period_date.date().day),
)

View File

@@ -75,7 +75,9 @@ class DecisionBookDecisionBookItemsListEventMethods(MethodToEvent):
status_code=status.HTTP_404_NOT_FOUND,
detail=f"No company is match with given Employee UUID {token_dict.selected_company.employee_uu_id}",
)
BuildDecisionBookItems.filter_attr = BuildDecisionBookItems.FilterModel(**data.dump())
BuildDecisionBookItems.filter_attr = BuildDecisionBookItems.FilterModel(
**data.dump()
)
records = BuildDecisionBookItems.filter_active(
BuildDecisionBookItems.build_decision_book_id == decision_book.id
)

View File

@@ -5,7 +5,6 @@ from databases import (
BuildParts,
BuildDecisionBook,
BuildDecisionBookItems,
BuildDecisionBookPerson,
BuildDecisionBookPayments,
BuildDecisionBookProjects,
@@ -21,6 +20,7 @@ from api_objects.auth.token_objects import EmployeeTokenObject, OccupantTokenObj
from api_validations.core_response import AlchemyJsonResponse
from api_library.date_time_actions.date_functions import system_arrow, client_arrow
class DecisionBookDecisionBookItemsDebitsListEventMethods(MethodToEvent):
event_type = "SELECT"
@@ -47,6 +47,7 @@ class DecisionBookDecisionBookItemsDebitsListEventMethods(MethodToEvent):
result=records,
)
class DecisionBookDecisionBookItemsDebitsCreateEventMethods(MethodToEvent):
event_type = "CREATE"
@@ -100,4 +101,3 @@ class DecisionBookDecisionBookItemsDebitsCreateEventMethods(MethodToEvent):
message="Decision Book Items Debits are listed",
result=records,
)

View File

@@ -69,9 +69,9 @@ class DecisionBookPersonAddEventMethods(MethodToEvent):
status_code=status.HTTP_404_NOT_FOUND,
detail=f"No Decision Book is match with given UUID {data.build_decision_book_uu_id}",
)
manager_occupant_type = OccupantTypes.find_or_abort(
manager_occupant_type = OccupantTypes.filter_by_one(
occupant_code="BU-MNG", occupant_category_type="BU"
)
).get(1)
if (
not manager_occupant_type.uu_id
== token_dict.selected_occupant.occupant_type_uu_id
@@ -81,42 +81,42 @@ class DecisionBookPersonAddEventMethods(MethodToEvent):
detail="Only Build Manager can update the invitation",
)
assign_occupant_type = OccupantTypes.find_or_abort(
assign_occupant_type = OccupantTypes.filter_by_one(
uu_id=data.occupant_type_uu_id,
occupant_category_type="MT",
)
).get(1)
if not assign_occupant_type:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Occupant type must be a Meeting Type {data.occupant_type_uu_id} is not a MT type occupant",
)
manger_book_person = BuildDecisionBookPerson.find_one(
token=data.token,
build_decision_book_uu_id=data.build_decision_book_uu_id,
is_confirmed=True,
active=True,
)
manger_book_person = BuildDecisionBookPerson.filter_one(
BuildDecisionBookPerson.token==data.token,
BuildDecisionBookPerson.build_decision_book_uu_id==data.build_decision_book_uu_id,
BuildDecisionBookPerson.is_confirmed==True,
BuildDecisionBookPerson.active==True,
).get(1)
if not manger_book_person:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Manager person not found. Please check token",
)
book_invite = BuildDecisionBookInvitations.find_one(
id=manger_book_person.invite_id,
build_id=token_dict.selected_occupant.build_id,
)
book_invite = BuildDecisionBookInvitations.filter_one(
BuildDecisionBookInvitations.id==manger_book_person.invite_id,
BuildDecisionBookInvitations.build_id==token_dict.selected_occupant.build_id,
).get(1)
if not book_invite:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Invitation not found. Please check token",
)
selected_book_person = BuildDecisionBookPerson.find_one(
invite_id=book_invite.id,
person_uu_id=data.person_uu_id,
is_confirmed=True,
active=True,
)
selected_book_person = BuildDecisionBookPerson.filter_one(
BuildDecisionBookPerson.invite_id==book_invite.id,
BuildDecisionBookPerson.person_uu_id==data.person_uu_id,
BuildDecisionBookPerson.is_confirmed==True,
BuildDecisionBookPerson.active==True,
).get(1)
if not selected_book_person:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
@@ -171,10 +171,12 @@ class DecisionBookPersonAttendEventMethods(MethodToEvent):
detail="Employee cannot create decision book invitations",
)
token_user = Users.find_one(id=token_dict.user_id)
invitation_person = BuildDecisionBookPerson.find_one(
token=data.token, active=True, is_confirmed=True
)
token_user = Users.filter_one(Users.id==token_dict.user_id).get(1)
invitation_person = BuildDecisionBookPerson.filter_one(
BuildDecisionBookPerson.token==data.token,
BuildDecisionBookPerson.active==True,
BuildDecisionBookPerson.is_confirmed==True
).get(1)
if not invitation_person:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
@@ -189,10 +191,11 @@ class DecisionBookPersonAttendEventMethods(MethodToEvent):
# detail=f"Invitation for the user {token_user.email} is not valid. Please check token",
# )
# todo check if vicarious person is valid
invitation = BuildDecisionBookInvitations.find_one(
id=invitation_person.invite_id,
build_id=token_dict.selected_occupant.build_id,
)
invitation = BuildDecisionBookInvitations.filter_one(
BuildDecisionBookInvitations.id==invitation_person.invite_id,
BuildDecisionBookInvitations.build_id==token_dict.selected_occupant.build_id,
BuildDecisionBookInvitations.active==True,
).get(1)
if not invitation:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
@@ -236,66 +239,60 @@ class DecisionBookPersonAssignOccupantEventMethods(MethodToEvent):
detail="Employee cannot create decision book invitations",
)
book_person_manager = BuildDecisionBookPerson.find_one(
token=data.token,
build_living_space_id=token_dict.selected_occupant.living_space_id,
active=True,
is_confirmed=True,
)
manager_occupant_type = OccupantTypes.find_or_abort(
book_person_manager = BuildDecisionBookPerson.filter_one(
BuildDecisionBookPerson.token==data.token,
BuildDecisionBookPerson.build_living_space_id==token_dict.selected_occupant.living_space_id,
BuildDecisionBookPerson.active==True,
BuildDecisionBookPerson.is_confirmed==True,
).get(1)
manager_occupant_type = OccupantTypes.filter_by_one(
occupant_code="BU-MNG", occupant_category_type="BU"
)
).get(1)
book_person_manager.check_occupant_type(manager_occupant_type)
# supervisor_occupant_type = OccupantTypes.find_or_abort(occupant_code="BU-SPV", occupant_category_type="BU")
# book_person_supervisor.check_occupant_type(supervisor_occupant_type)
invitation = BuildDecisionBookInvitations.find_one(
id=book_person_manager.invite_id,
build_id=token_dict.selected_occupant.build_id,
active=True,
is_confirmed=True,
)
invitation = BuildDecisionBookInvitations.filter_one(
BuildDecisionBookInvitations.id==book_person_manager.invite_id,
BuildDecisionBookInvitations.build_id==token_dict.selected_occupant.build_id,
BuildDecisionBookInvitations.active==True,
).get(1)
if not invitation:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Invitation not found. Please check token",
)
assign_occupant_type = OccupantTypes.find_or_abort(
uu_id=data.occupant_type_uu_id, is_confirmed=True, active=True
)
assign_occupant_type = OccupantTypes.filter_by_one(
uu_id=data.occupant_type_uu_id, active=True
).get(1)
if not assign_occupant_type:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Occupant type must be a Meeting Type {data.occupant_type_uu_id} is not a MT type occupant",
)
build_parts_of_token = BuildParts.filter_active(
build_parts_of_token = BuildParts.filter_all(
BuildParts.build_id == token_dict.selected_occupant.build_id,
)
selected_living_space = BuildLivingSpace.filter_active(
).data
selected_living_space = BuildLivingSpace.filter_one(
BuildLivingSpace.uu_id == data.build_living_space_uu_id,
BuildLivingSpace.build_parts_id.in_(
[build.id for build in build_parts_of_token.data]
[build.id for build in build_parts_of_token]
),
)
if not selected_living_space.data:
).get(1)
if not selected_living_space:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Person not found. Please check person uuid",
)
selected_living_space = selected_living_space.get(1)
book_person_to_assign: BuildDecisionBookPerson = (
BuildDecisionBookPerson.find_one(
build_living_space_id=selected_living_space.id,
invite_id=invitation.id,
active=True,
is_confirmed=True,
)
)
book_person_to_assign: BuildDecisionBookPerson = BuildDecisionBookPerson.filter_one(
BuildDecisionBookPerson.build_living_space_id==selected_living_space.id,
BuildDecisionBookPerson.invite_id==invitation.id,
BuildDecisionBookPerson.active==True
).get(1)
if not book_person_to_assign:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
@@ -309,16 +306,16 @@ class DecisionBookPersonAssignOccupantEventMethods(MethodToEvent):
)
if assign_occupant_type.occupant_code in ("MT-PRS", "MT-WRT"):
occupant_type_unique = OccupantTypes.find_or_abort(
occupant_type_unique = OccupantTypes.filter_by_one(
occupant_code=assign_occupant_type.occupant_code,
occupant_category_type="MT",
)
if assigned_book_person_occupant := BuildDecisionBookPersonOccupants.find_one(
invite_id=invitation.id,
occupant_type_id=occupant_type_unique.id,
active=True,
is_confirmed=True,
):
).get(1)
if assigned_book_person_occupant := BuildDecisionBookPersonOccupants.filter_one(
BuildDecisionBookPersonOccupants.invite_id==invitation.id,
BuildDecisionBookPersonOccupants.occupant_type_id==occupant_type_unique.id,
BuildDecisionBookPersonOccupants.active==True,
BuildDecisionBookPersonOccupants.is_confirmed==True,
).get(1):
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"Only one person can be assigned to {assign_occupant_type.occupant_code} type"
@@ -326,13 +323,13 @@ class DecisionBookPersonAssignOccupantEventMethods(MethodToEvent):
)
if assign_occupant_type.occupant_code == "BU-MNG":
person_occupant_manager = BuildDecisionBookPersonOccupants.find_one(
invite_id=invitation.id,
occupant_type_id=manager_occupant_type.id,
active=True,
is_confirmed=True,
person_occupant_manager = BuildDecisionBookPersonOccupants.filter_one(
BuildDecisionBookPersonOccupants.invite_id==invitation.id,
BuildDecisionBookPersonOccupants.occupant_type_id==manager_occupant_type.id,
BuildDecisionBookPersonOccupants.active==True,
BuildDecisionBookPersonOccupants.is_confirmed==True,
)
person_occupant_manager.delete(destroy=True)
person_occupant_manager.query.delete()
book_person_to_assign.add_occupant_type(
occupant_type=assign_occupant_type,

View File

@@ -62,9 +62,9 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
detail="Employee cannot create decision book invitations",
)
# Check token posses the occupant type of Build Manager
occupant_manager = OccupantTypes.find_one(
occupant_manager = OccupantTypes.filter_by_one(
occupant_category_type="BU", occupant_code="BU-MNG"
)
).get(1)
if not token_dict.selected_occupant.occupant_type_id == occupant_manager.id:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
@@ -72,21 +72,24 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
)
# Check decision book is valid for this token and building
decision_book = BuildDecisionBook.find_one(
uu_id=data.build_decision_book_uu_id,
build_id=token_dict.selected_occupant.build_id,
)
decision_book = BuildDecisionBook.filter_one(
BuildDecisionBook.uu_id==data.build_decision_book_uu_id,
BuildDecisionBook.build_id==token_dict.selected_occupant.build_id,
BuildDecisionBook.active==True,
).get(1)
if not decision_book:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Decision book not found. Please create decision book first",
)
occupant_building = Build.find_one(id=token_dict.selected_occupant.build_id)
occupant_building = Build.filter_one(
Build.id==token_dict.selected_occupant.build_id
).get(1)
# Check meeting type is valid
meeting_type = ApiEnumDropdown.find_one(
meeting_type = ApiEnumDropdown.filter_by_one(
enum_class="MeetingTypes",
)
).get(1)
if not meeting_type:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
@@ -104,6 +107,9 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
)
# Create an invitation for specific invitation type to start invite sending process
planned_date_expires = str(
system_arrow.get(data.planned_date).shift(days=15).date()
),
book_invitation = BuildDecisionBookInvitations.find_or_create(
build_id=token_dict.selected_occupant.build_id,
build_uu_id=token_dict.selected_occupant.build_uuid,
@@ -114,9 +120,7 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
living_part_percentage=0.51,
message=data.message,
planned_date=data.planned_date,
planned_date_expires=str(
system_arrow.get(data.planned_date).shift(days=15).date()
),
planned_date_expires=planned_date_expires,
expiry_ends=str(system_arrow.get(data.planned_date).shift(days=15).date()),
is_confirmed=True,
)
@@ -131,25 +135,22 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
)
# Get all the parts of the building that is occupant in token
build_parts = BuildParts.filter_active(
BuildParts.build_id == occupant_building.id
)
build_parts = BuildParts.filter_all(
BuildParts.build_id == occupant_building.id,
BuildParts.active == True
).data
# Get all build living spaces that is found in building with distinct person id
occupants = OccupantTypes.filter_all()
build_living_spaces_people = (
BuildLivingSpace.filter_active(
BuildLivingSpace.build_parts_id.in_(
[build_part.id for build_part in build_parts.data]
),
BuildLivingSpace.occupant_type.in_(
[occupant.id for occupant in occupants.data]
),
filter_records=False,
)
.query.distinct(BuildLivingSpace.person_id)
.all()
)
occupants = OccupantTypes.filter_all(system=True)
BuildLivingSpace.filter_attr = None
build_living_spaces_people = BuildLivingSpace.filter_all(
BuildLivingSpace.build_parts_id.in_(
[build_part.id for build_part in build_parts.data]
),
BuildLivingSpace.occupant_type.in_(
[occupant.id for occupant in occupants.data]
),
).query.distinct(BuildLivingSpace.person_id).all()
if not build_living_spaces_people:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
@@ -199,21 +200,22 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
invitations_person.add_occupant_type(occupant_type=attendance_occupant_type)
if invitations_person and not invitations_person.is_found:
print(f'"{invitations_person.token}",')
spaces_user = Users.find_one(
active=True,
is_confirmed=True,
person_id=build_living_spaces_user.person_id,
)
spaces_user = Users.filter_one(
Users.active==True,
Users.is_confirmed==True,
Users.person_id==build_living_spaces_user.person_id,
).data
# print(
# f"Invitation is send : {spaces_user.email} "
# f"Token : {invitations_person.token} "
# f"Send Date : {str(invitations_person.send_date.date())}"
# )
manager_living_spaces = BuildLivingSpace.filter_active(
manager_living_spaces = BuildLivingSpace.filter_all(
BuildLivingSpace.person_id == token_dict.person_id,
)
manager_people = BuildDecisionBookPerson.filter_active(
BuildLivingSpace.active == True,
).data
manager_people = BuildDecisionBookPerson.filter_all(
BuildDecisionBookPerson.invite_id == book_invitation.id,
BuildDecisionBookPerson.build_living_space_id.in_(
[
@@ -221,16 +223,15 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
for manager_living_space in manager_living_spaces.data
]
),
BuildLivingSpace.active == True,
)
manager_people_occupants = BuildDecisionBookPersonOccupants.filter_active(
manager_people_occupants = BuildDecisionBookPersonOccupants.filter_all(
BuildDecisionBookPersonOccupants.build_decision_book_person_id
== manager_people.get(1).id
== manager_people.get(1).id,
BuildDecisionBookPersonOccupants.active == True,
)
dlt = [
occupants.delete(destroy=True)
for occupants in manager_people_occupants.data
]
dlt = [occupants.delete(destroy=True) for occupants in manager_people.data]
manager_people_occupants.query.delete()
manager_people.query.delete()
if book_person_manager := BuildDecisionBookPerson.find_or_create(
**build_decision_book_person_dict,