Ejemplo n.º 1
0
 def save(self, task):
     users = get_latest_submits_for_task(task)
     for form_data in self.cleaned_data:
         user = form_data["user"]
         if user in users:
             value = users[user]
             if form_data["points"] is not None:
                 if "review" in value:
                     edit_review(
                         None,
                         None,
                         value["review"],
                         user,
                         form_data["points"],
                         form_data["reviewer_comment"],
                     )
                 else:
                     submit_review(
                         None,
                         None,
                         task,
                         user,
                         form_data["points"],
                         form_data["reviewer_comment"],
                         value["description"],
                     )
             else:
                 if "review" in value:
                     submit = value["review"]
                     submit.points = 0
                     submit.testing_status = SUBMIT_STATUS_IN_QUEUE
                     submit.save()
Ejemplo n.º 2
0
 def test_empty_points(self):
     form_set = self.form_set_class(
         self.data,
         form_kwargs={"max_points": self.task.description_points})
     self.assertTrue(form_set.is_valid())
     form_set.save(self.task)
     users = helpers.get_latest_submits_for_task(self.task)
     self.assertNotIn("review", users[self.user1])
Ejemplo n.º 3
0
def review_task(request, task_pk):
    task = get_object_or_404(Task, pk=task_pk)
    PointsFormSet = formset_factory(BasePointForm, formset=BasePointFormSet, extra=0)

    if (
        not request.user.is_superuser
        and task.round.semester.competition.organizers_group not in request.user.groups.all()
    ):
        raise PermissionDenied

    form = None
    form_set = None

    if request.method == "POST":
        if request.POST.get("Upload", None):
            form = UploadZipForm(request.POST, request.FILES)
            if form.is_valid():
                path_to_zip = form.save(request.user, task)

                if path_to_zip:
                    request.session["review_archive"] = path_to_zip
                    messages.add_message(
                        request, messages.SUCCESS, _("Successfully uploaded a zip file.")
                    )
                    return redirect("admin:review_submit_zip", task.pk)
        if "points_submit" in request.POST:
            form_set = PointsFormSet(
                request.POST, form_kwargs={"max_points": task.description_points}
            )
            if form_set.is_valid():
                form_set.save(task)
                messages.add_message(
                    request, messages.SUCCESS, _("Points and comments were successfully updated.")
                )
                return redirect("admin:review_task", task.pk)

    users = get_latest_submits_for_task(task)
    users_list = list(users.keys())

    if not form:
        form = UploadZipForm()
    if not form_set:
        data = []
        for user in users_list:
            value = users[user]
            form_data = {"user": user}
            if "review" in value:
                form_data["points"] = value["review"].points
                form_data["reviewer_comment"] = value["review"].reviewer_comment
            data.append(form_data)
        form_set = PointsFormSet(initial=data, form_kwargs={"max_points": task.description_points})
    for i in range(0, len(users_list)):
        users[users_list[i]]["form"] = form_set.forms[i]

    context = {"task": task, "users": users, "form": form, "form_set": form_set}

    return render(request, "admin/review_form.html", context)
Ejemplo n.º 4
0
 def test_add_new_reviews(self):
     self.data["form-0-points"] = 4
     self.data["form-0-reviewer_comment"] = "Nic moc"
     form_set = self.form_set_class(
         self.data, form_kwargs={"max_points": self.task.description_points}
     )
     self.assertTrue(form_set.is_valid())
     form_set.save(self.task)
     users = helpers.get_latest_submits_for_task(self.task)
     self.assertEqual(users[self.user1]["review"].points, 4)
     self.assertEqual(users[self.user1]["review"].reviewer_comment, "Nic moc")
Ejemplo n.º 5
0
 def test_add_new_reviews(self):
     self.data['form-0-points'] = 4
     self.data['form-0-reviewer_comment'] = 'Nic moc'
     form_set = self.form_set_class(
         self.data,
         form_kwargs={'max_points': self.task.description_points})
     self.assertTrue(form_set.is_valid())
     form_set.save(self.task)
     users = helpers.get_latest_submits_for_task(self.task)
     self.assertEqual(users[self.user1]['review'].points, 4)
     self.assertEqual(users[self.user1]['review'].reviewer_comment,
                      'Nic moc')
Ejemplo n.º 6
0
 def test_empty_points_with_review(self):
     Submit.objects.create(
         task=self.task,
         user=self.user1,
         submit_type=submit_constants.SUBMIT_TYPE_DESCRIPTION,
         points=7,
         testing_status=submit_constants.SUBMIT_STATUS_REVIEWED,
         reviewer_comment='First comment')
     form_set = self.form_set_class(
         self.data,
         form_kwargs={'max_points': self.task.description_points})
     self.assertTrue(form_set.is_valid())
     form_set.save(self.task)
     users = helpers.get_latest_submits_for_task(self.task)
     self.assertNotIn('review', users[self.user1])
Ejemplo n.º 7
0
 def test_edit_review(self):
     Submit.objects.create(
         task=self.task,
         user=self.user1,
         submit_type=submit_constants.SUBMIT_TYPE_DESCRIPTION,
         points=7,
         testing_status=submit_constants.SUBMIT_STATUS_REVIEWED,
         reviewer_comment="First comment",
     )
     self.data["form-0-points"] = 9
     self.data["form-0-reviewer_comment"] = "Second comment"
     form_set = self.form_set_class(
         self.data, form_kwargs={"max_points": self.task.description_points}
     )
     self.assertTrue(form_set.is_valid())
     form_set.save(self.task)
     users = helpers.get_latest_submits_for_task(self.task)
     self.assertEqual(users[self.user1]["review"].points, 9)
     self.assertEqual(users[self.user1]["review"].reviewer_comment, "Second comment")
