def test_exclude_review_in_download_latest_submits(self): 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_file = helpers.submit_download_filename(submit, 0) review = Submit.objects.create( task=self.task, user=self.user, points=5, submit_type=submit_constants.SUBMIT_TYPE_DESCRIPTION, testing_status=submit_constants.SUBMIT_STATUS_REVIEWED, filepath=path.join(path.dirname(__file__), "test_data", "submits", "review.txt"), ) review_file = helpers.submit_download_filename(review, 0) 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") self.assertIsNone(zipped_file.testzip()) self.assertIn(submit_file, zipped_file.namelist()) self.assertNotIn(review_file, zipped_file.namelist()) zipped_file.close() f.close()
def test_only_source_submit(self): submit = Submit.objects.create( task=self.task, user=self.user, points=5, submit_type=submit_constants.SUBMIT_TYPE_SOURCE, filepath=path.join(path.dirname(__file__), "test_data", "submits", "source.cpp"), ) submit.time = self.task.round.start_time + timezone.timedelta(0, 5) submit.save() submit_file = helpers.submit_download_filename(submit, 0) 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") self.assertIsNone(zipped_file.testzip()) # pretoze k nemu nemam description tak nie je co reviewovat self.assertNotIn(submit_file, zipped_file.namelist()) zipped_file.close() f.close()
def submit_download(request, submit_pk): submit = get_object_or_404(Submit, pk=submit_pk) name = submit_download_filename(submit) if ( not request.user.is_superuser and submit.task.round.semester.competition.organizers_group not in request.user.groups.all() ): raise PermissionDenied if not os.path.isfile(submit.filepath): raise Http404 return sendfile(request, submit.filepath, attachment=True, attachment_filename=name)
def test_only_description_submit(self): 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_file = helpers.submit_download_filename(submit, 0) 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') self.assertIsNone(zipped_file.testzip()) self.assertIn(submit_file, zipped_file.namelist()) zipped_file.close() f.close()
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)