22 months agoDon't show payment info on managed memberships
Sybren A. Stüvel [Thu, 3 Jan 2019 13:07:40 +0000 (14:07 +0100)]
Don't show payment info on managed memberships

22 months agoPrevent accessing subscriptions of anonymous user
Sybren A. Stüvel [Thu, 3 Jan 2019 11:55:25 +0000 (12:55 +0100)]
Prevent accessing subscriptions of anonymous user

22 months agoLog charge errors at INFO level
Sybren A. Stüvel [Thu, 3 Jan 2019 11:40:13 +0000 (12:40 +0100)]
Log charge errors at INFO level

Such errors happen very frequently (not enough money on a credit card, etc.)
so they shouldn't trigger Sentry events or send mails to admins.

22 months agoPrevent extending managed memberships
Sybren A. Stüvel [Thu, 3 Jan 2019 11:37:52 +0000 (12:37 +0100)]
Prevent extending managed memberships

Owners of a managed membership should NOT see the 'Extend your membership'

22 months agoMembership admin: allow searching by membership ID
Sybren A. Stüvel [Thu, 3 Jan 2019 11:34:26 +0000 (12:34 +0100)]
Membership admin: allow searching by membership ID

23 months agoAllow admins to download last order PDF from a Membership
Sybren A. Stüvel [Thu, 20 Dec 2018 14:06:10 +0000 (15:06 +0100)]
Allow admins to download last order PDF from a Membership

This allows filtering on membership level before trying to find the PDF.

23 months agoAdded hack to allow admins to get order receipts in PDF form from the admin
Sybren A. Stüvel [Thu, 20 Dec 2018 13:53:42 +0000 (14:53 +0100)]
Added hack to allow admins to get order receipts in PDF form from the admin

This adds another dependency of Looper on Blender Fund, which isn't nice
but necessary for now.

23 months agoUse TCP/IP sockets instead of UNIX domain sockets
Sybren A. Stüvel [Thu, 20 Dec 2018 09:41:48 +0000 (10:41 +0100)]
Use TCP/IP sockets instead of UNIX domain sockets

Turns out those are slightly slower but more reliable.

23 months agoBlender ID Badger API: use user ID instead of email address
Sybren A. Stüvel [Tue, 18 Dec 2018 17:38:25 +0000 (18:38 +0100)]
Blender ID Badger API: use user ID instead of email address

This allows people to change their email address and things will keep

Will break heavily when we try to deal with users of whom we don't have
their Blender ID UID, but that's good.

23 months agoAdded missing Looper migration
Sybren A. Stüvel [Tue, 18 Dec 2018 17:37:04 +0000 (18:37 +0100)]
Added missing Looper migration

23 months agoPrevent revoking Blender ID badges from system user
Sybren A. Stüvel [Tue, 18 Dec 2018 15:52:26 +0000 (16:52 +0100)]
Prevent revoking Blender ID badges from system user

Same as 3ca5efaefa163b3509087cd3e39dce377fec3ec8 but then for revoking

23 months agoUpdate BWA
Pablo Vazquez [Mon, 10 Dec 2018 20:11:39 +0000 (21:11 +0100)]
Update BWA

23 months agoUI: Flip overlapping thermometer label.
Pablo Vazquez [Mon, 10 Dec 2018 20:04:00 +0000 (21:04 +0100)]
UI: Flip overlapping thermometer label.

Fixes T59085

23 months agoUI: CSS tweaks to landing page
Francesco Siddi [Wed, 5 Dec 2018 18:59:21 +0000 (19:59 +0100)]
UI: CSS tweaks to landing page

23 months agoPDF Receipt: include bank details when it's a bank transfer
Sybren A. Stüvel [Wed, 28 Nov 2018 13:41:48 +0000 (14:41 +0100)]
PDF Receipt: include bank details when it's a bank transfer