Ejemplo n.º 8
0
 def save(self, task):
     users = get_latest_submits_for_task(task)
     for form_data in self.cleaned_data:
         user = form_data['user']
         if user in users:
             value = users[user]
             if form_data['points'] is not None:
                 if 'review' in value:
                     edit_review(None, None, value['review'], user,
                                 form_data['points'],
                                 form_data['reviewer_comment'])
                 else:
                     submit_review(None, None, task, user,
                                   form_data['points'],
                                   form_data['reviewer_comment'],
                                   value['description'])
             else:
                 if 'review' in value:
                     submit = value['review']
                     submit.points = 0
                     submit.testing_status = SUBMIT_STATUS_IN_QUEUE
                     submit.save()
Ejemplo n.º 9
0
Archivo: views.py Proyecto: lampask/web
def download_all_submits(request, task_pk, download_reviews=False):
    task = get_object_or_404(Task, pk=task_pk)
    submits = get_latest_submits_for_task(task).values()

    if (not request.user.is_superuser
            and task.round.semester.competition.organizers_group
            not in request.user.groups.all()):
        raise PermissionDenied

    path = os.path.join(settings.SUBMIT_PATH, "reviews")
    if not os.path.isdir(path):
        os.makedirs(path)
        os.chmod(path, 0o777)

    path = os.path.join(
        path,
        "Uloha-%s-%s-%s.zip" %
        (slugify(task.name), int(time()), slugify(request.user.username)),
    )

    errors = []

    with zipfile.ZipFile(path, "w") as zipper:
        for i, user in enumerate(submits):
            if "description" in user:
                submit = (user["review"] if download_reviews
                          and "review" in user else user["description"])
                description_submit_id = submit.pk
                if not os.path.isfile(submit.filepath):
                    errors += [
                        _("Missing file of user %s") %
                        submit.user.get_full_name()
                    ]
                else:
                    zipper.write(submit.filepath,
                                 submit_download_filename(submit, i))
                last_review_points = str(int(
                    user["review"].points)) if "review" in user else ""
                last_review_comment = user[
                    "review"].reviewer_comment if "review" in user else ""
                zipper.writestr(
                    submit_directory(submit, i) + REVIEW_POINTS_FILENAME,
                    last_review_points)
                zipper.writestr(
                    submit_directory(submit, i) + REVIEW_COMMENT_FILENAME,
                    last_review_comment.encode("utf-8"),
                )

            if "sources" in user:
                for submit in user["sources"]:
                    if os.path.isfile(submit.filepath):
                        zipper.write(
                            submit.filepath,
                            submit_source_download_filename(
                                submit, description_submit_id, i),
                        )
                    else:
                        errors += [
                            _("Missing source file of user %s") %
                            submit.user.get_full_name()
                        ]
                    if submit.protocol:
                        zipper.writestr(
                            submit.protocol,
                            submit_protocol_download_filename(
                                submit, description_submit_id, i),
                        )
                    else:
                        errors += [
                            _("Missing protocol of user %s") %
                            submit.user.get_full_name()
                        ]

        if errors:
            zipper.writestr(REVIEW_ERRORS_FILENAME,
                            "\n".join(errors).encode("utf8"))

    return sendfile(request, path, attachment=True)
Ejemplo n.º 10
0
def review_task(request, task_pk):
    task = get_object_or_404(Task, pk=task_pk)
    PointsFormSet = formset_factory(BasePointForm,
                                    formset=BasePointFormSet,
                                    extra=0)

    if (not request.user.is_superuser
            and task.round.semester.competition.organizers_group
            not in request.user.groups.all()):
        raise PermissionDenied

    form = None
    form_set = None

    if request.method == 'POST':
        if request.POST.get('Upload', None):
            form = UploadZipForm(request.POST, request.FILES)
            if form.is_valid():
                path_to_zip = form.save(request.user, task)

                if path_to_zip:
                    request.session['review_archive'] = path_to_zip
                    messages.add_message(
                        request, messages.SUCCESS,
                        _('Successfully uploaded a zip file.'))
                    return redirect('admin:review_submit_zip', task.pk)
        if 'points_submit' in request.POST:
            form_set = PointsFormSet(
                request.POST,
                form_kwargs={'max_points': task.description_points})
            if form_set.is_valid():
                form_set.save(task)
                messages.add_message(
                    request, messages.SUCCESS,
                    _('Points and comments were successfully updated.'))
                return redirect('admin:review_task', task.pk)

    users = get_latest_submits_for_task(task)
    users_list = list(users.keys())

    if not form:
        form = UploadZipForm()
    if not form_set:
        data = []
        for user in users_list:
            value = users[user]
            form_data = {'user': user}
            if 'review' in value:
                form_data['points'] = value['review'].points
                form_data['reviewer_comment'] = value[
                    'review'].reviewer_comment
            data.append(form_data)
        form_set = PointsFormSet(
            initial=data, form_kwargs={'max_points': task.description_points})
    for i in range(0, len(users_list)):
        users[users_list[i]]['form'] = form_set.forms[i]

    context = {
        'task': task,
        'users': users,
        'form': form,
        'form_set': form_set,
    }

    return render(request, 'admin/review_form.html', context)