Esempio n. 1
0
    def create_from_post(self, exercise, submitters, request):

        submission_data_list = [
                (key, value) for (key, value) in query_dict_to_list_of_tuples(request.POST)
                if key != '__aplus__'
        ]
        try:
            meta_data_dict = json.loads(request.POST.get('__aplus__', '{}'))
        except json.JSONDecodeError:
            raise ValueError("The content of the field __aplus__ is not valid json")
        if 'lang' not in meta_data_dict:
            meta_data_dict['lang'] = get_language()

        try:
            new_submission = Submission.objects.create(
                exercise=exercise,
                submission_data=submission_data_list,
                meta_data=meta_data_dict,
            )
            new_submission.submitters.set(submitters)
        except DatabaseError as error:
            logger.exception("Failed to create submission: %s %s",
                request.user.username, exercise);
            raise DatabaseError from error
        try:
            new_submission.add_files(request.FILES)
        except DatabaseError as error:
            logger.exception("Failed to save submitted files: %s %s",
                request.user.username, exercise);
            new_submission.delete()
            raise DatabaseError from error
        return new_submission
Esempio n. 2
0
def _handle_submission(request, exercise, students, form, submissions):
    """
    This method takes care of saving a new_submission locally and 
    sending it to an exercise service for assessment. 
    
    @param request: HttpRequest from Django
    @param exercise: an instance of an exercise class this submission is for
    @param students: a QuerySet of UserProfile objects that are submitting the exercise
    @param form: an instance of a Form class or None if there are no questions for the exercise
    @param submissions: previous submissions for the submitting user to the same exercise
    """
    
    new_submission                  = Submission.objects.create(exercise=exercise)
    new_submission.submitters       = students
    
    # Save the POST parameters from the new_submission in 
    # a list of tuples [(key1, value1), (key2, value2)].
    # By using tuples inside lists we allow two parameters 
    # with the same name, which is not possible with dicts.
    new_submission.submission_data  = helpers.query_dict_to_list_of_tuples(request.POST)
    
    # Add all submitted files to the new submission as SubmittedFile objects
    new_submission.add_files( request.FILES )
    
    try:
        # Try submitting the submission to the exercise service. The submission
        # is done with a multipart POST request that contains all the files and
        # POST parameters sent by the user.
        response_page               = new_submission.submit_to_service()
    except Exception, e:
        #raise e
        # TODO: Retrieving the grading failed. An error report should be sent
        # to administrators
        messages.error(request, _('Connecting to the assessment server failed! (%s)') % str(e) )
        response_page               = ExercisePage(exercise)
Esempio n. 3
0
 def post(self, request: HttpRequest, *args: Any,
          **kwargs: Any) -> HttpResponse:
     """
     Updates the request user's existing draft or creates a new draft.
     """
     submission_data_list = query_dict_to_list_of_tuples(request.POST)
     self.exercise.set_submission_draft(self.profile, submission_data_list)
     # Simple OK response
     return HttpResponse()
Esempio n. 4
0
 def create_from_post(self, exercise, submitters, request):
     new_submission = Submission.objects.create(
         exercise=exercise,
         submission_data=query_dict_to_list_of_tuples(request.POST))
     new_submission.submitters = submitters
     try:
         new_submission.add_files(request.FILES)
     except DatabaseError:
         logger.exception("Failed to save submitted files: %s %s",
                          request.user.username, exercise)
         new_submission.delete()
         return None
     return new_submission
Esempio n. 5
0
 def create_from_post(self, exercise, submitters, request):
     new_submission = Submission.objects.create(
         exercise=exercise,
         submission_data=query_dict_to_list_of_tuples(request.POST)
     )
     new_submission.submitters = submitters
     try:
         new_submission.add_files(request.FILES)
     except DatabaseError:
         logger.exception("Failed to save submitted files: %s %s",
             request.user.username, exercise);
         new_submission.delete()
         return None
     return new_submission
Esempio n. 6
0
def _handle_submission(request, exercise, students, form, submissions):
    """
    This method takes care of saving a new_submission locally and 
    sending it to an exercise service for assessment. 
    
    @param request: HttpRequest from Django
    @param exercise: an instance of an exercise class this submission is for
    @param students: a QuerySet of UserProfile objects that are submitting the exercise
    @param form: an instance of a Form class or None if there are no questions for the exercise
    @param submissions: previous submissions for the submitting user to the same exercise
    """

    new_submission = Submission.objects.create(exercise=exercise)
    new_submission.submitters = students

    # Save the POST parameters from the new_submission in
    # a list of tuples [(key1, value1), (key2, value2)].
    # By using tuples inside lists we allow two parameters
    # with the same name, which is not possible with dicts.
    new_submission.submission_data = helpers.query_dict_to_list_of_tuples(
        request.POST)

    # Add all submitted files to the new submission as SubmittedFile objects
    new_submission.add_files(request.FILES)

    try:
        # Try submitting the submission to the exercise service. The submission
        # is done with a multipart POST request that contains all the files and
        # POST parameters sent by the user.
        response_page = new_submission.submit_to_service()
    except Exception, e:
        #raise e
        # TODO: Retrieving the grading failed. An error report should be sent
        # to administrators
        messages.error(
            request,
            _('Connecting to the assessment server failed! (%s)') % str(e))
        response_page = ExercisePage(exercise)