migrator functions updated

This commit is contained in:
berkay 2024-11-11 22:23:07 +03:00
parent f6135ced5f
commit ffb85a62f6
56 changed files with 567 additions and 485 deletions

View File

@ -14,8 +14,7 @@ class ActionsSchema(ABC):
from databases import EndpointRestriction from databases import EndpointRestriction
endpoint_restriction = EndpointRestriction.filter_one( endpoint_restriction = EndpointRestriction.filter_one(
EndpointRestriction.endpoint_name.ilike(f"%{self.endpoint}%"), EndpointRestriction.endpoint_name.ilike(f"%{self.endpoint}%"), system=True
system=True
).data ).data
if not endpoint_restriction: if not endpoint_restriction:
raise HTTPException( raise HTTPException(

View File

@ -558,7 +558,9 @@ class AuthenticationRefreshTokenEventMethods(MethodToEvent):
cls, request: Request, data: Remember, token_dict: dict = None cls, request: Request, data: Remember, token_dict: dict = None
): ):
token_refresher = UsersTokens.filter_by_one( token_refresher = UsersTokens.filter_by_one(
token=data.refresh_token, domain=data.domain, **UsersTokens.valid_record_dict token=data.refresh_token,
domain=data.domain,
**UsersTokens.valid_record_dict,
).data ).data
if not token_refresher: if not token_refresher:
return JSONResponse( return JSONResponse(

View File

@ -71,6 +71,12 @@ class AuthenticationLoginEventMethods(MethodToEvent):
raise HTTPException( raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials" status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid credentials"
) )
access_object = access_dict.get("access_object")
if not access_object:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="This User has no active role registered. Please contact your administrator."
)
return JSONResponse( return JSONResponse(
content={ content={
@ -111,11 +117,15 @@ class AuthenticationSelectEventMethods(MethodToEvent):
}, },
status_code=status.HTTP_401_UNAUTHORIZED, status_code=status.HTTP_401_UNAUTHORIZED,
) )
if selected_company := Companies.find_one(uu_id=data.company_uu_id): if selected_company := Companies.filter_one(
Companies.uu_id==data.company_uu_id,
*Companies.valid_record_args(Companies),
).data:
department_ids = [ department_ids = [
department.id department.id
for department in Departments.filter_by_active( for department in Departments.filter_all(
company_id=selected_company.id Departments.company_id==selected_company.id,
*Departments.valid_record_args(Departments),
).data ).data
] ]
duties_ids = [ duties_ids = [
@ -154,12 +164,12 @@ class AuthenticationSelectEventMethods(MethodToEvent):
Departments.id == duties.department_id, Departments.id == duties.department_id,
).data ).data
bulk_id = Duty.filter_by_one( bulk_id = Duty.filter_by_one(
duty_code="BULK", **Duty.valid_record_args(Duty) duty_code="BULK", **Duty.valid_record_dict
).data ).data
bulk_duty_id = Duties.filter_by_one( bulk_duty_id = Duties.filter_by_one(
company_id=selected_company.id, company_id=selected_company.id,
duties_id=bulk_id.id, duties_id=bulk_id.id,
*Duties.valid_record_dict, **Duties.valid_record_dict,
).data ).data
update_selected_to_redis( update_selected_to_redis(
request=request, request=request,
@ -187,13 +197,13 @@ class AuthenticationSelectEventMethods(MethodToEvent):
status_code=status.HTTP_200_OK, status_code=status.HTTP_200_OK,
) )
elif token_user.user_type == 2: elif token_user.user_type == 2:
occupant_type = OccupantTypes.filter_by_one(uu_id=data.occupant_uu_id).data occupant_type = OccupantTypes.filter_by_one(system=True, uu_id=data.occupant_uu_id).data
if not occupant_type: if not occupant_type:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, status_code=status.HTTP_401_UNAUTHORIZED,
detail="Occupant Type is not found", detail="Occupant Type is not found",
) )
build_part = BuildParts.filter_by_one(uu_id=data.build_part_uu_id).data build_part = BuildParts.filter_by_one(system=True, uu_id=data.build_part_uu_id).data
if not build_part: if not build_part:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, status_code=status.HTTP_401_UNAUTHORIZED,
@ -213,7 +223,7 @@ class AuthenticationSelectEventMethods(MethodToEvent):
Companies.id == related_company.company_id, Companies.id == related_company.company_id,
*Companies.valid_record_args(Companies), *Companies.valid_record_args(Companies),
).data ).data
responsible_employee = Employees.find_one( responsible_employee = Employees.filter_one(
Employees.id == related_company.employee_id, Employees.id == related_company.employee_id,
*Employees.valid_record_args(Employees), *Employees.valid_record_args(Employees),
).data ).data
@ -389,7 +399,7 @@ class AuthenticationCreatePasswordEventMethods(MethodToEvent):
}, },
status_code=status.HTTP_202_ACCEPTED, status_code=status.HTTP_202_ACCEPTED,
) )
found_user.create_password(found_user=found_user,password=data.password) found_user.create_password(found_user=found_user, password=data.password)
# send_email_completed = send_email( # send_email_completed = send_email(
# subject=f"Dear {found_user.user_tag}, your password has been changed.", # subject=f"Dear {found_user.user_tag}, your password has been changed.",
# receivers=[str(found_user.email)], # receivers=[str(found_user.email)],
@ -409,7 +419,6 @@ class AuthenticationCreatePasswordEventMethods(MethodToEvent):
) )
class AuthenticationDisconnectUserEventMethods(MethodToEvent): class AuthenticationDisconnectUserEventMethods(MethodToEvent):
event_type = "UPDATE" event_type = "UPDATE"
@ -441,7 +450,10 @@ class AuthenticationDisconnectUserEventMethods(MethodToEvent):
for key in already_tokens: for key in already_tokens:
token_user = json.loads(redis_cli.get(key) or {}) token_user = json.loads(redis_cli.get(key) or {})
redis_cli.delete(key) redis_cli.delete(key)
selected_user = Users.find_one(uu_id=token_user.get("uu_id")) selected_user = Users.filter_one(
Users.uu_id==token_user.get("uu_id"),
*Users.valid_record_args(Users),
)
selected_user.remove_refresher_token( selected_user.remove_refresher_token(
domain=data.domain, disconnect=True domain=data.domain, disconnect=True
) )
@ -499,7 +511,10 @@ class AuthenticationLogoutEventMethods(MethodToEvent):
for token_user in token_users: for token_user in token_users:
if token_dict.domain == data.domain: if token_dict.domain == data.domain:
redis_cli.delete(token_user) redis_cli.delete(token_user)
selected_user = Users.find_one(uu_id=token_user.get("uu_id")) selected_user = Users.filter_one(
Users.uu_id==token_user.get("uu_id"),
*Users.valid_record_args(Users),
)
selected_user.remove_refresher_token(domain=data.domain) selected_user.remove_refresher_token(domain=data.domain)
# UserLogger.log_error( # UserLogger.log_error(
# str( # str(
@ -537,8 +552,8 @@ class AuthenticationRefreshTokenEventMethods(MethodToEvent):
def authentication_refresher_token( def authentication_refresher_token(
cls, request: Request, data: Remember, token_dict: dict = None cls, request: Request, data: Remember, token_dict: dict = None
): ):
token_refresher = UsersTokens.find_one( token_refresher = UsersTokens.filter_by_one(
token=data.refresh_token, domain=data.domain system=True, token=data.refresh_token, domain=data.domain
) )
if not token_refresher: if not token_refresher:
return JSONResponse( return JSONResponse(

View File

@ -60,27 +60,19 @@ class CompanyCreateEventMethods(MethodToEvent):
} }
@classmethod @classmethod
def company_create(cls, data: InsertCompany, token_dict): def company_create(
cls, data: InsertCompany, token_dict: typing.Union[EmployeeTokenObject, OccupantTokenObject]
):
created_company = Companies.create_action( created_company = Companies.create_action(
data=data, token=token_dict.companies_list data=data, token=token_dict
) )
created_company.related_company = token_dict.get("company_uu_id") created_company.related_company = token_dict.selected_company.company_uu_id
created_company.flush()
created_company.save() created_company.save()
return JSONResponse( return JSONResponse(
content={ content={
"completed": True, "completed": True,
"message": "Create Company record", "message": "Create Company record",
"data": created_company.get_dict(), "data": created_company.get_dict()
"password_token": {
"password_token": created_company.password_token,
"password_expires_day": str(created_company.password_expires_day),
"password_expiry_begins": str(
created_company.password_expiry_begins
),
"hash_password": created_company.hash_password,
"related_company": created_company.related_company,
},
}, },
status_code=status.HTTP_200_OK, status_code=status.HTTP_200_OK,
) )

View File

