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
File details
Details for the file django-pursed-0.9.linux-x86_64.tar.gz
.
File metadata
- Download URL: django-pursed-0.9.linux-x86_64.tar.gz
- Upload date:
- Size: 11.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ca20aab4a01730edf373c07ef184275725c4031e4fb0d8500f94b2c0925c733c |
|
MD5 | 94cc1eaee89a69a61a3c5c8b96f48fa7 |
|
BLAKE2b-256 | 2e58baa3761e86a132dc71f6b03c4bbc31bcc71becffd2cccc2435f3028b7242 |
File details
Details for the file django_pursed-0.9-py3-none-any.whl
.
File metadata
- Download URL: django_pursed-0.9-py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7ea21139ef912fe4e04efbd41be0c8a621f9ae17a7762193581c869c5208b04f |
|
MD5 | c4d5d00a1488fecee6f6cf1374c6793e |
|
BLAKE2b-256 | c4a4b0bb1e9556abfa63a5c5759da105eee3484828266039afb5a1309310f13d |
File details
Details for the file django_pursed-0.9-py2.py3-none-any.whl
.
File metadata
- Download URL: django_pursed-0.9-py2.py3-none-any.whl
- Upload date:
- Size: 23.0 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b225c50cd2698fa85f3659bb22c4aee817bb9fa49d06a6f9cb5ec88482f27582 |
|
MD5 | c59f23685b895662a195672dcca0f186 |
|
BLAKE2b-256 | 5c46dd34fb25e153346c4ae55a3a5f8ac9c0e02d4f18871af51d01ac031fe899 |