def get_course_assignments(course_key, user, include_access=False): """ Returns a list of assignment (at the subsection/sequential level) due dates for the given course. Each returned object is a namedtuple with fields: title, url, date, contains_gated_content, complete, past_due, assignment_type """ store = modulestore() course_usage_key = store.make_course_usage_key(course_key) block_data = get_course_blocks(user, course_usage_key, allow_start_dates_in_future=True, include_completion=True) now = datetime.now(pytz.UTC) assignments = [] for section_key in block_data.get_children(course_usage_key): for subsection_key in block_data.get_children(section_key): due = block_data.get_xblock_field(subsection_key, 'due') graded = block_data.get_xblock_field(subsection_key, 'graded', False) if not due or not graded: continue contains_gated_content = include_access and block_data.get_xblock_field( subsection_key, 'contains_gated_content', False) title = block_data.get_xblock_field(subsection_key, 'display_name', _('Assignment')) assignment_type = block_data.get_xblock_field( subsection_key, 'format', None) url = None start = block_data.get_xblock_field(subsection_key, 'start') assignment_released = not start or start < now if assignment_released: url = reverse('jump_to', args=[course_key, subsection_key]) complete = is_block_structure_complete_for_assignments( block_data, subsection_key) past_due = not complete and due < now assignments.append( _Assignment(subsection_key, title, url, due, contains_gated_content, complete, past_due, assignment_type)) return assignments
def get_course_assignments(course_key, user, include_access=False): # lint-amnesty, pylint: disable=too-many-statements """ Returns a list of assignment (at the subsection/sequential level) due dates for the given course. Each returned object is a namedtuple with fields: title, url, date, contains_gated_content, complete, past_due, assignment_type """ if not user.id: return [] store = modulestore() course_usage_key = store.make_course_usage_key(course_key) block_data = get_course_blocks(user, course_usage_key, allow_start_dates_in_future=True, include_completion=True) now = datetime.now(pytz.UTC) assignments = [] for section_key in block_data.get_children(course_usage_key): # lint-amnesty, pylint: disable=too-many-nested-blocks for subsection_key in block_data.get_children(section_key): due = block_data.get_xblock_field(subsection_key, 'due') graded = block_data.get_xblock_field(subsection_key, 'graded', False) if due and graded: first_component_block_id = get_first_component_of_block( subsection_key, block_data) contains_gated_content = include_access and block_data.get_xblock_field( subsection_key, 'contains_gated_content', False) title = block_data.get_xblock_field(subsection_key, 'display_name', _('Assignment')) assignment_type = block_data.get_xblock_field( subsection_key, 'format', None) url = None start = block_data.get_xblock_field(subsection_key, 'start') assignment_released = not start or start < now if assignment_released: url = reverse('jump_to', args=[course_key, subsection_key]) complete = is_block_structure_complete_for_assignments( block_data, subsection_key) past_due = not complete and due < now assignments.append( _Assignment(subsection_key, title, url, due, contains_gated_content, complete, past_due, assignment_type, None, first_component_block_id)) # Load all dates for ORA blocks as separate assignments descendents = block_data.get_children(subsection_key) while descendents: descendent = descendents.pop() descendents.extend(block_data.get_children(descendent)) if block_data.get_xblock_field(descendent, 'category', None) == 'openassessment': graded = block_data.get_xblock_field( descendent, 'graded', False) has_score = block_data.get_xblock_field( descendent, 'has_score', False) weight = block_data.get_xblock_field( descendent, 'weight', 1) if not (graded and has_score and (weight is None or weight > 0)): continue all_assessments = [{ 'name': 'submission', 'due': block_data.get_xblock_field(descendent, 'submission_due'), 'start': block_data.get_xblock_field(descendent, 'submission_start'), 'required': True }] valid_assessments = block_data.get_xblock_field( descendent, 'valid_assessments') if valid_assessments: all_assessments.extend(valid_assessments) assignment_type = block_data.get_xblock_field( descendent, 'format', None) complete = is_block_structure_complete_for_assignments( block_data, descendent) block_title = block_data.get_xblock_field( descendent, 'title', _('Open Response Assessment')) for assessment in all_assessments: due = parse_date(assessment.get('due')).replace(tzinfo=pytz.UTC) if assessment.get('due') else None # lint-amnesty, pylint: disable=line-too-long if due is None: continue assessment_name = assessment.get('name') if assessment_name is None: continue if assessment_name == 'self-assessment': assessment_type = _("Self Assessment") elif assessment_name == 'peer-assessment': assessment_type = _("Peer Assessment") elif assessment_name == 'staff-assessment': assessment_type = _("Staff Assessment") elif assessment_name == 'submission': assessment_type = _("Submission") else: assessment_type = assessment_name title = f"{block_title} ({assessment_type})" url = '' start = parse_date(assessment.get('start')).replace(tzinfo=pytz.UTC) if assessment.get('start') else None # lint-amnesty, pylint: disable=line-too-long assignment_released = not start or start < now if assignment_released: url = reverse('jump_to', args=[course_key, descendent]) past_due = not complete and due and due < now first_component_block_id = str(descendent) assignments.append( _Assignment( descendent, title, url, due, False, complete, past_due, assignment_type, _("Open Response Assessment due dates are set by your instructor and can't be shifted." ), first_component_block_id, )) return assignments