300 lines
12 KiB
Python
300 lines
12 KiB
Python
from typing import Union
|
|
|
|
|
|
from api_events.events.events.events_bind_services import (
|
|
ServiceBindOccupantEventMethods,
|
|
)
|
|
from databases import (
|
|
Modules,
|
|
BuildParts,
|
|
Build,
|
|
BuildLivingSpace,
|
|
OccupantTypes,
|
|
People,
|
|
)
|
|
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_validations.validations_request import (
|
|
InsertBuildLivingSpace,
|
|
UpdateBuildLivingSpace,
|
|
ListOptions,
|
|
)
|
|
from databases.sql_models.event.event import Services
|
|
|
|
|
|
class BuildingLivingSpacesListEventMethods(MethodToEvent):
|
|
|
|
event_type = "SELECT"
|
|
__event_keys__ = {
|
|
"36961d8a-cefa-46cc-9f7c-9d841d6351b6": "building_live_space_list",
|
|
}
|
|
__event_validation__ = {"36961d8a-cefa-46cc-9f7c-9d841d6351b6": None}
|
|
|
|
@classmethod
|
|
def building_live_space_list(
|
|
cls,
|
|
list_options: ListOptions,
|
|
token_dict: Union[EmployeeTokenObject, OccupantTokenObject],
|
|
):
|
|
records, Build.filter_attr = [], None
|
|
if isinstance(token_dict, OccupantTokenObject):
|
|
occupants_build_id = Build.filter_one(
|
|
Build.id == token_dict.selected_occupant.build_id,
|
|
).data
|
|
if not occupants_build_id:
|
|
Build.raise_http_exception(
|
|
status_code="HTTP_403_FORBIDDEN",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"Occupant has no build registered in the system. Contact with your company.",
|
|
data={},
|
|
)
|
|
occupants_build_parts = BuildParts.filter_all(
|
|
BuildParts.build_id.in_(occupants_build_id.id),
|
|
).data
|
|
if not occupants_build_parts:
|
|
Build.raise_http_exception(
|
|
status_code="HTTP_403_FORBIDDEN",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"Occupant has no build parts registered in the system. Contact with your company.",
|
|
data={},
|
|
)
|
|
BuildLivingSpace.pre_query = BuildLivingSpace.filter_all(
|
|
BuildLivingSpace.build_parts_id.in_(
|
|
[build_part.id for build_part in occupants_build_parts]
|
|
),
|
|
).query
|
|
BuildLivingSpace.filter_attr = list_options
|
|
records = BuildLivingSpace.filter_all()
|
|
elif isinstance(token_dict, EmployeeTokenObject):
|
|
build_id_list_query = Build.select_action(
|
|
employee_id=token_dict.selected_company.employee_id
|
|
)
|
|
if not build_id_list_query:
|
|
Build.raise_http_exception(
|
|
status_code="HTTP_403_FORBIDDEN",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"Employee has no build registered in the system. Contact with your supervisor.",
|
|
data={},
|
|
)
|
|
build_part_id_list_query = BuildParts.filter_all(
|
|
BuildParts.build_id.in_(
|
|
[build.id for build in build_id_list_query.all()]
|
|
),
|
|
).data
|
|
if not build_part_id_list_query:
|
|
Build.raise_http_exception(
|
|
status_code="HTTP_403_FORBIDDEN",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"Employee has no build parts registered in the system. Contact with your supervisor.",
|
|
data={},
|
|
)
|
|
BuildLivingSpace.pre_query = BuildLivingSpace.filter_all(
|
|
BuildLivingSpace.build_parts_id.in_(
|
|
[build_part.id for build_part in build_part_id_list_query]
|
|
),
|
|
).query
|
|
BuildLivingSpace.filter_attr = list_options
|
|
records = BuildLivingSpace.filter_all()
|
|
return AlchemyJsonResponse(
|
|
completed=True,
|
|
message="Building Living Spaces are listed successfully",
|
|
result=records,
|
|
)
|
|
|
|
|
|
class BuildingLivingSpacesCreateEventMethods(MethodToEvent):
|
|
|
|
event_type = "CREATE"
|
|
__event_keys__ = {
|
|
"46d90119-3b23-4784-8053-fe11da4a3584": "building_live_space_create"
|
|
}
|
|
__event_validation__ = {
|
|
"46d90119-3b23-4784-8053-fe11da4a3584": InsertBuildLivingSpace
|
|
}
|
|
|
|
@classmethod
|
|
def building_live_space_create(
|
|
cls,
|
|
data: InsertBuildLivingSpace,
|
|
token_dict: Union[EmployeeTokenObject, OccupantTokenObject],
|
|
):
|
|
from api_library.date_time_actions.date_functions import system_arrow
|
|
|
|
data_dict = data.excluded_dump()
|
|
build_id_list_query = Build.select_action(
|
|
employee_id=token_dict.selected_company.employee_id
|
|
)
|
|
build_part = BuildParts.filter_one(
|
|
BuildParts.uu_id == data.build_parts_uu_id,
|
|
BuildParts.build_id.in_([build.id for build in build_id_list_query.all()]),
|
|
).data
|
|
if not build_part:
|
|
BuildLivingSpace.raise_http_exception(
|
|
status_code="HTTP_404_NOT_FOUND",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"{data.build_parts_uu_id} - Build Part is not found in database. Check build part uu_id",
|
|
data={
|
|
"build_parts_uu_id": data.build_parts_uu_id,
|
|
},
|
|
)
|
|
life_person = People.filter_one(
|
|
People.uu_id == data.person_uu_id,
|
|
).data
|
|
if not life_person:
|
|
BuildLivingSpace.raise_http_exception(
|
|
status_code="HTTP_404_NOT_FOUND",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"{data.person_uu_id} - Living Person is not found in database.",
|
|
data={
|
|
"person_uu_id": data.person_uu_id,
|
|
},
|
|
)
|
|
occupant_type = OccupantTypes.filter_by_one(uu_id=data.occupant_type_uu_id).data
|
|
if not occupant_type:
|
|
BuildLivingSpace.raise_http_exception(
|
|
status_code="HTTP_404_NOT_FOUND",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"{data.occupant_type_uu_id} - Occupant Type is not found in database. Check occupant type uu_id",
|
|
data={
|
|
"occupant_type_uu_id": data.occupant_type_uu_id,
|
|
},
|
|
)
|
|
|
|
data_dict["occupant_type"] = occupant_type.id
|
|
data_dict["occupant_type_uu_id"] = str(occupant_type.uu_id)
|
|
data_dict["build_parts_id"] = build_part.id
|
|
data_dict["build_parts_uu_id"] = str(build_part.uu_id)
|
|
data_dict["person_id"] = life_person.id
|
|
data_dict["person_uu_id"] = str(life_person.uu_id)
|
|
|
|
living_space_id = BuildLivingSpace.select_only(
|
|
BuildLivingSpace.build_parts_id == build_part.id,
|
|
BuildLivingSpace.person_id == life_person.id,
|
|
BuildLivingSpace.occupant_type == occupant_type.id,
|
|
select_args=[BuildLivingSpace.id],
|
|
order_by=BuildLivingSpace.expiry_starts.desc(),
|
|
limit=1,
|
|
).data
|
|
|
|
last_living_space = BuildLivingSpace.filter_one(
|
|
BuildLivingSpace.id == living_space_id[0] if living_space_id else None,
|
|
).data
|
|
created_living_space = BuildLivingSpace.create_action(
|
|
data=data_dict, token_dict=token_dict
|
|
)
|
|
if last_living_space:
|
|
dt = system_arrow.get(last_living_space.expiry_ends)
|
|
if dt > system_arrow.now():
|
|
minute_df = int(dt.time().minute) - 10
|
|
last_living_space.expiry_ends = str(
|
|
dt.replace(
|
|
minute=60 - abs(minute_df) if minute_df < 0 else minute_df
|
|
)
|
|
)
|
|
last_living_space.save()
|
|
|
|
created_living_space.save_and_confirm()
|
|
occupants_service = Services.retrieve_service_via_occupant_code(
|
|
occupant_code=occupant_type.occupant_code
|
|
)
|
|
ServiceBindOccupantEventMethods.bind_services_occupant_system(
|
|
build_living_space_id=created_living_space.id,
|
|
service_id=occupants_service.id,
|
|
)
|
|
return created_living_space
|
|
|
|
|
|
class BuildingLivingSpacesUpdateEventMethods(MethodToEvent):
|
|
|
|
event_type = "UPDATE"
|
|
__event_keys__ = {
|
|
"c786e15c-c03e-4e8f-936c-7e5e5ec9bbcc": "building_live_space_update",
|
|
}
|
|
__event_validation__ = {
|
|
"c786e15c-c03e-4e8f-936c-7e5e5ec9bbcc": UpdateBuildLivingSpace
|
|
}
|
|
|
|
@classmethod
|
|
def building_live_space_update(
|
|
cls,
|
|
build_uu_id: str,
|
|
data: UpdateBuildLivingSpace,
|
|
token_dict: Union[EmployeeTokenObject, OccupantTokenObject],
|
|
):
|
|
from api_library.date_time_actions.date_functions import system_arrow
|
|
|
|
if isinstance(token_dict, OccupantTokenObject):
|
|
data_dict = data.dump()
|
|
build_id_list_query = Build.select_action(
|
|
employee_id=token_dict.selected_company.employee_id
|
|
)
|
|
build_part = BuildParts.filter_one(
|
|
BuildParts.uu_id == data.build_parts_uu_id,
|
|
BuildParts.build_id.in_(
|
|
[build.id for build in build_id_list_query.all()]
|
|
),
|
|
).data
|
|
if not build_part:
|
|
BuildLivingSpace.raise_http_exception(
|
|
status_code="HTTP_403_FORBIDDEN",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"{data.life_person_uu_id} - Living Person is not found in database.",
|
|
data={
|
|
"person_uu_id": data.life_person_uu_id,
|
|
},
|
|
)
|
|
life_person = People.filter_one(
|
|
People.uu_id == data.life_person_uu_id or ""
|
|
).data
|
|
if not life_person:
|
|
BuildLivingSpace.raise_http_exception(
|
|
status_code="HTTP_403_FORBIDDEN",
|
|
error_case="UNAUTHORIZED",
|
|
message=f"{data.life_person_uu_id} - Living Person is not found in database.",
|
|
data={
|
|
"person_uu_id": data.life_person_uu_id,
|
|
},
|
|
)
|
|
|
|
living_space_id = BuildLivingSpace.select_only(
|
|
*BuildLivingSpace.valid_record_args(BuildLivingSpace),
|
|
select_args=[BuildLivingSpace.id],
|
|
order_by=BuildLivingSpace.expiry_starts.desc(),
|
|
limit=1,
|
|
).get(1)
|
|
|
|
last_living_space = BuildLivingSpace.filter_one(
|
|
BuildLivingSpace.id == living_space_id if living_space_id else None,
|
|
).data
|
|
|
|
data_dict["expiry_starts"] = str(system_arrow.now())
|
|
data_dict["is_tenant_live"] = bool(data.is_tenant_live)
|
|
data_dict["build_parts_id"] = build_part.id
|
|
if data_dict["is_tenant_live"]:
|
|
owner_person = getattr(last_living_space, "owner_person_id", None)
|
|
if not owner_person:
|
|
BuildLivingSpace.raise_http_exception(
|
|
status_code="HTTP_403_FORBIDDEN",
|
|
error_case="UNAUTHORIZED",
|
|
message="Owner person of build part is not defined. Please register owner of part first.",
|
|
data=build_part.get_dict(),
|
|
)
|
|
data_dict["life_person_id"] = life_person.id
|
|
data_dict["owner_person_id"] = owner_person
|
|
else:
|
|
data_dict["life_person_id"] = life_person.id
|
|
data_dict["owner_person_id"] = life_person.id
|
|
del data_dict["build_parts_uu_id"], data_dict["life_person_uu_id"]
|
|
|
|
|
|
BuildingLivingSpacesListEventMethod = BuildingLivingSpacesListEventMethods(
|
|
action=ActionsSchema(endpoint="/building/living_space/list")
|
|
)
|
|
BuildingLivingSpacesCreateEventMethod = BuildingLivingSpacesCreateEventMethods(
|
|
action=ActionsSchema(endpoint="/building/living_space/create")
|
|
)
|
|
BuildingLivingSpacesUpdateEventMethod = BuildingLivingSpacesUpdateEventMethods(
|
|
action=ActionsSchema(endpoint="/building/living_space/update")
|
|
)
|