def test_preset_50(self): """Selecting a preset should set the correct value in payment_amount""" data = {'presets': 'preset-50'} form = DonationAmountForm(data=data) self.assertTrue(form.is_valid()) self.assertEqual(form.cleaned_data['payment_amount'], Decimal(50))
def donate_project(request, slug): """A profile for each project. Also includes a donation form""" project = get_object_or_404( Project.published_objects.select_related( 'volunteerpicture', 'featured_image', 'account', 'overflow'), slug=slug) if request.method == 'POST': form = DonationAmountForm(data=request.POST) if form.is_valid(): if project.account.funded() and project.overflow: code = project.overflow.code else: code = project.account.code params = {'project': code, # convert back into cents 'amount': int(round( form.cleaned_data['payment_amount'] * 100))} return HttpResponseRedirect( reverse('donations_payment') + '?' + urlencode(params)) else: form = DonationAmountForm() return render( request, 'donations/donate_project.jinja', { 'title': project.title, 'project': project, 'account': project.account, 'donate_form': form, "IS_PROJECT": project.account.category == Account.PROJECT, })
def errors_or_paygov(self, account, data, host): """Return a 400 or the paygov data""" amount_form = DonationAmountForm(data, account=account) if not amount_form.is_valid(): errors = self.serialize_errors(amount_form) return Http400("validation error", error_form="amount", errors=errors) donorinfo_form = DonationPaymentForm(data) if not donorinfo_form.is_valid(): errors = self.serialize_errors(donorinfo_form) return Http400("validation error", error_form="donorinfo", errors=errors) # convert to cents payment_amount = int(amount_form.cleaned_data['payment_amount'] * 100) payment_data = dict(donorinfo_form.cleaned_data) payment_data['payment_amount'] = payment_amount payment_data['project_code'] = account.code paygov = convert_to_paygov(payment_data, account, "https://" + host) paygov.save() return { "agency_id": settings.PAY_GOV_AGENCY_ID, "agency_tracking_id": paygov.agency_tracking_id, "app_name": settings.PAY_GOV_APP_NAME, "oci_servlet_url": settings.PAY_GOV_OCI_URL, }
def errors_or_paygov(self, account, data, host): """Return a 400 or the paygov data""" amount_form = DonationAmountForm(data, account=account) if not amount_form.is_valid(): errors = self.serialize_errors(amount_form) return Http400( "validation error", error_form="amount", errors=errors) donorinfo_form = DonationPaymentForm(data) if not donorinfo_form.is_valid(): errors = self.serialize_errors(donorinfo_form) return Http400( "validation error", error_form="donorinfo", errors=errors) # convert to cents payment_amount = int(amount_form.cleaned_data['payment_amount'] * 100) payment_data = dict(donorinfo_form.cleaned_data) payment_data['payment_amount'] = payment_amount payment_data['project_code'] = account.code paygov = convert_to_paygov(payment_data, account, "https://" + host) paygov.save() return { "agency_id": settings.PAY_GOV_AGENCY_ID, "agency_tracking_id": paygov.agency_tracking_id, "app_name": settings.PAY_GOV_APP_NAME, "oci_servlet_url": settings.PAY_GOV_OCI_URL, }
def test_custom_required(self): """Payment amount of some form is required""" for data in ({}, {'payment_amount': ''}): form = DonationAmountForm(data=data) self.assertFalse(form.is_valid()) errors = form.errors.as_data() self.assertTrue('payment_amount' in errors) self.assertEqual('required', errors['payment_amount'][0].code)
def test_custom_lower_limit(self): data = {'payment_amount': '0.99'} form = DonationAmountForm(data=data) self.assertFalse(form.is_valid()) errors = form.errors.as_data() self.assertEqual('min_value', errors['payment_amount'][0].code) data['payment_amount'] = '1.00' self.assertTrue(DonationAmountForm(data=data).is_valid())
def donation_payment(request, account, project=None, campaign=None): """Collect donor contact information. Expects a GET param, payment_amount, in dollars.""" form = DonationAmountForm(data=request.GET, account=account) if not form.is_valid(): if project: url = reverse('donate project', kwargs={'slug': project.slug}) else: url = reverse('donate campaign', kwargs={'slug': campaign.slug}) return HttpResponseRedirect( url + '?payment_amount=' + urlquote(request.GET.get('payment_amount', '')) + '&nonce=' + get_random_string(12) + '#amount-form') # convert to cents payment_amount = int(form.cleaned_data['payment_amount'] * 100) try: pay_gov_alert = PayGovAlert.objects.latest('id') except ObjectDoesNotExist: pay_gov_alert = None; context = { 'title': 'Giving Checkout', 'payment_amount': payment_amount, 'project': project, 'campaign': campaign, 'agency_id': settings.PAY_GOV_AGENCY_ID, 'app_name': settings.PAY_GOV_APP_NAME, 'oci_servlet_url': settings.PAY_GOV_OCI_URL, 'pay_gov_alert': pay_gov_alert, } if request.method == 'POST': form = DonationPaymentForm(request.POST) else: form = DonationPaymentForm() context['form'] = form if project: context['ajax_url'] = reverse('api:project_payment', kwargs={'slug': project.slug}) else: context['ajax_url'] = reverse('api:fund_payment', kwargs={'slug': campaign.slug}) if form.is_valid() and request.POST.get('force_form') != 'true': data = {k: v for k, v in form.cleaned_data.items()} data['payment_amount'] = payment_amount data['project_code'] = account.code paygov = convert_to_paygov( data, account, "https://" + request.get_host()) paygov.save() context['data'] = data context['agency_tracking_id'] = paygov.agency_tracking_id return render(request, 'donations/checkout_review.jinja', context) else: return render(request, 'donations/checkout_form.jinja', context)
def test_preset_custom(self): """Entering no value will result in an error. Entering a custom amount will resolve""" data = {'presets': 'custom'} form = DonationAmountForm(data=data) self.assertFalse(form.is_valid()) data['payment_amount'] = 1250 form = DonationAmountForm(data=data) self.assertTrue(form.is_valid())
def test_custom_upper_limit(self): """Ceiling of 9999.99""" data = {'payment_amount': '10000'} form = DonationAmountForm(data=data) self.assertFalse(form.is_valid()) errors = form.errors.as_data() self.assertEqual('max_value', errors['payment_amount'][0].code) data['payment_amount'] = '9999.99' self.assertTrue(DonationAmountForm(data=data).is_valid())
def test_custom_per_project_upper_limit(self): """Error if trying to donate more than a project needs""" data = {'payment_amount': '50.00'} account = Account(goal=8000, current=3001) form = DonationAmountForm(data=data, account=account) self.assertFalse(form.is_valid()) errors = form.errors.as_data() self.assertEqual('max_value', errors['payment_amount'][0].code) self.assertTrue('$49.99' in errors['payment_amount'][0].message) account.current = 3000 form = DonationAmountForm(data=data, account=account) self.assertTrue(form.is_valid())
def fund_detail(request, slug): campaign = get_object_or_404( Campaign.published_objects.select_related('account'), slug=slug) if 'payment_amount' in request.GET: form = DonationAmountForm(data=request.GET, account=campaign.account) else: form = DonationAmountForm(account=campaign.account) return render( request, 'donations/fund_detail.jinja', { 'title': 'Donate', 'campaign': campaign, 'account': campaign.account, 'donate_form': form, "PROJECT": Account.PROJECT })
def donate_project(request, slug): """A profile for each project. Also includes a donation form""" project = get_object_or_404(Project.published_objects.select_related( 'volunteerpicture', 'featured_image', 'account', 'overflow'), slug=slug) if 'payment_amount' in request.GET: form = DonationAmountForm(data=request.GET, account=project.account) else: form = DonationAmountForm(account=project.account) return render( request, 'donations/donate_project.jinja', { 'title': project.title, 'project': project, 'account': project.account, 'donate_form': form, "PROJECT": Account.PROJECT })
def donation_payment(request, account, project=None, campaign=None): """Collect donor contact information. Expects a GET param, payment_amount, in dollars.""" form = DonationAmountForm(data=request.GET, account=account) if not form.is_valid(): if project: url = reverse('donate project', kwargs={'slug': project.slug}) else: url = reverse('donate campaign', kwargs={'slug': campaign.slug}) return HttpResponseRedirect( url + '?payment_amount=' + urlquote(request.GET.get('payment_amount', '')) + '&nonce=' + get_random_string(12) + '#amount-form') # convert to cents payment_amount = int(form.cleaned_data['payment_amount'] * 100) try: pay_gov_alert = PayGovAlert.objects.latest('id') except ObjectDoesNotExist: pay_gov_alert = None context = { 'title': 'Giving Checkout', 'payment_amount': payment_amount, 'project': project, 'campaign': campaign, 'agency_id': settings.PAY_GOV_AGENCY_ID, 'app_name': settings.PAY_GOV_APP_NAME, 'oci_servlet_url': settings.PAY_GOV_OCI_URL, 'pay_gov_alert': pay_gov_alert, } if request.method == 'POST': form = DonationPaymentForm(request.POST) else: form = DonationPaymentForm() context['form'] = form if project: context['ajax_url'] = reverse('api:project_payment', kwargs={'slug': project.slug}) else: context['ajax_url'] = reverse('api:fund_payment', kwargs={'slug': campaign.slug}) if form.is_valid() and request.POST.get('force_form') != 'true': data = {k: v for k, v in form.cleaned_data.items()} data['payment_amount'] = payment_amount data['project_code'] = account.code paygov = convert_to_paygov(data, account, "https://" + request.get_host()) paygov.save() context['data'] = data context['agency_tracking_id'] = paygov.agency_tracking_id return render(request, 'donations/checkout_review.jinja', context) else: return render(request, 'donations/checkout_form.jinja', context)
def fund_detail(request, slug): campaign = get_object_or_404(Campaign.objects.select_related('account'), slug=slug) if request.method == "POST": form = DonationAmountForm(data=request.POST) if form.is_valid(): params = {'project': campaign.account.code, # convert back into cents 'amount': int(round( form.cleaned_data['payment_amount'] * 100))} return HttpResponseRedirect( reverse('donations_payment') + '?' + urlencode(params)) else: form = DonationAmountForm() return render( request, 'donations/fund_detail.jinja', { 'campaign': campaign, 'account': campaign.account, 'donate_form': form, "IS_PROJECT": campaign.account.category == Account.PROJECT, })