(20260404) Team fixing on TCAOFF completed.

This commit is contained in:
2026-04-04 12:57:28 +05:30
parent 1102b826da
commit 6838648a92
2 changed files with 132 additions and 30 deletions
+56 -29
View File
@@ -125,41 +125,49 @@ def enlist_teams_to_fix(
cosec_team_list: list,
) -> list:
"""
Gives you a list of TCAOFF team members whose Cosec details are missing or malformed.
This does NOT enlist missing names. Th efocus of this function is only fixing.
:param tcaoff_team_list: The list of team members from TCAOFF's '/team/list' API.
:param cosec_team_list: The list of team members from Cosec's Muster Roll report.
:return: The list of TCAOFF team members with read-to-use correct data.
"""
# Prepare the variables:
teams_to_fix = []
cosec_id_to_cosec_team_map = {ct["User ID"]: ct for ct in cosec_team_list}
print("COSEC_MAP:", json.to_string(cosec_id_to_cosec_team_map))
for tt in tcaoff_team_list:
# Start by assuming everything is alright,
# then extract the notes:
need_to_sync = False
# Extract Cosec notes:
json_notes = json.from_string(tt.get("json_notes", "{}"))
applicant_notes = json_notes.get("applicantNotes") or {}
cosec_notes = applicant_notes.get("cosec") or {}
# Now check if any fix is required:
# Now check if any fix is required.
# Fixes will be required when:
# 1. The team member is present in TCAOFF,
# 2. the team member either has no cosec notes, or the notes are malformed.
user_id = cosec_notes.get("User ID", cosec_notes.get("UserID"))
if not user_id:
print("NEED TO FIX:", f"{tt['full_name']} ({tt['pseudonym']})")
# if tt['pseudonym'] == "VIS07070":
# print("RAKESH:", json.to_string(tt))
# print("RAKESH:", user_id)
# print("RAKESH:", json.to_string(cosec_notes))
if (valid_cose_notes := cosec_id_to_cosec_team_map.get(tt["pseudonym"])) is not None:
applicant_notes["cosec"] = valid_cose_notes
tt.update({"applicantNotes": applicant_notes})
teams_to_fix.append(tt)
# Done here:
return teams_to_fix
# ---------------------------------------------------------------------------------------------------------------------
def enlist_missing_teams(
tcaoff_team_list: list,
cosec_team_list: list
) -> list:
pass
# def enlist_missing_teams(
# tcaoff_team_list: list,
# cosec_team_list: list
# ) -> list:
#
# pass
# ---------------------------------------------------------------------------------------------------------------------
@@ -172,6 +180,16 @@ async def manual_team_sync(
test_mode: bool = False,
) -> None:
"""
To manually sync. teams between Cosec (source) and TCAOFF (dest).
:param cosec_creds: The credentials to log into Cosec.
:param tcaoff_client: The credentials to log into TCAOFF.
:param on_date: The date for which the teams need to be synchronized. That day's Cosec Muster Roll will be fetched
and those records will be sync'd.
:param test_mode: Enable this during development or local testing.
:return: None.
"""
printer("MANUAL TEAM SYNC")
# Try the whole process once:
@@ -188,26 +206,35 @@ async def manual_team_sync(
now = date_time.get_current_ist_date_time()
if not on_date: on_date = now
# # Get the previous day's In/Out Summary and then wait
# # for the driver's resources to get freed:
# success = common.get_muster_roll(
# cosec_creds = cosec_creds,
# on_date = on_date,
# cache_file = common.get_manual_muster_roll_cache_file_path,
# test_mode = test_mode
# )
# Get the previous day's In/Out Summary and then wait
# for the driver's resources to get freed:
success = common.get_muster_roll(
cosec_creds = cosec_creds,
on_date = on_date,
cache_file = common.get_manual_muster_roll_cache_file_path,
test_mode = test_mode
)
success = True
# Sync data between Cosec and TCAOFF:
if success:
# --- Data Fetch:
printer("MUSTER ROLL: Sync'ing with TCAOFF")
print("SYNC FROM:", common.get_manual_muster_roll_cache_file_path())
cosec_teams = json.from_file(common.get_manual_muster_roll_cache_file_path())["report"]
# print("COSEC:", json.to_string(cosec_teams))
tcaoff_teams = await tcaoff_client.team_list()
# print("TCAOFF:", json.to_string(tcaoff_teams))
# ---
# --- Team Fix:
teams_to_fix = enlist_teams_to_fix(tcaoff_teams, cosec_teams)
for t in teams_to_fix:
printer("Fixing", t["user_id"], t["full_name"])
await tcaoff_client.team_update(
user_id = t["user_id"],
dept_id = t["department_id"],
team_name = t["full_name"],
email = t["email"],
phone_no = t["phone_number"],
role = t["role"],
applicant_notes = t["applicantNotes"],
)
# If something goes wrong in the COSEC step:
+76 -1
View File
@@ -531,7 +531,7 @@ class AsyncTheCAOffice:
role: str,
username: str,
password: str,
applicant_notes: dict | list | str = None,
applicant_notes: dict | list = None,
raise_exception: bool = False,
) -> bool:
@@ -604,6 +604,81 @@ class AsyncTheCAOffice:
# Done here:
return success
async def team_update(
self,
user_id: int,
dept_id: int,
team_name: str,
email: str,
phone_no: str,
role: str,
applicant_notes: dict | list | str = None,
raise_exception: bool = False,
) -> bool:
"""
Update an existing team member.
:param user_id: The id of the team member.
:param dept_id: The id of the department that this team member is working in.
:param team_name: The name of the team member. This is the full display name. Can be the same as others.
:param email: The email id of the team member.
:param phone_no: The phone no. of the team member.
:param role: The role of the team member in the organization.
:param applicant_notes: Optional notes about the team member.
:param raise_exception: Whether to raise any exceptions, or to suppress them.
:return: True if successful, else False.
"""
# Start by assuming failure:
success = False
try:
# Make the API call:
response = await self._http_client.post(
url = self.TEAM_UPDATE_URL,
headers = {"X-Session-Token": self.__session_token},
json = {
"idUser": user_id,
"idDepartment": dept_id,
"name": team_name,
"email": email,
"phoneNo": phone_no,
"role": role,
"hierarchy": 1,
"applicantNotes": applicant_notes
}
)
# If the call succeeded:
if response.status_code in [200]:
self._printer(
"Team updated.",
user_id,
team_name,
)
success = True
# If the call failed:
else:
response_json = response.json()
self._err_printer(
"Team NOT updated.",
user_id,
team_name,
response_json
)
success = False
# If something goes wrong:
except Exception as exception:
self._err_printer("Team NOT updated.", exception)
if raise_exception: raise
success = False
# Done here:
return success
# ┏┓ ┓
# ┣┫╋╋┏┓┏┓┏┫┏┓┏┓┏┏┓
# ┛┗┗┗┗ ┛┗┗┻┗┻┛┗┗┗