{ "info": { "author": "David Winterbottom", "author_email": "david.winterbottom@tangentlabs.co.uk", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6" ], "description": "===========================\nManaged accounts for Django\n===========================\n\nA 'managed account' is an allocation of money that can be debited and credited.\nThis package provides managed account functionality for use with the e-commerce\nframework `Oscar`_.\n\n.. _`Oscar`: https://github.com/django-oscar/django-oscar\n\nAccounts can be used to implement a variety of interesting components,\nincluding:\n\n* Giftcards\n* Web accounts\n* Loyalty schemes\n\nBasically anything that involves tracking the movement of funds within a closed\nsystem.\n\nThis package uses `double-entry bookkeeping`_ where every transaction is\nrecorded twice (once for the source and once for the destination). This\nensures the books always balance and there is full audit trail of all\ntransactional activity.\n\nIf your project manages money, you should be using a library like this. Your\nfinance people will thank you.\n\n\n.. image:: https://travis-ci.org/django-oscar/django-oscar-accounts.svg?branch=master\n :target: https://travis-ci.org/django-oscar/django-oscar-accounts\n\n.. image:: http://codecov.io/github/django-oscar/django-oscar-accounts/coverage.svg?branch=master\n :alt: Coverage\n :target: http://codecov.io/github/django-oscar/django-oscar-accounts?branch=master\n\n.. image:: https://requires.io/github/django-oscar/django-oscar-accounts/requirements.svg?branch=master\n :target: https://requires.io/github/django-oscar/django-oscar-accounts/requirements/?branch=master\n :alt: Requirements Status\n\n.. image:: https://img.shields.io/pypi/v/django-oscar-accounts.svg\n :target: https://pypi.python.org/pypi/django-oscar-accounts/\n\n\n.. _double-entry bookkeeping: http://en.wikipedia.org/wiki/Double-entry_bookkeeping_system\n\n\nFeatures\n--------\n\n* An account has a credit limit which defaults to zero. Accounts can be set up\n with no credit limit so that they are a 'source' of money within the system.\n At least one account must be set up without a credit limit in order for money\n to move around the system.\n\n* Accounts can have:\n - No users assigned\n - A single \"primary\" user - this is the most common case\n - A set of users assigned\n\n* A user can have multiple accounts\n\n* An account can have a start and end date to allow its usage in a limited time\n window\n\n* An account can be restricted so that it can only be used to pay for a range of\n products.\n\n* Accounts can be categorised\n\nScreenshots\n-----------\n\n.. image:: https://github.com/tangentlabs/django-oscar-accounts/raw/master/screenshots/dashboard-accounts.thumb.png\n :alt: Dashboard account list\n :target: https://github.com/tangentlabs/django-oscar-accounts/raw/master/screenshots/dashboard-accounts.png\n\n.. image:: https://github.com/tangentlabs/django-oscar-accounts/raw/master/screenshots/dashboard-form.thumb.png\n :alt: Create new account\n :target: https://github.com/tangentlabs/django-oscar-accounts/raw/master/screenshots/dashboard-form.png\n\n.. image:: https://github.com/tangentlabs/django-oscar-accounts/raw/master/screenshots/dashboard-transfers.thumb.png\n :alt: Dashboard transfer list\n :target: https://github.com/tangentlabs/django-oscar-accounts/raw/master/screenshots/dashboard-transfers.png\n\n.. image:: https://github.com/tangentlabs/django-oscar-accounts/raw/master/screenshots/dashboard-detail.thumb.png\n :alt: Dashboard account detail\n :target: https://github.com/tangentlabs/django-oscar-accounts/raw/master/screenshots/dashboard-detail.png\n\n\nInstallation\n------------\n\nInstall using pip:\n\n.. code-block:: bash\n\n\tpip install django-oscar-accounts\n\nand add `oscar_accounts` to `INSTALLED_APPS`. Runnning ``manage.py migrate\noscar_accounts`` will create the appropriate database tables. To create initial\nsome core accounts and account-types use ``manage.py oscar_accounts_init``.\nThe names of these accounts can be controlled using settings (see below).\n\nIf running with Oscar, add an additional path to your `TEMPLATE_DIRS`:\n\n.. code-block:: python\n\n from accounts import TEMPLATE_DIR as ACCOUNTS_TEMPLATE_DIR\n\n TEMPLATE_DIRS = (\n ...\n ACCOUNTS_TEMPLATE_DIR)\n\nThis allows the templates to be customised by overriding blocks instead of\nreplacing the entire template.\n\nIn order to make the accounts accessible via the Oscar dashboard you need to\nappend it to your `OSCAR_DASHBOARD_NAVIGATION`\n\n.. code-block:: python\n\n from oscar.defaults import *\n\n OSCAR_DASHBOARD_NAVIGATION.append(\n {\n 'label': 'Accounts',\n 'icon': 'icon-globe',\n 'children': [\n {\n 'label': 'Accounts',\n 'url_name': 'accounts-list',\n },\n {\n 'label': 'Transfers',\n 'url_name': 'transfers-list',\n },\n {\n 'label': 'Deferred income report',\n 'url_name': 'report-deferred-income',\n },\n {\n 'label': 'Profit/loss report',\n 'url_name': 'report-profit-loss',\n },\n ]\n })\n\n\nFurthermore you need to add the url-pattern to your `urls.py`\n\n.. code-block:: python\n\n from oscar_accounts.dashboard.app import application as accounts_app\n\n # ...\n\n urlpatterns = [\n ...\n url(r'^dashboard/accounts/', accounts_app.urls),\n ]\n\n\nYou should also set-up a cronjob that calls::\n\n ./manage.py close_expired_accounts\n\nto close any expired accounts and transfer their funds to the 'expired'\naccount.\n\nAPI\n---\n\nCreate account instances using the manager:\n\n.. code-block:: python\n\n from decimal import Decimal\n import datetime\n\n from django.contrib.auth.models import User\n\n from oscar_accounts import models\n\n anonymous_account = models.Account.objects.create()\n\n barry = User.objects.get(username=\"barry\")\n user_account = models.Account.objects.create(primary_user=barry)\n\n no_credit_limit_account = models.Account.objects.create(credit_limit=None)\n credit_limit_account = models.Account.objects.create(credit_limit=Decimal('1000.00'))\n\n today = datetime.date.today()\n next_week = today + datetime.timedelta(days=7)\n date_limited_account = models.Account.objects.create(\n start_date=today, end_date=next_week)\n\n\nTransfer funds using the facade:\n\n.. code-block:: python\n\n from oscar_accounts import facade\n\n staff_member = User.objects.get(username=\"staff\")\n trans = facade.transfer(source=no_credit_limit_account,\n destination=user_account,\n amount=Decimal('10.00'),\n user=staff_member)\n\nReverse transfers:\n\n.. code-block:: python\n\n facade.reverse(trans, user=staff_member,\n description=\"Just an example\")\n\nIf the proposed transfer is invalid, an exception will be raised. All\nexceptions are subclasses of `oscar_accounts.exceptions.AccountException`.\nYour client code should look for exceptions of this type and handle them\nappropriately.\n\nClient code should only use the `oscar_accounts.models.Budget` class and the\ntwo functions from `oscar_accounts.facade` - nothing else should be required.\n\nError handling\n--------------\n\nNote that the transfer operation is wrapped in its own database transaction to\nensure that only complete transfers are written out. When using Django's\ntransaction middleware, you need to be careful. If you have an unhandled\nexception, then account transfers will still be committed even though nothing\nelse will be. To handle this, you need to make sure that, if an exception\noccurs during your post-payment code, then you roll-back any transfers.\n\nHere's a toy example:\n\n\n.. code-block:: python\n\n from oscar_accounts import facade\n\n def submit(self, order_total):\n # Take payment first\n transfer = facade.transfer(self.get_user_account(),\n self.get_merchant_account(),\n order_total)\n # Create order models\n try:\n self.place_order()\n except Exception, e:\n # Something went wrong placing the order. Roll-back the previous\n # transfer\n facade.reverse(transfer)\n\nIn this situation, you'll end up with two transfers being created but no order.\nWhile this isn't ideal, it's the best way of handling exceptions that occur\nduring order placement.\n\nMulti-transfer payments\n-----------------------\n\nProjects will often allow users to have multiple accounts and pay for an order\nusing more than one. This will involve several transfers and needs some\ncareful handling in your application code.\n\nIt normally makes sense to write your own wrapper around the accounts API to\nencapsulate your business logic and error handling. Here's an example:\n\n\n.. code-block:: python\n\n from decimal import Decimal as D\n from oscar_accounts import models, exceptions, facade\n\n\n def redeem(order_number, user, amount):\n # Get user's non-empty accounts ordered with the first to expire first\n accounts = models.Account.active.filter(\n user=user, balance__gt=0).order_by('end_date')\n\n # Build up a list of potential transfers that cover the requested amount\n transfers = []\n amount_to_allocate = amount\n for account in accounts:\n to_transfer = min(account.balance, amount_to_allocate)\n transfers.append((account, to_transfer))\n amount_to_allocate -= to_transfer\n if amount_to_allocate == D('0.00'):\n break\n if amount_to_allocate > D('0.00'):\n raise exceptions.InsufficientFunds()\n\n # Execute transfers to some 'Sales' account\n destination = models.Account.objects.get(name=\"Sales\")\n completed_transfers = []\n try:\n for account, amount in transfers:\n transfer = facade.transfer(\n account, destination, amount, user=user,\n description=\"Order %s\" % order_number)\n completed_transfers.append(transfer)\n except exceptions.AccountException, transfer_exc:\n # Something went wrong with one of the transfers (possibly a race condition).\n # We try and roll back all completed ones to get us back to a clean state.\n try:\n for transfer in completed_transfers:\n facade.reverse(transfer)\n except Exception, reverse_exc:\n # Uh oh: No man's land. We could be left with a partial\n # redemption. This will require an admin to intervene. Make\n # sure your logger mails admins on error.\n logger.error(\"Order %s, transfers failed (%s) and reverse failed (%s)\",\n order_number, transfer_exc, reverse_exc)\n logger.exception(reverse_exc)\n\n # Raise an exception so that your client code can inform the user appropriately.\n raise RedemptionFailed()\n else:\n # All transfers completed ok\n return completed_transfers\n\nAs you can see, there is some careful handling of the scenario where not all\ntransfers can be executed.\n\nIf you using Oscar then ensure that you create an `OrderSource` instance for\nevery transfer (rather than aggregating them all into one). This will provide\nbetter audit information. Here's some example code:\n\n\n.. code-block:: python\n\n try:\n transfers = api.redeem(order_number, user, total_incl_tax)\n except Exception:\n # Inform user of failed payment\n else:\n for transfer in transfers:\n source_type, __ = SourceType.objects.get_or_create(name=\"Accounts\")\n source = Source(\n source_type=source_type,\n amount_allocated=transfer.amount,\n amount_debited=transfer.amount,\n reference=transfer.reference)\n self.add_payment_source(source)\n\n\nCore accounts and account types\n-------------------------------\n\nA post-syncdb signal will create the common structure for account types and\naccounts. Some names can be controlled with settings, as indicated in\nparentheses.\n\n- **Assets**\n\n - **Sales**\n\n - Redemptions (`ACCOUNTS_REDEMPTIONS_NAME`) - where money is\n transferred to when an account is used to pay for something.\n - Lapsed (`ACCOUNTS_LAPSED_NAME`) - where money is transferred to\n when an account expires. This is done by the\n 'close_expired_accounts' management command. The name of this\n account can be set using the `ACCOUNTS_LAPSED_NAME`.\n\n - **Cash**\n\n - \"Bank\" (`ACCOUNTS_BANK_NAME`) - the source account for creating new\n accounts that are paid for by the customer (eg a giftcard). This\n account will not have a credit limit and will normally have a\n negative balance as money is only transferred out.\n\n - **Unpaid** - This contains accounts that are used as sources for other\n accounts but aren't paid for by the customer. For instance, you might\n allow admins to create new accounts in the dashboard. An account of this\n type will be the source account for the initial transfer.\n\n- **Liabilities**\n\n - **Deferred income** - This contains customer accounts/giftcards. You may\n want to create additional account types within this type to categorise\n accounts.\n\nExample transactions\n--------------------\n\nConsider the following accounts and account types:\n\n- **Assets**\n - **Sales**\n - Redemptions\n - Lapsed\n - **Cash**\n - Bank\n - **Unpaid**\n - Merchant funded\n- **Liabilities**\n - **Deferred income**\n\nNote that all accounts start with a balance of 0 and the sum of all balances\nwill always be zero.\n\n*A customer purchases a \u00a350 giftcard*\n\n- A new account is created of type 'Deferred income' with an end date - \u00a350 is\n transferred from the Bank to this new account\n\n*A customer pays for a \u00a330 order using their \u00a350 giftcard*\n\n- \u00a330 is transferred from the giftcard account to the redemptions account\n\n*The customer's giftcard expires with \u00a320 still on it*\n\n- \u00a320 is transferred from the giftcard account to the lapsed account\n\n*The customer phones up to complain and a staff member creates a new giftcard\nfor \u00a320*\n\n- A new account is created of type 'Deferred income' - \u00a320 is transferred from\n the \"Merchant funded\" account to this new account\n\nSettings\n--------\n\nThere are settings to control the naming and initial unpaid and deferred income\naccount types:\n\n* `ACCOUNTS_MIN_LOAD_VALUE` The minimum value that can be used to create an\n account (or for a top-up)\n\n* `ACCOUNTS_MAX_INITIAL_VALUE` The maximum value that can be transferred to an\n account.\n\n* `OSCAR_ACCOUNTS_DASHBOARD_ITEMS_PER_PAGE` The amount of items per page that show in dashboard(default=20).\n\nContributing\n------------\n\nFork repo, set-up virtualenv and run::\n\n make install\n\nRun tests with::\n\n pytest\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "django-oscar-accounts", "package_url": "https://pypi.org/project/django-oscar-accounts/", "platform": "", "project_url": "https://pypi.org/project/django-oscar-accounts/", "project_urls": null, "release_url": "https://pypi.org/project/django-oscar-accounts/1.0.0/", "requires_dist": [ "django (<2.2,>=1.11)", "django-oscar (<1.7,>=1.5)", "python-dateutil (<3.0,>=2.6)", "django-webtest (==1.9.3); extra == 'test'", "pytest-cov (<2.6,>=2.5); extra == 'test'", "pytest-django (<3.3,>=3.2); extra == 'test'" ], "requires_python": "", "summary": "Managed accounts for django-oscar", "version": "1.0.0" }, "last_serial": 4373468, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "28124f55c7388ecdfb67ea5a44e57a76", "sha256": "2a2abd4533e3d38dcdd2ccb5789806a9a35c86801506575654db62358df057f5" }, "downloads": -1, "filename": "django-oscar-accounts-0.1.tar.gz", "has_sig": false, "md5_digest": "28124f55c7388ecdfb67ea5a44e57a76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30148, "upload_time": "2012-11-29T17:48:49", "url": "https://files.pythonhosted.org/packages/e7/e0/72e5dd92e66b8c45ad0ee4603cafed674d9d1cb740d1bcdb51af389d1994/django-oscar-accounts-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "cd2be595327650a213a070b44db25b60", "sha256": "4797fffc55a677357e984751c8966a891deaed8a81f659b450c6ffa5ea52fa42" }, "downloads": -1, "filename": "django-oscar-accounts-0.1.1.tar.gz", "has_sig": false, "md5_digest": "cd2be595327650a213a070b44db25b60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30672, "upload_time": "2012-11-29T17:50:38", "url": "https://files.pythonhosted.org/packages/99/71/fd1166a5525f8209fe450a9a58c58b4b6f3466d0c1cce519e421581cc267/django-oscar-accounts-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "3ec27947949f7b9e3b24139055ae836a", "sha256": "dfa982fa55d83b898fae3e6c6617f6008fd3c3fa11b0606dab00ec39a3d57c38" }, "downloads": -1, "filename": "django-oscar-accounts-0.1.2.tar.gz", "has_sig": false, "md5_digest": "3ec27947949f7b9e3b24139055ae836a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30697, "upload_time": "2013-04-09T16:22:42", "url": "https://files.pythonhosted.org/packages/c5/74/11f8d41bf8636d3cf4b49271e9280a2aa9053098ae1685d1794141ab84ef/django-oscar-accounts-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "56332681048883e74310d10b346dc578", "sha256": "ddb472afbd255e9890e272a813bc3c84c327f4da10eb513fe20b028c6648a9ca" }, "downloads": -1, "filename": "django-oscar-accounts-0.1.3.tar.gz", "has_sig": false, "md5_digest": "56332681048883e74310d10b346dc578", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30661, "upload_time": "2013-05-31T09:40:01", "url": "https://files.pythonhosted.org/packages/df/4e/906f2e5e2e099e9fc4f1f91b0da8fb833eb5b24727bf315e1b14773ed70f/django-oscar-accounts-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "5e1bbab84364074c6d70d406b74663bd", "sha256": "40803046630663987fe4edcb1fa68f5d955a48b34aad9b51495e44687abc419d" }, "downloads": -1, "filename": "django-oscar-accounts-0.1.4.tar.gz", "has_sig": false, "md5_digest": "5e1bbab84364074c6d70d406b74663bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30673, "upload_time": "2013-06-07T09:56:16", "url": "https://files.pythonhosted.org/packages/3d/4e/3edb79c5836375d7400553f3b8cfa2349881e17894794c96e78f21e14994/django-oscar-accounts-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "645d319f224ba9b88585fd111d41044d", "sha256": "5d6fc1dc314132faa59cf90a84c54cef6a587dfef36b215f62689a2cd420dd91" }, "downloads": -1, "filename": "django-oscar-accounts-0.1.5.tar.gz", "has_sig": false, "md5_digest": "645d319f224ba9b88585fd111d41044d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26770, "upload_time": "2014-07-11T13:03:10", "url": "https://files.pythonhosted.org/packages/86/46/d0a27bef9019b29f50159cd64bd2f010fed098c1b28b12aba3e25bbe7b43/django-oscar-accounts-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "a580e2d771ba4aa312f1e3dfc8987bf0", "sha256": "76301b4b143bf5820552959a6b473d80bfe3a0fd5ee94e2dbfa4f4460742706f" }, "downloads": -1, "filename": "django-oscar-accounts-0.1.6.tar.gz", "has_sig": false, "md5_digest": "a580e2d771ba4aa312f1e3dfc8987bf0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30930, "upload_time": "2014-07-17T15:58:53", "url": "https://files.pythonhosted.org/packages/8b/36/4abea0e61ca494e0c94d0cdcec7bc859f3d83ae91a8fc71947baa63a84ec/django-oscar-accounts-0.1.6.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "10cf70983fe0ba1decdd37e60d3e7ce9", "sha256": "e3aae0bdb686b31fe9e26b748d15015de1d6d6d97bcea5a7687d448f657e6099" }, "downloads": -1, "filename": "django-oscar-accounts-0.2.tar.gz", "has_sig": false, "md5_digest": "10cf70983fe0ba1decdd37e60d3e7ce9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30887, "upload_time": "2013-04-19T19:28:09", "url": "https://files.pythonhosted.org/packages/5c/a6/be072f69c584dd7397d8c3db011ab72d87f636b0d63f308f0902f895f2ac/django-oscar-accounts-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "79d98de704e75237ff5e9d72f108a17e", "sha256": "9f746b5d04e41906fad1326a77d06f00cb379bbcde844808aff036c70ed0e6fa" }, "downloads": -1, "filename": "django-oscar-accounts-0.3.tar.gz", "has_sig": false, "md5_digest": "79d98de704e75237ff5e9d72f108a17e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32973, "upload_time": "2013-08-13T10:46:23", "url": "https://files.pythonhosted.org/packages/26/91/f5288f3920d2b4c9c0f9af44a0733d7e42c9b7e6d259c3f6e012c9421851/django-oscar-accounts-0.3.tar.gz" } ], "0.4rc1": [ { "comment_text": "", "digests": { "md5": "3cdefe56fd653f3c9672e418a2b15f06", "sha256": "604aef96aef475ed8f88329c3f0364211b4a077ca6529c2a18bcea487d6afe63" }, "downloads": -1, "filename": "django_oscar_accounts-0.4rc1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3cdefe56fd653f3c9672e418a2b15f06", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 54887, "upload_time": "2016-03-21T09:37:31", "url": "https://files.pythonhosted.org/packages/b2/8e/a5d26e30f26a670afcba9d66a6c1c24a7a2d3530e2b17979a741bc361501/django_oscar_accounts-0.4rc1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "426ac919767913ce390758a0fef235cc", "sha256": "94f46f8f4c58e00dd7944c627bdd8c3a0517717f52274080b0b51e5f8395da05" }, "downloads": -1, "filename": "django-oscar-accounts-0.4rc1.tar.gz", "has_sig": false, "md5_digest": "426ac919767913ce390758a0fef235cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 809910, "upload_time": "2016-03-21T09:37:42", "url": "https://files.pythonhosted.org/packages/ff/04/b3d2d13b776486749b0377bbbd88fe2adf33a1f6384d78693861bf2bf5b8/django-oscar-accounts-0.4rc1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "aa5ffd0d886ca3cdf351af2448176523", "sha256": "5cee7e1aad261191ae990602751f08be17bd23d09839c04b7de57b3ec5763a0f" }, "downloads": -1, "filename": "django_oscar_accounts-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aa5ffd0d886ca3cdf351af2448176523", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 55297, "upload_time": "2018-10-14T04:34:35", "url": "https://files.pythonhosted.org/packages/a7/ea/102ca07561784a437698c3feb70a955d3063e845885a4b19cd9e734c83de/django_oscar_accounts-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c984f3e5788a7dc8e91988a0944de9e", "sha256": "0a5d156bc2cde0f4d1071116fe0b50ca353016b43ce73571c8d0dba610c566fb" }, "downloads": -1, "filename": "django-oscar-accounts-1.0.0.tar.gz", "has_sig": false, "md5_digest": "4c984f3e5788a7dc8e91988a0944de9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 808145, "upload_time": "2018-10-14T04:34:40", "url": "https://files.pythonhosted.org/packages/0b/4b/42df687b438ba994fa5eb6f7d678ebc204725965a25de9a6a46327422c97/django-oscar-accounts-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "aa5ffd0d886ca3cdf351af2448176523", "sha256": "5cee7e1aad261191ae990602751f08be17bd23d09839c04b7de57b3ec5763a0f" }, "downloads": -1, "filename": "django_oscar_accounts-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aa5ffd0d886ca3cdf351af2448176523", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 55297, "upload_time": "2018-10-14T04:34:35", "url": "https://files.pythonhosted.org/packages/a7/ea/102ca07561784a437698c3feb70a955d3063e845885a4b19cd9e734c83de/django_oscar_accounts-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c984f3e5788a7dc8e91988a0944de9e", "sha256": "0a5d156bc2cde0f4d1071116fe0b50ca353016b43ce73571c8d0dba610c566fb" }, "downloads": -1, "filename": "django-oscar-accounts-1.0.0.tar.gz", "has_sig": false, "md5_digest": "4c984f3e5788a7dc8e91988a0944de9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 808145, "upload_time": "2018-10-14T04:34:40", "url": "https://files.pythonhosted.org/packages/0b/4b/42df687b438ba994fa5eb6f7d678ebc204725965a25de9a6a46327422c97/django-oscar-accounts-1.0.0.tar.gz" } ] }