예제 #1
0
파일: admin.py 프로젝트: rcoder/vrfy
    def reassess(self, request, queryset):
        for obj in queryset:
            files = []
            for sf in obj.studentproblemfile_set.filter(attempt_num=obj.attempt_num):
                if (
                    sf.required_problem_filename == None or not sf.required_problem_filename.force_rename
                ):  # if it's not renamed, we can use the given name
                    name = str(sf)
                else:  # if it is we have to lookup the required name
                    name = str(sf.required_problem_filename)
                # localfile has username appended to it
                localFile = name + "-" + str(sf.student_problem_solution.student_problem_set.user)
                files.append({"localFile": localFile, "destFile": name})
            jsonlocalFile = "data.json" + "-" + str(sf.student_problem_solution.student_problem_set.user)
            files.append({"localFile": jsonlocalFile, "destFile": "data.json"})

            for f in chain(
                obj.problem.problemsolutionfile_set.all(),
                models.GraderLib.objects.all(),
                [obj.problem.grade_script.name.split("/")[-1]],
            ):
                files.append({"localFile": str(f), "destFile": str(f)})

            jobName = tango.get_jobName(
                obj.problem,
                obj.student_problem_set.problem_set,
                str(sf.student_problem_solution.student_problem_set.user),
            )
            tango.addJob(obj.problem, obj.student_problem_set.problem_set, files, jobName, jobName)
예제 #2
0
파일: views.py 프로젝트: Gastove/vrfy
def submit_success(request, ps_id, p_id):
    ps = _get_problem_set(ps_id, request.user.reedie)
    problem = get_object_or_404(Problem, pk=p_id)

    if problem.autograde_problem:  # if it is running in Tango
        # get running jobs
        job_url = vrfy.settings.TANGO_ADDRESS + \
            "jobs/" + vrfy.settings.TANGO_KEY + "/0/"
        running_jobs = requests.get(job_url)
        rj_json = running_jobs.json()

        jobName = tango.get_jobName(problem, ps, request.user.username)
        job_running = False
        for job in rj_json["jobs"]:
            if job["name"] == jobName:
                job_running = True

        context = {
            "num_jobs": len(
                rj_json["jobs"]),
            "job_running": job_running,
            'ps_id': ps_id,
            'p_id': p_id}
        # make sure the job is in the queue
        return render(request, 'course/submit_success.html', context)

    else:  # if it's a human graded problem
        return results_problem_detail(request, ps_id, p_id)
예제 #3
0
def submit_success(request, ps_id, p_id):
    ps = _get_problem_set(ps_id, request.user.reedie)
    problem = get_object_or_404(Problem, pk=p_id)

    if problem.autograde_problem:  # if it is running in Tango
        # get running jobs
        job_url = vrfy.settings.TANGO_ADDRESS + \
            "jobs/" + vrfy.settings.TANGO_KEY + "/0/"
        running_jobs = requests.get(job_url)
        rj_json = running_jobs.json()

        jobName = tango.get_jobName(problem, ps, request.user.username)
        job_running = False
        for job in rj_json["jobs"]:
            if job["name"] == jobName:
                job_running = True

        context = {
            "num_jobs": len(rj_json["jobs"]),
            "job_running": job_running,
            'ps_id': ps_id,
            'p_id': p_id
        }
        # make sure the job is in the queue
        return render(request, 'course/submit_success.html', context)

    else:  # if it's a human graded problem
        return results_problem_detail(request, ps_id, p_id)
예제 #4
0
파일: admin.py 프로젝트: Gastove/vrfy
    def reassess(self, request, queryset):
        for obj in queryset:
            log.info("REASSESS: {!s}".format(str(obj)))
            files = []
            for sf in obj.studentproblemfile_set.filter(
                    attempt_num=obj.attempt_num):
                # if it's not renamed, we can use the given name
                if sf.required_problem_filename is None or not sf.required_problem_filename.force_rename:
                    name = str(sf)
                else:  # if it is we have to lookup the required name
                    name = str(sf.required_problem_filename)
                # localfile has username appended to it
                localFile = name + "-" + \
                    str(sf.student_problem_solution.student_problem_set.user)
                files.append({'localFile': localFile, 'destFile': name})
            jsonlocalFile = "data.json" + "-" + \
                str(sf.student_problem_solution.student_problem_set.user)
            files.append({'localFile': jsonlocalFile, 'destFile': "data.json"})

            for f in chain(obj.problem.problemsolutionfile_set.all(),
                           models.GraderLib.objects.all(),
                           [obj.problem.grade_script.name.split("/")[-1]]):
                files.append({'localFile': str(f), 'destFile': str(f)})

            jobName = tango.get_jobName(
                obj.problem, obj.get_problemset(), str(
                    sf.student_problem_solution.get_user()))
            r = tango.addJob(
                obj.problem,
                obj.get_problemset(),
                files,
                jobName,
                jobName)
            if r.status_code is not 200:
                return redirect('500.html')
            else:
                # create a new problem result
                response = r.json()
                job_id = response["jobId"]
                obj.job_id = job_id
                prob_result = models.ProblemResult.objects.create(
                    job_id=job_id,
                    attempt_num=obj.attempt_num,
                    sp_sol=obj,
                    sp_set=obj.student_problem_set,
                    user=obj.get_user(),
                    problem=obj.problem,
                    timestamp=obj.submitted)
                obj.save()
                prob_result.save()
                self._update_result(obj)
