コード例 #1
0
def course_selection(request):
    canvas_user_id = request.LTI['custom_canvas_user_id']
    ci_filters = {key: request.GET.get(key, '') for key in COURSE_INSTANCE_FILTERS}

    try:
        school = get_school_data_for_user(canvas_user_id, ci_filters['school'])
        term = get_term_data(ci_filters['term'])
    except KeyError:
        redirect('bulk_site_creation:index')

    (account_type, school_id) = canvas_api_accounts.parse_canvas_account_id(school['id'])
    canvas_site_templates = get_canvas_site_templates_for_school(school_id)

    account = school
    department = {}
    if ci_filters['department']:
        department = get_department_data_for_school(canvas_user_id, school['id'], ci_filters['department'])
        account = department
    course_group = {}
    if ci_filters['course_group']:
        course_group = get_course_group_data_for_school(canvas_user_id, school['id'], ci_filters['course_group'])
        account = course_group

    ci_query_set = get_course_instance_query_set(term['id'], account['id'])
    course_instance_summary = get_course_instance_summary_data(ci_query_set)

    return render(request, 'bulk_site_creation/course_selection.html', {
        'filters': ci_filters,
        'school': school,
        'term': term,
        'department': department,
        'course_group': course_group,
        'canvas_site_templates': canvas_site_templates,
        'course_instance_summary': course_instance_summary
    })
コード例 #2
0
def index(request):
    start_time = time.time()

    sis_account_id = request.LTI['custom_canvas_account_sis_id']
    ci_filters = {key: request.GET.get(key, '')
                  for key in COURSE_INSTANCE_FILTERS}
    (account_type, local_id) = canvas_api_accounts.parse_canvas_account_id(sis_account_id)
    schools = []
    terms = []
    departments = []
    course_groups = []
    school = None

    # Proceed only for valid account types
    if account_type in canvas_api_accounts.ACCOUNT_TYPES:

        # If user is in context Department or Course Group, display a
        # message conveying restricted access
        if (account_type == canvas_api_accounts.ACCOUNT_TYPE_DEPARTMENT or
            account_type == canvas_api_accounts.ACCOUNT_TYPE_COURSE_GROUP):
            return render(request, 'canvas_site_creator/restricted_access.html',
                          status=403)

        # We are in the context of a SIS type account, so limit options to that
        # context
        s = School.objects.get(pk=local_id)
        school = {
            'id': sis_account_id,
            'name': s.title_short,
        }

        ci_filters[canvas_api_accounts.ACCOUNT_TYPE_SCHOOL] = school['id']
        schools.append(school)

    # if schools size is zero(includes improperly formatted account_type),
    # display unauthorized message
    if len(schools) == 0:
        return redirect('not_authorized')
    if school:
        # Populate term, department, and course_group filter options if we already have a school
        school_sis_account_id = school['id']

        terms, current_term_id = get_term_data_for_school(school_sis_account_id)
        if current_term_id:
            ci_filters['term'] = current_term_id
        if not departments and not course_groups:
            departments = get_department_data_for_school(school_sis_account_id)
            course_groups = get_course_group_data_for_school(school_sis_account_id)
    context = {
        'course_groups': course_groups,
        'departments': departments,
        'filters': ci_filters,
        'in_school_account': (account_type ==
                                  canvas_api_accounts.ACCOUNT_TYPE_SCHOOL),
        'schools': schools,
        'terms': terms,
    }
    logger.debug(" --------->Initial load of the Site creator view took : %s seconds" % (time.time() - start_time))
    return render(request, 'canvas_site_creator/index.html', context)
