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} )
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, })
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, })
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)
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'])
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)
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'])
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)