def upload_step1(request): if request.method == 'POST': form = UploadCourseStep1Form(request.POST, request.FILES) if form.is_valid(): # All validation rules pass extract_path = os.path.join(settings.COURSE_UPLOAD_DIR, 'temp', str(request.user.id)) course, resp = handle_uploaded_file(request.FILES['course_file'], extract_path, request, request.user) if course: CoursePublishingLog( course=course, user=request.user, action="file_uploaded", data=request.FILES['course_file'].name).save() return HttpResponseRedirect( reverse('oppia_upload2', args=[course.id])) # Redirect after POST else: os.remove( os.path.join(settings.COURSE_UPLOAD_DIR, request.FILES['course_file'].name)) else: form = UploadCourseStep1Form() # An unbound form return render(request, 'course/form.html', { 'form': form, 'title': _(u'Upload Course - step 1') })
def publish_view(request): # get the messages to clear possible previous unprocessed messages get_messages_array(request) if request.method != 'POST': return HttpResponse(status=405) validation_errors = [] validation_errors = check_required_fields(request, validation_errors) validation_errors = check_upload_file_size_type( request.FILES[api.COURSE_FILE_FIELD], validation_errors) if validation_errors: return JsonResponse( {'errors': validation_errors}, status=400, ) # authenticate user authenticated, response_data, user = authenticate_user( request, request.POST['username'], request.POST['password']) if not authenticated: return JsonResponse(response_data, status=401) # check user has permissions to publish course if settings.OPPIA_STAFF_ONLY_UPLOAD is True \ and not user.is_staff \ and user.userprofile.can_upload is False: return HttpResponse(status=401) extract_path = os.path.join(settings.COURSE_UPLOAD_DIR, 'temp', str(user.id)) course, status_code = handle_uploaded_file( request.FILES[api.COURSE_FILE_FIELD], extract_path, request, user) if course is False: status = status_code if status_code is not None else 500 response_data = {'messages': get_messages_array(request)} return JsonResponse(response_data, status=status) else: course.is_draft = (request.POST['is_draft'] == "True" or request.POST['is_draft'] == "true") course.save() # remove any existing tags CourseTag.objects.filter(course=course).delete() # add tags tags = request.POST['tags'].strip().split(",") add_course_tags(user, course, tags) msgs = get_messages_array(request) if len(msgs) > 0: return JsonResponse({'messages': msgs}, status=201) else: return HttpResponse(status=201)
def form_valid(self, form): user = self.request.user extract_path = os.path.join(settings.COURSE_UPLOAD_DIR, 'temp', str(user.id)) course, resp = handle_uploaded_file(self.request.FILES['course_file'], extract_path, self.request, user) if course: CoursePublishingLog(course=course, user=user, action="file_uploaded", data=self.request.FILES['course_file'].name) \ .save() return HttpResponseRedirect( reverse('oppia:upload_step2', args=[course.id])) else: return super().form_invalid(form)
def publish_view(request): # get the messages to clear possible previous unprocessed messages get_messages_array(request) if request.method != 'POST': return HttpResponse(status=405) course_file = request.FILES.get(api.COURSE_FILE_FIELD, None) validation_errors = [] validation_errors = check_required_fields(request, validation_errors) validation_errors = check_upload_file_size(course_file, validation_errors) if validation_errors: return JsonResponse( {'errors': validation_errors}, status=400, ) username = request.POST.get('username', None) password = request.POST.get('password', None) # authenticate user authenticated, response_data, user = authenticate_user( request, username, password) if not authenticated: return JsonResponse(response_data, status=401) extract_path = os.path.join(settings.COURSE_UPLOAD_DIR, 'temp', str(user.id)) result, course_shortname = get_course_shortname(course_file, extract_path, request, user) if result: course_manager = CoursePermissions.objects.filter( user=user, course__shortname=course_shortname, role=CoursePermissions.MANAGER).count() else: course_manager = 0 # check user has permissions to publish course if not user.is_staff \ and user.userprofile.can_upload is False \ and course_manager == 0: msg_text = \ _(u"Sorry, only the original owner may update this course") messages.info(request, msg_text) CoursePublishingLog(user=user if user else None, action="permissions_error", data=msg_text).save() return HttpResponse(status=401) course, status_code = handle_uploaded_file(course_file, extract_path, request, user) CoursePublishingLog(course=course if course else None, new_version=course.version if course else None, user=user, action="api_file_uploaded", data=course_file.name).save() if course is False: status = status_code if status_code is not None else 500 response_data = {'messages': get_messages_array(request)} return JsonResponse(response_data, status=status) else: course.is_draft = (request.POST['is_draft'] == "True" or request.POST['is_draft'] == "true") course.save() # remove any existing tags CourseTag.objects.filter(course=course).delete() # add tags tags = request.POST['tags'].strip().split(",") add_course_tags(user, course, tags) msgs = get_messages_array(request) CoursePublishingLog(course=course, new_version=course.version, user=user, action="api_course_published", data=_(u'Course published via API')).save() if len(msgs) > 0: return JsonResponse({'messages': msgs}, status=201) else: return HttpResponse(status=201)
def publish_view(request): if request.method != 'POST': return HttpResponse(status=405) required = ['username', 'password', 'tags', 'is_draft'] for r in required: if r not in request.POST: print r + " not found" return HttpResponse(status=201) if 'course_file' not in request.FILES: print "Course file not found" return HttpResponse(status=400) # authenticate user username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is None or not user.is_active: return HttpResponse(status=200) # check user has permissions to publish course if settings.OPPIA_STAFF_ONLY_UPLOAD is True and not user.is_staff and user.userprofile.can_upload is False: return HttpResponse(status=401) extract_path = os.path.join(settings.COURSE_UPLOAD_DIR, 'temp', str(user.id)) course = handle_uploaded_file(request.FILES['course_file'], extract_path, request, user) if course is False: return HttpResponse(status=500) else: if request.POST['is_draft'] == "False": course.is_draft = False else: course.is_draft = True course.save() # remove any existing tags CourseTag.objects.filter(course=course).delete() # add tags tags = request.POST['tags'].strip().split(",") for t in tags: try: tag = Tag.objects.get(name__iexact=t.strip()) except Tag.DoesNotExist: tag = Tag() tag.name = t.strip() tag.created_by = user tag.save() # add tag to course try: ct = CourseTag.objects.get(course=course, tag=tag) except CourseTag.DoesNotExist: ct = CourseTag() ct.course = course ct.tag = tag ct.save() return HttpResponse(status=201)
def publish_view(request): if request.method != 'POST': return HttpResponse(status=405) required = ['username','password','tags','is_draft'] for r in required: if r not in request.POST: print r + " not found" return HttpResponse(status=201) if 'course_file' not in request.FILES: print "Course file not found" return HttpResponse(status=400) # authenticate user username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is None or not user.is_active: return HttpResponse(status=200) # check user has permissions to publish course if settings.OPPIA_STAFF_ONLY_UPLOAD is True and not user.is_staff and user.userprofile.can_upload is False: return HttpResponse(status=401) extract_path = os.path.join(settings.COURSE_UPLOAD_DIR,'temp',str(user.id)) course = handle_uploaded_file(request.FILES['course_file'], extract_path, request, user) if course is False: return HttpResponse(status=500) else: if request.POST['is_draft'] == "False": course.is_draft = False else: course.is_draft = True course.save() # remove any existing tags CourseTag.objects.filter(course=course).delete() # add tags tags = request.POST['tags'].strip().split(",") for t in tags: try: tag = Tag.objects.get(name__iexact=t.strip()) except Tag.DoesNotExist: tag = Tag() tag.name = t.strip() tag.created_by = user tag.save() # add tag to course try: ct = CourseTag.objects.get(course=course,tag=tag) except CourseTag.DoesNotExist: ct = CourseTag() ct.course = course ct.tag = tag ct.save() return HttpResponse(status=201)
def publish_view(request): # get the messages to clear possible previous unprocessed messages get_messages_array(request) if request.method != 'POST': return HttpResponse(status=405) required = ['username', 'password', 'tags', 'is_draft'] validationErrors = [] for field in required: if field not in request.POST: print field + " not found" validationErrors.append("field '{0}' missing".format(field)) if COURSE_FILE_FIELD not in request.FILES: print "Course file not found" validationErrors.append("file '{0}' missing".format(COURSE_FILE_FIELD)) else: # check the file size of the course doesnt exceed the max file = request.FILES[COURSE_FILE_FIELD] if file is not None and file._size > settings.OPPIA_MAX_UPLOAD_SIZE: size = int(math.floor(settings.OPPIA_MAX_UPLOAD_SIZE / 1024 / 1024)) validationErrors.append((_( "Your file is larger than the maximum allowed (%(size)d Mb). You may want to check your course for large includes, such as images etc." ) % { 'size': size, })) if file is not None and file.content_type != 'application/zip' and file.content_type != 'application/x-zip-compressed': validationErrors.append(_("You may only upload a zip file")) if validationErrors: return JsonResponse( {'errors': validationErrors}, status=400, ) # authenticate user username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is None or not user.is_active: messages.error(request, "Invalid username/password") response_data = { 'message': _('Authentication errors'), 'messages': get_messages_array(request) } return JsonResponse(response_data, status=401) # check user has permissions to publish course if settings.OPPIA_STAFF_ONLY_UPLOAD is True \ and not user.is_staff \ and user.userprofile.can_upload is False: return HttpResponse(status=401) extract_path = os.path.join(settings.COURSE_UPLOAD_DIR, 'temp', str(user.id)) course, response = handle_uploaded_file(request.FILES['course_file'], extract_path, request, user) if course is False: resp_code = response if response is not None else 500 response_data = {'messages': get_messages_array(request)} return JsonResponse(response_data, status=resp_code) else: course.is_draft = (request.POST['is_draft'] == "True" or request.POST['is_draft'] == "true") course.save() # remove any existing tags CourseTag.objects.filter(course=course).delete() # add tags tags = request.POST['tags'].strip().split(",") for t in tags: try: tag = Tag.objects.get(name__iexact=t.strip()) except Tag.DoesNotExist: tag = Tag() tag.name = t.strip() tag.created_by = user tag.save() # add tag to course try: ct = CourseTag.objects.get(course=course, tag=tag) except CourseTag.DoesNotExist: ct = CourseTag() ct.course = course ct.tag = tag ct.save() msgs = get_messages_array(request) if len(msgs) > 0: return JsonResponse({'messages': msgs}, status=201) else: return HttpResponse(status=201)