コード例 #3
0
def index(request):
    canvas_user_id = request.LTI['custom_canvas_user_id']
    sis_account_id = request.LTI['custom_canvas_account_sis_id']
    ci_filters = {key: request.GET.get(key, '') for key in COURSE_INSTANCE_FILTERS}
    (account_type, _) = canvas_api_accounts.parse_canvas_account_id(sis_account_id)
    schools = []
    terms = []
    departments = []
    course_groups = []
    school = None

    if account_type in canvas_api_accounts.ACCOUNT_TYPES:
        # We are in the context of a SIS type account, so limit options to that context
        school_id = sis_account_id
        if account_type == canvas_api_accounts.ACCOUNT_TYPE_DEPARTMENT:
            department = canvas_api_accounts.get_account_by_sis_account_id(canvas_user_id, sis_account_id)
            department_id = department['sis_account_id']
            school_id = department['parent_account_id']
            ci_filters[canvas_api_accounts.ACCOUNT_TYPE_COURSE_GROUP] = department_id
            departments.append(get_department_data_for_school(canvas_user_id, school_id, department_id))
        elif account_type == canvas_api_accounts.ACCOUNT_TYPE_COURSE_GROUP:
            course_group = canvas_api_accounts.get_account_by_sis_account_id(canvas_user_id, sis_account_id)
            course_group_id = course_group['sis_account_id']
            school_id = course_group['parent_account_id']
            ci_filters[canvas_api_accounts.ACCOUNT_TYPE_COURSE_GROUP] = course_group_id
            course_groups.append(get_course_group_data_for_school(canvas_user_id, school_id, course_group_id))
        school = get_school_data_for_user(canvas_user_id, school_id)
        ci_filters[canvas_api_accounts.ACCOUNT_TYPE_SCHOOL] = school['id']
        schools.append(school)
    else:
        # We are outside the context of a SIS type account, so show all schools
        # that the user has permission to create courses for
        schools = get_school_data_for_user(canvas_user_id)
        school_sis_account_id = ci_filters.get('school')
        if school_sis_account_id:
            school = get_school_data_for_user(canvas_user_id, school_sis_account_id)

    if len(schools) == 0:
        return redirect('not_authorized')

    if school:
        # Populate term, department, and course_group filter options if we already have a school
        school_sis_account_id = school['id']
        terms = get_term_data_for_school(school_sis_account_id)
        if not departments and not course_groups:
            departments = get_department_data_for_school(canvas_user_id, school_sis_account_id)
            course_groups = get_course_group_data_for_school(canvas_user_id, school_sis_account_id)

    return render(request, 'bulk_site_creation/index.html', {
        'filters': ci_filters,
        'schools': schools,
        'terms': terms,
        'departments': departments,
        'course_groups': course_groups
    })
コード例 #4
0
def create_job(request):
    canvas_user_id = request.LTI['custom_canvas_user_id']
    logged_in_user_id = request.LTI['lis_person_sourcedid']
    data = json.loads(request.POST['data'])

    template_canvas_course_id = data.get('template')
    filters = data['filters']
    term = filters.get('term')

    school_account_id = filters['school']
    account_id = school_account_id
    (account_type, school_id) = canvas_api_accounts.parse_canvas_account_id(school_account_id)

    department = None
    department_account_id = filters.get('department')
    if department_account_id:
        account_id = department_account_id
        (account_type, department) = department_account_id.split(':')

    course_group = None
    course_group_account_id = filters.get('course_group')
    if course_group_account_id:
        account_id = course_group_account_id
        (account_type, course_group) = course_group_account_id.split(':')

    # Check permissions for selected account
    if not canvas_api_accounts.has_permission(
            canvas_user_id, account_id, canvas_api_accounts.ACCOUNT_PERMISSION_MANAGE_COURSES):
        logger.info(
            'Failed to create bulk job for user %s and account %s: Missing %s permission',
            canvas_user_id,
            account_id,
            canvas_api_accounts.ACCOUNT_PERMISSION_MANAGE_COURSES
        )
        raise PermissionDenied

    created_by_user_id = logged_in_user_id
    if not created_by_user_id:
        created_by_user_id = "canvas_user_id:%s" % canvas_user_id

    create_bulk_job_kwargs = {
        'school_id': school_id,
        'sis_term_id': int(term),
        'sis_department_id': int(department) if department else None,
        'sis_course_group_id': int(course_group) if course_group else None,
        'template_canvas_course_id': template_canvas_course_id,
        'created_by_user_id': created_by_user_id,
        'course_instance_ids': data['course_instance_ids']
    }

    bulk_job = BulkCanvasCourseCreationJob.objects.create_bulk_job(**create_bulk_job_kwargs)

    return redirect('bulk_site_creation:bulk_job_detail', bulk_job.id)
