Exemplo n.º 1
0
def upload(request):
    course_prefix = request.POST.get("course_prefix")
    course_suffix = request.POST.get("course_suffix")
    common_page_data = get_common_page_data(request, course_prefix, course_suffix)

    if request.method == "POST":
        form = FileUploadForm(request.POST, request.FILES, course=common_page_data["course"])
        if form.is_valid():
            new_file = form.save(commit=False)
            new_file.course = common_page_data["course"]
            new_file.index = new_file.section.getNextIndex()
            new_file.mode = "draft"
            new_file.handle = course_prefix + "--" + course_suffix

            new_file.save()
            new_file.create_ready_instance()

            create_contentgroup_entries_from_post(
                request, "parent", new_file.image, "file", request.POST.get("display_style", "list")
            )

            return redirect("courses.views.course_materials", course_prefix, course_suffix)
    else:
        form = FileUploadForm(course=common_page_data["course"])
    reverseview = "courses.files.actions.upload"

    return render(
        request, "files/upload.html", {"reverseview": reverseview, "common_page_data": common_page_data, "form": form}
    )
Exemplo n.º 2
0
def upload(request):
    course_prefix = request.POST.get("course_prefix")
    course_suffix = request.POST.get("course_suffix")
    common_page_data = get_common_page_data(request, course_prefix, course_suffix)

    if request.method == "POST":
        form = FileUploadForm(request.POST, request.FILES, course=common_page_data['course'])
        if form.is_valid():
            new_file = form.save(commit=False)
            new_file.course = common_page_data['course']
            new_file.index = new_file.section.getNextIndex()
            new_file.mode = 'draft'
            new_file.handle = course_prefix + "--" + course_suffix

            new_file.save()
            new_file.create_ready_instance()

            create_contentgroup_entries_from_post(request, 'parent', new_file.image, 'file', request.POST.get('display_style','list'))

            return redirect('courses.views.course_materials', course_prefix, course_suffix)
    else:
        form = FileUploadForm(course=common_page_data['course'])
        reverseview = 'courses.files.actions.upload'

    return render(request, 'files/upload.html',
            {'reverseview':reverseview,
             'common_page_data': common_page_data,
             'form': form,
             })
Exemplo n.º 3
0
def upload(request):
    course_prefix = request.POST.get("course_prefix")
    course_suffix = request.POST.get("course_suffix")
    common_page_data = get_common_page_data(request, course_prefix,
                                            course_suffix)

    if request.method == "POST":
        form = FileUploadForm(request.POST,
                              request.FILES,
                              course=common_page_data['course'])
        if form.is_valid():
            new_file = form.save(commit=False)
            new_file.course = common_page_data['course']
            new_file.index = new_file.section.getNextIndex()
            new_file.mode = 'draft'
            new_file.handle = course_prefix + "--" + course_suffix

            new_file.save()
            new_file.create_ready_instance()

            create_contentgroup_entries_from_post(
                request, 'parent', new_file.image, 'file',
                request.POST.get('display_style', 'list'))

            return redirect('courses.views.course_materials', course_prefix,
                            course_suffix)

    form = FileUploadForm(course=common_page_data['course'])
    reverseview = 'courses.files.actions.upload'
    return render(
        request, 'files/upload.html', {
            'reverseview': reverseview,
            'common_page_data': common_page_data,
            'form': form,
        })
