def update_discipline_association_status()

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