A simple wallet django application
Project description
A simple wallet django application
Creating a New Wallet
A wallet is owned by a user. Should you be using a custom user model, the wallet should still work properly as it the wallet points to settings.AUTH_USER_MODEL.
from wallet.models import Wallet
# wallets are owned by users.
wallet = user.wallet_set.create()
Despositing a balance to a wallet
from django.db import transaction
with transaction.atomic():
# We need to lock the wallet first so that we're sure
# that nobody modifies the wallet at the same time
# we're modifying it.
wallet = Wallet.select_for_update().get(pk=wallet.id)
wallet.deposit(100) # amount
Withdrawing a balance from a wallet
from django.db import transaction
with transaction.atomic():
# We need to lock the wallet first so that we're sure
# that nobody modifies the wallet at the same time
# we're modifying it.
wallet = Wallet.select_for_update().get(pk=wallet.id)
wallet.withdraw(100) # amount
Withdrawing with an insufficient balance
When a user tries to withdraw from a wallet with an amount greater than its balance, the transaction raises a wallet.errors.InsufficientBalance error.
# wallet.current_balance # 50
# This raises an wallet.errors.InsufficentBalance.
wallet.withdraw(100)
This error inherits from django.db.IntegrityError so that when it is raised, the whole transaction is automatically rolled-back.
Transferring between wallets
One can transfer a values between wallets. It uses withdraw and deposit internally. Should the sending wallet have an insufficient balance, wallet.errors.InsufficientBalance is raised.
with transaction.atomic():
wallet = Wallet.select_for_update().get(pk=wallet_id)
transfer_to_wallet = Wallet.select_for_update().get(pk=transfer_to_wallet_id)
wallet.transfer(transfer_to_wallet, 100)
CURRENCY_STORE_FIELD
The CURRENCY_STORE_FIELD is a django field class that contains how the fields should be stored. By default, it uses django.models.BigIntegerField. It was chosen that way for simplicity - just make cents into your smallest unit (0.01 -> 1, 1.00 -> 100).
You can change this to decimal by adding this to your settings.py:
# settings.py
CURRENCY_STORE_FIELD = models.DecimalField(max_digits=10, decimal_places=2)
You need to run ./manage.py makemigrations after that.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Hashes for django-pursed-0.9.linux-x86_64.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | ca20aab4a01730edf373c07ef184275725c4031e4fb0d8500f94b2c0925c733c |
|
MD5 | 94cc1eaee89a69a61a3c5c8b96f48fa7 |
|
BLAKE2b-256 | 2e58baa3761e86a132dc71f6b03c4bbc31bcc71becffd2cccc2435f3028b7242 |
Hashes for django_pursed-0.9-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7ea21139ef912fe4e04efbd41be0c8a621f9ae17a7762193581c869c5208b04f |
|
MD5 | c4d5d00a1488fecee6f6cf1374c6793e |
|
BLAKE2b-256 | c4a4b0bb1e9556abfa63a5c5759da105eee3484828266039afb5a1309310f13d |
Hashes for django_pursed-0.9-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b225c50cd2698fa85f3659bb22c4aee817bb9fa49d06a6f9cb5ec88482f27582 |
|
MD5 | c59f23685b895662a195672dcca0f186 |
|
BLAKE2b-256 | 5c46dd34fb25e153346c4ae55a3a5f8ac9c0e02d4f18871af51d01ac031fe899 |