예제 #1
0
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
예제 #2
0
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