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