def make_request(request, public_body=None): public_body_form = None if public_body is not None: public_body = get_object_or_404(PublicBody, slug=public_body) if not public_body.email: raise Http404 all_laws = FoiLaw.objects.filter(jurisdiction=public_body.jurisdiction) else: all_laws = FoiLaw.objects.all() public_body_form = PublicBodyForm() initial = { "subject": request.GET.get("subject", ""), "body": request.GET.get("body", "") } initial['jurisdiction'] = request.GET.get("jurisdiction", None) rq_form = RequestForm(all_laws, FoiLaw.get_default_law(public_body), True, initial=initial) topic = request.GET.get("topic", "") user_form = None if not request.user.is_authenticated(): user_form = NewUserForm() return render(request, 'foirequest/request.html', {"public_body": public_body, "public_body_form": public_body_form, "request_form": rq_form, "user_form": user_form, "topic": topic})
def test_set_message_sender(self): from foirequest.forms import MessagePublicBodySenderForm mail.outbox = [] self.client.login(username="******", password="******") pb = PublicBody.objects.all()[0] post = {"subject": "A simple test request", "body": "This is another test body", "law": str(FoiLaw.get_default_law().id), "public_body": str(pb.id), "public": "on"} response = self.client.post( reverse('foirequest-submit_request'), post) self.assertEqual(response.status_code, 302) self.assertEqual(len(mail.outbox), 2) req = FoiRequest.objects.get(title=post['subject']) req.add_message_from_email({ 'msgobj': None, 'date': (datetime.now() + timedelta(days=1), 0), 'subject': u"Re: %s" % req.title, 'body': u"""Message""", 'html': None, 'from': ("FoI Officer", "*****@*****.**"), 'to': [(req.user.get_full_name(), req.secret_address)], 'cc': [], 'resent_to': [], 'resent_cc': [], 'attachments': [] }, "FAKE_ORIGINAL") self.assertEqual(len(req.messages), 2) self.assertEqual(len(mail.outbox), 3) notification = mail.outbox[-1] match = re.search('https?://[^/]+(/.*?/%d/[^\s]+)' % req.user.pk, notification.body) self.assertIsNotNone(match) url = match.group(1) self.client.logout() response = self.client.get(reverse('account-show')) self.assertEqual(response.status_code, 302) response = self.client.get(url) self.assertEqual(response.status_code, 302) message = req.messages[1] self.assertIn(req.get_absolute_url(), response['Location']) response = self.client.get(reverse('account-show')) self.assertEqual(response.status_code, 200) form = MessagePublicBodySenderForm(message) post_var = form.add_prefix("sender") self.assertTrue(message.is_response) alternate_pb = PublicBody.objects.all()[1] response = self.client.post( reverse('foirequest-set_message_sender', kwargs={"slug": req.slug, "message_id": "9"*8}), {post_var: alternate_pb.id}) self.assertEqual(response.status_code, 404) self.assertNotEqual(message.sender_public_body, alternate_pb) self.client.logout() response = self.client.post( reverse('foirequest-set_message_sender', kwargs={"slug": req.slug, "message_id": str(message.pk)}), {post_var: alternate_pb.id}) self.assertEqual(response.status_code, 403) self.assertNotEqual(message.sender_public_body, alternate_pb) self.client.login(username="******", password="******") response = self.client.post( reverse('foirequest-set_message_sender', kwargs={"slug": req.slug, "message_id": str(message.pk)}), {post_var: alternate_pb.id}) self.assertEqual(response.status_code, 403) self.assertNotEqual(message.sender_public_body, alternate_pb) self.client.logout() self.client.login(username="******", password="******") mes = req.messages[0] response = self.client.post( reverse('foirequest-set_message_sender', kwargs={"slug": req.slug, "message_id": str(mes.pk)}), {post_var: str(alternate_pb.id)}) self.assertEqual(response.status_code, 400) self.assertNotEqual(message.sender_public_body, alternate_pb) response = self.client.post( reverse('foirequest-set_message_sender', kwargs={"slug": req.slug, "message_id": message.pk}), {post_var: "9" * 5}) self.assertEqual(response.status_code, 400) self.assertNotEqual(message.sender_public_body, alternate_pb) response = self.client.post( reverse('foirequest-set_message_sender', kwargs={"slug": req.slug, "message_id": message.pk}), {post_var: str(alternate_pb.id)}) self.assertEqual(response.status_code, 302) message = FoiMessage.objects.get(pk=message.pk) self.assertEqual(message.sender_public_body, alternate_pb)
def test_public_body_new_user_request(self): self.client.logout() pb = PublicBody.objects.all()[0] post = {"subject": "Test-Subject With New User", "body": "This is a test body with new user", "first_name": "Stefan", "last_name": "Wehrmeyer", "user_email": "*****@*****.**", # already exists in fixture "law": pb.laws.all()[0].pk} response = self.client.post(reverse('foirequest-submit_request', kwargs={"public_body": pb.slug}), post) self.assertTrue(response.context['user_form']['user_email'].errors) self.assertEqual(response.status_code, 400) post = {"subject": "Test-Subject With New User", "body": "This is a test body with new user", "first_name": "Stefan", "last_name": "Wehrmeyer", "address": "TestStreet 3\n55555 Town", "user_email": "*****@*****.**", "terms": "on", "law": str(FoiLaw.get_default_law().id)} response = self.client.post(reverse('foirequest-submit_request', kwargs={"public_body": pb.slug}), post) self.assertEqual(response.status_code, 302) user = User.objects.filter(email=post['user_email']).get() self.assertFalse(user.is_active) req = FoiRequest.objects.filter(user=user, public_body=pb).get() self.assertEqual(req.title, post['subject']) self.assertEqual(req.description, post['body']) self.assertEqual(req.status, "awaiting_user_confirmation") self.assertEqual(req.visibility, 0) message = req.foimessage_set.all()[0] self.assertIn(post['body'], message.plaintext) self.assertEqual(len(mail.outbox), 1) message = mail.outbox[0] self.assertEqual(mail.outbox[0].to[0], post['user_email']) match = re.search('/%d/%d/(\w+)/' % (user.pk, req.pk), message.body) self.assertIsNotNone(match) secret = match.group(1) response = self.client.get(reverse('account-confirm', kwargs={'user_id': user.pk, 'secret': secret, 'request_id': req.pk})) req = FoiRequest.objects.get(pk=req.pk) mes = req.messages[0] mes.timestamp = mes.timestamp - timedelta(days=2) mes.save() self.assertEqual(req.status, "awaiting_response") self.assertEqual(req.visibility, 1) self.assertEqual(len(mail.outbox), 3) message = mail.outbox[1] self.assertIn(req.secret_address, message.extra_headers.get('Reply-To','')) if settings.FROIDE_DRYRUN: self.assertEqual(message.to[0], "%s@%s" % (req.public_body.email.replace("@", "+"), settings.FROIDE_DRYRUN_DOMAIN)) else: self.assertEqual(message.to[0], req.public_body.email) self.assertEqual(message.subject, req.title) resp = self.client.post(reverse('foirequest-set_status', kwargs={"slug": req.slug})) self.assertEqual(resp.status_code, 400) response = self.client.post(reverse('foirequest-set_law', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 400) new_foi_email = "foi@" + pb.email.split("@")[1] req.add_message_from_email({ 'msgobj': None, 'date': (datetime.now() - timedelta(days=1),0), 'subject': u"Re: %s" % req.title, 'body': u"""Message""", 'html': None, 'from': ("FoI Officer", new_foi_email), 'to': [(req.user.get_full_name(), req.secret_address)], 'cc': [], 'resent_to': [], 'resent_cc': [], 'attachments': [] }, "FAKE_ORIGINAL") req = FoiRequest.objects.get(pk=req.pk) self.assertTrue(req.awaits_classification()) self.assertEqual(len(req.messages), 2) self.assertEqual(req.messages[1].sender_email, new_foi_email) self.assertEqual(req.messages[1].sender_public_body, req.public_body) response = self.client.get(reverse('foirequest-show', kwargs={"slug": req.slug})) self.assertEqual(response.status_code, 200) self.assertTrue(req.status_settable) response = self.client.post(reverse('foirequest-set_status', kwargs={"slug": req.slug}), {"status": "invalid_status_settings_now"}) self.assertEqual(response.status_code, 400) costs = "123.45" status = "awaiting_response" response = self.client.post(reverse('foirequest-set_status', kwargs={"slug": req.slug}), {"status": status, "costs": costs}) req = FoiRequest.objects.get(pk=req.pk) self.assertEqual(req.costs, float(costs)) self.assertEqual(req.status, status) # send reply old_len = len(mail.outbox) response = self.client.post(reverse('foirequest-send_message', kwargs={"slug": req.slug}), {}) self.assertEqual(response.status_code, 400) post = {"message": "My custom reply"} response = self.client.post(reverse('foirequest-send_message', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 400) post["to"] = 'abc' response = self.client.post(reverse('foirequest-send_message', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 400) post["to"] = '9'*10 response = self.client.post(reverse('foirequest-send_message', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 400) post["subject"] = "Re: Custom subject" post["to"] = str(req.possible_reply_addresses().values()[0].id) response = self.client.post(reverse('foirequest-send_message', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 302) new_len = len(mail.outbox) self.assertEqual(old_len + 2, new_len) message = filter(lambda x: post['subject'] == x.subject, mail.outbox)[-1] self.assertTrue(message.body.startswith(post['message'])) self.assertIn(user.get_profile().address, message.body) self.assertIn(new_foi_email, message.to[0]) req._messages = None foimessage = list(req.messages)[-1] self.assertEqual(foimessage.recipient_public_body, req.public_body) self.assertTrue(req.law.meta) other_laws = req.law.combined.all() post = {"law": str(other_laws[0].pk)} response = self.client.post(reverse('foirequest-set_law', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 302) response = self.client.get(reverse('foirequest-show', kwargs={"slug": req.slug})) self.assertEqual(response.status_code, 200) response = self.client.post(reverse('foirequest-set_law', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 400) # logout self.client.logout() response = self.client.post(reverse('foirequest-set_law', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 403) response = self.client.post(reverse('foirequest-send_message', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 403) response = self.client.post(reverse('foirequest-set_status', kwargs={"slug": req.slug}), {"status": status, "costs": costs}) self.assertEqual(response.status_code, 403) self.client.login(username='******', password='******') response = self.client.post(reverse('foirequest-set_law', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 403) response = self.client.post(reverse('foirequest-send_message', kwargs={"slug": req.slug}), post) self.assertEqual(response.status_code, 403)
def test_logged_in_request_no_public_body(self): self.client.login(username="******", password="******") post = {"subject": "An Empty Public Body Request", "body": "This is another test body", "law": str(FoiLaw.get_default_law().id), "public_body": '', "public": "on"} response = self.client.post( reverse('foirequest-submit_request'), post) self.assertEqual(response.status_code, 302) req = FoiRequest.objects.get(title=post['subject']) response = self.client.get(req.get_absolute_url()) self.assertEqual(response.status_code, 200) message = req.foimessage_set.all()[0] law = FoiLaw.get_default_law() self.assertIn(law.get_letter_start_text({}), message.plaintext) self.assertIn(law.get_letter_end_text({}), message.plaintext) # suggest public body other_req = FoiRequest.objects.filter(public_body__isnull=False)[0] pb = PublicBody.objects.all()[0] response = self.client.post( reverse('foirequest-suggest_public_body', kwargs={"slug": req.slug + "garbage"}), {"public_body": str(pb.pk)}) self.assertEqual(response.status_code, 404) response = self.client.post( reverse('foirequest-suggest_public_body', kwargs={"slug": other_req.slug}), {"public_body": str(pb.pk)}) self.assertEqual(response.status_code, 400) response = self.client.post( reverse('foirequest-suggest_public_body', kwargs={"slug": req.slug}), {}) self.assertEqual(response.status_code, 400) response = self.client.post( reverse('foirequest-suggest_public_body', kwargs={"slug": req.slug}), {"public_body": "9" * 10}) self.assertEqual(response.status_code, 400) self.client.logout() self.client.login(username="******", password="******") mail.outbox = [] response = self.client.post( reverse('foirequest-suggest_public_body', kwargs={"slug": req.slug}), {"public_body": str(pb.pk), "reason": "A good reason"}) self.assertEqual(response.status_code, 302) self.assertEqual([t.public_body for t in req.publicbodysuggestion_set.all()], [pb]) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].to[0], req.user.email) response = self.client.post( reverse('foirequest-suggest_public_body', kwargs={"slug": req.slug}), {"public_body": str(pb.pk), "reason": "A good reason"}) self.assertEqual(response.status_code, 302) self.assertEqual([t.public_body for t in req.publicbodysuggestion_set.all()], [pb]) self.assertEqual(len(mail.outbox), 1) # set public body response = self.client.post( reverse('foirequest-set_public_body', kwargs={"slug": req.slug + "garbage"}), {"suggestion": str(pb.pk)}) self.assertEqual(response.status_code, 404) self.client.logout() self.client.login(username="******", password="******") response = self.client.post( reverse('foirequest-set_public_body', kwargs={"slug": req.slug}), {}) self.assertEqual(response.status_code, 302) req = FoiRequest.objects.get(title=post['subject']) self.assertIsNone(req.public_body) response = self.client.post( reverse('foirequest-set_public_body', kwargs={"slug": req.slug}), {"suggestion": "9" * 10}) self.assertEqual(response.status_code, 400) self.client.logout() response = self.client.post( reverse('foirequest-set_public_body', kwargs={"slug": req.slug}), {"suggestion": str(pb.pk)}) self.assertEqual(response.status_code, 403) self.client.login(username="******", password="******") response = self.client.post( reverse('foirequest-set_public_body', kwargs={"slug": req.slug}), {"suggestion": str(pb.pk)}) self.assertEqual(response.status_code, 302) req = FoiRequest.objects.get(title=post['subject']) message = req.foimessage_set.all()[0] self.assertIn(req.law.get_letter_start_text({}), message.plaintext) self.assertIn(req.law.get_letter_end_text({}), message.plaintext) self.assertEqual(req.public_body, pb) response = self.client.post( reverse('foirequest-set_public_body', kwargs={"slug": req.slug}), {"suggestion": str(pb.pk)}) self.assertEqual(response.status_code, 400)
def submit_request(request, public_body=None): error = False foilaw = None if public_body is not None: public_body = get_object_or_404(PublicBody, slug=public_body) all_laws = FoiLaw.objects.filter(jurisdiction=public_body.jurisdiction) else: all_laws = FoiLaw.objects.all() context = {"public_body": public_body} request_form = RequestForm(all_laws, FoiLaw.get_default_law(public_body), True, request.POST) context['request_form'] = request_form context['public_body_form'] = PublicBodyForm() if public_body is None and \ request.POST.get('public_body') == "new": pb_form = PublicBodyForm(request.POST) context["public_body_form"] = pb_form if pb_form.is_valid(): data = pb_form.cleaned_data data['confirmed'] = False public_body = PublicBody(**data) else: error = True if not request_form.is_valid(): error = True else: if public_body is None and \ request_form.cleaned_data['public_body'] != '' and \ request_form.cleaned_data['public_body'] != 'new': public_body = request_form.public_body_object context['user_form'] = None user = None if not request.user.is_authenticated(): user_form = NewUserForm(request.POST) context['user_form'] = user_form if not user_form.is_valid(): error = True else: user = request.user if not error: password = None if user is None: user, password = AccountManager.create_user(**user_form.cleaned_data) sent_to_pb = 1 if public_body is not None and public_body.pk is None: public_body._created_by = user public_body.save() sent_to_pb = 2 elif public_body is None: sent_to_pb = 0 if foilaw is None: foilaw = request_form.foi_law foi_request = FoiRequest.from_request_form(user, public_body, foilaw, form_data=request_form.cleaned_data, post_data=request.POST) if user.is_active: if sent_to_pb == 0: messages.add_message(request, messages.INFO, _('Others can now suggest the Public Bodies for your request.')) elif sent_to_pb == 2: messages.add_message(request, messages.INFO, _('Your request will be sent as soon as the newly created Public Body was confirmed by an administrator.')) else: messages.add_message(request, messages.INFO, _('Your request has been sent.')) return HttpResponseRedirect(foi_request.get_absolute_url()) else: AccountManager(user).send_confirmation_mail(request_id=foi_request.pk, password=password) messages.add_message(request, messages.INFO, _('Please check your inbox for mail from us to confirm your mail address.')) # user cannot access the request yet! return HttpResponseRedirect("/") messages.add_message(request, messages.ERROR, _('There were errors in your form submission. Please review and submit again.')) return render(request, 'foirequest/request.html', context, status=400)