예제 #5
0
    def reassess(self, request, queryset):
        for obj in queryset:
            log.info("REASSESS: {!s}".format(str(obj)))
            files = []
            for sf in obj.studentproblemfile_set.filter(
                    attempt_num=obj.attempt_num):
                # if it's not renamed, we can use the given name
                if sf.required_problem_filename is None or not sf.required_problem_filename.force_rename:
                    name = str(sf)
                else:  # if it is we have to lookup the required name
                    name = str(sf.required_problem_filename)
                # localfile has username appended to it
                localFile = name + "-" + \
                    str(sf.student_problem_solution.student_problem_set.user)
                files.append({'localFile': localFile, 'destFile': name})
            jsonlocalFile = "data.json" + "-" + \
                str(sf.student_problem_solution.student_problem_set.user)
            files.append({'localFile': jsonlocalFile, 'destFile': "data.json"})

            for f in chain(obj.problem.problemsolutionfile_set.all(),
                           models.GraderLib.objects.all(),
                           [obj.problem.grade_script.name.split("/")[-1]]):
                files.append({'localFile': str(f), 'destFile': str(f)})

            #create a new problem result
            prob_result = models.ProblemResult.objects.create(
                attempt_num=obj.attempt_num,
                sp_sol=obj,
                sp_set=obj.student_problem_set,
                user=obj.get_user(),
                problem=obj.problem,
                timestamp=obj.submitted)

            #get relevant ids & info for the task
            spsol_id = obj.id
            prob_result_id = prob_result.id
            time_limit = obj.problem.time_limit

            #form the tango jobname
            jobName = tango.get_jobName(obj.problem, obj.get_problemset(),
                                        str(obj.get_user()))

            (submit_job_to_tango.s(None, spsol_id, prob_result_id, files,
                                   jobName, time_limit)
             | get_response.s(prob_result_id)).delay()
예제 #6
0
파일: admin.py 프로젝트: ifjorissen/vrfy
    def reassess(self, request, queryset):
        for obj in queryset:
            log.info("REASSESS: {!s}".format(str(obj)))
            files = []
            for sf in obj.studentproblemfile_set.filter(
                    attempt_num=obj.attempt_num):
                # if it's not renamed, we can use the given name
                if sf.required_problem_filename is None or not sf.required_problem_filename.force_rename:
                    name = str(sf)
                else:  # if it is we have to lookup the required name
                    name = str(sf.required_problem_filename)
                # localfile has username appended to it
                localFile = name + "-" + \
                    str(sf.student_problem_solution.student_problem_set.user)
                files.append({'localFile': localFile, 'destFile': name})
            jsonlocalFile = "data.json" + "-" + \
                str(sf.student_problem_solution.student_problem_set.user)
            files.append({'localFile': jsonlocalFile, 'destFile': "data.json"})

            for f in chain(obj.problem.problemsolutionfile_set.all(),
                           models.GraderLib.objects.all(),
                           [obj.problem.grade_script.name.split("/")[-1]]):
                files.append({'localFile': str(f), 'destFile': str(f)})

            #create a new problem result
            prob_result = models.ProblemResult.objects.create(
                    attempt_num=obj.attempt_num,
                    sp_sol=obj,
                    sp_set=obj.student_problem_set,
                    user=obj.get_user(),
                    problem=obj.problem,
                    timestamp=obj.submitted)

            #get relevant ids & info for the task
            spsol_id = obj.id
            prob_result_id = prob_result.id
            time_limit = obj.problem.time_limit

            #form the tango jobname
            jobName = tango.get_jobName(
                obj.problem, obj.get_problemset(), str(
                    obj.get_user()))

            (submit_job_to_tango.s(None, spsol_id, prob_result_id, files, jobName, time_limit) | get_response.s(prob_result_id)).delay()