Exemplo n.º 4
0
def save(request):
    def redirectWithError(warn_msg):
        url = request.get_full_path()
        messages.add_message(request,messages.ERROR, warn_msg)
        return redirect(request.META['HTTP_REFERER'])
    
    common_page_data = get_common_page_data(request, request.POST.get("course_prefix"), request.POST.get("course_suffix"))
    if not common_page_data['is_course_admin']:
        return redirect('courses.views.main', common_page_data['course_prefix'],common_page_data['course_suffix'])
    
    page = AdditionalPage.objects.get(id=request.POST.get("page_id"))
    
    if request.POST.get("revert") == '1':
        page.revert()
    else:

        #Validate manually, b/c we didn't use django forms here since we missed it
        try:
            validate_slug(request.POST.get("slug"))
        except ValidationError:
            return redirectWithError("The url descriptor cannot be empty and can only contain numbers, letters, underscores, and hyphens")

        if (not page.slug==request.POST.get("slug")) and AdditionalPage.objects.filter(course=common_page_data['course'], slug=request.POST.get("slug")).exists():
            return redirectWithError("A page with this URL identifier already exists")

        if len(request.POST.get("title")) == 0:
            return redirectWithError("The title cannot be empty")

        if len(request.POST.get("title")) > AdditionalPage._meta.get_field("title").max_length:
            return redirectWithError("The title length was too long")

        new_section = request.POST.get("section")
        old_section = page.section
        if new_section == "null":                # Topbar pages
            page.section = None
            page.menu_slug = "course_info"       # normal pages
        else:
            page.section = ContentSection.objects.get(id=new_section)
            page.menu_slug = None

        page.title = request.POST.get("title")
        page.description = request.POST.get("description")
        page.slug = request.POST.get("slug")
        page.save()

        ##Also save the production slug per Issue #685, basically slugs are not stageable.
        page.image.slug = request.POST.get("slug")
        page.image.save()

        create_contentgroup_entries_from_post(request, 'parent', page.image, 'additional_page', display_style='list')

        if request.POST.get("commit") == '1':
            page.commit()
            
        # This has to happen last of all
        if old_section or new_section != "null":
            ContentGroup.reassign_parent_child_sections('additional_page', page.image.id, new_section)

    return redirect('courses.additional_pages.views.main', common_page_data['course_prefix'],common_page_data['course_suffix'], page.slug)
Exemplo n.º 5
0
def add(request):
    
    def redirectWithError(warn_msg):
        url = request.get_full_path()
        messages.add_message(request,messages.ERROR, warn_msg)
        return redirect(request.META['HTTP_REFERER'])
    
    course_prefix = request.POST.get("course_prefix")
    course_suffix = request.POST.get("course_suffix")
    common_page_data = get_common_page_data(request, course_prefix, course_suffix)
    
    
    if not common_page_data['is_course_admin']:
        return redirect('courses.views.view', course_prefix, course_suffix)
    
    menu_slug = None
    if request.POST.get("menu_slug") != "":
        menu_slug = request.POST.get("menu_slug")
        
    section = None
    if request.POST.get("section_id") != "":
        section = ContentSection.objects.get(id=request.POST.get("section_id"))

    if request.POST.get("menu_slug") != "":
        index = len(AdditionalPage.objects.filter(course=common_page_data['course'],menu_slug=request.POST.get("menu_slug")))
    else:
        index = section.getNextIndex()
    
    #Validate manually, b/c we didn't use django forms here since we missed it
    try:
        validate_slug(request.POST.get("slug"))
    except ValidationError:
        return redirectWithError("The url descriptor cannot be empty and can only contain numbers, letters, underscores, and hyphens")

    if AdditionalPage.objects.filter(course=common_page_data['course'], slug=request.POST.get("slug")).exists():
        return redirectWithError("A page with this URL identifier already exists")

    if len(request.POST.get("title")) == 0:
        return redirectWithError("The title cannot be empty")

    if len(request.POST.get("title")) > AdditionalPage._meta.get_field("title").max_length:
        return redirectWithError("The title length was too long")

    draft_page = AdditionalPage(course=common_page_data['draft_course'], menu_slug=menu_slug, section=section, title=request.POST.get("title"), slug=request.POST.get("slug"), index=index, mode='draft')
    draft_page.save()
    draft_page.create_ready_instance()

    create_contentgroup_entries_from_post(request, 'parent_id', draft_page.image, 'additional_page', display_style='list')

    if request.POST.get("menu_slug") == "":
        return redirect('courses.views.course_materials', course_prefix, course_suffix)
    else:
        return redirect(request.META['HTTP_REFERER'])
