Пример #1
0
 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))
Пример #2
0
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,
        })
Пример #3
0
    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,
        }
Пример #4
0
    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,
        }
Пример #5
0
 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)
Пример #6
0
 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)
Пример #7
0
    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())
Пример #8
0
    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())
Пример #9
0
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)
Пример #10
0
    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())
Пример #11
0
    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())
Пример #12
0
    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())
Пример #13
0
    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())
Пример #14
0
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
        })
Пример #15
0
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
        })
Пример #16
0
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)
Пример #17
0
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,
        })
Пример #18
0
    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())