예제 #7
0
파일: views.py 프로젝트: rcoder/vrfy
def problem_submit(request, ps_id, p_id):
  if request.method == 'POST':#make sure the user doesn't type this into the address bar
    ps = _get_problem_set(ps_id, request.user.reedie)
    problem = get_object_or_404(Problem, pk=p_id)

    #create / get the student problem set and update the submission time (reflects latest attempt)
    student_ps_sol, sp_set_created = StudentProblemSet.objects.get_or_create(problem_set=ps, user=request.user.reedie, defaults={'submitted': timezone.now()})
    student_ps_sol.save()

    student_psol, sp_sol_created = StudentProblemSolution.objects.get_or_create(problem=problem, student_problem_set=student_ps_sol)
    student_psol.submitted = timezone.now()
    student_psol.attempt_num += 1 
    student_psol.save()

    #create the student result set & problem
    # result_set, prs_created = ProblemResultSet.objects.get_or_create(sp_set = student_ps_sol, user=request.user, problem_set=ps)
    mytimestamp = None
    if not problem.autograde_problem: #if its not being autograded, we should set the timestamp here; if it is, tango will set it
      mytimestamp = timezone.now()
    prob_result = ProblemResult.objects.create(attempt_num=student_psol.attempt_num, sp_sol=student_psol, sp_set=student_ps_sol, user=request.user.reedie, problem=problem, timestamp=mytimestamp)
    
    additional_files = 0
    files = []#for the addJob
    #getting all the submitted files
    for name, f in request.FILES.items():
      print(name, ADDITIONAL_FILE_NAME)
      if ADDITIONAL_FILE_NAME in name:
        required_pf = None
        print(additional_files)
        if additional_files < MAX_ADDITIONAL_FILES:
          additional_files += 1
        else:
          return render(request, '403.html', {'exception': "You can't upload more than " + str(MAX_ADDITIONAL_FILES) + " additional files."}, status=403)
          #raise PermissionDenied()
        
      else:
        required_pf = RequiredProblemFilename.objects.get(problem=problem, file_title=name)

      if required_pf == None or not required_pf.force_rename: 
        name = f.name#if the file should not be renamed, give it the name as it was uploaded
        
        #we also need to check if it has the same name as any of the grader files
        for gfile in chain(problem.problemsolutionfile_set.all(), GraderLib.objects.all(),[problem.grade_script.name.split("/")[-1]]):
          if name == str(gfile):
            return render(request, '403.html', {'exception': name + " is an invalid filename."}, status=403)
            #raise PermissionDenied(name + " is an invalid filename.")
        
      localfile = name + "-"+ request.user.username
      if problem.autograde_problem:
        r = tango.upload(problem, ps, localfile, f.read())
        files.append({"localFile" : localfile, "destFile":name})#for the addJob command

      attempts = student_psol.attempt_num
      new_prob_file = StudentProblemFile.objects.create(required_problem_filename=required_pf, student_problem_solution = student_psol, submitted_file=f, attempt_num = attempts)
      new_prob_file.save()

    if problem.autograde_problem:#these operatons are only required for autograding
      #add grader libraries
      for lib in GraderLib.objects.all():
        name = lib.lib_upload.name.split("/")[-1]
        files.append({"localFile" : name, "destFile": name})

      #getting all the grader files
      grading = problem.grade_script
      name = grading.name.split("/")[-1]
      files.append({"localFile" : name, "destFile": name})

      for psfile in ProblemSolutionFile.objects.filter(problem=problem):
        name = psfile.file_upload.name.split("/")[-1]
        files.append({"localFile" : name, "destFile": name})

      #upload the json data object
      tango_data = json.dumps({"attempts": student_psol.attempt_num, "timedelta": student_psol.is_late()})
      data_name = "data.json" + "-" + request.user.username
      tango.upload(problem, ps, data_name, tango_data)
      files.append({"localFile" : data_name, "destFile": "data.json"})

      #making Tango run the files
      jobName = tango.get_jobName(problem, ps, request.user.username)
      r = tango.addJob(problem, ps, files, jobName, jobName)
      if r.status_code is not 200:
        return redirect('500.html')
      else:
        response = r.json()
        student_psol.job_id = response["jobId"]
        prob_result.job_id = response["jobId"]
        student_psol.save()
        prob_result.save()
    return redirect('course:submit_success', ps_id, p_id)
    
  else:
    raise Http404("Don't do that")