Exemplo n.º 6
0
def save(request):
    def redirectWithError(warn_msg):
        messages.add_message(request, messages.ERROR, warn_msg)
        return redirect(request.META['HTTP_REFERER'])

    common_page_data = get_common_page_data(request,
                                            request.POST.get("course_prefix"),
                                            request.POST.get("course_suffix"))
    if not common_page_data['is_course_admin']:
        return redirect('courses.views.main',
                        common_page_data['course_prefix'],
                        common_page_data['course_suffix'])

    page = AdditionalPage.objects.get(id=request.POST.get("page_id"))
    if request.POST.get("revert") == '1':
        page.revert()
    else:
        #Validate manually, b/c we didn't use django forms here since we missed it
        try:
            validate_slug(request.POST.get("slug"))
        except ValidationError:
            return redirectWithError(
                "The url descriptor cannot be empty and can only contain numbers, letters, underscores, and hyphens"
            )

        if (not page.slug
                == request.POST.get("slug")) and AdditionalPage.objects.filter(
                    course=common_page_data['course'],
                    slug=request.POST.get("slug")).exists():
            return redirectWithError(
                "A page with this URL identifier already exists")

        if len(request.POST.get("title")) == 0:
            return redirectWithError("The title cannot be empty")

        if len(request.POST.get("title")) > AdditionalPage._meta.get_field(
                "title").max_length:
            return redirectWithError("The title length was too long")

        new_section = request.POST.get("section")
        old_section = page.section
        if new_section is None or new_section == "null":  # Topbar pages
            page.section = None
            page.menu_slug = "course_info"  # normal pages
        else:
            page.section = ContentSection.objects.get(id=new_section)
            page.menu_slug = None

        page.title = request.POST.get("title")
        page.description = request.POST.get("description")
        page.slug = request.POST.get("slug")
        page.save()

        ##Also save the production slug per Issue #685, basically slugs are not stageable.
        page.image.slug = request.POST.get("slug")
        page.image.save()

        create_contentgroup_entries_from_post(request,
                                              'parent',
                                              page.image,
                                              'additional_page',
                                              display_style='list')

        if request.POST.get("commit") == '1':
            page.commit()

        if request.POST.get("title") == 'Overview':

            ready_course = common_page_data['ready_course']
            draft_course = common_page_data['draft_course']

            draft_course.outcomes = request.POST.get("outcomes")
            draft_course.faq = request.POST.get("faq")
            draft_course.prerequisites = request.POST.get("prerequisites")
            draft_course.accompanying_materials = request.POST.get(
                "accompanying_materials")
            draft_course.description = request.POST.get("description")
            draft_course.save()

            if request.POST.get("commit") == '1':
                ready_course.outcomes = request.POST.get("outcomes")
                ready_course.faq = request.POST.get("faq")
                ready_course.prerequisites = request.POST.get("prerequisites")
                ready_course.accompanying_materials = request.POST.get(
                    "accompanying_materials")
                ready_course.description = request.POST.get("description")
                ready_course.save()

        # This has to happen last of all
        if (old_section != None
                or new_section != None) and (old_section
                                             or new_section != "null"):
            ContentGroup.reassign_parent_child_sections(
                'additional_page', page.image.id, new_section)

    return redirect('courses.additional_pages.views.main',
                    common_page_data['course_prefix'],
                    common_page_data['course_suffix'], page.slug)
Exemplo n.º 7
0
def add(request):
    def redirectWithError(warn_msg):
        messages.add_message(request, messages.ERROR, warn_msg)
        return redirect(request.META['HTTP_REFERER'])

    course_prefix = request.POST.get("course_prefix")
    course_suffix = request.POST.get("course_suffix")
    common_page_data = get_common_page_data(request, course_prefix,
                                            course_suffix)

    if not common_page_data['is_course_admin']:
        return redirect('courses.views.view', course_prefix, course_suffix)

    menu_slug = None
    if request.POST.get("menu_slug") != "":
        menu_slug = request.POST.get("menu_slug")

    section = None
    if request.POST.get("section_id") != "":
        section = ContentSection.objects.get(id=request.POST.get("section_id"))

    if request.POST.get("menu_slug") != "":
        index = len(
            AdditionalPage.objects.filter(
                course=common_page_data['course'],
                menu_slug=request.POST.get("menu_slug")))
    else:
        index = section.getNextIndex()

    #Validate manually, b/c we didn't use django forms here since we missed it
    try:
        validate_slug(request.POST.get("slug"))
    except ValidationError:
        return redirectWithError(
            "The url descriptor cannot be empty and can only contain numbers, letters, underscores, and hyphens"
        )

    if AdditionalPage.objects.filter(course=common_page_data['course'],
                                     slug=request.POST.get("slug")).exists():
        return redirectWithError(
            "A page with this URL identifier already exists")

    if len(request.POST.get("title")) == 0:
        return redirectWithError("The title cannot be empty")

    if len(request.POST.get("title")) > AdditionalPage._meta.get_field(
            "title").max_length:
        return redirectWithError("The title length was too long")

    draft_page = AdditionalPage(course=common_page_data['draft_course'],
                                menu_slug=menu_slug,
                                section=section,
                                title=request.POST.get("title"),
                                slug=request.POST.get("slug"),
                                index=index,
                                mode='draft')
    draft_page.save()
    draft_page.create_ready_instance()

    create_contentgroup_entries_from_post(request,
                                          'parent_id',
                                          draft_page.image,
                                          'additional_page',
                                          display_style='list')

    if request.POST.get("menu_slug") == "":
        return redirect('courses.views.course_materials', course_prefix,
                        course_suffix)
    else:
        return redirect(request.META['HTTP_REFERER'])