コード例 #5
0
def create_job(request):
    canvas_user_id = request.LTI['custom_canvas_user_id']
    logged_in_user_id = request.LTI['lis_person_sourcedid']
    data = json.loads(request.POST['data'])

    template_canvas_course_id = data.get('template')
    filters = data['filters']
    term = filters.get('term')

    school_account_id = filters['school']
    (account_type, school_id) = canvas_api_accounts.parse_canvas_account_id(school_account_id)

    department = None
    department_account_id = filters.get('department')
    if department_account_id:
        (account_type, department) = department_account_id.split(':')

    course_group = None
    course_group_account_id = filters.get('course_group')
    if course_group_account_id:
        (account_type, course_group) = course_group_account_id.split(':')

    created_by_user_id = logged_in_user_id
    if not created_by_user_id:
        created_by_user_id = "canvas_user_id:%s" % canvas_user_id

    # If the create_all flag has been set and passed with the form,
    # then create a query to get the all course instances with the applied filters that are to be created.
    course_instance_ids = []
    if data.get('create_all', False):
        # Get the account data to be used in the course instance query.
        if filters['course_group']:
            account = filters['course_group']
        elif filters['department']:
            account = filters['department']
        else:
            account = filters['school']

        # Retrieve all course instances for the given term and account that do not have Canvas course sites.
        ci_query_set_without_canvas = get_course_instance_query_set(term, account).filter(canvas_course_id__isnull=True)

        # Iterate through the query set to build a list of all the course instance id's
        # for a school/course_group/department, which course sites will be created for.
        for ci in ci_query_set_without_canvas:
            course_instance_ids.append(ci.course_instance_id)
    else:
        course_instance_ids = data['course_instance_ids']

    create_bulk_job_kwargs = {
        'school_id': school_id,
        'sis_term_id': int(term),
        'sis_department_id': int(department) if department else None,
        'sis_course_group_id': int(course_group) if course_group else None,
        'template_canvas_course_id': template_canvas_course_id,
        'created_by_user_id': created_by_user_id,
        'course_instance_ids': course_instance_ids
    }

    bulk_job = BulkCanvasCourseCreationJob.objects.create_bulk_job(**create_bulk_job_kwargs)

    return redirect('canvas_site_creator:bulk_job_detail', bulk_job.id)
コード例 #6
0
def audit(request):
    canvas_user_id = request.LTI['custom_canvas_user_id']
    sis_account_id = request.LTI['custom_canvas_account_sis_id']
    (account_type, account_id) = canvas_api_accounts.parse_canvas_account_id(sis_account_id)

    filter_kwargs = {}
    if account_type == canvas_api_accounts.ACCOUNT_TYPE_SCHOOL:
        filter_kwargs['school_id'] = account_id
    elif account_type == canvas_api_accounts.ACCOUNT_TYPE_DEPARTMENT:
        filter_kwargs['sis_department_id'] = account_id
    elif account_type == canvas_api_accounts.ACCOUNT_TYPE_COURSE_GROUP:
        filter_kwargs['sis_course_group_id'] = account_id

    query_set = BulkCanvasCourseCreationJob.objects.filter(**filter_kwargs).order_by('-created_at')

    jobs = []
    creator_ids = set()
    school_ids = set()
    term_ids = set()
    department_ids = set()
    course_group_ids = set()
    for bulk_job in query_set:
        jobs.append(bulk_job)
        creator_ids.add(bulk_job.created_by_user_id)
        school_ids.add(bulk_job.school_id)
        term_ids.add(bulk_job.sis_term_id)
        if bulk_job.sis_department_id:
            department_ids.add(bulk_job.sis_department_id)
        if bulk_job.sis_course_group_id:
            course_group_ids.add(bulk_job.sis_course_group_id)

    creators = {p.univ_id: p for p in Person.objects.filter(univ_id__in=creator_ids)}
    schools = School.objects.in_bulk(school_ids)
    terms = Term.objects.in_bulk(term_ids)
    departments = {}
    if department_ids:
        departments = {
            id: name for id, name in Department.objects.filter(
                department_id__in=department_ids
            ).values_list('department_id', 'name')
        }
    course_groups = {}
    if course_group_ids:
        course_groups = {
            id: name for id, name in CourseGroup.objects.filter(
                course_group_id__in=course_group_ids
            ).values_list('course_group_id', 'name')
        }

    bulk_job_data = []
    for bulk_job in jobs:
        try:
            creator = creators[bulk_job.created_by_user_id]
            creator_name = "%s, %s" % (creator.name_last, creator.name_first)
        except KeyError:
            # Bulk job creator could not be found
            logger.warning("Failed to find bulk canvas site job creator %s", bulk_job.created_by_user_id)
            creator_name = ''

        school = schools[bulk_job.school_id]
        term = terms[bulk_job.sis_term_id]
        department = ''
        if bulk_job.sis_department_id:
            department = departments[bulk_job.sis_department_id]
        course_group = ''
        if bulk_job.sis_course_group_id:
            course_group = course_groups[bulk_job.sis_course_group_id]
        template_canvas_course = get_canvas_site_template(school.school_id, bulk_job.template_canvas_course_id)

        bulk_job_data.append({
            'id': bulk_job.id,
            'created_at': timezone.localtime(bulk_job.created_at).strftime('%b %d, %Y %H:%M:%S'),
            'status': bulk_job.status_display_name,
            'created_by': creator_name,
            'term': term.display_name,
            'school': school.title_short,
            'subaccount': department if department else course_group,
            'template_canvas_course': template_canvas_course,
            'count_course_jobs': CanvasCourseGenerationJob.objects.filter(bulk_job_id=bulk_job.id).count()
        })

    return render(request, 'canvas_site_creator/audit.html', {
        'bulk_job_data': bulk_job_data
    })
