in microservices/user_management/src/routes/discipline_association_group.py [0:0]
def update_discipline_association_status(
uuid: str,
input_association_status:UpdateDisciplineAssociationStatusModel):
"""Update status of users or associations provided in request body
in discipline association group for uuid given in path param
### Args:
uuid (str): Unique id of the association group
request_body: Required body having user/association uuid and status
that needs to be updated
NOTE: Curriculum_pathway field will correspond to discipline
and pathway will contain uuid for curriculum pathway
having alias as discipline.
### Raises:
ResourceNotFoundException: If the group does not exist
Exception: 500 Internal Server Error if something went wrong
### Returns:
UpdateDisciplineAssociationGroupResponseModel: discipline association
group Object
"""
try:
existing_association_group = AssociationGroup.find_by_uuid(uuid)
group_fields = existing_association_group.get_fields()
if not is_discipline_association_group(group_fields):
raise ValidationError(f"AssociationGroup for given uuid: {uuid} "
"is not discipline type")
input_dict = {**input_association_status.dict()}
for key, val in input_dict.items():
if key == "user" and val:
is_user_present = False
is_user_instructor = False
is_user_assessor = False
assessor_id = None
deactivate_assessor = False
for user in group_fields["users"]:
if val.get("user_id") == user["user"]:
is_user_present = True
if val.get("status") != user["status"]:
user["status"] = val["status"]
if user["user_type"] == "instructor":
is_user_instructor = True
elif user["user_type"] == "assessor":
is_user_assessor = True
assessor_id = val.get("user_id")
if user["status"] == "inactive":
deactivate_assessor = True
if not is_user_present:
raise ValidationError("User for given user_id is not present "
"in the discipline association group")
# Logic to de-activate instructor in learner association group as well
if (is_user_instructor or is_user_assessor) and \
group_fields.get("associations") and \
val.get("status") == "inactive":
# Get active curriculum_pathway_id from Discipline Group
for pathway_dict in group_fields.get("associations").get(
"curriculum_pathways"):
if pathway_dict["status"] == "active":
discipline_id = pathway_dict["curriculum_pathway_id"]
break
# Fetch all learner association groups
learner_group_fields = get_all_learner_association_groups()
if is_user_assessor and deactivate_assessor:
# Logic to remove assessor from submitted assessments
Logger.info("About to trigger update assessor reference function")
update_assessor_of_submitted_assessments_of_a_discipline(
uuid,
discipline_id,
{
"user":assessor_id
}
)
# Find Learner Association Group in which given instructor exists
learner_group = None
for group in learner_group_fields:
for instructor_dict in group.get("associations").get("instructors"):
if val["user_id"] == instructor_dict["instructor"] and \
instructor_dict["curriculum_pathway_id"] == discipline_id:
learner_group = group
break
# De-activate instructor in Learner Association Group
if learner_group:
for instructor_dict in learner_group.get(
"associations").get("instructors"):
if instructor_dict.get("instructor") == val["user_id"] and \
instructor_dict.get("status") != val["status"]:
instructor_dict["status"] = val["status"]
learner_association_group_object = AssociationGroup.find_by_uuid(
learner_group["uuid"])
for k, value in learner_group.items():
setattr(learner_association_group_object, k, value)
learner_association_group_object.update()
if key == "curriculum_pathway" and val:
is_pathway_present = False
for pathway in group_fields["associations"]["curriculum_pathways"]:
if val.get("curriculum_pathway_id") == \
pathway["curriculum_pathway_id"]:
is_pathway_present = True
if val.get("status") != pathway["status"]:
pathway["status"] = val["status"]
if pathway["status"] == "inactive":
# Logic to remove assessor from submitted assessments
msg = "About to trigger update assessor reference function"
Logger.info(msg)
update_assessor_of_submitted_assessments_of_a_discipline(
uuid,
pathway["curriculum_pathway_id"]
)
# Logic to de-activate instructor in learner association group
if val.get("status") == "inactive":
# Fetch all learner association groups
learner_group_fields = get_all_learner_association_groups()
# Find Learner Association Group in which discipline to
# de-activate exists & de-activate instructor linked to given
# discipline
for group in learner_group_fields:
for instructor_dict in group.get("associations").get(
"instructors"):
if val.get("curriculum_pathway_id") == \
instructor_dict["curriculum_pathway_id"]:
instructor_dict["status"] = val["status"]
learner_group_object = AssociationGroup.find_by_uuid(
group["uuid"])
for k, value in group.items():
setattr(learner_group_object, k, value)
learner_group_object.update()
if not is_pathway_present:
raise ValidationError(
"CurriculumPathway for given curriculum_pathway_id is not "
"present in the discipline association group")
for key, value in group_fields.items():
setattr(existing_association_group, key, value)
# Update the data
existing_association_group.update()
group_fields = existing_association_group.get_fields(
reformat_datetime=True)
return {
"success": True,
"message": "Successfully updated the association group",
"data": group_fields
}
except ResourceNotFoundException as e:
Logger.info(traceback.print_exc())
raise ResourceNotFound(str(e)) from e
except ValidationError as e:
Logger.info(traceback.print_exc())
raise BadRequest(str(e)) from e
except Exception as e:
Logger.info(traceback.print_exc())
raise InternalServerError(str(e)) from e