def check_copy_course_alpha()

in microservices/lms/src/services/section_service.py [0:0]


def check_copy_course_alpha(original_courseworks,
                      original_coursework_materials,
                      copied_course,
                      lms_job_id, section_id,course_template_id):

  """
  This function checks if the copy course process is completed successfully
  It returns a boolean error flag if the error flag is True then copy course
  process had errors It can be missing coursework or coursework attachments
  """

  lms_job = LmsJob.find_by_id(lms_job_id)
  logs = lms_job.logs
  try:
    count = 0
    max_count = 3
    original_coursework_titles = sort_titles(original_courseworks)
    original_coursework_dict =  make_title_key_coursework(original_courseworks)
    original_coursework_material_titles = sort_titles(
      original_coursework_materials)
    original_coursework_material_dict =  make_title_key_coursework(
      original_coursework_materials)
    duplicate_coursework=[]
    duplicate_coursework_material=[]
    duplicate_coursework = [
    title for title in original_coursework_titles
      if original_coursework_titles.count(title) > 1]
    duplicate_coursework_material = [
    title for title in original_coursework_material_titles
      if original_coursework_material_titles.count(title) > 1]
    if duplicate_coursework or duplicate_coursework_material:
      Logger.error(
        f"Given course has duplicate coursework {duplicate_coursework}\
                  Duplicate coursework Material{duplicate_coursework_material}")
      logs["errors"].append(
        f"Given course has duplicate coursework {duplicate_coursework}\
                  Duplicate coursework Material{duplicate_coursework_material}")
      lms_job.logs = logs
      lms_job.update()
      error_flag =True
      return error_flag

    original_coursework_titles = set(original_coursework_titles)
    original_coursework_material_titles = set(original_coursework_material_titles)

    while count<max_count :
      Logger.info(f"Iteration  count {count} to verify copy_course process")
      logs["info"].append(f"Iteration  count {count} to verify copy_course process")
      time.sleep(240)
      count+=1
      error_flag = False
      copied_courseworks = classroom_crud.get_coursework_list(
        copied_course["id"],"DRAFT")
      copied_coursework_materials = classroom_crud.get_coursework_material_list(
            copied_course["id"],"DRAFT")

      # Get course title
      # Todo : Seperate these two conditions
      if copied_courseworks is None :
        Logger.error("Courseworks not copied ")
        logs["errors"].append("Courseworks not copied ")
        error_flag = True
        continue
      if copied_coursework_materials is None:
        Logger.error("Coursework material not copied ")
        logs["errors"].append("Coursework material not copied ")
        error_flag = True
        continue
      copied_coursework_titles = sort_titles(copied_courseworks)
      copied_coursework_material_titles = sort_titles(copied_coursework_materials)
      copied_coursework_titles = set(copied_coursework_titles)
      copied_coursework_material_titles = set(copied_coursework_material_titles)
      missing_coursework =[]
      missing_coursework_material = []
      title_mismatch_coursework = []
      title_mismatch_coursework_material =[]

      if copied_coursework_titles != original_coursework_titles:
        error_flag = True
        Logger.error("Length of coursework are not  matching")
        logs["errors"].append("Length of coursework are not  matching")
        missing_coursework = original_coursework_titles - copied_coursework_titles
        title_mismatch_coursework = copied_coursework_titles - original_coursework_titles

        if title_mismatch_coursework or missing_coursework:
          logs["errors"].append(f"Missing courseworks are {missing_coursework} or \
                                Title mismatch are {title_mismatch_coursework}")
          Logger.error(f"Missing courseworks are {missing_coursework} or\
                        Title mismatch are {title_mismatch_coursework}")

      if copied_coursework_material_titles != original_coursework_material_titles:
        error_flag = True
        Logger.error("Length of coursework Material are not matching")
        logs["errors"].append("Length of coursework Material are not  matching")
        missing_coursework_material = original_coursework_material_titles -\
            copied_coursework_material_titles
        title_mismatch_coursework_material =copied_coursework_material_titles -\
                                        original_coursework_material_titles
        if missing_coursework_material or title_mismatch_coursework_material:
          logs["errors"].append(
          f"Missing courseworks are {missing_coursework_material} or \
            Title mismatch are {title_mismatch_coursework_material}")
          Logger.error(f"Missing courseworks are {missing_coursework_material} or\
                        Title mismatch are {title_mismatch_coursework_material}")

      lms_job.logs = logs
      lms_job.update()

      # If there is mistmatch in coursework name or coursework name continue to wait
      if error_flag:
        continue

      # make_title_key_coursework function takes the list of coursework or coursework
      # material and returns a dictionary with keys as title and coursework_details as value
      copied_coursework_dict = make_title_key_coursework(
        copied_courseworks)
      copied_coursework_material_dict = make_title_key_coursework(
        copied_coursework_materials)
      for coursework_title in original_coursework_titles:
        missing_attachment=[]
        if "materials" in original_coursework_dict[coursework_title]:
          missing_attachment = verifiy_attachment(coursework_title,
                                                  original_coursework_dict,
                                                  copied_coursework_dict,
                                                  lms_job_id
                                                  )

        lms_job = LmsJob.find_by_id(lms_job_id)
        logs = lms_job.logs
        if missing_attachment:
          Logger.error(f"Missing attachment are {coursework_title} {missing_attachment }")
          logs["errors"].append(f"Missing attachment are {coursework_title} {missing_attachment }")
          error_flag=True
        else:
          logs["info"].append(f"No Missing attachment for {coursework_title}")
          Logger.info(f"No Missing attachment for {coursework_title}")
        lms_job.logs = logs
        lms_job.update()
        Logger.info("")
      #Errror in copying coursework attachments restart wait loop
      for coursework_material_title in original_coursework_material_titles:
        missing_attachment=[]
        if "materials" in original_coursework_material_dict[coursework_material_title]:
          missing_attachment = verifiy_attachment(coursework_material_title,
                                                  original_coursework_material_dict,
                                                  copied_coursework_material_dict,
                                                  lms_job_id)

        lms_job = LmsJob.find_by_id(lms_job_id)
        logs = lms_job.logs
        if  missing_attachment:
          Logger.error(f"Missing attachment are {coursework_material_title} {missing_attachment}")
          logs["errors"].append(f"Missing attachment are {coursework_material_title} {missing_attachment}")
          error_flag=True
        else :
          logs["info"].append(f"No Missing attachment for {coursework_material_title}")
          Logger.info(f" No Missing attachment for {coursework_material_title}")
        lms_job.logs = logs
        lms_job.update()
      if error_flag:
        continue
      else:
        break

    logs = lms_job.logs
    if not error_flag:
      for coursework in copied_courseworks:
        coursework_title = coursework["title"]

        lti_assignment_details = {
            "section_id": section_id,
            "coursework_title": coursework_title,
            "coursework_id": coursework["id"],
            "source_context_id": course_template_id,
            "start_date": None,
            "end_date": None,
            "due_date": None
        }
        material_update = False
        if "materials" in coursework.keys():
          for material in coursework["materials"]:
            if "link" in material.keys():
              link = material["link"]
              if "/classroom-shim/api/v1/launch?lti_assignment_id=" in link["url"]:
                copy_resp = copy_lti_shim_assignment(link["url"], lti_assignment_details, logs)
                logs = copy_resp["logs"]
                if copy_resp.get("copy_resp_status") == 200:
                  material_update = True
                  material["link"]["url"] = copy_resp.get("updated_lti_link")
                else:
                  error_flag = True
        try:
          updated_data = {"state": "PUBLISHED"}
          if "dueDate" in original_coursework_dict[coursework_title].keys():
            updated_data["dueDate"] = original_coursework_dict[coursework_title].get(
              "dueDate")
            if "dueTime" in original_coursework_dict[coursework_title].keys()  :
              updated_data["dueTime"]=original_coursework_dict[coursework_title].get("dueTime")
            else:
              updated_data["dueTime"]={
                "hours": 23,
                "minutes": 59,
                "seconds": 0
              }
          if material_update:
            updated_data["materials"] = coursework["materials"]
          update_mask = ",".join(updated_data)
          classroom_crud.patch_coursework_alpha(copied_course["id"],
                                                coursework["id"], update_mask,
                                                updated_data)
          logs["info"].append(f"Coursework published for {coursework_title}")
          Logger.info(f"Coursework published for {coursework_title}")
        except HttpError as error:
          Logger.error(error)
          error_flag=True
          logs["errors"].append(
            f"Coursework state update failed for {coursework_title}\
                                {error}")

      for coursework_material in copied_coursework_materials:
        coursework_material_title = coursework_material["title"]

        lti_assignment_details = {
            "section_id": section_id,
            "coursework_title": coursework_material_title,
            "coursework_id": coursework_material["id"],
            "source_context_id": course_template_id,
            "start_date": None,
            "end_date": None,
            "due_date": None
        }
        material_update = False
        if "materials" in coursework_material.keys():
          for material in coursework_material["materials"]:
            if "link" in material.keys():
              link = material["link"]
              if "/classroom-shim/api/v1/launch?lti_assignment_id=" in link["url"]:
                copy_resp = copy_lti_shim_assignment(link["url"], lti_assignment_details, logs)
                logs = copy_resp["logs"]
                if copy_resp.get("copy_resp_status") == 200:
                  material_update = True
                  material["link"]["url"] = copy_resp.get("updated_lti_link")
                else:
                  error_flag = True
        try:
          updated_data = {"state": "PUBLISHED"}
          if material_update:
            updated_data["materials"] = coursework_material["materials"]
          update_mask = ",".join(updated_data)
          classroom_crud.patch_coursework_material_alpha(
              copied_course["id"], coursework_material["id"], update_mask,
              updated_data)
          logs["info"].append(
            f"Coursework Material published for {coursework_material_title}")
          Logger.info(
            f"Coursework Material published for {coursework_material_title}")
        except HttpError as error:
          Logger.error(error)
          logs["errors"].append(
            f"Coursework Material state update failed for {coursework_material_title}\
                                {error}")


    logs["info"].append(
    f"Error flag to check copied items in copy course alpha is {error_flag}")
    lms_job.logs=logs
    lms_job.update()
    return error_flag
  except Exception as e:
    error = traceback.format_exc().replace("\n", " ")
    Logger.error(f"Error in check copy course -{error} {e}")
    logs["errors"].append(f"Error in check copy course -{error}")
    lms_job.logs =logs
    lms_job.update()
    return True