コード例 #7
0
def audit(request):
    canvas_user_id = request.LTI['custom_canvas_user_id']
    sis_account_id = request.LTI['custom_canvas_account_sis_id']
    (account_type, account_id) = canvas_api_accounts.parse_canvas_account_id(sis_account_id)

    filter_kwargs = {}
    if account_type == canvas_api_accounts.ACCOUNT_TYPE_SCHOOL:
        filter_kwargs['school_id'] = account_id
    elif account_type == canvas_api_accounts.ACCOUNT_TYPE_DEPARTMENT:
        filter_kwargs['sis_department_id'] = account_id
    elif account_type == canvas_api_accounts.ACCOUNT_TYPE_COURSE_GROUP:
        filter_kwargs['sis_course_group_id'] = account_id

    query_set = BulkCanvasCourseCreationJob.objects.filter(**filter_kwargs).order_by('-created_at')

    jobs = []
    creator_ids = set()
    school_ids = set()
    term_ids = set()
    department_ids = set()
    course_group_ids = set()
    for bulk_job in query_set:
        jobs.append(bulk_job)
        creator_ids.add(bulk_job.created_by_user_id)
        school_ids.add(bulk_job.school_id)
        term_ids.add(bulk_job.sis_term_id)
        if bulk_job.sis_department_id:
            department_ids.add(bulk_job.sis_department_id)
        if bulk_job.sis_course_group_id:
            course_group_ids.add(bulk_job.sis_course_group_id)

    creators = {p.univ_id: p for p in Person.objects.filter(univ_id__in=creator_ids)}
    schools = School.objects.in_bulk(school_ids)
    terms = Term.objects.in_bulk(term_ids)
    departments = {}
    if department_ids:
        departments = {
            id: name for id, name in Department.objects.filter(
                department_id__in=department_ids
            ).values_list('department_id', 'name')
        }
    course_groups = {}
    if course_group_ids:
        course_groups = {
            id: name for id, name in CourseGroup.objects.filter(
                course_group_id__in=course_group_ids
            ).values_list('course_group_id', 'name')
        }

    bulk_job_data = []
    for bulk_job in jobs:
        try:
            creator = creators[bulk_job.created_by_user_id]
            creator_name = "%s, %s" % (creator.name_last, creator.name_first)
        except KeyError:
            # Bulk job creator could not be found
            logger.warning("Failed to find bulk canvas site job creator %s", bulk_job.created_by_user_id)
            creator_name = ''

        school = schools[bulk_job.school_id]
        term = terms[bulk_job.sis_term_id]
        department = ''
        if bulk_job.sis_department_id:
            department = departments[bulk_job.sis_department_id]
        course_group = ''
        if bulk_job.sis_course_group_id:
            course_group = course_groups[bulk_job.sis_course_group_id]
        template_canvas_course = get_canvas_site_template(school.school_id, bulk_job.template_canvas_course_id)

        bulk_job_data.append({
            'id': bulk_job.id,
            'created_at': timezone.localtime(bulk_job.created_at).strftime('%b %d, %Y %H:%M:%S'),
            'status': bulk_job.status_display_name,
            'created_by': creator_name,
            'term': term.display_name,
            'school': school.title_short,
            'subaccount': department if department else course_group,
            'template_canvas_course': template_canvas_course,
            'count_course_jobs': CanvasCourseGenerationJob.objects.filter(bulk_job_id=bulk_job.id).count()
        })

    return render(request, 'bulk_site_creation/audit.html', {
        'bulk_job_data': bulk_job_data
    })