{ "info": { "author": "Hiroki KIYOHARA", "author_email": "hirokiky@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# django-keeper\n\nAuthorization library for Django, not depends on models.\n\n* Won't depend on models\n* Won't save assignments/permissions into datastores\n\nSupported versions:\n\n* Python 3.6\n* Python 3.7\n* Django 1.10\n* Django 1.11\n* Django 2.0\n* Django 2.1\n* Django 2.2\n\n## Install\n\n```bash\n$ pip install django-keeper\n```\n\nAnd add to INSTALLED_APPS\n\n```python\nINSTALLED_APPS = [\n ...\n 'keeper',\n]\n```\n\n## At A Glance\n\nDeclarative permission mapping for models.\n\n```python\nfrom django.conf import settings\nfrom keeper.security import Allow\nfrom keeper.operators import Everyone, Authenticated, IsUser\n\n\nclass Issue(models.Model):\n author = models.ForeignKey(settings.AUTH_USER_MODEL)\n ...\n\n def __acl__(self):\n return [\n (Allow, Everyone, 'view'),\n (Allow, Authenticated, 'add_comment'),\n (Allow, IsUser(self.author), 'edit'),\n ]\n\n```\n\nInstances of model allow:\n\n* Every requests to view\n* Autheticated requests to add comments\n* it's author to edit\n\nThen, apply `@keeper` for views.\n\n```python\nfrom keeper.views import keeper\n\n\n# Model Permissions\n@keeper(\n 'view',\n model=Issue,\n mapper=lambda request, issue_id: {'id': issue_id},\n)\ndef issue_detail(request, issue_id):\n \"\"\" View requires 'view' permission of Issue model\n\n * An issue object will be retrieved\n * keeper will check whether the rquests has 'view' permission for the issue\n\n The third argument function can return keyword argument to retrieve the issue object.\n \"\"\"\n request.k_context # Will be instance of the issue object\n ...\n\n\n\n@keeper(\n 'add_comment',\n model=Issue,\n mapper=lambda request, issue_id: {'id': issue_id},\n)\ndef add_comment(request, issue_id):\n ...\n\n```\n\n## Global Permission\n\nNot just for model permissions `django-keeper` can handle global permissions.\n\nFirst, write class having `__acl__` method in models.py.\n\n```python\nclass Root:\n def __acl__(self):\n return [\n (Allow, Authenticated, 'view_dashboard'),\n (Allow, Authenticated, 'add_issue'),\n ]\n```\n\nIt's not necessary to put it in `models.py`,\nbut easy to understand.\n\nAnd specify it.\n\n```python\nKEEPER_GLOBAL_CONTEXT = myapp.models.Root'\n```\n\nThen you can use global permission in views.\nSimply just apply `@keeper` and permission names.\n\n```python\n@keeper('add_issue')\ndef issue_list(request):\n \"\"\" View requires 'add_issue' permission of Root Context\n \"\"\"\n\n```\n\n## Operators\n\nOperators is just `Callable[[HttpRequest], bool]`.\nBy default django-keeper has these operators:\n\n* `keeper.operators.Everyone`\n* `keeper.operators.Authenticated`\n* `keeper.operators.IsUser`\n* `keeper.operators.Staff`\n\nAlso you can create your own operators easily.\n\n```python\nfrom keeper.operators import Authenticated, Operator\n\n\nclass IsIP(Operator):\n def __init__(self, ip):\n self.ip = ip\n\n def __call__(self, request):\n return request.META.get('REMOTE_ADDR') == self.ip\n\n\nclass BelongsTeam(Authenticated):\n def __init__(self, team, role):\n self.team = team\n\n def __call__(self, request):\n if not super().__call__(request):\n return False\n return request.user.team == self.team\n```\n\nUse it in ACL\n\n```python\nclass Article(models.Model):\n team = models.ForeignKey(Team)\n\n def __acl__(self):\n return [\n (Allow, Everyone, 'view'),\n (Allow, BelongsTeam(self.team), 'edit'),\n (Allow, IsIP(settings.COMPANY_IP_ADDRESS), 'edit'),\n ]\n```\n\n### Combining operators\n\nYou can use bitwise operators to combine multiple \"Operators\".\n\n\n```python\nclass Article(models.Model):\n def __acl__(self):\n return [\n (Allow, Authenticated() & IsIP(settings.COMPANY_IP_ADDRESS), 'view'),\n ]\n```\n\nThere operators can be used\n\n* `a & b`\n* `a | b`\n* `a ^ b`\n* `~a`\n\n## On Fail Actions\n\nYou can change actions when requests can't pass ACLs.\n\n```python\nfrom keeper.views import keeper, login_required\n\n@keeper(\n 'view_articles',\n on_fail=login_required(),\n)\ndef dashboard(request):\n ...\n```\n\nThis view will behave just like `@login_required` decorator of Django\nwhen requests don't have 'view' permission.\n\nAlso you can use other actions.\n\n* `keeper.views.login_required`\n* `keeper.views.permission_denied`\n* `keeper.views.not_found`\n* `keeper.views.redirect`\n\n## Use in template\n\nHandling permissions in templates is also supported.\n\n```django\n{% load keeper %}\n\n{% has_permission issue 'edit' as can_edit %}\n\n{% if can_edit %}\n Edit\n{% endif %}\n```\n\nWhen checking global permission, use `has_global_permission`.\n\n```django\n{% load keeper %}\n\n{% has_global_permission 'add_issue' as can_add_issue %}\n\n{% if can_add_issue %}\n New Issue\n{% endif %}\n```\n\n## With Django Core\n\nAdd the authentication backend:\n\n```python\nAUTHENTICATION_BACKENDS = (\n 'keeper.permissions.ObjectPermissionBackend',\n 'django.contrib.auth.backends.ModelBackend',\n)\n```\n\nNow `User.has_perm` method will consider permissions of django-keeper.\n\n## Alternative\n\n* [django-guardian](https://github.com/django-guardian/django-guardian)\n * It depends on databases\n * Not way to handle global permissions, not just for a model\n* [django-rules](https://github.com/dfunckt/django-rules)\n\n## FAQ\n\n* Can I filter models by using ACL?\n * Not supported\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/hirokiky/django-keeper/", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-keeper", "package_url": "https://pypi.org/project/django-keeper/", "platform": "", "project_url": "https://pypi.org/project/django-keeper/", "project_urls": { "Homepage": "https://github.com/hirokiky/django-keeper/" }, "release_url": "https://pypi.org/project/django-keeper/0.1.14/", "requires_dist": [ "Django (<2.3,>=1.10)" ], "requires_python": "", "summary": "Authorization library for Django, with ACL, not depends on models.", "version": "0.1.14" }, "last_serial": 5489559, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "4b28c7b2b044df78ef0f762d87c0bd88", "sha256": "05abb5152f302450037ece4239b0af2eb7537bff474d70cf3bf6f926f30c3eb0" }, "downloads": -1, "filename": "django_keeper-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4b28c7b2b044df78ef0f762d87c0bd88", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 1735, "upload_time": "2017-09-03T06:59:09", "url": "https://files.pythonhosted.org/packages/bc/ef/4cd1c4b50cc3d795bdb77abc94fdc6b6c07672350a9b62191d3294fb8113/django_keeper-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6072956143565953709876e6a723f642", "sha256": "773e830736532f2f89a5bb8914fff14e2e5f1f98bc10df4c01d135fe31b2689c" }, "downloads": -1, "filename": "django-keeper-0.1.1.tar.gz", "has_sig": false, "md5_digest": "6072956143565953709876e6a723f642", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 640, "upload_time": "2017-09-03T06:59:07", "url": "https://files.pythonhosted.org/packages/e1/fd/1846746e8fa8dd7aa3545922600ba9bef1027a33d920c240bda19f42f940/django-keeper-0.1.1.tar.gz" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "a995cc16aa1e42221716851e3d4509ff", "sha256": "b3974756f4564142013261c580e7ed9dc4dc2c4c9f034463a7fe49551c9c5f43" }, "downloads": -1, "filename": "django_keeper-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "a995cc16aa1e42221716851e3d4509ff", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 8964, "upload_time": "2018-05-04T01:20:13", "url": "https://files.pythonhosted.org/packages/0c/50/3f58943616cf572d92f1c8a54787b468ed89f386d73b4e7cecf6f873cb72/django_keeper-0.1.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6991e338de45a62467ab0f95d513043d", "sha256": "7d689bf70c62d7c26a785cf585aab1333e3f1b8190c1e8f59140ff6d28135af0" }, "downloads": -1, "filename": "django-keeper-0.1.10.tar.gz", "has_sig": false, "md5_digest": "6991e338de45a62467ab0f95d513043d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5906, "upload_time": "2018-05-04T01:20:11", "url": "https://files.pythonhosted.org/packages/48/b9/f7cf65f6d512d7e61a08ca7ea4aa01fed5caccec95e6b9104ba206129e07/django-keeper-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "7699fc8c4c0ed2627fef173c12e71ae5", "sha256": "b49515591c85d40505714dbf9694cd63e3babe6618ab57861160f270c597fc14" }, "downloads": -1, "filename": "django_keeper-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "7699fc8c4c0ed2627fef173c12e71ae5", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 9310, "upload_time": "2018-05-04T01:36:09", "url": "https://files.pythonhosted.org/packages/f1/07/51c0fe68390ed2e6dc396c91f6b6d8d11cb3b864921f19b573f9f0dc6fb6/django_keeper-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2167e1503e15d8f982ec02f75f672b94", "sha256": "309794b2818a30c18681b9ade7294be19f475c33e7d950c7aab9ff6796f3840e" }, "downloads": -1, "filename": "django-keeper-0.1.11.tar.gz", "has_sig": false, "md5_digest": "2167e1503e15d8f982ec02f75f672b94", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6220, "upload_time": "2018-05-04T01:36:07", "url": "https://files.pythonhosted.org/packages/6a/77/aa6392e8767c810bfa46d2b892c4cacf0e77a54db2f6a1ff734805a4aa24/django-keeper-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "874ce1faf6d695207e349ad75f02916a", "sha256": "15bba7aa0b90196e9dfda70eef54ddc2577183a73c3f47a16f5716385f760ef8" }, "downloads": -1, "filename": "django_keeper-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "874ce1faf6d695207e349ad75f02916a", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 9292, "upload_time": "2018-05-04T02:14:35", "url": "https://files.pythonhosted.org/packages/97/40/d6b6b8afa04a2428795edd5341f3d2529b59aa0c79fe996282c2d9867f84/django_keeper-0.1.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d387af8ccf5dc2457f2c68f871a5be6c", "sha256": "423fe214c0d0f96a18daecebef3b7bc04288fdb09a5b3c40902abb5a8efe0dd2" }, "downloads": -1, "filename": "django-keeper-0.1.12.tar.gz", "has_sig": false, "md5_digest": "d387af8ccf5dc2457f2c68f871a5be6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6207, "upload_time": "2018-05-04T02:14:33", "url": "https://files.pythonhosted.org/packages/fd/cf/b5c2750f2cefb03bf63c6a384ea878452367cd5ba58178f600de9f61b583/django-keeper-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "beaa941d803c6e4d682a6e1a25b67c8b", "sha256": "22c0720404f3b19f3b54f6603be37e4c11458acbca6d955bf8125be4737ed7f6" }, "downloads": -1, "filename": "django_keeper-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "beaa941d803c6e4d682a6e1a25b67c8b", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 7498, "upload_time": "2018-10-18T06:45:37", "url": "https://files.pythonhosted.org/packages/58/a9/324da3d1554dae7426a1269e4476229cbe3e5610b18058e6328fee9ce96e/django_keeper-0.1.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b87c2685538aa3ff172a39b83d77019", "sha256": "a49878734d5efd52aaa95bdb7da71ec4c249de4af5cabc7570c06d7369c5e6b4" }, "downloads": -1, "filename": "django-keeper-0.1.13.tar.gz", "has_sig": false, "md5_digest": "8b87c2685538aa3ff172a39b83d77019", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6161, "upload_time": "2018-10-18T06:45:35", "url": "https://files.pythonhosted.org/packages/30/1e/f4142531a9303fdef96f644b43c8285f22e6e554386cd40f2c0ed97c7ada/django-keeper-0.1.13.tar.gz" } ], "0.1.14": [ { "comment_text": "", "digests": { "md5": "50d680f8fe218a44e6ac85d56d6823eb", "sha256": "f717d62a8d620a2303e9c57bf3c989947ec0401739b87f129a2744bcefd45d2e" }, "downloads": -1, "filename": "django_keeper-0.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "50d680f8fe218a44e6ac85d56d6823eb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7732, "upload_time": "2019-07-05T04:58:37", "url": "https://files.pythonhosted.org/packages/81/c7/ebd2400bd1646ff22b4062029722ae99b211b38567ce5fcade125799b72d/django_keeper-0.1.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "957597d4dbfc4202ba268ec068ee833d", "sha256": "f04c3e140a1ff9194b50f53ea1c6fda6436549f260bf5f0f446676bc03c415d9" }, "downloads": -1, "filename": "django-keeper-0.1.14.tar.gz", "has_sig": false, "md5_digest": "957597d4dbfc4202ba268ec068ee833d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6460, "upload_time": "2019-07-05T04:58:39", "url": "https://files.pythonhosted.org/packages/e6/bf/8c278a81c0f07fb75453179f9c22afb54b1bd764c9227574893e1febf066/django-keeper-0.1.14.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "7758d7195cd96b0d79023fd15d7ade62", "sha256": "7e393f39cb795831b016441388182e95cee38fce8cec95ec9aeb686990a719f6" }, "downloads": -1, "filename": "django_keeper-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7758d7195cd96b0d79023fd15d7ade62", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 7383, "upload_time": "2017-09-03T07:11:02", "url": "https://files.pythonhosted.org/packages/53/bc/bd605339e1fce8e657f516186ad87d3ac161e24c27d0d2fd8ad427210307/django_keeper-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "82a30ec2b3fea9ee494726371ead2d28", "sha256": "1c44f4cf03a21a379c47a7772aa649669490979eaebce58d607ce25d844c8434" }, "downloads": -1, "filename": "django-keeper-0.1.2.tar.gz", "has_sig": false, "md5_digest": "82a30ec2b3fea9ee494726371ead2d28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3939, "upload_time": "2017-09-03T07:11:00", "url": "https://files.pythonhosted.org/packages/b9/81/489d3b74f3af3c456b52b615143733b481dfd4f932ce1b33998802d66f58/django-keeper-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "82989c6973b0df2e128bb704c455af0d", "sha256": "0d7b84d21c601c752df15be3dc60300e22c2eeb8e7e28543aa9a9e130c6d3a2b" }, "downloads": -1, "filename": "django_keeper-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "82989c6973b0df2e128bb704c455af0d", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 7686, "upload_time": "2017-09-03T08:09:56", "url": "https://files.pythonhosted.org/packages/cb/e3/f98c94b401a21ed8319cc1d5aaa3a26983667395b4bece306e76a77d4e32/django_keeper-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a282bb7fb19fc4a406a3d21787cd0f9f", "sha256": "189b6efdb5cba3228cabb8de9d1c94c292bd955119dffd0552ae310118294824" }, "downloads": -1, "filename": "django-keeper-0.1.3.tar.gz", "has_sig": false, "md5_digest": "a282bb7fb19fc4a406a3d21787cd0f9f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5357, "upload_time": "2017-09-03T08:09:54", "url": "https://files.pythonhosted.org/packages/e6/89/9add7de02cc13bc3204ac62bc65752ce371d7dd65823605fdffebf777fc3/django-keeper-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "09d14c1a764cf404f2248c46138ab5d4", "sha256": "73bd4ce5281697f81cd3504a65502ada3e263e1856db266b20806163fb7a364a" }, "downloads": -1, "filename": "django_keeper-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "09d14c1a764cf404f2248c46138ab5d4", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 8848, "upload_time": "2017-10-12T08:30:26", "url": "https://files.pythonhosted.org/packages/d4/78/f1100fa431a257304626712d223dbcbe191fe8d5aef0b9c9fa77934aa5a1/django_keeper-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "32f9b6144089a0e5af7c13233321f059", "sha256": "0a0d58a5b8d0e3044e4ec1fb35ecbe5ab5b20ac2f99ceeb0bcd57acb2c002b3c" }, "downloads": -1, "filename": "django-keeper-0.1.4.tar.gz", "has_sig": false, "md5_digest": "32f9b6144089a0e5af7c13233321f059", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5797, "upload_time": "2017-10-12T08:30:24", "url": "https://files.pythonhosted.org/packages/81/6e/c7d70742691b907780d795e19694ee9620e002f3267cddc55313012db101/django-keeper-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "8c00e29b532fd8ed163378d5fa69e98e", "sha256": "492073acbc2cf039947afd2d00a3c2b885e805f285b99e991a2963d7106f55e6" }, "downloads": -1, "filename": "django_keeper-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "8c00e29b532fd8ed163378d5fa69e98e", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 8845, "upload_time": "2017-11-08T02:15:46", "url": "https://files.pythonhosted.org/packages/3a/83/1192cdbe6a87f34e798b5618ba1b0922794c7eb2dcd23786d8d0ffca684d/django_keeper-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8c5a4ff31b4e3f1ba9b20e2e1004815", "sha256": "b61cd74f42184ff5459fc12bfb13ddd145f66d3e891daf0ac453f3772f19ffe1" }, "downloads": -1, "filename": "django-keeper-0.1.5.tar.gz", "has_sig": false, "md5_digest": "f8c5a4ff31b4e3f1ba9b20e2e1004815", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5808, "upload_time": "2017-11-08T02:15:44", "url": "https://files.pythonhosted.org/packages/80/a4/ff6473e21755058e733520fc5686b69a2791366e0ec120d85863ceed8982/django-keeper-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "0f02867ffa9ebb402a2c754c109cc923", "sha256": "2734c9adc8376fb7fc9250f1d49ee8fb3edc588852a6dd96d286bb42669aff85" }, "downloads": -1, "filename": "django_keeper-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "0f02867ffa9ebb402a2c754c109cc923", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 8817, "upload_time": "2018-04-29T02:37:28", "url": "https://files.pythonhosted.org/packages/96/3d/18df0199fa970f15f24a3996a5837234464a82844a8c6c01223a2d844723/django_keeper-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "38dac244397c7325e6f115ce63567b4c", "sha256": "5dbfe451d5206c0afb762f322635da28b62e5f3e07a4eb2e0237e075c7047b46" }, "downloads": -1, "filename": "django-keeper-0.1.6.tar.gz", "has_sig": false, "md5_digest": "38dac244397c7325e6f115ce63567b4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5793, "upload_time": "2018-04-29T02:37:26", "url": "https://files.pythonhosted.org/packages/a3/db/01b72ba28bef4d5ad5e0accc7fca1d5470617bf1c24f8db65f15026ba0b3/django-keeper-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "e86fa173314d0c194b262e3715383c21", "sha256": "4e8f952863dee2deb7c027827f90c3362d2ee8c0d0e017ddffa3c4578a04fa66" }, "downloads": -1, "filename": "django_keeper-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "e86fa173314d0c194b262e3715383c21", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 8821, "upload_time": "2018-04-29T10:41:51", "url": "https://files.pythonhosted.org/packages/3d/b8/b180838b0f308713b50973886c2afd5d04007ded5049b1edb579e7ea10a7/django_keeper-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c841e5efe50d8ae2c9851457e8d4ccdc", "sha256": "23b077943ba026abd34e905216630eb849e6e56486e8c34846291a63b93e8717" }, "downloads": -1, "filename": "django-keeper-0.1.7.tar.gz", "has_sig": false, "md5_digest": "c841e5efe50d8ae2c9851457e8d4ccdc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5806, "upload_time": "2018-04-29T10:41:49", "url": "https://files.pythonhosted.org/packages/49/b5/e91274a922460027147db003971fe84c7369839de41d7bd47050f584bc9a/django-keeper-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "1eb8280d21a4195fb6e7fc0b2301802d", "sha256": "cb3acf039e6f07fbc8552830646ce14362716d7c00eb7d3285b627bc99f5d402" }, "downloads": -1, "filename": "django_keeper-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "1eb8280d21a4195fb6e7fc0b2301802d", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 8868, "upload_time": "2018-05-03T03:02:03", "url": "https://files.pythonhosted.org/packages/80/3c/63b15e9a00cc0c37b99c7811848613af84838cf720e4efbc5039180e8d4f/django_keeper-0.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3c24148cd7b0332cbf8d031cad368fa1", "sha256": "b997b1c4975ed5f0ee51d8f00999a2548fd2366eff99da49d4391b94a8d02d8a" }, "downloads": -1, "filename": "django-keeper-0.1.8.tar.gz", "has_sig": false, "md5_digest": "3c24148cd7b0332cbf8d031cad368fa1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5848, "upload_time": "2018-05-03T03:02:01", "url": "https://files.pythonhosted.org/packages/31/b8/2363cee8f98ce1f1e65b92944d0692121ecae31f5d3df10b509120a268fb/django-keeper-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "40aca900d7bd7904ee842511cb4aa63f", "sha256": "5102061b632c540e6fc2dd38044a989b4bab072292e5fd6e5e20b9f817bf0e5a" }, "downloads": -1, "filename": "django_keeper-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "40aca900d7bd7904ee842511cb4aa63f", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 9029, "upload_time": "2018-05-03T03:31:29", "url": "https://files.pythonhosted.org/packages/e7/53/04fbd8f3617834da88cab4dee46c6cf12e47d5413dc55ca121abb272a29a/django_keeper-0.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c34c49148530b05ea3fca56ee8385956", "sha256": "712ff1eb10a1cc7516c929fcf239f80a75054a2e46c13dfdcb80a16dd6ac5199" }, "downloads": -1, "filename": "django-keeper-0.1.9.tar.gz", "has_sig": false, "md5_digest": "c34c49148530b05ea3fca56ee8385956", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5982, "upload_time": "2018-05-03T03:31:26", "url": "https://files.pythonhosted.org/packages/1d/43/e4af885716906b0f561a3201429276d8412f01759d4cb9c490950cf4ce82/django-keeper-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "50d680f8fe218a44e6ac85d56d6823eb", "sha256": "f717d62a8d620a2303e9c57bf3c989947ec0401739b87f129a2744bcefd45d2e" }, "downloads": -1, "filename": "django_keeper-0.1.14-py3-none-any.whl", "has_sig": false, "md5_digest": "50d680f8fe218a44e6ac85d56d6823eb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7732, "upload_time": "2019-07-05T04:58:37", "url": "https://files.pythonhosted.org/packages/81/c7/ebd2400bd1646ff22b4062029722ae99b211b38567ce5fcade125799b72d/django_keeper-0.1.14-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "957597d4dbfc4202ba268ec068ee833d", "sha256": "f04c3e140a1ff9194b50f53ea1c6fda6436549f260bf5f0f446676bc03c415d9" }, "downloads": -1, "filename": "django-keeper-0.1.14.tar.gz", "has_sig": false, "md5_digest": "957597d4dbfc4202ba268ec068ee833d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6460, "upload_time": "2019-07-05T04:58:39", "url": "https://files.pythonhosted.org/packages/e6/bf/8c278a81c0f07fb75453179f9c22afb54b1bd764c9227574893e1febf066/django-keeper-0.1.14.tar.gz" } ] }