예제 #8
0
def problem_submit(request, ps_id, p_id):
    if request.method == 'POST':  # make sure the user doesn't type this into the address bar
        ps = _get_problem_set(ps_id, request.user.reedie)
        problem = get_object_or_404(Problem, pk=p_id)

        # create / get the student problem set and update the submission time
        # (reflects latest attempt)
        student_ps_sol, sp_set_created = StudentProblemSet.objects.get_or_create(
            problem_set=ps,
            user=request.user.reedie,
            defaults={'submitted': timezone.now()})
        student_ps_sol.save()

        student_psol, sp_sol_created = StudentProblemSolution.objects.get_or_create(
            problem=problem, student_problem_set=student_ps_sol)
        student_psol.submitted = timezone.now()
        prevscore = student_psol.latest_score()
        student_psol.attempt_num += 1
        student_psol.save()

        # create the student result set & problem
        # result_set, prs_created = ProblemResultSet.objects.get_or_create(sp_set = student_ps_sol, user=request.user, problem_set=ps)
        mytimestamp = None
        if not problem.autograde_problem:  # if its not being autograded, we should set the timestamp here; if it is, tango will set it
            mytimestamp = timezone.now()
        prob_result = ProblemResult.objects.create(
            attempt_num=student_psol.attempt_num,
            sp_sol=student_psol,
            sp_set=student_ps_sol,
            user=request.user.reedie,
            problem=problem,
            timestamp=mytimestamp)

        additional_files = 0
        files = []  # for the addJob
        file_batch = []  #for the celery tasks
        # getting all the submitted files
        for name, f in request.FILES.items():
            # print(name, ADDITIONAL_FILE_NAME)
            if ADDITIONAL_FILE_NAME in name:
                required_pf = None
                # print(additional_files)
                if additional_files < MAX_ADDITIONAL_FILES:
                    additional_files += 1
                else:
                    return render(
                        request,
                        '403.html', {
                            'exception':
                            "You can't upload more than " +
                            str(MAX_ADDITIONAL_FILES) + " additional files."
                        },
                        status=403)
                    #raise PermissionDenied()

            else:
                required_pf = RequiredProblemFilename.objects.get(
                    problem=problem, file_title=name)

            if required_pf is None or not required_pf.force_rename:
                name = f.name  # if the file should not be renamed, give it the name as it was uploaded

                # we also need to check if it has the same name as any of the
                # grader files
                for gfile in chain(problem.problemsolutionfile_set.all(),
                                   GraderLib.objects.all(),
                                   [problem.grade_script.name.split("/")[-1]]):
                    if name == str(gfile):
                        return render(
                            request,
                            '403.html',
                            {'exception': name + " is an invalid filename."},
                            status=403)
                        #raise PermissionDenied(name + " is an invalid filename.")

            if problem.autograde_problem:
                localfile = name + "-" + request.user.username
                file_batch.append(
                    send_file_to_tango.s(ps_id, p_id, request.user.reedie.id,
                                         localfile, f.read()))
                # for the addJob command
                files.append({"localFile": localfile, "destFile": name})

            #IFJ 1.20.16: this can be a celery task
            attempts = student_psol.attempt_num
            new_prob_file = StudentProblemFile.objects.create(
                required_problem_filename=required_pf,
                student_problem_solution=student_psol,
                submitted_file=f,
                attempt_num=attempts)
            new_prob_file.save()

        if problem.autograde_problem:  # these operatons are only required for autograding
            #IFJ 1.20.16 TODO: edit this so only this course's grader libs get uploaded
            # add grader libraries
            for lib in GraderLib.objects.all():
                name = lib.lib_upload.name.split("/")[-1]
                files.append({"localFile": name, "destFile": name})

            # getting all the grader files
            grading = problem.grade_script
            name = grading.name.split("/")[-1]
            files.append({"localFile": name, "destFile": name})

            for psfile in ProblemSolutionFile.objects.filter(problem=problem):
                name = psfile.file_upload.name.split("/")[-1]
                files.append({"localFile": name, "destFile": name})

            # upload the json data object
            tango_data = json.dumps({
                "attempts": student_psol.attempt_num,
                "prevscore": prevscore,
                "timedelta": student_psol.is_late()
            })
            data_name = "data.json" + "-" + request.user.username
            file_batch.append(
                send_file_to_tango.s(ps_id, p_id, request.user.reedie.id,
                                     data_name, tango_data))
            files.append({"localFile": data_name, "destFile": "data.json"})

            #batch upload the files
            jobName = tango.get_jobName(problem, ps, request.user.username)
            file_upload_job = group(file_batch)
            celery_callback = submit_job_to_tango.s(
                student_psol.id, prob_result.id, files, jobName,
                problem.time_limit) | get_response.s(prob_result.id)
            add_job_to_tango = (file_upload_job | celery_callback).delay()
        return redirect('course:submit_success', ps_id, p_id)

    else:
        return HttpResponseForbidden("Don't do that")