{ "info": { "author": "Alexandre Varas", "author_email": "alej0varas@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Framework :: Django", "Framework :: Django :: 1.10", "Framework :: Django :: 1.11", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "===============\n django-pursed\n===============\n\nA simple wallet django application\n\nCreating a New Wallet\n=====================\n\nA wallet is owned by a user. Should you be using a custom user model,\nthe wallet should still work properly as it the wallet points to\n`settings.AUTH_USER_MODEL`.\n\n.. code-block:: python\n\n from wallet.models import Wallet\n\n # wallets are owned by users.\n wallet = user.wallet_set.create()\n\n\nDespositing a balance to a wallet\n=================================\n\n.. code-block:: python\n\n from django.db import transaction\n\n with transaction.atomic():\n # We need to lock the wallet first so that we're sure\n # that nobody modifies the wallet at the same time \n # we're modifying it.\n wallet = Wallet.select_for_update().get(pk=wallet.id)\n wallet.deposit(100) # amount\n\nWithdrawing a balance from a wallet\n===================================\n\n.. code-block:: python\n\n from django.db import transaction\n\n with transaction.atomic():\n # We need to lock the wallet first so that we're sure\n # that nobody modifies the wallet at the same time \n # we're modifying it.\n wallet = Wallet.select_for_update().get(pk=wallet.id)\n wallet.withdraw(100) # amount\n\nWithdrawing with an insufficient balance\n========================================\n\nWhen a user tries to withdraw from a wallet with an amount greater\nthan its balance, the transaction raises a\n`wallet.errors.InsufficientBalance` error.\n\n.. code-block:: python\n\n # wallet.current_balance # 50\n\n # This raises an wallet.errors.InsufficentBalance.\n wallet.withdraw(100)\n\nThis error inherits from `django.db.IntegrityError` so that when it is\nraised, the whole transaction is automatically rolled-back.\n\nTransferring between wallets\n============================\n\nOne can transfer a values between wallets. It uses `withdraw` and\n`deposit` internally. Should the sending wallet have an insufficient\nbalance, `wallet.errors.InsufficientBalance` is raised.\n\n.. code-block:: python\n\n with transaction.atomic():\n wallet = Wallet.select_for_update().get(pk=wallet_id)\n transfer_to_wallet = Wallet.select_for_update().get(pk=transfer_to_wallet_id)\n wallet.transfer(transfer_to_wallet, 100)\n\nCURRENCY_STORE_FIELD\n====================\n\nThe `CURRENCY_STORE_FIELD` is a django field class that contains how\nthe fields should be stored. By default, it uses\n`django.models.BigIntegerField`. It was chosen that way for\nsimplicity - just make cents into your smallest unit (0.01 -> 1, 1.00\n-> 100).\n\nYou can change this to decimal by adding this to your settings.py:\n\n.. code-block:: python\n\n # settings.py\n CURRENCY_STORE_FIELD = models.DecimalField(max_digits=10, decimal_places=2)\n\nYou need to run `./manage.py makemigrations` after that.\n\n\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/alej0varas/django-pursed", "keywords": "", "license": "GPL v3", "maintainer": "", "maintainer_email": "", "name": "django-pursed", "package_url": "https://pypi.org/project/django-pursed/", "platform": "", "project_url": "https://pypi.org/project/django-pursed/", "project_urls": { "Homepage": "https://github.com/alej0varas/django-pursed" }, "release_url": "https://pypi.org/project/django-pursed/0.9/", "requires_dist": null, "requires_python": "", "summary": "A simple wallet django application", "version": "0.9" }, "last_serial": 3227901, "releases": { "0.9": [ { "comment_text": "", "digests": { "md5": "94cc1eaee89a69a61a3c5c8b96f48fa7", "sha256": "ca20aab4a01730edf373c07ef184275725c4031e4fb0d8500f94b2c0925c733c" }, "downloads": -1, "filename": "django-pursed-0.9.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "94cc1eaee89a69a61a3c5c8b96f48fa7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11517, "upload_time": "2017-10-05T13:01:29", "url": "https://files.pythonhosted.org/packages/2e/58/baa3761e86a132dc71f6b03c4bbc31bcc71becffd2cccc2435f3028b7242/django-pursed-0.9.linux-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "c59f23685b895662a195672dcca0f186", "sha256": "b225c50cd2698fa85f3659bb22c4aee817bb9fa49d06a6f9cb5ec88482f27582" }, "downloads": -1, "filename": "django_pursed-0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c59f23685b895662a195672dcca0f186", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23002, "upload_time": "2017-10-05T13:01:28", "url": "https://files.pythonhosted.org/packages/5c/46/dd34fb25e153346c4ae55a3a5f8ac9c0e02d4f18871af51d01ac031fe899/django_pursed-0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c4d5d00a1488fecee6f6cf1374c6793e", "sha256": "7ea21139ef912fe4e04efbd41be0c8a621f9ae17a7762193581c869c5208b04f" }, "downloads": -1, "filename": "django_pursed-0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "c4d5d00a1488fecee6f6cf1374c6793e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10671, "upload_time": "2017-10-05T13:13:01", "url": "https://files.pythonhosted.org/packages/c4/a4/b0bb1e9556abfa63a5c5759da105eee3484828266039afb5a1309310f13d/django_pursed-0.9-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "94cc1eaee89a69a61a3c5c8b96f48fa7", "sha256": "ca20aab4a01730edf373c07ef184275725c4031e4fb0d8500f94b2c0925c733c" }, "downloads": -1, "filename": "django-pursed-0.9.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "94cc1eaee89a69a61a3c5c8b96f48fa7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11517, "upload_time": "2017-10-05T13:01:29", "url": "https://files.pythonhosted.org/packages/2e/58/baa3761e86a132dc71f6b03c4bbc31bcc71becffd2cccc2435f3028b7242/django-pursed-0.9.linux-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "c59f23685b895662a195672dcca0f186", "sha256": "b225c50cd2698fa85f3659bb22c4aee817bb9fa49d06a6f9cb5ec88482f27582" }, "downloads": -1, "filename": "django_pursed-0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c59f23685b895662a195672dcca0f186", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23002, "upload_time": "2017-10-05T13:01:28", "url": "https://files.pythonhosted.org/packages/5c/46/dd34fb25e153346c4ae55a3a5f8ac9c0e02d4f18871af51d01ac031fe899/django_pursed-0.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c4d5d00a1488fecee6f6cf1374c6793e", "sha256": "7ea21139ef912fe4e04efbd41be0c8a621f9ae17a7762193581c869c5208b04f" }, "downloads": -1, "filename": "django_pursed-0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "c4d5d00a1488fecee6f6cf1374c6793e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10671, "upload_time": "2017-10-05T13:13:01", "url": "https://files.pythonhosted.org/packages/c4/a4/b0bb1e9556abfa63a5c5759da105eee3484828266039afb5a1309310f13d/django_pursed-0.9-py3-none-any.whl" } ] }