Beispiel #1
0
    def test_comment_in_submit(self):
        comment = """TESTINGComment\ns diakritikou áäčďéíľňóŕšťúýž"""
        submit = Submit.objects.create(
            task=self.task,
            user=self.user,
            points=5,
            submit_type=submit_constants.SUBMIT_TYPE_DESCRIPTION,
            filepath=path.join(path.dirname(__file__), "test_data", "submits",
                               "description.txt"),
        )
        submit.time = self.task.round.start_time + timezone.timedelta(0, 5)
        submit.save()
        Submit.objects.create(
            task=self.task,
            user=self.user,
            points=5,
            reviewer_comment=comment,
            testing_status=submit_constants.SUBMIT_STATUS_REVIEWED,
            submit_type=submit_constants.SUBMIT_TYPE_DESCRIPTION,
        )

        comm_file = "%s%s" % (
            helpers.submit_directory(submit, 0),
            review_constants.REVIEW_COMMENT_FILENAME,
        )

        self.client.force_login(self.staff)
        url = reverse(self.url_name, kwargs={"task_pk": self.task.id})
        response = self.client.get(url)
        f = io.BytesIO(b"".join(response.streaming_content))
        zipped_file = zipfile.ZipFile(f, "a")
        data = zipped_file.read(comm_file)
        self.assertEqual(data.decode("utf-8"), comment)
        zipped_file.close()
        f.close()
Beispiel #2
0
    def test_points_in_submit(self):
        points = 47
        submit = Submit.objects.create(
            task=self.task,
            user=self.user,
            points=0,
            submit_type=submit_constants.SUBMIT_TYPE_DESCRIPTION,
            filepath=path.join(path.dirname(__file__), "test_data", "submits",
                               "description.txt"),
        )
        submit.time = self.task.round.start_time + timezone.timedelta(0, 5)
        submit.save()
        Submit.objects.create(
            task=self.task,
            user=self.user,
            points=points,
            testing_status=submit_constants.SUBMIT_STATUS_REVIEWED,
            submit_type=submit_constants.SUBMIT_TYPE_DESCRIPTION,
        )

        points_file = "%s%s" % (
            helpers.submit_directory(submit, 0),
            review_constants.REVIEW_POINTS_FILENAME,
        )

        self.client.force_login(self.staff)
        url = reverse(self.url_name, kwargs={"task_pk": self.task.id})
        response = self.client.get(url)
        f = io.BytesIO(b"".join(response.streaming_content))
        zipped_file = zipfile.ZipFile(f, "a")
        data = zipped_file.read(points_file)
        self.assertEqual(int(data), points)
        zipped_file.close()
        f.close()
Beispiel #3
0
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)