Exemplo n.º 8
0
def save_exam_ajax(request, course_prefix, course_suffix, create_or_edit="create", old_slug=""):
    course = request.common_page_data['course']
    if course.mode == "ready":
        course = course.image
    
    slug = request.POST.get('slug','')
    title = request.POST.get('title', '')
    description = request.POST.get('description', '')
    metaXMLContent = request.POST.get('metaXMLContent', '')
    htmlContent = request.POST.get('htmlContent', '')
    xmlImported = request.POST.get('xmlImported','')
    due_date = request.POST.get('due_date', '')
    grace_period = request.POST.get('grace_period', '')
    partial_credit_deadline =  request.POST.get('partial_credit_deadline', '')
    late_penalty = request.POST.get('late_penalty', '')
    num_subs_permitted = request.POST.get('num_subs_permitted','')
    resubmission_penalty = request.POST.get('resubmission_penalty','')
    assessment_type = request.POST.get('assessment_type','')
    section=request.POST.get('section','')
    invideo_val=request.POST.get('invideo','')
    
    if invideo_val and invideo_val == "true":
        invideo = True
    else:
        invideo = False

    #########Validation, lots of validation#######
    if not slug:
        return HttpResponseBadRequest("No URL identifier value provided")
    try:
        validate_slug(slug)
    except ValidationError as ve:
        return HttpResponseBadRequest(unicode(ve))

    if not title:
        return HttpResponseBadRequest("No Title value provided")
    if not metaXMLContent:
        return HttpResponseBadRequest("No metadataXML provided")
    try:
        grader = AutoGrader(metaXMLContent)
    except Exception as e: #Since this is just a validator, pass back all the exceptions
        return HttpResponseBadRequest(unicode(e))

    total_score = grader.points_possible

    if not htmlContent:
        return HttpResponseBadRequest("No Exam HTML provided")
    if not due_date:
        return HttpResponseBadRequest("No due date provided")
    if not grace_period:
        return HttpResponseBadRequest("No grace period provided")
    if not partial_credit_deadline:
        return HttpResponseBadRequest("No hard deadline provided")
    if not section:
        return HttpResponseBadRequest("Bad section provided!")

    try:
        contentsection = ContentSection.objects.get(id=section, course=course, is_deleted=False)
    except ContentSection.DoesNotExist:
        return HttpResponseBadRequest("Bad section provided!")

    dd = datetime.datetime.strptime(due_date, "%m/%d/%Y %H:%M")
    gp = datetime.datetime.strptime(grace_period, "%m/%d/%Y %H:%M")
    pcd = datetime.datetime.strptime(partial_credit_deadline, "%m/%d/%Y %H:%M")

    if assessment_type == "summative":
        autograde = True
        display_single = False
        grade_single = False
        exam_type = "problemset"
    elif assessment_type == "formative":
        autograde = True
        display_single = True
        grade_single = False #We will eventually want this to be True
        exam_type = "problemset"
    elif assessment_type == "interactive":
        autograde = True
        display_single = True
        grade_single = False
        exam_type = "interactive_exercise"
    elif assessment_type == "exam-autograde":
        autograde = True
        display_single = False
        grade_single = False
        exam_type = "exam"
    elif assessment_type == "exam-csv":
        autograde = False
        display_single = False
        grade_single = False
        exam_type = "exam"
    elif assessment_type == "survey":
        autograde = False
        display_single = False
        grade_single = False
        exam_type = "survey"
    else:
        return HttpResponseBadRequest("A bad assessment type (" + assessment_type  + ") was provided")

    if not late_penalty:
        lp = 0
    else:
        try:
            lp = int(late_penalty)
        except ValueError:
            return HttpResponseBadRequest("A non-numeric late penalty (" + late_penalty  + ") was provided")

    if not num_subs_permitted:
        sp = 999
    else:
        try:
            sp = int(num_subs_permitted)
        except ValueError:
            return HttpResponseBadRequest("A non-numeric number of submissions permitted (" + sp  + ") was provided")

    if not resubmission_penalty:
        rp = 0
    else:
        try:
            rp = int(resubmission_penalty)
        except ValueError:
            return HttpResponseBadRequest("A non-numeric resubmission penalty (" + resubmission_penalty  + ") was provided")

    #create or edit the Exam
    if create_or_edit == "create":
        if Exam.objects.filter(course=course, slug=slug, is_deleted=False).exists():
            return HttpResponseBadRequest("An exam with this URL identifier already exists in this course")
        exam_obj = Exam(course=course, slug=slug, title=title, description=description, html_content=htmlContent, xml_metadata=metaXMLContent,
                        due_date=dd, assessment_type=assessment_type, mode="draft", total_score=total_score, grade_single=grade_single,
                        grace_period=gp, partial_credit_deadline=pcd, late_penalty=lp, submissions_permitted=sp, resubmission_penalty=rp,
                        exam_type=exam_type, autograde=autograde, display_single=display_single, invideo=invideo, section=contentsection,
                        xml_imported=xmlImported
                        )

        exam_obj.save()
        exam_obj.create_ready_instance()        

        # Set parent/child relationships
        create_contentgroup_entries_from_post(request, 'parent', exam_obj.image, 'exam', display_style='list')

        #Now set the video associations
        exam_obj.sync_videos_foreignkeys_with_metadata()
        vid_status_obj = exam_obj.image.sync_videos_foreignkeys_with_metadata()
        vid_status_string = ""
        if vid_status_obj['video_slugs_set']:
            exam_obj.invideo=True
            exam_obj.image.invideo=True
            exam_obj.save()
            exam_obj.image.save()
            vid_status_string = "This exam was successfully associated with the following videos:\n" + \
                            ", ".join(vid_status_obj['video_slugs_set']) + "\n"
        if vid_status_obj['video_slugs_not_set']:
            vid_status_string += "The following videos WERE NOT automatically associated with this exam:\n" + \
                ", ".join(vid_status_obj['video_slugs_not_set']) + "\n\n" + \
                "You may have provided the wrong url-identifier or have not yet uploaded the video"


        return HttpResponse("Exam " + title + " created. \n" + unicode(grader) + "\n\n" + vid_status_string)
    else:
        try: #this is nasty code, I know.  It should at least be moved into the model somehow
            exam_obj = Exam.objects.get(course=course, is_deleted=0, slug=old_slug)
            exam_obj.slug=slug
            exam_obj.title=title
            exam_obj.description=description
            exam_obj.html_content=htmlContent
            exam_obj.xml_metadata=metaXMLContent
            exam_obj.xml_imported=xmlImported
            exam_obj.due_date=dd
            exam_obj.total_score=total_score
            exam_obj.assessment_type=assessment_type
            exam_obj.grace_period=gp
            exam_obj.partial_credit_deadline=pcd
            exam_obj.late_penalty=lp
            exam_obj.submissions_permitted=sp
            exam_obj.resubmission_penalty=rp
            exam_obj.exam_type=exam_type
            exam_obj.autograde=autograde
            exam_obj.display_single=display_single
            exam_obj.grade_single=grade_single
            exam_obj.invideo=invideo
            exam_obj.section=contentsection
            exam_obj.save()
            exam_obj.commit()

            # Set parent/chlid relationships for this exam
            create_contentgroup_entries_from_post(request, 'parent', exam_obj.image, 'exam', display_style='list')

            #Now set the video associations
            exam_obj.sync_videos_foreignkeys_with_metadata()
            vid_status_obj = exam_obj.image.sync_videos_foreignkeys_with_metadata()
            vid_status_string = ""
            if vid_status_obj['video_slugs_set']:
                exam_obj.invideo=True
                exam_obj.image.invideo=True
                exam_obj.save()
                exam_obj.image.save()
                vid_status_string = "This exam was successfully associated with the following videos:\n" + \
                ", ".join(vid_status_obj['video_slugs_set']) + "\n\n"
            if vid_status_obj['video_slugs_not_set']:
                vid_status_string += "The following videos WERE NOT automatically associated with this exam:\n" + \
                    ", ".join(vid_status_obj['video_slugs_not_set']) + "\n" + \
                    "You may have provided the wrong url-identifier or have not yet uploaded the video"

            return HttpResponse("Exam " + title + " saved. \n" + unicode(grader) + "\n\n" + vid_status_string)

        except Exam.DoesNotExist:
            return HttpResponseBadRequest("No exam exists with URL identifier %s" % old_slug)