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'])
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
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
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='******'))
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='******'))