@ -58,11 +58,11 @@ class EmployeeCreateEventMethods(MethodToEvent):
token_dict: Union[EmployeeTokenObject, OccupantTokenObject], token_dict: Union[EmployeeTokenObject, OccupantTokenObject],
): ):
person = People.filter_one( person = People.filter_one(
People.uu_id==data.people_uu_id, People.uu_id == data.people_uu_id,
*People.valid_record_args(People), *People.valid_record_args(People),
).data ).data
staff = Staff.filter_one( staff = Staff.filter_one(
Staff.uu_id==data.staff_uu_id, Staff.uu_id == data.staff_uu_id,
*Staff.valid_record_args(Staff), *Staff.valid_record_args(Staff),
).data ).data
if not staff: if not staff:
@ -101,7 +101,7 @@ class EmployeeUpdateEventMethods(MethodToEvent):
@classmethod @classmethod
def employee_update(cls, employee_uu_id: str, data: PatchRecord, token_dict): def employee_update(cls, employee_uu_id: str, data: PatchRecord, token_dict):
find_one_employee = Employees.filter_one( find_one_employee = Employees.filter_one(
Employees.uu_id==employee_uu_id, Employees.uu_id == employee_uu_id,
*Employees.valid_record_args(Employees), *Employees.valid_record_args(Employees),
).data ).data
access_authorized_employee = Employees.select_action( access_authorized_employee = Employees.select_action(
@ -188,12 +188,11 @@ class Employee2PeopleEmployEventMethods(MethodToEvent):
@classmethod @classmethod
def company_employee_employ(cls, data: BindEmployees2People, token_dict): def company_employee_employ(cls, data: BindEmployees2People, token_dict):
selected_staff = Staff.filter_one( selected_staff = Staff.filter_one(
Staff.uu_id==data.staff_uu_id, Staff.uu_id == data.staff_uu_id,
*Staff.valid_record_args(Staff), *Staff.valid_record_args(Staff),
).data ).data
selected_people = People.filter_one( selected_people = People.filter_one(
People.uu_id==data.people_uu_id, People.uu_id == data.people_uu_id, *People.valid_record_args
*People.valid_record_args
).data ).data
if not selected_staff: if not selected_staff:
raise HTTPException( raise HTTPException(
@ -251,7 +250,7 @@ class Employee2PeopleFireEventMethods(MethodToEvent):
@classmethod @classmethod
def company_employee_fire(cls, data: BindEmployees2People, token_dict): def company_employee_fire(cls, data: BindEmployees2People, token_dict):
selected_people = People.filter_one( selected_people = People.filter_one(
People.uu_id==data.people_uu_id, People.uu_id == data.people_uu_id,
*People.valid_record_args(People), *People.valid_record_args(People),
).data ).data
if not selected_people: if not selected_people:
@ -261,7 +260,7 @@ class Employee2PeopleFireEventMethods(MethodToEvent):
) )
find_one_employee: Employees = Employees.filter_one( find_one_employee: Employees = Employees.filter_one(
Employees.people_id==selected_people.id, Employees.people_id == selected_people.id,
*Employees.valid_record_args(Employees), *Employees.valid_record_args(Employees),
).data ).data
if not find_one_employee: if not find_one_employee:

View File

@ -45,7 +45,7 @@ class StaffCreateEventMethods(MethodToEvent):
def staff_create(cls, data: InsertStaff, token_dict: EmployeeTokenObject): def staff_create(cls, data: InsertStaff, token_dict: EmployeeTokenObject):
data_dict = data.excluded_dump() data_dict = data.excluded_dump()
duties = Duties.filter_one( duties = Duties.filter_one(
Duties.uu_id==data.duties_uu_id, Duties.uu_id == data.duties_uu_id,
*Duties.valid_record_args(Duties), *Duties.valid_record_args(Duties),
).data ).data
if not duties: if not duties:
@ -77,12 +77,10 @@ class StaffGetByUUIDEventMethods(MethodToEvent):
def staff_get_by_uu_id(cls, data: SelectStaff, token_dict): def staff_get_by_uu_id(cls, data: SelectStaff, token_dict):
if data.duties_uu_id: if data.duties_uu_id:
duties_id = Duties.filter_one( duties_id = Duties.filter_one(
Duties.uu_id==data.duties_uu_id, Duties.uu_id == data.duties_uu_id, *Duties.valid_record_args(Duties)
*Duties.valid_record_args(Duties)
).data ).data
selected_staffs = Staff.filter_all( selected_staffs = Staff.filter_all(
Staff.duties_id == duties_id.id, Staff.duties_id == duties_id.id, *Staff.valid_record_args(Staff)
*Staff.valid_record_args(Staff)
) )
return JSONResponse( return JSONResponse(
content={ content={

View File

@ -43,7 +43,7 @@ class DecisionBookDecisionBookItemsListEventMethods(MethodToEvent):
token_dict: typing.Union[EmployeeTokenObject, OccupantTokenObject], token_dict: typing.Union[EmployeeTokenObject, OccupantTokenObject],
): ):
decision_book = BuildDecisionBook.filter_one( decision_book = BuildDecisionBook.filter_one(
BuildDecisionBook.uu_id==data.build_decision_book_uu_id, BuildDecisionBook.uu_id == data.build_decision_book_uu_id,
*BuildDecisionBook.valid_record_args(BuildDecisionBook), *BuildDecisionBook.valid_record_args(BuildDecisionBook),
) )
if not decision_book: if not decision_book:
@ -232,17 +232,17 @@ class DecisionBookDecisionBookItemsCreateEventMethods(MethodToEvent):
== f"{decision_book.decision_type}_{data_info_type.key}", == f"{decision_book.decision_type}_{data_info_type.key}",
).data ).data
management_room = BuildParts.filter_one( management_room = BuildParts.filter_one(
BuildParts.build_id==build_id, BuildParts.build_id == build_id,
BuildParts.part_no==0, BuildParts.part_no == 0,
*BuildParts.valid_record_args(BuildParts), *BuildParts.valid_record_args(BuildParts),
).data ).data
occupant_man = OccupantTypes.filter_by_one( occupant_man = OccupantTypes.filter_by_one(
occupant_code="MT-VPR", occupant_category_type="MT" occupant_code="MT-VPR", occupant_category_type="MT"
).data ).data
manager_living_space = BuildLivingSpace.filter_one( manager_living_space = BuildLivingSpace.filter_one(
BuildLivingSpace.build_parts_id==management_room.id, BuildLivingSpace.build_parts_id == management_room.id,
BuildLivingSpace.occupant_type==occupant_man.id, BuildLivingSpace.occupant_type == occupant_man.id,
*BuildLivingSpace.valid_record_args(BuildLivingSpace) *BuildLivingSpace.valid_record_args(BuildLivingSpace),
).data ).data
if not manager_living_space.data: if not manager_living_space.data:
raise HTTPException( raise HTTPException(
@ -322,12 +322,12 @@ class DecisionBookDecisionBookItemsCreateEventMethods(MethodToEvent):
) )
decision_book_person = BuildDecisionBookPerson.filter_one( decision_book_person = BuildDecisionBookPerson.filter_one(
BuildDecisionBookPerson.token==data.token, BuildDecisionBookPerson.token == data.token,
*BuildDecisionBookPerson.valid_record_args(BuildDecisionBookPerson) *BuildDecisionBookPerson.valid_record_args(BuildDecisionBookPerson),
).data ).data
decision_book = BuildDecisionBook.filter_one( decision_book = BuildDecisionBook.filter_one(
BuildDecisionBook.id==decision_book_person.build_decision_book_id, BuildDecisionBook.id == decision_book_person.build_decision_book_id,
*BuildDecisionBook.valid_record_args(BuildDecisionBook) *BuildDecisionBook.valid_record_args(BuildDecisionBook),
).data ).data
BuildDecisionBookItems.check_meeting_is_valid_to_start_add_attendance( BuildDecisionBookItems.check_meeting_is_valid_to_start_add_attendance(
decision_book=decision_book, decision_book=decision_book,

View File

@ -62,8 +62,8 @@ class DecisionBookPersonAddEventMethods(MethodToEvent):
) )
elif isinstance(token_dict, OccupantTokenObject): elif isinstance(token_dict, OccupantTokenObject):
decision_book = BuildDecisionBook.filter_one( decision_book = BuildDecisionBook.filter_one(
BuildDecisionBook.uu_id==data.build_decision_book_uu_id, BuildDecisionBook.uu_id == data.build_decision_book_uu_id,
*BuildDecisionBook.valid_record_args(BuildDecisionBook) *BuildDecisionBook.valid_record_args(BuildDecisionBook),
).data ).data
if not decision_book: if not decision_book:
raise HTTPException( raise HTTPException(
@ -281,7 +281,7 @@ class DecisionBookPersonAssignOccupantEventMethods(MethodToEvent):
build_parts_of_token = BuildParts.filter_all( build_parts_of_token = BuildParts.filter_all(
BuildParts.build_id == token_dict.selected_occupant.build_id, BuildParts.build_id == token_dict.selected_occupant.build_id,
*BuildParts.valid_record_args(BuildParts) *BuildParts.valid_record_args(BuildParts),
).data ).data
selected_living_space = BuildLivingSpace.filter_one( selected_living_space = BuildLivingSpace.filter_one(
BuildLivingSpace.uu_id == data.build_living_space_uu_id, BuildLivingSpace.uu_id == data.build_living_space_uu_id,

View File

@ -136,7 +136,8 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
# Get all the parts of the building that is occupant in token # Get all the parts of the building that is occupant in token
build_parts = BuildParts.filter_all( build_parts = BuildParts.filter_all(
BuildParts.build_id == occupant_building.id, *BuildParts.valid_record_args(BuildParts) BuildParts.build_id == occupant_building.id,
*BuildParts.valid_record_args(BuildParts),
) )
# Get all build living spaces that is found in building with distinct person id # Get all build living spaces that is found in building with distinct person id
@ -184,9 +185,10 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
# Check if the invitation is already created at database # Check if the invitation is already created at database
for build_living_spaces_user in build_living_spaces_people: for build_living_spaces_user in build_living_spaces_people:
if invite := BuildDecisionBookPerson.filter_one( if invite := BuildDecisionBookPerson.filter_one(
BuildDecisionBookPerson.invite_id==book_invitation.id, BuildDecisionBookPerson.invite_id == book_invitation.id,
BuildDecisionBookPerson.build_living_space_id==build_living_spaces_user.id, BuildDecisionBookPerson.build_living_space_id
*BuildDecisionBookPerson.valid_record_args(BuildDecisionBookPerson) == build_living_spaces_user.id,
*BuildDecisionBookPerson.valid_record_args(BuildDecisionBookPerson),
).data: ).data:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
@ -217,7 +219,7 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
manager_living_spaces = BuildLivingSpace.filter_all( manager_living_spaces = BuildLivingSpace.filter_all(
BuildLivingSpace.person_id == token_dict.person_id, BuildLivingSpace.person_id == token_dict.person_id,
*BuildLivingSpace.valid_record_args(BuildLivingSpace) *BuildLivingSpace.valid_record_args(BuildLivingSpace),
) )
manager_people = BuildDecisionBookPerson.filter_all( manager_people = BuildDecisionBookPerson.filter_all(
BuildDecisionBookPerson.invite_id == book_invitation.id, BuildDecisionBookPerson.invite_id == book_invitation.id,
@ -227,12 +229,14 @@ class BuildDecisionBookInvitationsCreateEventMethods(MethodToEvent):
for manager_living_space in manager_living_spaces.data for manager_living_space in manager_living_spaces.data
] ]
), ),
*BuildLivingSpace.valid_record_args(BuildLivingSpace) *BuildLivingSpace.valid_record_args(BuildLivingSpace),
) )
manager_people_occupants = BuildDecisionBookPersonOccupants.filter_all( manager_people_occupants = BuildDecisionBookPersonOccupants.filter_all(
BuildDecisionBookPersonOccupants.build_decision_book_person_id BuildDecisionBookPersonOccupants.build_decision_book_person_id
== manager_people.get(1).id, == manager_people.get(1).id,
*BuildDecisionBookPersonOccupants.valid_record_args(BuildDecisionBookPersonOccupants) *BuildDecisionBookPersonOccupants.valid_record_args(
BuildDecisionBookPersonOccupants
),
) )
manager_people_occupants.query.delete() manager_people_occupants.query.delete()
manager_people.query.delete() manager_people.query.delete()

View File

@ -66,7 +66,7 @@ class EventBindOccupantEventMethods(MethodToEvent):
events_to_add_to_occupant = Events.filter_all( events_to_add_to_occupant = Events.filter_all(
Events.uu_id.in_(list(data.event_uu_id_list)), Events.uu_id.in_(list(data.event_uu_id_list)),
*Events.valid_record_args(Events) *Events.valid_record_args(Events),
) )
if not events_to_add_to_occupant.data: if not events_to_add_to_occupant.data:
return JSONResponse( return JSONResponse(

View File

@ -38,15 +38,14 @@ class ServiceBindOccupantEventMethods(MethodToEvent):
living_space = BuildLivingSpace.filter_one( living_space = BuildLivingSpace.filter_one(
BuildLivingSpace.id == build_living_space_id, BuildLivingSpace.id == build_living_space_id,
*BuildLivingSpace.valid_record_args(BuildLivingSpace) *BuildLivingSpace.valid_record_args(BuildLivingSpace),
).data ).data
service = Services.filter_one( service = Services.filter_one(
Services.id == service_id, Services.id == service_id, *Services.valid_record_args(Services)
*Services.valid_record_args(Services)
).data ).data
add_events_list = Service2Events.filter_all( add_events_list = Service2Events.filter_all(
Service2Events.service_id == service.id, Service2Events.service_id == service.id,
*Service2Events.valid_record_args(Service2Events) *Service2Events.valid_record_args(Service2Events),
).data ).data
if not add_events_list: if not add_events_list:
raise Exception( raise Exception(
@ -106,7 +105,9 @@ class ServiceBindOccupantEventMethods(MethodToEvent):
status_code=status.HTTP_404_NOT_FOUND, status_code=status.HTTP_404_NOT_FOUND,
) )
occupant_occupant_type = OccupantTypes.filter_by_one(uu_id=data.occupant_uu_id).data occupant_occupant_type = OccupantTypes.filter_by_one(
uu_id=data.occupant_uu_id
).data
if not occupant_occupant_type: if not occupant_occupant_type:
return JSONResponse( return JSONResponse(
content={ content={
@ -142,7 +143,7 @@ class ServiceBindOccupantEventMethods(MethodToEvent):
BuildLivingSpace.build_parts_id == occupants_build_part.id, BuildLivingSpace.build_parts_id == occupants_build_part.id,
BuildLivingSpace.occupant_types_id == occupant_occupant_type.id, BuildLivingSpace.occupant_types_id == occupant_occupant_type.id,
BuildLivingSpace.person_id == token_dict.person_id, BuildLivingSpace.person_id == token_dict.person_id,
*BuildLivingSpace.valid_record_args(BuildLivingSpace) *BuildLivingSpace.valid_record_args(BuildLivingSpace),
).data ).data
if not living_space: if not living_space:
return JSONResponse( return JSONResponse(
@ -188,8 +189,12 @@ class ServiceBindEmployeeEventMethods(MethodToEvent):
def bind_services_employee(cls, service_id: int, employee_id: int): def bind_services_employee(cls, service_id: int, employee_id: int):
from sqlalchemy.dialects.postgresql import insert from sqlalchemy.dialects.postgresql import insert
employee = Employees.filter_by_one(id=employee_id, **Employees.valid_record_dict).data employee = Employees.filter_by_one(
service = Services.filter_by_one(id=service_id, **Services.valid_record_dict).data id=employee_id, **Employees.valid_record_dict
).data
service = Services.filter_by_one(
id=service_id, **Services.valid_record_dict
).data
service_events = Service2Events.filter_all( service_events = Service2Events.filter_all(
Service2Events.service_id == service.id, Service2Events.service_id == service.id,
*Service2Events.valid_record_args(Service2Events), *Service2Events.valid_record_args(Service2Events),
@ -220,6 +225,9 @@ class ServiceBindEmployeeEventMethods(MethodToEvent):
count_row = session_execute.rowcount count_row = session_execute.rowcount
print(f"{count_row} events are added to employee {employee.uu_id}") print(f"{count_row} events are added to employee {employee.uu_id}")
Services.save() Services.save()
for service_event in service_events:
service_event.is_confirmed = True
Service2Events.save()
@classmethod @classmethod
def bind_services_employee_super_user( def bind_services_employee_super_user(
@ -263,7 +271,7 @@ class ServiceBindEmployeeEventMethods(MethodToEvent):
service_events = Service2Events.filter_all( service_events = Service2Events.filter_all(
Service2Events.service_id == service.id, Service2Events.service_id == service.id,
*Service2Events.valid_record_args(Service2Events) *Service2Events.valid_record_args(Service2Events),
).data ).data
if not service_events: if not service_events:
raise HTTPException( raise HTTPException(

View File

@ -6,7 +6,7 @@ class AddEventFunctionality:
get_event_ids = Events.filter_all( get_event_ids = Events.filter_all(
Events.function_code.in_([event["function_code"] for event in events]), Events.function_code.in_([event["function_code"] for event in events]),
system=True system=True,
).data ).data
if get_event_ids: if get_event_ids:
return [(get_event.id, str(get_event.uu_id)) for get_event in get_event_ids] return [(get_event.id, str(get_event.uu_id)) for get_event in get_event_ids]

View File

@ -26,7 +26,7 @@ class ApplicationToken(BaseModel):
timezone: Optional[str] = "Europe/Istanbul" timezone: Optional[str] = "Europe/Istanbul"
user_type: int = UserType.occupant.value user_type: int = UserType.occupant.value
credentials: Credentials credentials: dict = {}
user_uu_id: str user_uu_id: str
user_id: int user_id: int

View File

@ -139,7 +139,6 @@ def wag_insert_budget_record(data):
similarity_result = parse_comment_with_name(data["iban"], data["process_comment"]) similarity_result = parse_comment_with_name(data["iban"], data["process_comment"])
build_iban = BuildIbans.find_one(iban=data["iban"]) build_iban = BuildIbans.find_one(iban=data["iban"])
if payload := InsertBudgetRecord(**data): if payload := InsertBudgetRecord(**data):
payload_dict = payload.model_dump(exclude_unset=True, exclude_none=True) payload_dict = payload.model_dump(exclude_unset=True, exclude_none=True)
decision_books = BuildDecisionBook.select_only( decision_books = BuildDecisionBook.select_only(

View File

@ -50,6 +50,7 @@ def save_access_token_to_redis(
Employees, Employees,
Staff, Staff,
) )
if not found_user: if not found_user:
raise HTTPException( raise HTTPException(
status_code=400, status_code=400,
@ -82,8 +83,9 @@ def save_access_token_to_redis(
) )
occupants_selection_dict = {} occupants_selection_dict = {}
for living_space in living_spaces: for living_space in living_spaces:
build_parts_selection = BuildParts.filter_active( build_parts_selection = BuildParts.filter_all(
BuildParts.id == living_space.build_parts_id BuildParts.id == living_space.build_parts_id,
*BuildParts.valid_record_args(BuildParts),
) )
if not build_parts_selection.data: if not build_parts_selection.data:
raise HTTPException( raise HTTPException(
@ -129,29 +131,30 @@ def save_access_token_to_redis(
available_occupants=new_occupants_selection_dict, available_occupants=new_occupants_selection_dict,
) )
list_employee = Employees.filter_active(Employees.people_id == found_user.person_id) list_employee = Employees.filter_all(
Employees.people_id == found_user.person_id,
*Employees.valid_record_args(Employees),
).data
companies_uu_id_list, companies_id_list = [], [] companies_uu_id_list, companies_id_list = [], []
duty_uu_id_list, duty_id_list = [], [] duty_uu_id_list, duty_id_list = [], []
for employee in list_employee.data: for employee in list_employee:
staff = Staff.filter_one( staff = Staff.filter_one(
Staff.id==employee.staff_id, Staff.id == employee.staff_id, *Staff.valid_record_args(Staff)
*Staff.valid_record_args(Staff)
).data ).data
if duties := Duties.filter_one( if duties := Duties.filter_one(
Duties.id == staff.duties_id, Duties.id == staff.duties_id, *Duties.valid_record_args(Duties)
*Duties.valid_record_args(Duties)
).data: ).data:
if duty_found := Duty.filter_by_one(id=duties.duties_id).data: if duty_found := Duty.filter_by_one(id=duties.duties_id).data:
duty_uu_id_list.append(str(duty_found.uu_id)) duty_uu_id_list.append(str(duty_found.uu_id))
duty_id_list.append(duty_found.id) duty_id_list.append(duty_found.id)
department = Departments.filter_one( department = Departments.filter_one(
Departments.id==duties.department_id, Departments.id == duties.department_id,
*Departments.valid_record_args(Departments), *Departments.valid_record_args(Departments),
) ).data
if company := Companies.filter_one( if company := Companies.filter_one(
Companies.id==department.company_id, Companies.id == department.company_id,
*Companies.valid_record_args(Companies), *Companies.valid_record_args(Companies),
).data: ).data:
companies_uu_id_list.append(str(company.uu_id)) companies_uu_id_list.append(str(company.uu_id))
companies_id_list.append(company.id) companies_id_list.append(company.id)

View File

@ -9,13 +9,14 @@ def parse_token_object_to_dict(request): # from requests import Request
if valid_token := get_object_via_access_key(request=request): if valid_token := get_object_via_access_key(request=request):
endpoint_name = str(request.url).replace(str(request.base_url), "/") endpoint_name = str(request.url).replace(str(request.base_url), "/")
endpoint_active = EndpointRestriction.filter_active( endpoint_active = EndpointRestriction.filter_one(
EndpointRestriction.endpoint_name.ilike(f"%{endpoint_name}%") EndpointRestriction.endpoint_name.ilike(f"%{endpoint_name}%"),
).data[0] *EndpointRestriction.valid_record_args(EndpointRestriction),
).data
if not endpoint_active: if not endpoint_active:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, status_code=status.HTTP_401_UNAUTHORIZED,
detail="This endpoint is not active for this user, please contact your responsible company for further information.", detail=f"This endpoint {endpoint_name} is not active for this user, please contact your responsible company for further information.",
) )
if valid_token.user_type == 1: if valid_token.user_type == 1:
@ -24,9 +25,10 @@ def parse_token_object_to_dict(request): # from requests import Request
status_code=status.HTTP_418_IM_A_TEAPOT, status_code=status.HTTP_418_IM_A_TEAPOT,
detail="Selected company is not found in the token object.", detail="Selected company is not found in the token object.",
) )
selected_event = Events.filter_active( selected_event = Events.filter_all(
Events.endpoint_id == endpoint_active.id, Events.endpoint_id == endpoint_active.id,
Events.id.in_(valid_token.selected_company.reachable_event_list_id), Events.id.in_(valid_token.selected_company.reachable_event_list_id),
*Events.valid_record_args(Events)
) )
if not selected_event.data: if not selected_event.data:
raise HTTPException( raise HTTPException(
@ -55,14 +57,15 @@ def parse_token_object_to_dict(request): # from requests import Request
status_code=status.HTTP_418_IM_A_TEAPOT, status_code=status.HTTP_418_IM_A_TEAPOT,
detail="Selected occupant is not found in the token object.", detail="Selected occupant is not found in the token object.",
) )
selected_event = Events.filter_active( selected_event = Events.filter_all(
Events.endpoint_id == endpoint_active.id, Events.endpoint_id == endpoint_active.id,
Events.id.in_(valid_token.selected_occupant.reachable_event_list_id), Events.id.in_(valid_token.selected_occupant.reachable_event_list_id),
Events.valid_record_args(Events),
) )
if not selected_event.data: if not selected_event.data:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, status_code=status.HTTP_401_UNAUTHORIZED,
detail="This endpoint requires event validation. Please contact your responsible company to use this event.", detail=f"This endpoint {endpoint_name} requires event validation. Please contact your responsible company to use this event.",
) )
selected_event = selected_event.data[0] selected_event = selected_event.data[0]
event_function_class = getattr(selected_event, "function_class", None) event_function_class = getattr(selected_event, "function_class", None)
@ -76,7 +79,7 @@ def parse_token_object_to_dict(request): # from requests import Request
if not active_function: if not active_function:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, status_code=status.HTTP_401_UNAUTHORIZED,
detail="This endpoint requires event validation. Please contact your responsible company to use this event.", detail=f"This endpoint {endpoint_name} requires event validation. Please contact your responsible company to use this event.",
) )
valid_token.available_event = active_function valid_token.available_event = active_function
return valid_token return valid_token

View File

@ -15,7 +15,7 @@ class InsertCompany(PydanticBaseModel):
company_tag: Optional[str] = None company_tag: Optional[str] = None
default_lang_type: Optional[str] = None default_lang_type: Optional[str] = None
default_money_type: Optional[str] = None default_money_type: Optional[str] = None
official_address_uu_id: Optional[int] = None official_address_uu_id: Optional[str] = None
# parent_uu_id: Optional[int] = None # parent_uu_id: Optional[int] = None
@ -27,7 +27,7 @@ class UpdateCompany(PydanticBaseModel):
company_tag: Optional[str] = None company_tag: Optional[str] = None
default_lang_type: Optional[str] = None default_lang_type: Optional[str] = None
default_money_type: Optional[str] = None default_money_type: Optional[str] = None
official_address_uu_id: Optional[int] = None official_address_uu_id: Optional[str] = None
class MatchCompany2Company(PydanticBaseModel): class MatchCompany2Company(PydanticBaseModel):

View File

@ -44,12 +44,13 @@ class AuthModule(PasswordModule):
@classmethod @classmethod
def check_user_exits(cls, access_key, domain): def check_user_exits(cls, access_key, domain):
found_user = cls.filter_one( from databases import Users
found_user = Users.query.filter(
or_( or_(
cls.email == str(access_key).lower(), Users.email == str(access_key).lower(),
cls.phone_number == str(access_key).replace(" ", ""), Users.phone_number == str(access_key).replace(" ", ""),
), ),
).data ).first()
if not found_user: if not found_user:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
@ -73,6 +74,7 @@ class AuthModule(PasswordModule):
from databases import ( from databases import (
UsersTokens, UsersTokens,
) )
if disconnect: if disconnect:
registered_tokens = UsersTokens.filter_all( registered_tokens = UsersTokens.filter_all(
UsersTokens.user_id == self.id, system=True UsersTokens.user_id == self.id, system=True
@ -88,19 +90,12 @@ class AuthModule(PasswordModule):
def check_password(self, password): def check_password(self, password):
main_domain = self.get_main_domain_and_other_domains(get_main_domain=True) main_domain = self.get_main_domain_and_other_domains(get_main_domain=True)
print('check_password', dict(
domain=main_domain,
id_=str(self.uu_id),
password_hashed=self.hash_password,
password=password,
))
if check_password := self.check_hashed_password( if check_password := self.check_hashed_password(
domain=main_domain, domain=main_domain,
id_=str(self.uu_id), id_=str(self.uu_id),
password_hashed=self.hash_password, password_hashed=self.hash_password,
password=password, password=password,
): ):
print('check_password', check_password)
return check_password return check_password
raise HTTPException( raise HTTPException(
status_code=401, status_code=401,
@ -120,6 +115,7 @@ class AuthModule(PasswordModule):
@staticmethod @staticmethod
def create_password(found_user, password, password_token=None): def create_password(found_user, password, password_token=None):
from databases import MongoQueryIdentity from databases import MongoQueryIdentity
if found_user.password_token: if found_user.password_token:
replace_day = 0 replace_day = 0
try: try:
@ -141,9 +137,9 @@ class AuthModule(PasswordModule):
) )
query_engine = MongoQueryIdentity(company_uuid=found_user.related_company) query_engine = MongoQueryIdentity(company_uuid=found_user.related_company)
domain_via_user = query_engine.get_domain_via_user(user_uu_id=str(found_user.uu_id))[ domain_via_user = query_engine.get_domain_via_user(
"main_domain" user_uu_id=str(found_user.uu_id)
] )["main_domain"]
new_password_dict = { new_password_dict = {
"password": found_user.create_hashed_password( "password": found_user.create_hashed_password(
domain=domain_via_user, id_=str(found_user.uu_id), password=password domain=domain_via_user, id_=str(found_user.uu_id), password=password
@ -167,18 +163,21 @@ class AuthModule(PasswordModule):
@staticmethod @staticmethod
def reset_password_token(found_user): def reset_password_token(found_user):
found_user.password_expiry_begins = str(system_arrow.now()) found_user.password_expiry_begins = str(system_arrow.now())
found_user.password_token = found_user.generate_token(127) found_user.password_token = found_user.generate_token(
Auth.REFRESHER_TOKEN_LENGTH
)
found_user.save() found_user.save()
def generate_refresher_token(self, domain: str, remember_me=False): def generate_refresher_token(self, domain: str, remember_me=False):
from databases import ( from databases import (
UsersTokens, UsersTokens,
) )
if remember_me: if remember_me:
refresh_token = self.generate_token(Auth.REFRESHER_TOKEN_LENGTH) refresh_token = self.generate_token(Auth.REFRESHER_TOKEN_LENGTH)
if already_token := UsersTokens.find_one( if already_token := UsersTokens.filter_by_one(
user_id=self.id, token_type="RememberMe", domain=domain system=True, user_id=self.id, token_type="RememberMe", domain=domain
): ).data:
already_token.update(token=refresh_token) already_token.update(token=refresh_token)
already_token.expires_at = system_arrow.shift(days=3) already_token.expires_at = system_arrow.shift(days=3)
already_token.save() already_token.save()
@ -194,16 +193,13 @@ class AuthModule(PasswordModule):
return None return None
def remainder_day(self): def remainder_day(self):
join_list = [
_ for _ in str(self.password_expires_day).split(",")[0] if _.isdigit()
]
return float( return float(
timedelta( timedelta(
days=int( days=int(
"".join( "".join(join_list)
[
_
for _ in str(self.password_expires_day).split(",")[0]
if _.isdigit()
]
)
) )
).seconds ).seconds
) )
@ -218,13 +214,13 @@ class UserLoginModule(AuthModule):
People, People,
MongoQueryIdentity, MongoQueryIdentity,
) )
found_user = Users.check_user_exits( found_user = Users.check_user_exits(
access_key=data.access_key, domain=data.domain access_key=data.access_key, domain=data.domain
) )
access_token = found_user.generate_access_token() access_token = found_user.generate_access_token()
query_engine = MongoQueryIdentity(company_uuid=found_user.related_company) query_engine = MongoQueryIdentity(company_uuid=found_user.related_company)
if found_user.check_password(password=data.password): if found_user.check_password(password=data.password):
print('before access_object_to_redis')
access_object_to_redis = save_access_token_to_redis( access_object_to_redis = save_access_token_to_redis(
request=request, request=request,
found_user=found_user, found_user=found_user,
@ -270,7 +266,9 @@ class UserLoginModule(AuthModule):
no_address_validates = mongo_db.mongo_engine.get_all()[0] == 0 no_address_validates = mongo_db.mongo_engine.get_all()[0] == 0
record_id = uuid.uuid4().__str__() record_id = uuid.uuid4().__str__()
notice_link = ApiStatic.blacklist_login(record_id=record_id) notice_link = ApiStatic.blacklist_login(record_id=record_id)
found_people = People.find_one(id=found_user.person_id) found_people = People.filter_one(
People.id == found_user.person_id, *People.valid_record_args(People)
).data
access_via_user = query_engine.update_access_history_via_user( access_via_user = query_engine.update_access_history_via_user(
AccessHistoryViaUser( AccessHistoryViaUser(
**{ **{

View File

@ -33,7 +33,6 @@ class MongoQueryIdentity:
table_name=self.mongo_collection_name, database_name="mongo_database" table_name=self.mongo_collection_name, database_name="mongo_database"
) )
def create_domain_via_user(self, payload: DomainViaUser): def create_domain_via_user(self, payload: DomainViaUser):
self.use_collection("Domain") self.use_collection("Domain")
return self.mongo_engine.insert( return self.mongo_engine.insert(

View File

@ -45,9 +45,7 @@ class AccountBooks(CrudCollection):
# ) # )
__table_args__ = ( __table_args__ = (
Index( Index("account_companies_book_ndx_00", company_id, "expiry_starts"),
"account_companies_book_ndx_00", company_id, "expiry_starts"
),
{"comment": "Account Book Information"}, {"comment": "Account Book Information"},
) )

View File

@ -478,6 +478,7 @@ class BuildParts(CrudCollection):
@classmethod @classmethod
def create_action(cls, data: InsertBuildParts, token): def create_action(cls, data: InsertBuildParts, token):
from databases import ApiEnumDropdown from databases import ApiEnumDropdown
data_dict = data.dump() data_dict = data.dump()
build_from_duty = Build.select_action( build_from_duty = Build.select_action(
employee_id=token.selected_company.employee_id, employee_id=token.selected_company.employee_id,

View File

@ -28,7 +28,6 @@ from api_validations.validations_request import (
from databases.sql_models.core_mixin import CrudCollection from databases.sql_models.core_mixin import CrudCollection
class BuildDecisionBook(CrudCollection): class BuildDecisionBook(CrudCollection):
""" """
Builds class based on declarative_base and BaseMixin via session Builds class based on declarative_base and BaseMixin via session
@ -99,6 +98,7 @@ class BuildDecisionBook(CrudCollection):
from databases import ( from databases import (
Build, Build,
) )
related_build = Build.find_one(id=cls.build_id) related_build = Build.find_one(id=cls.build_id)
related_date = system_arrow.get(related_build.build_date) related_date = system_arrow.get(related_build.build_date)
date_processed = related_date.replace( date_processed = related_date.replace(
@ -119,7 +119,7 @@ class BuildDecisionBook(CrudCollection):
build_id=str(related_build.uu_id), build_id=str(related_build.uu_id),
build_name=related_build.build_name, build_name=related_build.build_name,
decision_type="RBM", decision_type="RBM",
) ),
) )
return book return book
return return
@ -130,13 +130,14 @@ class BuildDecisionBook(CrudCollection):
Build, Build,
Companies, Companies,
) )
related_companies = Companies.select_action(duty_id_list=[int(duty_id)]) related_companies = Companies.select_action(duty_id_list=[int(duty_id)])
related_companies_ids = list( related_companies_ids = list(
related_.id for related_ in related_companies.all() related_.id for related_ in related_companies.all()
) )
related_building = Build.filter_all( related_building = Build.filter_all(
Build.company_id.in_(related_companies_ids) Build.company_id.in_(related_companies_ids)
*Build.valid_record_args(Build), * Build.valid_record_args(Build),
) )
related_building_ids = list(related_.id for related_ in related_building.data) related_building_ids = list(related_.id for related_ in related_building.data)
return cls.filter_all(cls.build_id.in_(related_building_ids)).query return cls.filter_all(cls.build_id.in_(related_building_ids)).query
@ -147,6 +148,7 @@ class BuildDecisionBook(CrudCollection):
Build, Build,
Companies, Companies,
) )
data_dict = data.model_dump() data_dict = data.model_dump()
if building := Build.find_one(uu_id=data.build_uu_id): if building := Build.find_one(uu_id=data.build_uu_id):
data_dict["build_id"] = building.id data_dict["build_id"] = building.id
@ -217,6 +219,7 @@ class BuildDecisionBook(CrudCollection):
from databases import ( from databases import (
BuildIbans, BuildIbans,
) )
if all( if all(
[True if letter in str(bank_date) else False for letter in ["-", " ", ":"]] [True if letter in str(bank_date) else False for letter in ["-", " ", ":"]]
): ):
@ -493,7 +496,9 @@ class BuildDecisionBookPerson(CrudCollection):
def get_occupant_types(self): def get_occupant_types(self):
if occupants := BuildDecisionBookPersonOccupants.filter_all( if occupants := BuildDecisionBookPersonOccupants.filter_all(
BuildDecisionBookPersonOccupants.build_decision_book_person_id == self.id, BuildDecisionBookPersonOccupants.build_decision_book_person_id == self.id,
*BuildDecisionBookPersonOccupants.valid_record_args(BuildDecisionBookPersonOccupants) *BuildDecisionBookPersonOccupants.valid_record_args(
BuildDecisionBookPersonOccupants
),
).data: ).data:
return occupants return occupants
return return
@ -606,6 +611,7 @@ class BuildDecisionBookItems(CrudCollection):
Build, Build,
Companies, Companies,
) )
related_companies = Companies.select_action(duty_id=duty_id) related_companies = Companies.select_action(duty_id=duty_id)
related_companies_ids = list( related_companies_ids = list(
related_.id for related_ in related_companies.all() related_.id for related_ in related_companies.all()
@ -651,6 +657,7 @@ class BuildDecisionBookItems(CrudCollection):
People, People,
OccupantTypes, OccupantTypes,
) )
active_invite = ( active_invite = (
BuildDecisionBookInvitations.check_invites_are_ready_for_meeting( BuildDecisionBookInvitations.check_invites_are_ready_for_meeting(
selected_decision_book=decision_book, selected_decision_book=decision_book,
@ -1059,18 +1066,18 @@ class BuildDecisionBookProjects(CrudCollection):
Build, Build,
Companies, Companies,
) )
related_companies = Companies.select_action(duty_id_list=[duty_id]) related_companies = Companies.select_action(duty_id_list=[duty_id])
related_companies_ids = list( related_companies_ids = list(
related_.id for related_ in related_companies.all() related_.id for related_ in related_companies.all()
) )
related_building = Build.filter_all( related_building = Build.filter_all(
Build.company_id.in_(related_companies_ids), Build.company_id.in_(related_companies_ids), *Build.valid_record_args(Build)
*Build.valid_record_args(Build)
) )
related_building_ids = list(related_.id for related_ in related_building.data) related_building_ids = list(related_.id for related_ in related_building.data)
related_decision_books = BuildDecisionBook.filter_all( related_decision_books = BuildDecisionBook.filter_all(
BuildDecisionBook.build_id.in_(related_building_ids), BuildDecisionBook.build_id.in_(related_building_ids),
*BuildDecisionBook.valid_record_args(BuildDecisionBook) *BuildDecisionBook.valid_record_args(BuildDecisionBook),
).data ).data
related_decision_books_ids = list( related_decision_books_ids = list(
related_.id for related_ in related_decision_books related_.id for related_ in related_decision_books
@ -1079,14 +1086,14 @@ class BuildDecisionBookProjects(CrudCollection):
BuildDecisionBookItems.build_decision_book_id.in_( BuildDecisionBookItems.build_decision_book_id.in_(
related_decision_books_ids related_decision_books_ids
), ),
*BuildDecisionBookItems.valid_record_args(BuildDecisionBookItems) *BuildDecisionBookItems.valid_record_args(BuildDecisionBookItems),
).data ).data
related_decision_books_items_ids = list( related_decision_books_items_ids = list(
related_.id for related_ in related_decision_books_items related_.id for related_ in related_decision_books_items
) )
return cls.filter_all( return cls.filter_all(
cls.build_decision_book_item_id.in_(related_decision_books_items_ids), cls.build_decision_book_item_id.in_(related_decision_books_items_ids),
*cls.valid_record_args(cls) *cls.valid_record_args(cls),
).query ).query
@classmethod @classmethod
@ -1095,11 +1102,14 @@ class BuildDecisionBookProjects(CrudCollection):
People, People,
Companies, Companies,
) )
data_dict = data.dump() data_dict = data.dump()
BuildDecisionBookItems.pre_query = BuildDecisionBookItems.select_action( BuildDecisionBookItems.pre_query = BuildDecisionBookItems.select_action(
duty_id=token.duty_list["duty_id"] duty_id=token.duty_list["duty_id"]
) )
People.pre_query = People.select_action(duty_id_list=[token.duty_list["duty_id"]]) People.pre_query = People.select_action(
duty_id_list=[token.duty_list["duty_id"]]
)
decision_book_project_item = BuildDecisionBookItems.find_one_or_abort( decision_book_project_item = BuildDecisionBookItems.find_one_or_abort(
uu_id=data_dict.get("build_decision_book_item_uu_id") uu_id=data_dict.get("build_decision_book_item_uu_id")
) )

View File

@ -63,12 +63,19 @@ class RelationshipDutyCompany(CrudCollection):
from databases import ( from databases import (
Duties, Duties,
) )
token_duties_id, token_company_id = token.get("duty_id"), token.get( token_duties_id, token_company_id = token.get("duty_id"), token.get(
"company_id" "company_id"
) )
send_duties, list_match_company_id = Duties.find_one(uu_id=data.duty_uu_id), [] list_match_company_id = []
send_user_duties = Duties.find_one( send_duties = Duties.filter_one(
duties_id=send_duties.id, company_id=token_duties_id Duties.uu_id==data.duty_uu_id,
*Duties.valid_record_args(Duties),
)
send_user_duties = Duties.filter_one(
Duties.duties_id==send_duties.id,
Duties.company_id==token_duties_id,
*Duties.valid_record_args(Duties),
) )
if not send_user_duties: if not send_user_duties:
raise Exception( raise Exception(
@ -76,11 +83,15 @@ class RelationshipDutyCompany(CrudCollection):
) )
for company_uu_id in list(data.match_company_uu_id): for company_uu_id in list(data.match_company_uu_id):
company = Companies.find_one(uu_id=company_uu_id) company = Companies.filter_one(
bulk_company = RelationshipDutyCompany.find_one( Companies.uu_id==company_uu_id,
owner_id=token_company_id, *Companies.valid_record_args(Companies),
relationship_type="Bulk", )
member_id=company.id, bulk_company = RelationshipDutyCompany.filter_one(
RelationshipDutyCompany.owner_id==token_company_id,
RelationshipDutyCompany.relationship_type=="Bulk",
RelationshipDutyCompany.member_id==company.id,
*RelationshipDutyCompany.valid_record_args(RelationshipDutyCompany),
) )
if not bulk_company: if not bulk_company:
raise Exception( raise Exception(
@ -104,12 +115,19 @@ class RelationshipDutyCompany(CrudCollection):
from databases import ( from databases import (
Duties, Duties,
) )
token_duties_id, token_company_id = token.get("duty_id"), token.get( token_duties_id, token_company_id = token.get("duty_id"), token.get(
"company_id" "company_id"
) )
send_duties, list_match_company_id = Duties.find_one(uu_id=data.duty_uu_id), [] list_match_company_id = []
send_user_duties = Duties.find_one( send_duties = Duties.filter_one(
duties_id=send_duties.id, company_id=token_duties_id Duties.uu_id==data.duty_uu_id,
*Duties.valid_record_args(Duties),
)
send_user_duties = Duties.filter_one(
Duties.duties_id==send_duties.id,
Duties.company_id==token_duties_id,
*Duties.valid_record_args(Duties),
) )
if not send_user_duties: if not send_user_duties:
raise Exception( raise Exception(
@ -117,11 +135,15 @@ class RelationshipDutyCompany(CrudCollection):
) )
for company_uu_id in list(data.match_company_uu_id): for company_uu_id in list(data.match_company_uu_id):
company = Companies.find_one(uu_id=company_uu_id) company = Companies.filter_one(
bulk_company = RelationshipDutyCompany.find_one( Companies.uu_id==company_uu_id,
owner_id=token_company_id, *Companies.valid_record_args(Companies),
relationship_type="Bulk", )
member_id=company.id, bulk_company = RelationshipDutyCompany.filter_one(
RelationshipDutyCompany.owner_id==token_company_id,
RelationshipDutyCompany.relationship_type=="Bulk",
RelationshipDutyCompany.member_id==company.id,
*RelationshipDutyCompany.valid_record_args(RelationshipDutyCompany),
) )
if not bulk_company: if not bulk_company:
raise Exception( raise Exception(
@ -194,7 +216,9 @@ class Companies(CrudCollection, SelectAction):
parent_id = mapped_column(Integer, nullable=True) parent_id = mapped_column(Integer, nullable=True)
workplace_no: Mapped[str] = mapped_column(String, nullable=True) workplace_no: Mapped[str] = mapped_column(String, nullable=True)
official_address_id: Mapped[int] = mapped_column(ForeignKey("addresses.id"), nullable=True) official_address_id: Mapped[int] = mapped_column(
ForeignKey("addresses.id"), nullable=True
)
official_address_uu_id: Mapped[str] = mapped_column( official_address_uu_id: Mapped[str] = mapped_column(
String, nullable=True, comment="Official Address UUID" String, nullable=True, comment="Official Address UUID"
) )
@ -222,57 +246,45 @@ class Companies(CrudCollection, SelectAction):
from databases import Addresses, Duties from databases import Addresses, Duties
data_dict = data.model_dump() data_dict = data.model_dump()
if cls.filter_one(cls.tax_no == str(data.tax_no).strip()): if cls.filter_one(cls.tax_no == str(data.tax_no).strip(), system=True).data:
raise Exception( raise HTTPException(
"Company already exists. Please ask supervisor to make company visible for your duty." status_code=400,
detail="Company already exists. Please ask supervisor to make company visible for your duty."
) )
official_address = Addresses.filter_one( official_address = Addresses.filter_one(
Addresses.uu_id == data.official_address_uu_id Addresses.uu_id == data.official_address_uu_id,
) *Addresses.valid_record_args(Addresses),
if not official_address: ).data
raise HTTPException( # if not official_address:
status_code=400, # raise HTTPException(
detail="Official address is not found. Please check address uuid and try again.", # status_code=400,
) # detail="Official address is not found. Please check address uuid and try again.",
# )
bulk_duties = Duties.get_bulk_duties_of_a_company( bulk_duties = Duties.get_bulk_duties_of_a_company(
company_id=token.selected_company.company_id company_id=token.selected_company.company_id
) )
if official_address:
data_dict["official_address_id"] = official_address.id
data_dict["official_address_uu_id"] = str(official_address.uu_id)
data_dict["parent_id"] = token.selected_company.company_id data_dict["parent_id"] = token.selected_company.company_id
data_dict["official_address_id"] = official_address.id
data_dict["official_address_uu_id"] = str(official_address.uu_id)
data_dict["top_responsible_company_id"] = token.selected_company.company_id data_dict["top_responsible_company_id"] = token.selected_company.company_id
data_dict["top_responsible_company_uu_id"] = ( data_dict["top_responsible_company_uu_id"] = (
token.selected_company.company_uu_id token.selected_company.company_uu_id
) )
company_created = cls.find_or_create(**data_dict) company_created = cls.find_or_create(**data_dict)
if not company_created.is_found: RelationshipDutyCompany.find_or_create(
RelationshipDutyCompany.find_or_create( owner_id=token.selected_company.company_id,
owner_id=token.selected_company.company_id, duties_id=bulk_duties.id,
duties_id=bulk_duties.id, member_id=company_created.id,
member_id=company_created.id, parent_id=company_created.parent_id,
parent_id=company_created.parent_id, child_count=0,
relationship_type="Bulk", relationship_type="Bulk",
show_only=False, show_only=False,
) )
if (
not str(token.get("priority_code")) == "78"
): # Company based configuration will be applied
user_duties = Duties.find_one(
duties_id=token.selected_company.duty_id,
company_id=token.selected_company.company_id,
)
RelationshipDutyCompany.find_or_create(
owner_id=token.selected_company.company_id,
duties_id=user_duties.id,
member_id=company_created.id,
parent_id=company_created.parent_id,
relationship_type="Commercial",
show_only=False,
)
return company_created return company_created
@classmethod @classmethod
@ -280,11 +292,15 @@ class Companies(CrudCollection, SelectAction):
from databases import ( from databases import (
Addresses, Addresses,
) )
data_dict = data.excluded_dump() data_dict = data.excluded_dump()
duty_id = token.get("duty_id") duty_id = token.get("duty_id")
company_id = token.get("company_id") company_id = token.get("company_id")
if data.official_address_uu_id: if data.official_address_uu_id:
official_address = Addresses.find_one(uu_id=data.official_address_uu_id) official_address = Addresses.filter_one(
Addresses.uu_id==data.official_address_uu_id,
*Addresses.valid_record_args(Addresses),
).data
data_dict["official_address_id"] = official_address.id data_dict["official_address_id"] = official_address.id
del data_dict["official_address_uu_id"], data_dict["company_uu_id"] del data_dict["official_address_uu_id"], data_dict["company_uu_id"]
company_to_update = cls.select_action( company_to_update = cls.select_action(
@ -558,4 +574,3 @@ class Companies(CrudCollection, SelectAction):
# "default_money_type": self.default_money_type, # "default_money_type": self.default_money_type,
# "official_address_id": self.official_address_id, # "official_address_id": self.official_address_id,
# } # }

View File

@ -178,12 +178,12 @@ class Duties(CrudCollection):
list_of_created.append(duties_created_at) list_of_created.append(duties_created_at)
return list_of_created return list_of_created
@classmethod @classmethod
def get_bulk_duties_of_a_company(cls, company_id): def get_bulk_duties_of_a_company(cls, company_id):
if bulk_duties := Duties.find_one( duties_id = Duty.filter_by_one(system=True, duty_code="BULK").data
duties_id=Duty.find_one(duty_code="BULK").id, company_id=company_id if bulk_duties := Duties.filter_by_one(
): duties_id=getattr(duties_id,'id', None), company_id=company_id, **Duties.valid_record_dict
).data:
return bulk_duties return bulk_duties
raise Exception("Bulk Duty not found. Please contact with supervisor.") raise Exception("Bulk Duty not found. Please contact with supervisor.")

View File

@ -90,9 +90,7 @@ class CrudMixin(Base, SmartQueryMixin, SessionMixin, FilterAttributes):
) )
@classmethod @classmethod
def set_user_define_properties( def set_user_define_properties(cls, token):
cls, token
):
cls.creds = token.credentials cls.creds = token.credentials
cls.client_arrow = DateTimeLocal(is_client=True, timezone=token.timezone) cls.client_arrow = DateTimeLocal(is_client=True, timezone=token.timezone)
@ -126,39 +124,39 @@ class CrudMixin(Base, SmartQueryMixin, SessionMixin, FilterAttributes):
is_primary, value_type = key in cls.primary_keys, type(val) is_primary, value_type = key in cls.primary_keys, type(val)
row_attr = bool(getattr(getattr(cls, key), "foreign_keys", None)) row_attr = bool(getattr(getattr(cls, key), "foreign_keys", None))
if is_primary or row_attr and key_ == Mapped[int]: if is_primary or row_attr and key_ == Mapped[int]:
return None return False, None
if key_: if key_:
if key_ == Mapped[int]: if key_ == Mapped[int]:
return int(val) if val else None return True, int(val) if val is not None else None
elif key_ == Mapped[bool]: elif key_ == Mapped[bool]:
return bool(val) if val else None return True, bool(val) if val is not None else None
elif key_ == Mapped[float] or key_ == Mapped[NUMERIC]: elif key_ == Mapped[float] or key_ == Mapped[NUMERIC]:
return round(float(val), 3) if val else None return True, round(float(val), 3) if val is not None else None
elif key_ == Mapped[int]: elif key_ == Mapped[int]:
return int(val) if val else None return True, int(val) if val is not None else None
elif key_ == Mapped[TIMESTAMP]: elif key_ == Mapped[TIMESTAMP]:
formatted_date = client_arrow.get(str(val)).format( formatted_date = client_arrow.get(str(val)).format(
"DD-MM-YYYY HH:mm:ss" "DD-MM-YYYY HH:mm:ss"
) )
return str(formatted_date) if val else None return True, str(formatted_date) if val is not None else None
else: else:
if isinstance(val, datetime.datetime): if isinstance(val, datetime.datetime):
formatted_date = client_arrow.get(str(val)).format( formatted_date = client_arrow.get(str(val)).format(
"DD-MM-YYYY HH:mm:ss" "DD-MM-YYYY HH:mm:ss"
) )
return str(formatted_date) if val else None return True, str(formatted_date) if val is not None else None
elif isinstance(value_type, bool): elif isinstance(value_type, bool):
return bool(val) if val else None return True, bool(val) if val is not None else None
elif isinstance(value_type, float) or isinstance(value_type, Decimal): elif isinstance(value_type, float) or isinstance(value_type, Decimal):
return round(float(val), 3) if val else None return True, round(float(val), 3) if val is not None else None
elif isinstance(value_type, int): elif isinstance(value_type, int):
return int(val) if val else None return True, int(val) if val is not None else None
elif isinstance(value_type, str): elif isinstance(value_type, str):
return str(val) if val else None return True, str(val) if val is not None else None
elif isinstance(value_type, type(None)): elif isinstance(value_type, type(None)):
return None return True, None
return False, None
return str(val) if val else None
@classmethod @classmethod
def find_or_create(cls, **kwargs): def find_or_create(cls, **kwargs):
@ -198,9 +196,11 @@ class CrudMixin(Base, SmartQueryMixin, SessionMixin, FilterAttributes):
created_record = cls() created_record = cls()
for key, value in check_kwargs.items(): for key, value in check_kwargs.items():
setattr(created_record, key, value) setattr(created_record, key, value)
if getattr(cls.creds, 'person_id', None) and getattr(cls.creds, 'person_name', None): if getattr(cls.creds, "person_id", None) and getattr(
cls.created_by_id = cls.creds.person_id cls.creds, "person_name", None
cls.created_by = cls.creds.person_name ):
cls.created_by_id = cls.creds.get('person_id', "Unknown")
cls.created_by = cls.creds.get('person_name', "Unknown")
created_record.flush() created_record.flush()
return created_record return created_record
@ -220,13 +220,17 @@ class CrudMixin(Base, SmartQueryMixin, SessionMixin, FilterAttributes):
setattr(self, key, value) setattr(self, key, value)
if is_confirmed_argument: if is_confirmed_argument:
if getattr(self.creds, 'person_id', None) and getattr(self.creds, 'person_name', None): if getattr(self.creds, "person_id", None) and getattr(
self.confirmed_by_id = self.creds.person_id self.creds, "person_name", None
self.confirmed_by = self.creds.person_name ):
self.confirmed_by_id = self.creds.get('person_id', "Unknown")
self.confirmed_by = self.creds.get('person_name', "Unknown")
else: else:
if getattr(self.creds, 'person_id', None) and getattr(self.creds, 'person_name', None): if getattr(self.creds, "person_id", None) and getattr(
self.updated_by_id = self.creds.person_id self.creds, "person_name", None
self.updated_by = self.creds.person_name ):
self.updated_by_id = self.creds.get('person_id', "Unknown")
self.updated_by = self.creds.get('person_id', "Unknown")
self.flush() self.flush()
return self return self
@ -244,8 +248,8 @@ class CrudMixin(Base, SmartQueryMixin, SessionMixin, FilterAttributes):
columns_include_list.extend(["uu_id", "active"]) columns_include_list.extend(["uu_id", "active"])
for key in list(columns_include_list): for key in list(columns_include_list):
val = getattr(self, key) val = getattr(self, key)
value_of_database = self.iterate_over_variables(val, key) correct, value_of_database = self.iterate_over_variables(val, key)
if value_of_database is not None: if correct:
return_dict[key] = value_of_database return_dict[key] = value_of_database
elif exclude: elif exclude:
exclude.extend( exclude.extend(
@ -261,18 +265,19 @@ class CrudMixin(Base, SmartQueryMixin, SessionMixin, FilterAttributes):
columns_excluded_list = set(self.columns).difference(set(exclude)) columns_excluded_list = set(self.columns).difference(set(exclude))
for key in list(columns_excluded_list): for key in list(columns_excluded_list):
val = getattr(self, key) val = getattr(self, key)
value_of_database = self.iterate_over_variables(val, key) correct, value_of_database = self.iterate_over_variables(val, key)
if value_of_database is not None: if correct:
return_dict[key] = value_of_database return_dict[key] = value_of_database
else: else:
exclude_list = ( exclude_list = (
self.__exclude__fields__ or [] + self.__system_default_model__ self.__exclude__fields__ or [] + self.__system_default_model__
) )
columns_list = list(set(self.columns).difference(set(exclude_list))) columns_list = list(set(self.columns).difference(set(exclude_list)))
columns_list = [columns for columns in columns_list if str(columns)[-2:] != "id" and 'uu_id' not in str(columns)]
for key in list(columns_list): for key in list(columns_list):
val = getattr(self, key) val = getattr(self, key)
value_of_database = self.iterate_over_variables(val, key) correct, value_of_database = self.iterate_over_variables(val, key)
if value_of_database is not None: if correct:
return_dict[key] = value_of_database return_dict[key] = value_of_database
# all_arguments = [ # all_arguments = [

View File

@ -69,8 +69,7 @@ class Modules(CrudCollection):
def retrieve_services(self): def retrieve_services(self):
services = Services.filter_all( services = Services.filter_all(
Services.module_id == self.id, Services.module_id == self.id, *Services.valid_record_args(Services)
*Services.valid_record_args(Services)
).data ).data
if not services: if not services:
self.raise_http_exception( self.raise_http_exception(
@ -151,8 +150,7 @@ class Event2Employee(CrudCollection):
) )
active_events_id = [event.event_id for event in active_events.data] active_events_id = [event.event_id for event in active_events.data]
active_events = Events.filter_all( active_events = Events.filter_all(
Events.id.in_(active_events_id), Events.id.in_(active_events_id), *Events.valid_record_args(Events)
*Events.valid_record_args(Events)
) )
active_events_uu_id = [str(event.uu_id) for event in active_events.data] active_events_uu_id = [str(event.uu_id) for event in active_events.data]
return active_events_id, active_events_uu_id return active_events_id, active_events_uu_id

View File

@ -37,7 +37,7 @@ class UsersTokens(CrudCollection):
token: Mapped[str] = mapped_column(String, server_default="") token: Mapped[str] = mapped_column(String, server_default="")
domain: Mapped[str] = mapped_column(String, server_default="") domain: Mapped[str] = mapped_column(String, server_default="")
expires_at = mapped_column( expires_at = mapped_column(
TIMESTAMP, default=str(system_arrow.shift(date=system_arrow.now(),days=3)) TIMESTAMP, default=str(system_arrow.shift(date=system_arrow.now(), days=3))
) )
# users = relationship("Users", back_populates="tokens", foreign_keys=[user_id]) # users = relationship("Users", back_populates="tokens", foreign_keys=[user_id])
@ -162,65 +162,21 @@ class Users(CrudCollection, UserLoginModule, SelectAction):
return created_user return created_user
@classmethod @classmethod
def created_creds(cls, create_creds: bool = True): def credentials(cls):
person_object = People.find_one(id=cls.person_id) person_object = People.filter_by_one(system=True, id=cls.person_id).data
if create_creds: if not person_object:
return { raise HTTPException(
"created_by_id": person_object.id, status_code=401,
"created_by": str(person_object.firstname) detail="Person not found. Please contact the admin.",
+ " " )
+ str(person_object.surname),
}
return { return {
"updated_by_id": person_object.id, "person_id": person_object.id,
"updated_by": str(person_object.firstname) "person_uu_id": str(person_object.uu_id),
+ " "
+ str(person_object.surname),
} }
#
# def prepare_employee_token_object(self, selected_duty_uu_id):
# from database_sql_models import (
# Companies,
# Employees,
# Duties,
# Departments,
# )
# found_person = People.find_one(id=self.person_id)
# found_employee = Employees.find_one(people_id=found_person.id)
# found_duty = Duties.find_one(uu_id=selected_duty_uu_id)
# found_department = Departments.find_one(id=found_duty.department_id)
# found_company = Companies.find_one(id=found_department.company_id)
# return {
# "people": {
# "people_id": found_person.id,
# "people_uu_id": found_person.uu_id.__str__(),
# },
# "user": {
# "user_id": self.id,
# "user_uu_id": self.uu_id.__str__(),
# },
# "duty": {
# "duty_id": found_duty.id,
# "duty_uu_id": found_duty.uu_id.__str__()
# },
# "employee": {
# "employee_id": found_employee.id,
# "employee_uu_id": found_employee.uu_id.__str__(),
# "people_id": found_employee.people_id,
# },
# "department": {
# "department_id": found_department.id,
# "department_uu_id": found_department.uu_id.__str__(),
# },
# "company": {
# "company_id": found_company.id,
# "company_uu_id": found_company.uu_id.__str__()
# },
# }
def get_employee_and_duty_details(self): def get_employee_and_duty_details(self):
from databases import Employees, Duties from databases import Employees, Duties
found_person = People.find_one(id=self.person_id) found_person = People.find_one(id=self.person_id)
found_employees = Employees.filter_by_active( found_employees = Employees.filter_by_active(
people_id=found_person.id, is_confirmed=True people_id=found_person.id, is_confirmed=True
@ -383,6 +339,7 @@ class People(CrudCollection, SelectAction):
@classmethod @classmethod
def create_action(cls, data: InsertPerson, token): def create_action(cls, data: InsertPerson, token):
from databases import Employees, Duties from databases import Employees, Duties
token_duties_id, token_company_id = ( token_duties_id, token_company_id = (
token.selected_company.duty_id, token.selected_company.duty_id,
token.selected_company.company_id, token.selected_company.company_id,
@ -498,7 +455,9 @@ class Addresses(CrudCollection):
post_code_list = RelationshipEmployee2PostCode.filter_all( post_code_list = RelationshipEmployee2PostCode.filter_all(
RelationshipEmployee2PostCode.employee_id RelationshipEmployee2PostCode.employee_id
== token_dict.selected_company.employee_id, == token_dict.selected_company.employee_id,
*RelationshipEmployee2PostCode.valid_record_args(RelationshipEmployee2PostCode) *RelationshipEmployee2PostCode.valid_record_args(
RelationshipEmployee2PostCode
),
).data ).data
post_code_id_list = [post_code.member_id for post_code in post_code_list] post_code_id_list = [post_code.member_id for post_code in post_code_list]
if not post_code_id_list: if not post_code_id_list:

View File

@ -1,4 +1,4 @@
from sqlalchemy import SQLColumnExpression from sqlalchemy import BinaryExpression
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from api_validations.validations_request import ListOptions from api_validations.validations_request import ListOptions
@ -94,10 +94,15 @@ class FilterAttributes:
@classmethod @classmethod
def add_new_arg_to_args(cls, args_list, argument, value): def add_new_arg_to_args(cls, args_list, argument, value):
new_arg_list = list(set( new_arg_list = list(
args_ for args_ in list(args_list) if isinstance(args_, SQLColumnExpression) set(
)) args_
arg_left = lambda arg_obj: getattr(getattr(arg_obj, "left", None), 'key', None) for args_ in list(args_list)
if isinstance(args_, BinaryExpression)
)
)
arg_left = lambda arg_obj: getattr(getattr(arg_obj, "left", None), "key", None)
# arg_right = lambda arg_obj: getattr(getattr(arg_obj, "right", None), "value", None)
if not any(True for arg in new_arg_list if arg_left(arg_obj=arg) == argument): if not any(True for arg in new_arg_list if arg_left(arg_obj=arg) == argument):
new_arg_list.append(value) new_arg_list.append(value)
return tuple(new_arg_list) return tuple(new_arg_list)
@ -108,7 +113,7 @@ class FilterAttributes:
from api_library.date_time_actions.date_functions import system_arrow from api_library.date_time_actions.date_functions import system_arrow
arg = cls.add_new_arg_to_args( arg = cls.add_new_arg_to_args(
arg, "expiry_ends", cls.expiry_ends >= str(system_arrow.now()) arg, "expiry_ends", cls.expiry_ends > str(system_arrow.now())
) )
arg = cls.add_new_arg_to_args( arg = cls.add_new_arg_to_args(
arg, "expiry_starts", cls.expiry_starts <= str(system_arrow.now()) arg, "expiry_starts", cls.expiry_starts <= str(system_arrow.now())

View File

@ -24,10 +24,7 @@ def exception_handler_http(request: Request, exc: HTTPException):
err = e err = e
return JSONResponse( return JSONResponse(
status_code=exc.status_code, status_code=exc.status_code,
content={ content={"detail": str(exc_detail), "mesasage": f"{e}"},
"detail":str(exc_detail),
"mesasage": f"{e}"
},
) )

View File

@ -47,7 +47,9 @@ from .address.address.router import address_router
from .address.post_code.router import post_code_router from .address.post_code.router import post_code_router
from .application.enums_and_drops.router import enums_route from .application.enums_and_drops.router import enums_route
from .application.occupants.router import occupant_types_route from .application.occupants.router import occupant_types_route
from .decision_book.decision_book_invitations.router import build_decision_book_invitations from .decision_book.decision_book_invitations.router import (
build_decision_book_invitations,
)
__all__ = [ __all__ = [

View File

@ -1,20 +1,18 @@
class Config: class Config:
IP_ADDRESS: str = "http://10.10.2.46:41575/internal/isbank/retreive" IP_ADDRESS: str = "http://10.10.2.46:41575/internal/isbank/retreive"
SERVICE_TIMING: int = 900 # 15 min SERVICE_TIMING: int = 900 # 15 min
UNREAD_PATH: str = '/home/bank/isbank/unread/' UNREAD_PATH: str = "/home/bank/isbank/unread/"
PARSED_PATH: str = '/home/bank/isbank/parsed/parsed_data.json' PARSED_PATH: str = "/home/bank/isbank/parsed/parsed_data.json"
ARCHIVE_PATH: str = '/home/bank/isbank/archive/' ARCHIVE_PATH: str = "/home/bank/isbank/archive/"
INCOMING_PATH: str = '/home/bank/isbank/unread' INCOMING_PATH: str = "/home/bank/isbank/unread"
COMPLETED_PATH: str = '/home/bank/isbank/completed' COMPLETED_PATH: str = "/home/bank/isbank/completed"
MAILBOX: str = 'bilgilendirme@ileti.isbank.com.tr' MAILBOX: str = "bilgilendirme@ileti.isbank.com.tr"
KARATAY: str = 'karatay.berkay@gmail.com' KARATAY: str = "karatay.berkay@gmail.com"
EMAIL_HOST: str = '10.10.2.34' EMAIL_HOST: str = "10.10.2.34"
EMAIL_USERNAME: str = 'karatay@mehmetkaratay.com.tr' EMAIL_USERNAME: str = "karatay@mehmetkaratay.com.tr"
EMAIL_PASSWORD: str = '' EMAIL_PASSWORD: str = ""
INFO_MAIL = 'mehmet.karatay@hotmail.com' INFO_MAIL = "mehmet.karatay@hotmail.com"

View File

@ -6,9 +6,10 @@ email_sender = EmailSender(
host=Config.EMAIL_HOST, host=Config.EMAIL_HOST,
port=993, port=993,
username=Config.EMAIL_USERNAME, username=Config.EMAIL_USERNAME,
password=Config.EMAIL_PASSWORD password=Config.EMAIL_PASSWORD,
) )
def mail_sender_service(subject, list_of_read_attachment_names): def mail_sender_service(subject, list_of_read_attachment_names):
email_sender.connect() email_sender.connect()
try: try:
@ -20,5 +21,5 @@ def mail_sender_service(subject, list_of_read_attachment_names):
return True return True
except Exception as e: except Exception as e:
err = e err = e
print('Mail send error raised : ', err) print("Mail send error raised : ", err)
return False return False

View File

@ -16,13 +16,13 @@ basicConfig(filename=__name__, level=INFO)
def read_json_file(json_file_path): def read_json_file(json_file_path):
if os.path.exists(json_file_path): if os.path.exists(json_file_path):
with open(json_file_path, 'r') as json_file: with open(json_file_path, "r") as json_file:
return json.load(json_file) return json.load(json_file)
return {} return {}
def write_json_file(json_file_path, data): def write_json_file(json_file_path, data):
with open(json_file_path, 'w') as json_file: with open(json_file_path, "w") as json_file:
json.dump(data, json_file, indent=4) json.dump(data, json_file, indent=4)
@ -39,7 +39,7 @@ def parser_service():
excel_files = glob.glob(os.path.join(absolute_path, "*.xls*")) excel_files = glob.glob(os.path.join(absolute_path, "*.xls*"))
for file_path in excel_files: for file_path in excel_files:
xl_name = str(file_path).split('/')[-1] xl_name = str(file_path).split("/")[-1]
xl_file = pandas.read_excel(file_path) xl_file = pandas.read_excel(file_path)
xl_frame = pandas.DataFrame(xl_file) xl_frame = pandas.DataFrame(xl_file)
iban = "" iban = ""
@ -68,13 +68,17 @@ def parser_service():
) )
logger.info(f"Insert Dict: {insert_dict}") logger.info(f"Insert Dict: {insert_dict}")
existing_data = read_json_file(parsed) existing_data = read_json_file(parsed)
if xl_name in existing_data: # Check if the key already exists if xl_name in existing_data: # Check if the key already exists
if insert_dict not in existing_data[xl_name]: if insert_dict not in existing_data[xl_name]:
existing_data[xl_name].append(insert_dict) existing_data[xl_name].append(insert_dict)
else: else:
existing_data[xl_name] = [insert_dict] # Update the JSON data with the new key-value pair existing_data[xl_name] = [
write_json_file(parsed, existing_data) # Write the updated data back to the JSON file insert_dict
] # Update the JSON data with the new key-value pair
write_json_file(
parsed, existing_data
) # Write the updated data back to the JSON file
shutil.move( shutil.move(
file_path, file_path,
os.path.join(current_directory, completed, os.path.basename(file_path)), os.path.join(current_directory, completed, os.path.basename(file_path)),
@ -83,8 +87,7 @@ def parser_service():
# if __name__ == "__main__": # if __name__ == "__main__":
# parse_xl_files_and_copy_to_database() # parse_xl_files_and_copy_to_database()
# time.sleep(int(os.getenv("PARSER_SEQUENCE", 60))) # time.sleep(int(os.getenv("PARSER_SEQUENCE", 60)))
# while True: # while True:
# parse_xl_files_and_copy_to_database() # parse_xl_files_and_copy_to_database()
# time.sleep(int(os.getenv("PARSER_SEQUENCE", 60))) # time.sleep(int(os.getenv("PARSER_SEQUENCE", 60)))

View File

@ -6,19 +6,14 @@ from redbox import EmailBox
from redbox.query import FROM, UNSEEN, OR from redbox.query import FROM, UNSEEN, OR
host='10.10.2.34' host = "10.10.2.34"
port=993 port = 993
username='isbank@mehmetkaratay.com.tr' username = "isbank@mehmetkaratay.com.tr"
password='system' password = "system"
authorized_iban = "4245-0093333" authorized_iban = "4245-0093333"
authorized_iban_cleaned = authorized_iban.replace("-", "") authorized_iban_cleaned = authorized_iban.replace("-", "")
box = EmailBox( box = EmailBox(host=host, port=port, username=username, password=password)
host=host,
port=port,
username=username,
password=password
)
filter_mail = OR(FROM(Config.MAILBOX), FROM(Config.KARATAY)) filter_mail = OR(FROM(Config.MAILBOX), FROM(Config.KARATAY))
filter_print = f"{Config.MAILBOX} & {Config.KARATAY}" filter_print = f"{Config.MAILBOX} & {Config.KARATAY}"
@ -29,29 +24,45 @@ filter_print = f"{Config.MAILBOX} & {Config.KARATAY}"
def reader_service(): def reader_service():
mailbox = box.inbox mailbox = box.inbox
banks_mails = mailbox.search(filter_mail & UNSEEN) banks_mails = mailbox.search(filter_mail & UNSEEN)
print(f'Service is reading mailbox [{username}] with mail sender [{filter_print}] with count : {len(banks_mails)}') print(
f"Service is reading mailbox [{username}] with mail sender [{filter_print}] with count : {len(banks_mails)}"
)
for banks_mail in banks_mails: for banks_mail in banks_mails:
message_attc = lambda fn: f"FROM: {banks_mail.from_}, SEEN: {banks_mail.seen} MSG: email_message.is_multipart Downloaded attachment: {fn}" message_attc = (
message_non_attc = lambda fn: f"FROM: {banks_mail.from_}, SEEN: {banks_mail.seen} MSG: Handle non-multipart email Downloaded attachment: {fn}" lambda fn: f"FROM: {banks_mail.from_}, SEEN: {banks_mail.seen} MSG: email_message.is_multipart Downloaded attachment: {fn}"
)
message_non_attc = (
lambda fn: f"FROM: {banks_mail.from_}, SEEN: {banks_mail.seen} MSG: Handle non-multipart email Downloaded attachment: {fn}"
)
# mail_subject = banks_mail.subject # mail_subject = banks_mail.subject
email_message = banks_mail.email email_message = banks_mail.email
full_path = lambda fn: str(Config.UNREAD_PATH) + str(fn) full_path = lambda fn: str(Config.UNREAD_PATH) + str(fn)
completed_path = lambda fn: str(Config.COMPLETED_PATH) + '/' + str(fn) completed_path = lambda fn: str(Config.COMPLETED_PATH) + "/" + str(fn)
file_exists = lambda fn: not os.path.exists(full_path(fn)) and not os.path.exists(completed_path(fn)) file_exists = lambda fn: not os.path.exists(
if email_message.is_multipart(): # Check if email has multipart content full_path(fn)
) and not os.path.exists(completed_path(fn))
if email_message.is_multipart(): # Check if email has multipart content
for part in email_message.walk(): for part in email_message.walk():
content_disposition = part.get('Content-Disposition') # Each part can be an attachment content_disposition = part.get(
if content_disposition and 'attachment' in content_disposition: "Content-Disposition"
) # Each part can be an attachment
if content_disposition and "attachment" in content_disposition:
if filename := part.get_filename(): if filename := part.get_filename():
if authorized_iban_cleaned in str(filename) and file_exists(filename): if authorized_iban_cleaned in str(filename) and file_exists(
with open(full_path(filename), 'wb') as f: filename
):
with open(full_path(filename), "wb") as f:
print(message_attc(filename)) print(message_attc(filename))
f.write(part.get_payload(decode=True)) # Save attachment f.write(
part.get_payload(decode=True)
) # Save attachment
else: # Handle non-multipart email, though this is rare for emails with attachments else: # Handle non-multipart email, though this is rare for emails with attachments
content_disposition = email_message.get('Content-Disposition') content_disposition = email_message.get("Content-Disposition")
if content_disposition and 'attachment' in content_disposition: if content_disposition and "attachment" in content_disposition:
if filename := email_message.get_filename(): if filename := email_message.get_filename():
if authorized_iban_cleaned in str(filename) and file_exists(filename): if authorized_iban_cleaned in str(filename) and file_exists(
with open(full_path(filename), 'wb') as f: filename
):
with open(full_path(filename), "wb") as f:
print(message_non_attc(filename)) print(message_non_attc(filename))
f.write(email_message.get_payload(decode=True)) f.write(email_message.get_payload(decode=True))

View File

@ -28,19 +28,20 @@ class BankReceive(BaseModel):
def read_json_file(json_file_path): def read_json_file(json_file_path):
if os.path.exists(json_file_path): if os.path.exists(json_file_path):
with open(json_file_path, 'r') as json_file: with open(json_file_path, "r") as json_file:
return json.load(json_file) return json.load(json_file)
return {} return {}
def write_json_file(json_file_path, data): def write_json_file(json_file_path, data):
with open(json_file_path, 'w') as json_file: with open(json_file_path, "w") as json_file:
json.dump(data, json_file, indent=4) json.dump(data, json_file, indent=4)
def sender_service(): def sender_service():
parsed_data = read_json_file(Config.PARSED_PATH) parsed_data = read_json_file(Config.PARSED_PATH)
if not parsed_data: if not parsed_data:
print('Parsed data can not found') print("Parsed data can not found")
return return
if is_bank_retrieve_account_records(bank_data=json.dumps(parsed_data)): if is_bank_retrieve_account_records(bank_data=json.dumps(parsed_data)):
@ -49,14 +50,15 @@ def sender_service():
print("is_bank_retrieve_account_records is failed") print("is_bank_retrieve_account_records is failed")
return return
today_date = str(arrow.now('GMT+0')) today_date = str(arrow.now("GMT+0"))
archive_path = str(Config.ARCHIVE_PATH + today_date + '.json').replace(' ', '') archive_path = str(Config.ARCHIVE_PATH + today_date + ".json").replace(" ", "")
already_archived = read_json_file(archive_path) already_archived = read_json_file(archive_path)
already_archived[today_date] = parsed_data already_archived[today_date] = parsed_data
write_json_file(archive_path, already_archived) write_json_file(archive_path, already_archived)
write_json_file(Config.PARSED_PATH, {}) write_json_file(Config.PARSED_PATH, {})
return return
def is_bank_retrieve_account_records(bank_data): def is_bank_retrieve_account_records(bank_data):
from databases import AccountRecords from databases import AccountRecords
@ -88,4 +90,3 @@ def is_bank_retrieve_account_records(bank_data):
# err = e # err = e
# print('Exception',e) # print('Exception',e)
# return False, {}, 500 # return False, {}, 500

View File

@ -1,14 +1,13 @@
import time import time
import datetime import datetime
from config_isbank import Config from config_isbank import Config
from isbank_reader import reader_service from isbank_reader import reader_service
from isbank_parser import parser_service from isbank_parser import parser_service
from isbank_sender import sender_service from isbank_sender import sender_service
if __name__ == "__main__": if __name__ == "__main__":
print('Bank service booted...') print("Bank service booted...")
while True: while True:
try: try:
reader_service() reader_service()
@ -17,10 +16,9 @@ if __name__ == "__main__":
time.sleep(1) time.sleep(1)
sender_service() sender_service()
time.sleep(1) time.sleep(1)
print(datetime.datetime.now().__str__(), ' : system completed a cycle...') print(datetime.datetime.now().__str__(), " : system completed a cycle...")
except Exception as e: except Exception as e:
err = e err = e
print('Raised Error :', err) print("Raised Error :", err)
time.sleep(int(Config.SERVICE_TIMING or 900)) time.sleep(int(Config.SERVICE_TIMING or 900))
# time.sleep(10) # time.sleep(10)

View File

@ -1,26 +1,27 @@
import time import time
import datetime import datetime
from config_isbank import Config from config_isbank import Config
from isbank_reader import reader_service from isbank_reader import reader_service
from isbank_parser import parser_service from isbank_parser import parser_service
from isbank_sender import sender_service from isbank_sender import sender_service
if __name__ == "__main__": if __name__ == "__main__":
print('Bank service booted...') print("Bank service booted...")
# while True: # while True:
# try: # try:
reader_service() reader_service()
time.sleep(1) time.sleep(1)
parser_service() parser_service()
time.sleep(1) time.sleep(1)
sender_service() sender_service()
time.sleep(1) time.sleep(1)
print(datetime.datetime.now().__str__(), ' : system completed a cycle without error...') print(
# except Exception as e: datetime.datetime.now().__str__(),
# err = e " : system completed a cycle without error...",
# print('Raised Error :', err) )
# time.sleep(int(Config.SERVICE_TIMING or 900)) # except Exception as e:
# time.sleep(10) # err = e
# print('Raised Error :', err)
# time.sleep(int(Config.SERVICE_TIMING or 900))
# time.sleep(10)

View File

@ -19,9 +19,11 @@ active_confirmed = dict(
is_notification_send=True, is_notification_send=True,
) )
def create_all_events_from_actions(): def create_all_events_from_actions():
import api_events.events as events import api_events.events as events
from databases import EndpointRestriction from databases import EndpointRestriction
an_empty_list, duplicate_list = [], [] an_empty_list, duplicate_list = [], []
for event in events.__all__: for event in events.__all__:
@ -37,18 +39,20 @@ def create_all_events_from_actions():
f"Endpoint not found in {event_selected.__name__} class" f"Endpoint not found in {event_selected.__name__} class"
) )
endpoint_restriction = EndpointRestriction.filter_one( endpoint_restriction = EndpointRestriction.filter_one(
EndpointRestriction.endpoint_name.ilike(f"%{event_selected.action.endpoint}%"), EndpointRestriction.endpoint_name.ilike(
system=True f"%{event_selected.action.endpoint}%"
),
system=True,
).data ).data
if endpoint_restriction: if endpoint_restriction:
if event_selected_function: if event_selected_function:
selected_event = Events.filter_one( selected_event = Events.filter_one(
Events.event_type==event_selected.event_type, Events.event_type == event_selected.event_type,
Events.function_class==event, Events.function_class == event,
Events.function_code==event_selected_key, Events.function_code == event_selected_key,
Events.endpoint_id==endpoint_restriction.id, Events.endpoint_id == endpoint_restriction.id,
Events.endpoint_uu_id==str(endpoint_restriction.uu_id), Events.endpoint_uu_id == str(endpoint_restriction.uu_id),
system=True system=True,
).data ).data
if not selected_event: if not selected_event:
created_event = Events.find_or_create( created_event = Events.find_or_create(
@ -57,7 +61,7 @@ def create_all_events_from_actions():
function_code=event_selected_key, function_code=event_selected_key,
endpoint_id=endpoint_restriction.id, endpoint_id=endpoint_restriction.id,
endpoint_uu_id=str(endpoint_restriction.uu_id), endpoint_uu_id=str(endpoint_restriction.uu_id),
**active_confirmed **active_confirmed,
) )
Events.save() Events.save()
print(f"Event created: {created_event.uu_id}") print(f"Event created: {created_event.uu_id}")
@ -80,8 +84,8 @@ def add_events_all_services_and_occupant_types():
for event_block in tasks2events.__all__: for event_block in tasks2events.__all__:
event_block_class = getattr(tasks2events, event_block) event_block_class = getattr(tasks2events, event_block)
service_selected = Services.filter_one( service_selected = Services.filter_one(
Services.service_code==getattr(event_block_class, "service_code", None), Services.service_code == getattr(event_block_class, "service_code", None),
system=True system=True,
).data ).data
if not service_selected: if not service_selected:
raise Exception(f"{event_block_class.service_code} service is not found") raise Exception(f"{event_block_class.service_code} service is not found")

View File

@ -140,7 +140,9 @@ def create_occupant_types_defaults():
] ]
for list_occupant_type in list_occupant_types: for list_occupant_type in list_occupant_types:
created_type = OccupantTypes.find_or_create(**{"is_confirmed": True, **list_occupant_type}) created_type = OccupantTypes.find_or_create(
**{"is_confirmed": True, **list_occupant_type}
)
created_type.save() created_type.save()
created_type.is_confirmed = True created_type.is_confirmed = True
created_type.save() created_type.save()
@ -401,10 +403,8 @@ def create_application_defaults():
is_notification_send=True, is_notification_send=True,
) )
created_list.append(app_manager_user) created_list.append(app_manager_user)
app_manager_user.reset_password_token() app_manager_user.reset_password_token(found_user=app_manager_user)
mongo_engine = MongoQueryIdentity( mongo_engine = MongoQueryIdentity(company_uuid=company_management.uu_id)
company_uuid=company_management.uu_id
)
mongo_engine.create_domain_via_user( mongo_engine.create_domain_via_user(
payload=DomainViaUser( payload=DomainViaUser(
user_uu_id=str(app_manager_user.uu_id), user_uu_id=str(app_manager_user.uu_id),
@ -430,7 +430,7 @@ def create_application_defaults():
) )
created_list.append(sup_manager_employee) created_list.append(sup_manager_employee)
sup_manager_employee.reset_password_token() sup_manager_employee.reset_password_token(found_user=sup_manager_employee)
mongo_engine.create_domain_via_user( mongo_engine.create_domain_via_user(
payload=DomainViaUser( payload=DomainViaUser(
user_uu_id=str(sup_manager_employee.uu_id), user_uu_id=str(sup_manager_employee.uu_id),

View File

@ -6,10 +6,10 @@ from databases import (
) )
def create_endpoints_from_api_functions(routers): def create_endpoints_from_api_functions(routers):
from application.create_file import create_app from application.create_file import create_app
from databases import EndpointRestriction from databases import EndpointRestriction
api_app = create_app(routers=routers) api_app = create_app(routers=routers)
for route in api_app.routes: for route in api_app.routes:
@ -290,7 +290,7 @@ def create_modules_and_services_and_actions():
service_code=f"SRE-{duty_object.duty_code}", service_code=f"SRE-{duty_object.duty_code}",
) )
created_service.save() created_service.save()
created_service.is_confirmed=True created_service.is_confirmed = True
created_service.save() created_service.save()
occupant_types = OccupantTypes.filter_all() occupant_types = OccupantTypes.filter_all()
@ -302,7 +302,7 @@ def create_modules_and_services_and_actions():
service_code=f"SRO-{occupant_type.occupant_code}", service_code=f"SRO-{occupant_type.occupant_code}",
) )
created_service.save() created_service.save()
created_service.is_confirmed=True created_service.is_confirmed = True
created_service.save() created_service.save()
create_services_authenticate(module_dict=user_module_module_dict) create_services_authenticate(module_dict=user_module_module_dict)

View File

@ -1,15 +1,13 @@
class TerminalColors: class TerminalColors:
HEADER = '\033[95m' HEADER = "\033[95m"
OKBLUE = '\033[94m' OKBLUE = "\033[94m"
OKCYAN = '\033[96m' OKCYAN = "\033[96m"
OKGREEN = '\033[92m' OKGREEN = "\033[92m"
WARNING = '\033[93m' WARNING = "\033[93m"
FAIL = '\033[91m' FAIL = "\033[91m"
ENDC = '\033[0m' ENDC = "\033[0m"
BOLD = '\033[1m' BOLD = "\033[1m"
UNDERLINE = '\033[4m' UNDERLINE = "\033[4m"
def do_alembic(): def do_alembic():
@ -18,6 +16,7 @@ def do_alembic():
generate_alembic_with_session(text=text) generate_alembic_with_session(text=text)
def create_one_address(): def create_one_address():
from databases import ( from databases import (
AddressCity, AddressCity,
@ -28,6 +27,7 @@ def create_one_address():
AddressState, AddressState,
AddressCountry, AddressCountry,
) )
address_list = [] address_list = []
country = AddressCountry.find_or_create(country_name="TÜRKİYE", country_code="TR") country = AddressCountry.find_or_create(country_name="TÜRKİYE", country_code="TR")
address_list.append(country) address_list.append(country)
@ -100,10 +100,14 @@ def create_application_defaults_func(create_address=False):
create_occupant_types_defaults, create_occupant_types_defaults,
) )
import routers import routers
try: try:
create_endpoints_from_api_functions(routers=routers) create_endpoints_from_api_functions(routers=routers)
except Exception as e: except Exception as e:
print(f"{TerminalColors.WARNING} create_endpoints_from_api_functions Defaults Error", e) print(
f"{TerminalColors.WARNING} create_endpoints_from_api_functions Defaults Error",
e,
)
try: try:
create_application_defaults() create_application_defaults()
except Exception as e: except Exception as e:
@ -111,11 +115,16 @@ def create_application_defaults_func(create_address=False):
try: try:
create_occupant_types_defaults() create_occupant_types_defaults()
except Exception as e: except Exception as e:
print(f"{TerminalColors.WARNING} create_occupant_types_defaults Defaults Error", e) print(
f"{TerminalColors.WARNING} create_occupant_types_defaults Defaults Error", e
)
try: try:
create_modules_and_services_and_actions() create_modules_and_services_and_actions()
except Exception as e: except Exception as e:
print(f"{TerminalColors.WARNING} create_modules_and_services_and_actions Defaults Error", e) print(
f"{TerminalColors.WARNING} create_modules_and_services_and_actions Defaults Error",
e,
)
try: try:
init_api_enums_build_types() init_api_enums_build_types()
except Exception as e: except Exception as e:
@ -123,15 +132,23 @@ def create_application_defaults_func(create_address=False):
try: try:
create_all_events_from_actions() create_all_events_from_actions()
except Exception as e: except Exception as e:
print(f"{TerminalColors.WARNING} create_all_events_from_actions Defaults Error", e) print(
f"{TerminalColors.WARNING} create_all_events_from_actions Defaults Error", e
)
try: try:
add_events_all_services_and_occupant_types() add_events_all_services_and_occupant_types()
except Exception as e: except Exception as e:
print(f"{TerminalColors.WARNING} add_events_all_services_and_occupant_types Defaults Error", e) print(
f"{TerminalColors.WARNING} add_events_all_services_and_occupant_types Defaults Error",
e,
)
try: try:
add_events_to_system_super_user() add_events_to_system_super_user()
except Exception as e: except Exception as e:
print(f"{TerminalColors.WARNING} add_events_to_system_super_user Defaults Error", e) print(
f"{TerminalColors.WARNING} add_events_to_system_super_user Defaults Error",
e,
)
try: try:
if not create_address: if not create_address:
return return
@ -145,4 +162,3 @@ if __name__ == "__main__":
do_alembic() do_alembic()
create_application_defaults_func(create_address=True) create_application_defaults_func(create_address=True)
print("Service App Initial Default Runner is completed") print("Service App Initial Default Runner is completed")

View File

@ -1,8 +1,8 @@
class BothAPIS: class BothAPIS:
wag_api = None wag_api = None
local_api = None local_api = None
class BaseAPI: class BaseAPI:
ACCESS_TOKEN_TAG: str = "evyos-session-key" ACCESS_TOKEN_TAG: str = "evyos-session-key"
headers: dict = { headers: dict = {

View File

@ -76,13 +76,15 @@ class RequestToApi:
return response return response
def login_via_email_and_password( def login_via_email_and_password(
self, login_data, is_password_valid=True, selection_list: list = None self, login_data, is_password_valid=True, selection_list: list = None
): ):
if not is_password_valid: if not is_password_valid:
if not login_data.get("password_token"): if not login_data.get("password_token"):
raise Exception("Password token is not found") raise Exception("Password token is not found")
self.change_password_with_token(password_token=login_data.get("password_token")) self.change_password_with_token(
password_token=login_data.get("password_token")
)
login_dict = self.post(endpoint="authentication/login", data=login_data) login_dict = self.post(endpoint="authentication/login", data=login_data)
print("login_dict", login_dict.text) print("login_dict", login_dict.text)
@ -141,5 +143,5 @@ class RequestToApi:
response = self.post( response = self.post(
data=data_dict, endpoint="authentication/create_password" data=data_dict, endpoint="authentication/create_password"
) )
print('change_password_with_token', response.text) print("change_password_with_token", response.text)
print('change_password_with_token', response.json()) print("change_password_with_token", response.json())

View File

@ -1,10 +1,18 @@
from random import randint from random import randint
from faker import Faker from faker import Faker
from service_app_test.test_application.evyos.datas.company_employee_data import list_options from service_app_test.test_application.evyos.datas.company_employee_data import (
from service_app_test.test_application.evyos.datas.get_building_types import list_building_types list_options,
from service_app_test.test_application.evyos.datas.get_occupants_codes import get_occupants_types )
from service_app_test.test_application.evyos.datas.get_type_codes import get_type_codes_key_and_class from service_app_test.test_application.evyos.datas.get_building_types import (
list_building_types,
)
from service_app_test.test_application.evyos.datas.get_occupants_codes import (
get_occupants_types,
)
from service_app_test.test_application.evyos.datas.get_type_codes import (
get_type_codes_key_and_class,
)
from service_app_test.bases import active_and_confirmed from service_app_test.bases import active_and_confirmed
@ -182,7 +190,7 @@ def list_build_living_space(requester):
return response.json() return response.json()
def list_building_parts(requester,query: dict = None): def list_building_parts(requester, query: dict = None):
query_dict = query query_dict = query
if not query: if not query:
query_dict = {"part_code__contains": ":"} query_dict = {"part_code__contains": ":"}
@ -292,7 +300,9 @@ def assign_random_people_to_build_parts(
uu_id_occupant_type_flat_manager = occupant_dict["occupant_type_flat_manager"] uu_id_occupant_type_flat_manager = occupant_dict["occupant_type_flat_manager"]
uu_id_occupant_type_flat_resident = occupant_dict["occupant_type_flat_resident"] uu_id_occupant_type_flat_resident = occupant_dict["occupant_type_flat_resident"]
man_room = list_building_parts(query={"part_no": "0", "build_uu_id": build_uu_id}, requester=requester) man_room = list_building_parts(
query={"part_no": "0", "build_uu_id": build_uu_id}, requester=requester
)
man_room_uu_id = man_room["data"][0]["uu_id"] man_room_uu_id = man_room["data"][0]["uu_id"]
for i in range(len(list_of_random_people)): for i in range(len(list_of_random_people)):
@ -307,7 +317,7 @@ def assign_random_people_to_build_parts(
build_part_uu_id=selected_build_part_uu_id, build_part_uu_id=selected_build_part_uu_id,
person_uu_id=list_of_random_people[i - 1]["uu_id"], person_uu_id=list_of_random_people[i - 1]["uu_id"],
occupant_type_flat_owner_uu_id=uu_id_occupant_type_flat_owner, occupant_type_flat_owner_uu_id=uu_id_occupant_type_flat_owner,
requester=requester requester=requester,
) )
# Property Tenant # Property Tenant
@ -315,7 +325,7 @@ def assign_random_people_to_build_parts(
build_part_uu_id=selected_build_part_uu_id, build_part_uu_id=selected_build_part_uu_id,
person_uu_id=list_of_random_people[i]["uu_id"], person_uu_id=list_of_random_people[i]["uu_id"],
occupant_type_flat_tenant_uu_id=uu_id_occupant_type_flat_tenant, occupant_type_flat_tenant_uu_id=uu_id_occupant_type_flat_tenant,
requester=requester requester=requester,
) )
# Property Tenant Living Space Occupant # Property Tenant Living Space Occupant
@ -323,7 +333,7 @@ def assign_random_people_to_build_parts(
build_part_uu_id=selected_build_part_uu_id, build_part_uu_id=selected_build_part_uu_id,
person_uu_id=list_of_random_people[i]["uu_id"], person_uu_id=list_of_random_people[i]["uu_id"],
occupant_type_flat_resident_uu_id=uu_id_occupant_type_flat_resident, occupant_type_flat_resident_uu_id=uu_id_occupant_type_flat_resident,
requester=requester requester=requester,
) )
if i == 1: if i == 1:
@ -331,7 +341,7 @@ def assign_random_people_to_build_parts(
build_part_uu_id=man_room_uu_id, build_part_uu_id=man_room_uu_id,
person_uu_id=list_of_random_people[i]["uu_id"], person_uu_id=list_of_random_people[i]["uu_id"],
occupant_type_flat_manager_uu_id=uu_id_occupant_type_flat_manager, occupant_type_flat_manager_uu_id=uu_id_occupant_type_flat_manager,
requester=requester requester=requester,
) )
@ -353,7 +363,9 @@ def run_address_to_building(requester):
create_post_code(post_code=post_code_dict(street_uu_id), requester=requester) create_post_code(post_code=post_code_dict(street_uu_id), requester=requester)
selected_post_code_uu_id = list_post_codes(requester=requester)["data"][0]["uu_id"] selected_post_code_uu_id = list_post_codes(requester=requester)["data"][0]["uu_id"]
create_addresses(address=address_dict(selected_post_code_uu_id), requester=requester) create_addresses(
address=address_dict(selected_post_code_uu_id), requester=requester
)
selected_address_uu_id = list_addresses(requester=requester)["data"][0]["uu_id"] selected_address_uu_id = list_addresses(requester=requester)["data"][0]["uu_id"]
build_type_response = list_building_types(type_code="apt") build_type_response = list_building_types(type_code="apt")
@ -363,7 +375,7 @@ def run_address_to_building(requester):
address_uu_id=selected_address_uu_id, address_uu_id=selected_address_uu_id,
build_type_uu_id=build_type_uu_id_, build_type_uu_id=build_type_uu_id_,
), ),
requester=requester requester=requester,
) )
selected_build_uu_id = list_building(requester=requester)["data"][0]["uu_id"] selected_build_uu_id = list_building(requester=requester)["data"][0]["uu_id"]
@ -378,6 +390,6 @@ def run_address_to_building(requester):
list_of_building_parts=building_parts_list, list_of_building_parts=building_parts_list,
occupant_dict=occupant_type_dict, occupant_dict=occupant_type_dict,
build_uu_id=selected_build_uu_id, build_uu_id=selected_build_uu_id,
requester=requester requester=requester,
) )
print("list_build_living_space", list_build_living_space(requester=requester)) print("list_build_living_space", list_build_living_space(requester=requester))

View File

@ -1,4 +1,3 @@
from service_app_test.test_application.evyos.people import ( from service_app_test.test_application.evyos.people import (
create_random_person, create_random_person,
create_random_user, create_random_user,
@ -176,7 +175,9 @@ def create_occupant_people_via_list(people_count: int, requester):
def run_company_and_depends(company_uu_id, requester): def run_company_and_depends(company_uu_id, requester):
create_department_via_list(list_of_departments=departments, requester=requester) create_department_via_list(list_of_departments=departments, requester=requester)
create_duty_via_list(list_of_duties=duties, requester=requester) create_duty_via_list(list_of_duties=duties, requester=requester)
create_duties_via_list(list_of_duties=duties, company_uu_id=company_uu_id, requester=requester) create_duties_via_list(
list_of_duties=duties, company_uu_id=company_uu_id, requester=requester
)
create_staff_via_list(list_of_staff=staffs, requester=requester) create_staff_via_list(list_of_staff=staffs, requester=requester)
create_employee_via_list(list_of_staff=duties, requester=requester) create_employee_via_list(list_of_staff=duties, requester=requester)
create_people_via_list(people_count=10, requester=requester) create_people_via_list(people_count=10, requester=requester)

View File

@ -1,7 +1,7 @@
def list_building_types(requester, lang: str = "TR", type_code: str = None): def list_building_types(requester, lang: str = "TR", type_code: str = None):
from service_app_test.test_application.evyos.datas.company_employee_data import list_options from service_app_test.test_application.evyos.datas.company_employee_data import (
list_options,
)
options_smart_query = { options_smart_query = {
**list_options, **list_options,

View File

@ -1,5 +1,3 @@
def get_occupants_types(occupant_code, requester): def get_occupants_types(occupant_code, requester):
response = requester.post( response = requester.post(
endpoint="/occupant_types/get/code", endpoint="/occupant_types/get/code",

View File

@ -1,5 +1,3 @@
def get_type_codes_key_and_class(class_name, key_name, requester): def get_type_codes_key_and_class(class_name, key_name, requester):
response = requester.post( response = requester.post(
endpoint="/enums/get/key", endpoint="/enums/get/key",

View File

@ -1,8 +1,12 @@
import arrow import arrow
from service_app_test.bases import active_and_confirmed from service_app_test.bases import active_and_confirmed
from service_app_test.test_application.evyos.datas.company_employee_data import list_options from service_app_test.test_application.evyos.datas.company_employee_data import (
from service_app_test.test_application.evyos.datas.get_type_codes import get_type_codes_key_and_class list_options,
)
from service_app_test.test_application.evyos.datas.get_type_codes import (
get_type_codes_key_and_class,
)
from service_app_test.test_application.evyos.address_building import list_building from service_app_test.test_application.evyos.address_building import list_building

View File

@ -1,5 +1,8 @@
from service_app_test.bases import active_and_confirmed from service_app_test.bases import active_and_confirmed
from service_app_test.test_application.evyos.datas.get_occupants_codes import get_occupants_types from service_app_test.test_application.evyos.datas.get_occupants_codes import (
get_occupants_types,
)
# from service_app_test.test_application.evyos.datas.get_type_codes import get_type_codes_key_and_class # from service_app_test.test_application.evyos.datas.get_type_codes import get_type_codes_key_and_class
@ -45,9 +48,9 @@ def assign_people_to_pre_or_wrt(
data={ data={
"token": manager_token, "token": manager_token,
"build_living_space_uu_id": person_uu_id, "build_living_space_uu_id": person_uu_id,
"occupant_type_uu_id": get_occupants_types(occupant_code=occupant_code, requester=requester)[ "occupant_type_uu_id": get_occupants_types(
"data" occupant_code=occupant_code, requester=requester
]["uu_id"], )["data"]["uu_id"],
}, },
) )
print("text", response.text) print("text", response.text)
@ -99,7 +102,13 @@ def create_decision_book_items_with_occupant_user(
def run_decision_book_items( def run_decision_book_items(
writers_token, unit_price, info_type_uu_id, is_fixed, requester, start_date=None, end_date=None writers_token,
unit_price,
info_type_uu_id,
is_fixed,
requester,
start_date=None,
end_date=None,
): ):
if start_date and end_date: if start_date and end_date:
create_decision_book_items_with_occupant_user( create_decision_book_items_with_occupant_user(
@ -109,7 +118,7 @@ def run_decision_book_items(
info_type_uu_id=info_type_uu_id, info_type_uu_id=info_type_uu_id,
start_date=start_date, start_date=start_date,
end_date=end_date, end_date=end_date,
requester=requester requester=requester,
) )
else: else:
create_decision_book_items_with_occupant_user( create_decision_book_items_with_occupant_user(
@ -117,5 +126,5 @@ def run_decision_book_items(
unit_price=unit_price, unit_price=unit_price,
is_fixed=is_fixed, is_fixed=is_fixed,
info_type_uu_id=info_type_uu_id, info_type_uu_id=info_type_uu_id,
requester=requester requester=requester,
) )

View File

@ -3,9 +3,15 @@ import arrow
from service_app_test.bases import RequestToApi from service_app_test.bases import RequestToApi
from service_app_test.api_configs import WagAPI, LocalAPI, BothAPIS from service_app_test.api_configs import WagAPI, LocalAPI, BothAPIS
from service_app_test.test_application.evyos.company_employee import run_company_and_depends from service_app_test.test_application.evyos.company_employee import (
from service_app_test.test_application.evyos.address_building import run_address_to_building run_company_and_depends,
from service_app_test.test_application.evyos.datas.get_type_codes import get_type_codes_key_and_class )
from service_app_test.test_application.evyos.address_building import (
run_address_to_building,
)
from service_app_test.test_application.evyos.datas.get_type_codes import (
get_type_codes_key_and_class,
)
from service_app_test.test_application.evyos.decision_book import ( from service_app_test.test_application.evyos.decision_book import (
run_decision_book_depends, run_decision_book_depends,
list_decision_books, list_decision_books,
@ -23,7 +29,7 @@ login_creds_employee = {
"access_key": "karatay.berkay.sup@evyos.com.tr", "access_key": "karatay.berkay.sup@evyos.com.tr",
"password": "string", "password": "string",
"remember_me": False, "remember_me": False,
"password_token": "z5nPguDu6PrY_94KlTGxGBCMcK6rZcDl5AGqO5aHWY7TcQF8LJGYikMQs9labvqdz5yM7vE_f8Zq_vqp00o3EnWwWCWhel-EsMcAujBKNRjV3jC_4xk0_1r_unIYogWAjz_spZipX6pncsch2ngvv0dpx4lHSiZ5QrDTA1RefQ" "password_token": "z5nPguDu6PrY_94KlTGxGBCMcK6rZcDl5AGqO5aHWY7TcQF8LJGYikMQs9labvqdz5yM7vE_f8Zq_vqp00o3EnWwWCWhel-EsMcAujBKNRjV3jC_4xk0_1r_unIYogWAjz_spZipX6pncsch2ngvv0dpx4lHSiZ5QrDTA1RefQ",
} }
access_key_president = "bmanco@example.net" access_key_president = "bmanco@example.net"
login_creds_occupant = { login_creds_occupant = {
@ -61,17 +67,22 @@ local_api = RequestToApi()
local_api.overwrite_base_url(base_url=LocalAPI.base_url) local_api.overwrite_base_url(base_url=LocalAPI.base_url)
if add_with_employee: if add_with_employee:
print('local_api', local_api.post(endpoint="authentication/login", data=login_creds_employee).text) print(
"local_api",
local_api.post(endpoint="authentication/login", data=login_creds_employee).text,
)
exit() exit()
local_api.selected_object = local_api.login_via_email_and_password( local_api.selected_object = local_api.login_via_email_and_password(
login_data=login_creds_employee, is_password_valid=False login_data=login_creds_employee, is_password_valid=False
) )
print('local_api', local_api.headers) print("local_api", local_api.headers)
print("select_company_uu_id", local_api.selected_object) print("select_company_uu_id", local_api.selected_object)
exit() exit()
run_company_and_depends(company_uu_id=local_api.selected_object, requester=local_api) run_company_and_depends(
company_uu_id=local_api.selected_object, requester=local_api
)
run_address_to_building(requester=local_api) run_address_to_building(requester=local_api)
exit() exit()

View File

@ -4,14 +4,18 @@ from service_app_test.api_configs import BothAPIS
def migrate_build(requester: BothAPIS): def migrate_build(requester: BothAPIS):
return return
def migrate_build_area(requester: BothAPIS): def migrate_build_area(requester: BothAPIS):
return return
def migrate_build_part(requester: BothAPIS): def migrate_build_part(requester: BothAPIS):
return return
def migrate_build_iban(requester: BothAPIS): def migrate_build_iban(requester: BothAPIS):
return return
def migrate_build_living_space(requester: BothAPIS): def migrate_build_living_space(requester: BothAPIS):
return return

View File

@ -6,26 +6,25 @@ def migrate_company(requester: BothAPIS):
filter_object = FilterObject( filter_object = FilterObject(
page=1, page=1,
size=100, size=100,
order_field="id",
order_type="asc",
) )
response = requester.wag_api.post( response = requester.wag_api.post(
endpoint="/company/list", endpoint="/company/list",
data=filter_object.dump(), data=filter_object.dump(),
) )
response_json = response.json() response_json = response.json()
print('response_json', response_json) print("response_json", response_json)
response_datas = response_json['data'] response_datas = response_json["data"]
for response_data in response_datas: for response_data in response_datas:
print('response_data', response_data) new_response_data = dict()
response_data['active'] = True for key, value in dict(response_data).items():
response_data['deleted'] = False if value is not None and not str(value) == "None":
response_data['is_confirmed'] = True new_response_data[key] = response_data[key]
response_data['expiry_starts'] = None new_response_data.pop("uu_id", None)
response_data['expiry_ends'] = None print("new_response_data", new_response_data)
new_response_data["company_tag"] = response_data["formal_name"]
response = requester.local_api.post( response = requester.local_api.post(
endpoint="/company/create", endpoint="/company/create",
data=response_data, data=new_response_data,
) )
print('response', response.text) print("response", response.text)
return return

View File

@ -3,4 +3,4 @@ from service_app_test.api_configs import BothAPIS
def migrate_people(requester: BothAPIS): def migrate_people(requester: BothAPIS):
# Migrate old data # Migrate old data
pass pass

View File

@ -12,11 +12,13 @@ system_default = dict(
def read_json_file(json_directory, json_file): def read_json_file(json_directory, json_file):
with open(f"{json_directory}/{json_file}.json", "r", encoding='utf-8') as json_file: with open(f"{json_directory}/{json_file}.json", "r", encoding="utf-8") as json_file:
return loads(json_file.read()) return loads(json_file.read())
def bulk_insert_alchemy_postgresql(active_session, table, data_list, on_conflict_constraints = None): def bulk_insert_alchemy_postgresql(
active_session, table, data_list, on_conflict_constraints=None
):
from sqlalchemy.dialects.postgresql import insert from sqlalchemy.dialects.postgresql import insert
st = perf_counter() st = perf_counter()
@ -29,11 +31,10 @@ def bulk_insert_alchemy_postgresql(active_session, table, data_list, on_conflict
) )
) )
else: else:
session_execute = active_session.execute( session_execute = active_session.execute(insert(table).values(data_list))
insert(table)
.values(data_list)
)
count_row = session_execute.rowcount count_row = session_execute.rowcount
print(f'Table : {table.__name__} count_row : {count_row} : time took : {round(perf_counter() - st, 2)} seconds') print(
f"Table : {table.__name__} count_row : {count_row} : time took : {round(perf_counter() - st, 2)} seconds"
)
active_session.commit() active_session.commit()
active_session.flush() active_session.flush()

View File

@ -17,14 +17,14 @@ login_data = {
"access_key": "karatay.berkay.sup@evyos.com.tr", "access_key": "karatay.berkay.sup@evyos.com.tr",
"password": "string", "password": "string",
"remember_me": False, "remember_me": False,
"password_token": "z5nPguDu6PrY_94KlTGxGBCMcK6rZcDl5AGqO5aHWY7TcQF8LJGYikMQs9labvqdz5yM7vE_f8Zq_vqp00o3EnWwWCWhel-EsMcAujBKNRjV3jC_4xk0_1r_unIYogWAjz_spZipX6pncsch2ngvv0dpx4lHSiZ5QrDTA1RefQ", "password_token": ""
} }
login_data_wag = { login_data_wag = {
"domain": "evyos.com.tr", "domain": "evyos.com.tr",
"access_key": "karatay.berkay.sup@evyos.com.tr", "access_key": "karatay.berkay.sup@evyos.com.tr",
"password": "string", "password": "string",
"remember_me": False, "remember_me": False,
"password_token": "" "password_token": "",
} }
wag_api = RequestToApi() wag_api = RequestToApi()
@ -36,7 +36,7 @@ wag_api.selected_object = wag_api.login_via_email_and_password(
local_api = RequestToApi() local_api = RequestToApi()
local_api.overwrite_base_url(base_url=LocalAPI.base_url) local_api.overwrite_base_url(base_url=LocalAPI.base_url)
local_api.selected_object = local_api.login_via_email_and_password( local_api.selected_object = local_api.login_via_email_and_password(
login_data=login_data, is_password_valid=False login_data=login_data, is_password_valid=True
) )
both_apis = BothAPIS() both_apis = BothAPIS()
@ -45,6 +45,7 @@ both_apis.local_api = local_api
migrate_company(requester=both_apis) migrate_company(requester=both_apis)
migrate_people(requester=both_apis) migrate_people(requester=both_apis)
exit()
migrate_build(requester=both_apis) migrate_build(requester=both_apis)
migrate_build_area(requester=both_apis) migrate_build_area(requester=both_apis)
migrate_build_part(requester=both_apis) migrate_build_part(requester=both_apis)