23 months agoPDF receipt: include Foundation's name, address, and VAT number
Sybren A. Stüvel [Wed, 28 Nov 2018 13:33:08 +0000 (14:33 +0100)]
PDF receipt: include Foundation's name, address, and VAT number

23 months agoCopied Sentry settings from production to the example code
Sybren A. Stüvel [Wed, 28 Nov 2018 08:39:07 +0000 (09:39 +0100)]
Copied Sentry settings from production to the example code

This adds explicit logging configuration. It's the same as the default
logging config (see the [Sentry documentation](,
but with a raised `event_level` so that warnings are also sent to Sentry
(rather than only errors).

23 months agoTest multiple users with payment method for the Bank gateway
Sybren A. Stüvel [Wed, 28 Nov 2018 08:37:12 +0000 (09:37 +0100)]
Test multiple users with payment method for the Bank gateway

We had an issue in production with a troublesome uniqueness constraint in
the database (side-effect of some less-than-optimal manual migration in
the past) where only a single user could have a Bank payment method. This
wasn't reproducible in the test database because it's frequently recreated,
but it felt like a good idea to simply cover this case in a test anyway,
as the Bank gateway is somewhat special (ignores nonces, gives everybody
the same token 'bank').

23 months agoFixed the BF logo in the receipt PDF
Sybren A. Stüvel [Tue, 27 Nov 2018 09:40:31 +0000 (10:40 +0100)]
Fixed the BF logo in the receipt PDF

This was broken because of the cache busting introduced in 2f0eba4. It
seems that the finders expect a filename without the MD5 sum in it, but
that's already done by the {% static %} tag, so we have to take it out

2 years agoInclude glyphicons-halflings-regular font files in webstatic
Sybren A. Stüvel [Fri, 23 Nov 2018 13:08:59 +0000 (14:08 +0100)]
Include glyphicons-halflings-regular font files in webstatic

These are referenced by Bootstrap-SASS. Even though we don't use them
directly, they are still searched for by ' collectstatic' because
of the cache busting process.

Previously I tried to include the `node_modules` directory in
`STATICFILES_DIRS`; this works until we build the docker image, which
doesn't include `node_modules`.

2 years agoCache busting for static files
Sybren A. Stüvel [Fri, 23 Nov 2018 12:49:41 +0000 (13:49 +0100)]
Cache busting for static files

The Django built-in `ManifestStaticFilesStorage` class takes care of this.
However, it only works when running ` collectstatic`, so for
unit tests the default storage class is used.

2 years agoMove all unit test setting overrides to common test superclass
Sybren A. Stüvel [Fri, 23 Nov 2018 11:59:42 +0000 (12:59 +0100)]
Move all unit test setting overrides to common test superclass

This allows us to set some more settings globally in one go, without having
to inspect on a test-by-test basis where it is needed.

2 years agoAdded unittest for membership URL without protocol
Sybren A. Stüvel [Fri, 23 Nov 2018 11:24:56 +0000 (12:24 +0100)]
Added unittest for membership URL without protocol

Django already adds 'http://'; by having a unit test a change in this
behaviour will be noticed.

2 years agoCheckout Form: Don't clear the fields on show/hide.
Pablo Vazquez [Fri, 23 Nov 2018 11:04:29 +0000 (12:04 +0100)]
Checkout Form: Don't clear the fields on show/hide.

2 years agoUI: More responsive fixes.
Pablo Vazquez [Thu, 22 Nov 2018 20:03:33 +0000 (21:03 +0100)]
UI: More responsive fixes.

2 years agoUI: Mobile fixes and improvements.
Pablo Vazquez [Thu, 22 Nov 2018 19:55:18 +0000 (20:55 +0100)]
UI: Mobile fixes and improvements.

2 years agoUI Checkout: Show all Billing Address fields on demand.
Pablo Vazquez [Thu, 22 Nov 2018 19:22:07 +0000 (20:22 +0100)]
UI Checkout: Show all Billing Address fields on demand.

2 years agoUI Landing: Style adjustment on credits.
Pablo Vazquez [Thu, 22 Nov 2018 19:20:33 +0000 (20:20 +0100)]
UI Landing: Style adjustment on credits.

2 years agoUI: Minor text and layout changes in Payment Method Change/Replace
Pablo Vazquez [Thu, 22 Nov 2018 19:20:14 +0000 (20:20 +0100)]
UI: Minor text and layout changes in Payment Method Change/Replace

2 years agoUI Landing: rename anchor links
Pablo Vazquez [Thu, 22 Nov 2018 19:19:42 +0000 (20:19 +0100)]
UI Landing: rename anchor links

2 years agoUpdate Blender Web Assets
Pablo Vazquez [Thu, 22 Nov 2018 19:19:11 +0000 (20:19 +0100)]
Update Blender Web Assets

2 years agoUI: On the sidebar move Billing Address after Personal Info
Pablo Vazquez [Thu, 22 Nov 2018 19:18:58 +0000 (20:18 +0100)]
UI: On the sidebar move Billing Address after Personal Info

2 years agoUI: CSS tweaks to braintree form.
Pablo Vazquez [Thu, 22 Nov 2018 19:18:22 +0000 (20:18 +0100)]
UI: CSS tweaks to braintree form.

2 years agoRemoved debug log
Sybren A. Stüvel [Thu, 22 Nov 2018 14:45:31 +0000 (15:45 +0100)]
Removed debug log

2 years agoPorted 'replace payment method' page to new gateway selector HTML/JS
Sybren A. Stüvel [Thu, 22 Nov 2018 14:41:42 +0000 (15:41 +0100)]
Ported 'replace payment method' page to new gateway selector HTML/JS

2 years agoBetter handling of Braintree JavaScript error responses
Sybren A. Stüvel [Thu, 22 Nov 2018 14:10:41 +0000 (15:10 +0100)]
Better handling of Braintree JavaScript error responses

Instead of trying to find error messages in hardcoded-and-then-checked
properties, we simply recurse through the error object and concatenate
any 'message' property we find.

2 years agoOnly call $.select2() if necessary
Sybren A. Stüvel [Thu, 22 Nov 2018 14:24:24 +0000 (15:24 +0100)]
Only call $.select2() if necessary

Probably this bit of code should move to where it's required, and out of
the base template. No time to really look into that now, though.

2 years agoProperly show bank transfers in payment methods list
Sybren A. Stüvel [Thu, 22 Nov 2018 14:13:13 +0000 (15:13 +0100)]
Properly show bank transfers in payment methods list

2 years agoCorrectly set PaymentMethod.method_type
Sybren A. Stüvel [Thu, 22 Nov 2018 14:10:18 +0000 (15:10 +0100)]
Correctly set PaymentMethod.method_type

Previously we didn't do this, and thus all payment methods had type 'cc' as
this was the default. I've removed the default, as there is no reason to
assume 'cc' over any other when there is no explicit value passed. I've
also allowed blank values so that we can handle unknown types. Not ideal,
but I think it's better to be a bit more flexible.

When the user visits their payment methods page, the method_types are
automatically corrected with info from BrainTree.

2 years agoTell people to include the subscription nr in their bank transfer
Sybren A. Stüvel [Wed, 21 Nov 2018 15:10:19 +0000 (16:10 +0100)]
Tell people to include the subscription nr in their bank transfer

The subscription number doesn't change between orders, so that means that
they can keep the same description for a recurring payment.

2 years agoIncrease LOOPER_ORDER_RETRY_AFTER from 1 day to 2 days
Sybren A. Stüvel [Tue, 20 Nov 2018 16:19:28 +0000 (17:19 +0100)]
Increase LOOPER_ORDER_RETRY_AFTER from 1 day to 2 days

This gives people (including us) some more time to solve payment issues.
Having 2 days also prevents all attempts from being in the same weekend
(i.e. a Friday, Saturday, and Sunday evening charge was possible with only
one day of 'retry after' duration).

2 years agoAdded Sentry integration
Sybren A. Stüvel [Tue, 20 Nov 2018 16:03:17 +0000 (17:03 +0100)]
Added Sentry integration

sentry_sdk replaces raven.

2 years agoPrevent badge assignment to the system user
Sybren A. Stüvel [Tue, 20 Nov 2018 15:38:16 +0000 (16:38 +0100)]
Prevent badge assignment to the system user

2 years agoIntroducing gtag
Francesco Siddi [Thu, 15 Nov 2018 14:36:59 +0000 (15:36 +0100)]
Introducing gtag

2 years agoTweak payment method form label
Francesco Siddi [Thu, 15 Nov 2018 14:31:03 +0000 (15:31 +0100)]
Tweak payment method form label

2 years agoOnly allow extending memberships when it can be charged
Sybren A. Stüvel [Tue, 13 Nov 2018 16:57:04 +0000 (17:57 +0100)]
Only allow extending memberships when it can be charged

Without this check, pending-cancellation memberships would be extendable,
which is kind of weird.

2 years agoAdded missing deploy-time config for bank transfers
Sybren A. Stüvel [Tue, 13 Nov 2018 16:46:57 +0000 (17:46 +0100)]
Added missing deploy-time config for bank transfers

2 years agoUpgraded Wagtail from custom-rolled version to 2.3 release
Sybren A. Stüvel [Tue, 13 Nov 2018 16:35:12 +0000 (17:35 +0100)]
Upgraded Wagtail from custom-rolled version to 2.3 release

2 years agoFormatting
Sybren A. Stüvel [Tue, 13 Nov 2018 15:47:18 +0000 (16:47 +0100)]

2 years agoAdded type annotation
Sybren A. Stüvel [Tue, 13 Nov 2018 15:47:08 +0000 (16:47 +0100)]
Added type annotation

2 years agoAllow the admin to set some extra text for each payment gateway
Sybren A. Stüvel [Tue, 13 Nov 2018 15:47:00 +0000 (16:47 +0100)]
Allow the admin to set some extra text for each payment gateway

This allows us to write "do your bank transfer" and "this is only manual".

2 years agoOnly show 'membership cancelled' if the subscription was cancelled
Sybren A. Stüvel [Tue, 13 Nov 2018 15:01:36 +0000 (16:01 +0100)]
Only show 'membership cancelled' if the subscription was cancelled

2 years agoNicer label for gateway selector
Sybren A. Stüvel [Tue, 13 Nov 2018 15:01:25 +0000 (16:01 +0100)]
Nicer label for gateway selector

2 years agoFixed membership extension payment page
Sybren A. Stüvel [Tue, 13 Nov 2018 15:01:17 +0000 (16:01 +0100)]
Fixed membership extension payment page

2 years agoFixed payment form for extending memberships
Sybren A. Stüvel [Tue, 13 Nov 2018 14:53:57 +0000 (15:53 +0100)]
Fixed payment form for extending memberships

2 years agoMore address fields are now optional
Sybren A. Stüvel [Tue, 13 Nov 2018 14:53:46 +0000 (15:53 +0100)]
More address fields are now optional

2 years agoFixed Pug error
Sybren A. Stüvel [Tue, 13 Nov 2018 13:49:06 +0000 (14:49 +0100)]
Fixed Pug error

2 years agoT57751: Streamline Login Flow
Sybren A. Stüvel [Tue, 13 Nov 2018 13:35:11 +0000 (14:35 +0100)]
T57751: Streamline Login Flow

- Choosing a plan variation doesn't require logging in any more.
- Checkout out anonymously now shows a simplified page allowing the user to
  choose the plan variation + a login button.

2 years agoImplemented manual bank payments
Sybren A. Stüvel [Fri, 9 Nov 2018 17:08:30 +0000 (18:08 +0100)]
Implemented manual bank payments

- New payment gateway 'bank'.
- Show gateway choice in payment forms.
- Paying by bank only supports manual.
- Changed braintree to only support automatic.
- Switching between gateways now also switches collection method for the
  subscription and any still-payable (e.g. 'created' and 'soft-failed')
- The admin now has an action to bulk-mark orders as 'paid'.
- After completing the order, an email is sent with bank details.

2 years agoAllow extending memberships using flexible payments
Sybren A. Stüvel [Thu, 8 Nov 2018 12:41:16 +0000 (13:41 +0100)]
Allow extending memberships using flexible payments

For this I added a 'price per month' functions to PlanVariation and
Membership Level, which is used to convert between time and money, for
the current feature of flexible payment as well as up/downgrading
membership levels.

2 years agoNo longer auto-generate an Order when creating a Subscription
Sybren A. Stüvel [Thu, 8 Nov 2018 09:49:02 +0000 (10:49 +0100)]
No longer auto-generate an Order when creating a Subscription

Database objects should be created for a purpose (f.e. automatic renewal
happening, or the user paying for their membership) rather than as as side-
effect of another database object being created.

2 years agoTest money unit tests with MyPy as well
Sybren A. Stüvel [Thu, 8 Nov 2018 12:40:07 +0000 (13:40 +0100)]
Test money unit tests with MyPy as well

Annotating the test functions with `-> None` triggers MyPy to test those
functions as well. Since the Money class is very important to get right,
I thought this would be a good idea.

2 years agoMoney: added floor division operator
Sybren A. Stüvel [Thu, 8 Nov 2018 12:39:04 +0000 (13:39 +0100)]
Money: added floor division operator

This allows us to losslessly divide a monetary amount. This means that it
guarantees that when you do

    result = money // 3

this will hold:

    result * 3 <= money

We will use this in the future to compute the price of a Membership per
day, so that we can convert between time and money. The fact that this
computation will be off by a cent or so doesn't really matter.

2 years agoMake PyCharm happy
Sybren A. Stüvel [Thu, 8 Nov 2018 09:49:08 +0000 (10:49 +0100)]
Make PyCharm happy

2 years agoShow user when next automatic payment will happen.
Sybren A. Stüvel [Thu, 8 Nov 2018 09:06:05 +0000 (10:06 +0100)]
Show user when next automatic payment will happen.

2 years agoAdmin: allow filtering on managed memberships
Sybren A. Stüvel [Thu, 8 Nov 2018 08:24:33 +0000 (09:24 +0100)]
Admin: allow filtering on managed memberships

2 years agoPrevent toggling subscriptions between managed / non-managed in the admin
Sybren A. Stüvel [Thu, 8 Nov 2018 08:09:26 +0000 (09:09 +0100)]
Prevent toggling subscriptions between managed / non-managed in the admin

2 years agoUpgraded blender-id-oauth-client 0.7 → 0.8
Sybren A. Stüvel [Wed, 7 Nov 2018 15:44:26 +0000 (16:44 +0100)]
Upgraded blender-id-oauth-client 0.7 → 0.8

This fixes some potential issues with OAuth state getting out of sync.

2 years agoPrevent order generation for managed subscriptions
Sybren A. Stüvel [Wed, 7 Nov 2018 15:41:30 +0000 (16:41 +0100)]
Prevent order generation for managed subscriptions

This should make the database a bit cleaner, as those auto-created orders
for managed subscriptions will never be paid anyway.

2 years agoAlter 'Add Membership' in admin to easily create managed memberships
Sybren A. Stüvel [Tue, 23 Oct 2018 08:51:19 +0000 (10:51 +0200)]
Alter 'Add Membership' in admin to easily create managed memberships

2 years agogitignore the entire templates directory, not just '*.html' in there
Sybren A. Stüvel [Wed, 7 Nov 2018 13:37:37 +0000 (14:37 +0100)]
gitignore the entire templates directory, not just '*.html' in there

2 years agoAdmin: remove display of tax
Sybren A. Stüvel [Tue, 6 Nov 2018 09:42:47 +0000 (10:42 +0100)]
Admin: remove display of tax

We don't need those fields at the moment, so to reduce clutter it's better
to hide them.

2 years agoPrevent error in admin when order has no transactions
Sybren A. Stüvel [Tue, 6 Nov 2018 09:42:09 +0000 (10:42 +0100)]
Prevent error in admin when order has no transactions

2 years agoNotify manager (read: Ton) when a managed subscription passes its next_payment
Sybren A. Stüvel [Tue, 6 Nov 2018 09:37:40 +0000 (10:37 +0100)]
Notify manager (read: Ton) when a managed subscription passes its next_payment

2 years agoFixed bug in clock when subscription has no membership attached
Sybren A. Stüvel [Tue, 6 Nov 2018 09:38:09 +0000 (10:38 +0100)]
Fixed bug in clock when subscription has no membership attached

This should never happen in production, but it helps when trying out crazy
stuff while developing.

2 years agoRemoved the 'Add Payment Method' flow
Sybren A. Stüvel [Fri, 2 Nov 2018 11:05:11 +0000 (12:05 +0100)]
Removed the 'Add Payment Method' flow

It's possible to add payment methods by replacing an old one or by placing
a new order, and those flows are more explicit and easier to understand.
Furthermore, those are all done within the context of a certain currency,
which allows us to accept the correct payment method types.

2 years agoAllow users to replace a payment method
Sybren A. Stüvel [Fri, 2 Nov 2018 10:56:16 +0000 (11:56 +0100)]
Allow users to replace a payment method

Any subscription or order that's still payable and is using the old payment
method is changed to use the new payment method.

Also moved the PaymentMethodChangeTest from to

2 years agoRenamed template
Sybren A. Stüvel [Thu, 1 Nov 2018 17:04:36 +0000 (18:04 +0100)]
Renamed template

2 years agoLooper: Allow changing payment method for a subscription
Sybren A. Stüvel [Thu, 1 Nov 2018 15:47:21 +0000 (16:47 +0100)]
Looper: Allow changing payment method for a subscription

2 years agoReceipts: Don't show 'braintree' in front of used payment method
Sybren A. Stüvel [Thu, 1 Nov 2018 15:24:40 +0000 (16:24 +0100)]
Receipts: Don't show 'braintree' in front of used payment method

2 years agoRemoved unused imports
Sybren A. Stüvel [Thu, 1 Nov 2018 15:24:06 +0000 (16:24 +0100)]
Removed unused imports

2 years agoAdmin: added link to users' subscriptions
Sybren A. Stüvel [Thu, 1 Nov 2018 11:36:23 +0000 (12:36 +0100)]
Admin: added link to users' subscriptions

2 years agoAdmin: unified which fields of the user are used for searching
Sybren A. Stüvel [Thu, 1 Nov 2018 11:30:57 +0000 (12:30 +0100)]
Admin: unified which fields of the user are used for searching

2 years agoPrevent duplicate subscription + order when payment fails
Sybren A. Stüvel [Thu, 1 Nov 2018 11:09:52 +0000 (12:09 +0100)]
Prevent duplicate subscription + order when payment fails

While the user keeps trying and reusing the same form, it'll automatically
reuse the created subscription & order.

Restarting this flow is more tricky from a Looper point of view. Probably
it's better to detect that there is already a membership + unpaid order,
and go to the 'pay existing order' flow.

2 years agoAdded in the top-level directory + moved 'deploy' to 'staging'
Sybren A. Stüvel [Thu, 1 Nov 2018 09:48:54 +0000 (10:48 +0100)]
Added in the top-level directory + moved 'deploy' to 'staging'

This makes it easier to deploy, because:

- We have a top-level script, and
- If you want to run `docker/` we no longer have a `deploy`
  directory that prevents you from tab-completing the script in one go.

2 years agoLink to order and transaction in admin history
Sybren A. Stüvel [Thu, 1 Nov 2018 09:39:03 +0000 (10:39 +0100)]
Link to order and transaction in admin history

This may backfire a bit, because it required me to mark the message as
'HTML Safe' in the template. Since it wasn't before, we have a risk of
strange things happening with admin-generated log entries. However, it does
allow for adding links there, which makes 'X happened for transaction X
for order Y' a lot more pleasant to navigate.

2 years agoStricter check on assignments to money fields
Sybren A. Stüvel [Tue, 30 Oct 2018 18:41:58 +0000 (19:41 +0100)]
Stricter check on assignments to money fields

2 years agoCopy log entries on transactions to order, and order to subscription
Sybren A. Stüvel [Tue, 30 Oct 2018 18:39:24 +0000 (19:39 +0100)]
Copy log entries on transactions to order, and order to subscription

2 years agoMoneyField: Prevent unnecessary 'xxx changed' log entries
Sybren A. Stüvel [Tue, 30 Oct 2018 18:37:38 +0000 (19:37 +0100)]
MoneyField: Prevent unnecessary 'xxx changed' log entries

We needed better comparison between the various representations of money
we're using.

2 years agoAdmin: prevent adding payment methods
Sybren A. Stüvel [Tue, 30 Oct 2018 17:33:36 +0000 (18:33 +0100)]
Admin: prevent adding payment methods

2 years agoAdmin: Cleanup of inline payment method list
Sybren A. Stüvel [Tue, 30 Oct 2018 17:32:14 +0000 (18:32 +0100)]
Admin: Cleanup of inline payment method list

2 years agoFix deleting payment methods
Sybren A. Stüvel [Tue, 30 Oct 2018 16:55:07 +0000 (17:55 +0100)]
Fix deleting payment methods

2 years agoCreate Braintree client auth token for specific merchant account ID
Sybren A. Stüvel [Tue, 30 Oct 2018 16:54:29 +0000 (17:54 +0100)]
Create Braintree client auth token for specific merchant account ID

This should disallow AMEX cards when paying in USD (given that we don't
have support for that currently).

2 years agoAllow choosing currency when checking out
Sybren A. Stüvel [Tue, 30 Oct 2018 16:35:58 +0000 (17:35 +0100)]
Allow choosing currency when checking out

2 years agoInclude credit card type in recognisable name
Sybren A. Stüvel [Tue, 30 Oct 2018 15:53:38 +0000 (16:53 +0100)]
Include credit card type in recognisable name

I hope this'll help us analyzing payment issues, for example the AMEX issue
we're experiencing.

2 years agoShow user's payment methods in admin
Sybren A. Stüvel [Tue, 30 Oct 2018 15:52:59 +0000 (16:52 +0100)]
Show user's payment methods in admin

This will help in debugging payment issues.

2 years agoRandomise the list of members on the landing page
Sybren A. Stüvel [Tue, 30 Oct 2018 14:48:12 +0000 (15:48 +0100)]
Randomise the list of members on the landing page

This way nobody gets jealous, and it's an O(N) operation (rather than
sorting, which is O(N log N).

2 years agoInclude total nr of memberships in text + move counts to thermo tooltip
Sybren A. Stüvel [Tue, 30 Oct 2018 14:33:06 +0000 (15:33 +0100)]
Include total nr of memberships in text + move counts to thermo tooltip

2 years agoShow total nr of corporate/individual memberships on landing page
Sybren A. Stüvel [Tue, 30 Oct 2018 14:23:47 +0000 (15:23 +0100)]
Show total nr of corporate/individual memberships on landing page

2 years agoShow badge info on membership edit page too + conditional on badge name
Sybren A. Stüvel [Wed, 24 Oct 2018 15:56:41 +0000 (17:56 +0200)]
Show badge info on membership edit page too + conditional on badge name

If there is no BID badge associated with the membership level the info
is hidden.