{
"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"
}
]
}