Exemplo n.º 1
0
def _generate_pdfdoc(request, mailsubmission):
    source_hash, submission_hash = mail_submission_hashes(mailsubmission)

    accept_link = request.build_absolute_uri(reverse('accept_mailsubmission',
            kwargs={
                'contest_id': request.contest.id,
                'mailsubmission_id': mailsubmission.id,
                'mailsubmission_hash': submission_hash,
            }))

    doc = render_to_string('mailsubmit/submissiondoc.tex',
            context_instance=RequestContext(request, {
                'config': request.contest.mail_submission_config,
                'submission': mailsubmission,
                'contest': request.contest,
                'source_hash': source_hash,
                'submission_hash': submission_hash,
                'qrcode_content': accept_link
            }))

    filename = u'%s-%s-%s.pdf' % (_("confirmation"),
            mailsubmission.problem_instance.short_name,
            mailsubmission.id)

    # The QR code generator needs the permission to run shell commands,
    # that's why we have --shell-escape here.
    # See also: http://www.texdev.net/2009/10/06/what-does-write18-mean/
    return generate_pdf(doc, filename, extra_args=['--shell-escape'])
Exemplo n.º 2
0
    def clean(self):
        cleaned_data = super(AcceptMailSubmissionForm, self).clean()
        if 'mailsubmission_id' not in cleaned_data \
                or 'submission_hash' not in cleaned_data:
            return cleaned_data

        mailsubmission_id = cleaned_data['mailsubmission_id']
        submission_hash = cleaned_data['submission_hash'].lower()

        try:
            mailsubmission = MailSubmission.objects.get(id=mailsubmission_id)
        except MailSubmission.DoesNotExist:
            raise ValidationError(_("Postal submission number %s does not "
                "exist") % (mailsubmission_id,))

        if mailsubmission.problem_instance.contest != self.request.contest:
            raise ValidationError(_("Postal submission number %s is for a "
                "different contest") % (mailsubmission_id,))

        _source_hash, mailsubmission_hash = \
                mail_submission_hashes(mailsubmission)
        if submission_hash != mailsubmission_hash:
            raise ValidationError(_("Invalid confirmation code"))

        cleaned_data['mailsubmission'] = mailsubmission

        return cleaned_data
Exemplo n.º 3
0
    def clean(self):
        cleaned_data = super(AcceptMailSubmissionForm, self).clean()
        if 'mailsubmission_id' not in cleaned_data \
                or 'submission_hash' not in cleaned_data:
            return cleaned_data

        mailsubmission_id = cleaned_data['mailsubmission_id']
        submission_hash = cleaned_data['submission_hash'].lower()

        try:
            mailsubmission = MailSubmission.objects.get(id=mailsubmission_id)
        except MailSubmission.DoesNotExist:
            raise ValidationError(
                _("Postal submission number %s does not "
                  "exist") % (mailsubmission_id, ))

        if mailsubmission.problem_instance.contest != self.request.contest:
            raise ValidationError(
                _("Postal submission number %s is for a "
                  "different contest") % (mailsubmission_id, ))

        _source_hash, mailsubmission_hash = \
                mail_submission_hashes(mailsubmission)
        if submission_hash != mailsubmission_hash:
            raise ValidationError(_("Invalid confirmation code"))

        cleaned_data['mailsubmission'] = mailsubmission

        return cleaned_data
Exemplo n.º 4
0
    def test_accepting_mailsubmissions(self):
        contest = Contest.objects.get()
        problem_instance = ProblemInstance.objects.get()
        problem_instance.submissions_limit = 0
        problem_instance.save()
        round = Round.objects.get()
        round.start_date = datetime(2012, 7, 31, tzinfo=utc)
        round.end_date = datetime(2012, 8, 10, tzinfo=utc)
        round.save()
        msc = MailSubmissionConfig(
            contest=contest,
            enabled=True,
            start_date=datetime(2012, 8, 12, tzinfo=utc),
            end_date=datetime(2012, 8, 14, tzinfo=utc),
        )
        msc.save()

        with fake_time(datetime(2012, 8, 13, tzinfo=utc)):
            response = self.submit_file(contest, problem_instance)
            self.assertEqual(200, response.status_code)

        self.assertEqual(MailSubmission.objects.count(), 1)
        ms = MailSubmission.objects.get()
        _ms_source_hash, ms_submission_hash = mail_submission_hashes(ms)

        self.assertEqual(Submission.objects.count(), 0)

        url = reverse('accept_mailsubmission_default',
                      kwargs={'contest_id': contest.id})
        valid_post_data = {
            'mailsubmission_id': ms.id,
            'submission_hash': ms_submission_hash,
        }
        invalid_post_data = {
            'mailsubmission_id': ms.id,
            'submission_hash': 'ABCDE'
        }

        response = self.client.post(url, valid_post_data)
        self.assertEqual(403, response.status_code)
        self.assertEqual(Submission.objects.count(), 0)

        self.assertTrue(self.client.login(username='******'))
        response = self.client.post(url, invalid_post_data)
        self.assertEqual(200, response.status_code)
        self.assertContains(response, 'Invalid confirmation code')
        self.assertEqual(Submission.objects.count(), 0)

        response = self.client.post(url, valid_post_data, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertEqual(Submission.objects.count(), 1)
        response = self.client.post(url, valid_post_data, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertContains(response, 'already accepted')
        ms = MailSubmission.objects.get()
        self.assertEqual(ms.accepted_by,
                         User.objects.get(username='******'))
Exemplo n.º 5
0
    def test_accepting_mailsubmissions(self):
        contest = Contest.objects.get()
        problem_instance = ProblemInstance.objects.get()
        problem_instance.submissions_limit = 0
        problem_instance.save()
        round = Round.objects.get()
        round.start_date = datetime(2012, 7, 31, tzinfo=utc)
        round.end_date = datetime(2012, 8, 10, tzinfo=utc)
        round.save()
        msc = MailSubmissionConfig(contest=contest, enabled=True,
                start_date=datetime(2012, 8, 12, tzinfo=utc),
                end_date=datetime(2012, 8, 14, tzinfo=utc))
        msc.save()

        with fake_time(datetime(2012, 8, 13, tzinfo=utc)):
            response = self.submit_file(contest, problem_instance)
            self.assertEqual(200, response.status_code)

        self.assertEqual(MailSubmission.objects.count(), 1)
        ms = MailSubmission.objects.get()
        _ms_source_hash, ms_submission_hash = mail_submission_hashes(ms)

        self.assertEqual(Submission.objects.count(), 0)

        url = reverse('accept_mailsubmission_default',
                      kwargs={'contest_id': contest.id})
        valid_post_data = {
            'mailsubmission_id': ms.id,
            'submission_hash': ms_submission_hash
        }
        invalid_post_data = {
            'mailsubmission_id': ms.id,
            'submission_hash': 'ABCDE'
        }

        response = self.client.post(url, valid_post_data)
        self.assertEqual(403, response.status_code)
        self.assertEqual(Submission.objects.count(), 0)

        self.client.login(username='******')
        response = self.client.post(url, invalid_post_data)
        self.assertEqual(200, response.status_code)
        self.assertIn('Invalid confirmation code', response.content)
        self.assertEqual(Submission.objects.count(), 0)

        response = self.client.post(url, valid_post_data, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertEqual(Submission.objects.count(), 1)
        response = self.client.post(url, valid_post_data, follow=True)
        self.assertEqual(200, response.status_code)
        self.assertIn('already accepted', response.content)
        ms = MailSubmission.objects.get()
        self.assertEqual(ms.accepted_by,
                         User.objects.get(username='******'))