{ "info": { "author": "Stefano Apostolico", "author_email": "s.apostolico@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django :: 1.10", "Framework :: Django :: 1.11", "Framework :: Django :: 1.8", "Framework :: Django :: 1.9", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "==================\nDjango Concurrency\n==================\n\n\n.. image:: https://badge.fury.io/py/django-concurrency.svg\n :target: http://badge.fury.io/py/django-concurrency\n :alt: PyPI package\n\n\ndjango-concurrency is an optimistic lock [1]_ implementation for Django.\n\nSupported Django versions: 1.8.x, 1.9.x, 1.10.x., 1.11.x, 2.x\n\nIt prevents users from doing concurrent editing in Django both from UI and from a\ndjango command.\n\n\nHow it works\n------------\nsample code::\n\n from django.db import models\n from concurrency.fields import IntegerVersionField\n\n class ConcurrentModel( models.Model ):\n version = IntegerVersionField( )\n name = models.CharField(max_length=100)\n\nNow if you try::\n\n a = ConcurrentModel.objects.get(pk=1)\n a.name = '1'\n\n b = ConcurrentModel.objects.get(pk=1)\n b.name = '2'\n\n a.save()\n b.save()\n\nyou will get a ``RecordModifiedError`` on ``b.save()``\n\n\nSimilar projects\n----------------\n\nOther projects that handle concurrent editing are `django-optimistic-lock`_ and `django-locking`_ anyway concurrency is \"a batteries included\" optimistic lock management system, here some features not available elsewhere:\n\n * can be applied to any model; not only your code (ie. django.contrib.auth.Group)\n * handle `list-editable`_ ChangeList. (handle `#11313 `_)\n * manage concurrency conflicts in admin's actions\n * can intercept changes performend out of the django app (ie using pgAdmin, phpMyAdmin, Toads) (using `TriggerVersionField`_)\n * can be disabled if needed (see `disable_concurrency`_)\n * `ConditionalVersionField`_ to handle complex business rules\n\n\nLinks\n~~~~~\n\n+--------------------+----------------+--------------+------------------------+\n| Stable | |master-build| | |master-cov| | |\n+--------------------+----------------+--------------+------------------------+\n| Development | |dev-build| | |dev-cov| | |\n+--------------------+----------------+--------------+------------------------+\n| Project home page: |https://github.com/saxix/django-concurrency |\n+--------------------+---------------+----------------------------------------+\n| Issue tracker: |https://github.com/saxix/django-concurrency/issues?sort |\n+--------------------+---------------+----------------------------------------+\n| Download: |http://pypi.python.org/pypi/django-concurrency/ |\n+--------------------+---------------+----------------------------------------+\n| Documentation: |https://django-concurrency.readthedocs.org/en/latest/ |\n+--------------------+---------------+--------------+-------------------------+\n\n.. |master-build| image:: https://secure.travis-ci.org/saxix/django-concurrency.svg?branch=master\n :target: http://travis-ci.org/saxix/django-concurrency/\n\n.. |master-cov| image:: https://codecov.io/gh/saxix/django-concurrency/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/saxix/django-concurrency\n\n.. |master-doc| image:: https://readthedocs.org/projects/django-concurrency/badge/?version=stable\n :target: http://django-concurrency.readthedocs.io/en/stable/\n\n.. |dev-build| image:: https://secure.travis-ci.org/saxix/django-concurrency.svg?branch=develop\n :target: http://travis-ci.org/saxix/django-concurrency/\n\n.. |dev-cov| image:: https://codecov.io/gh/saxix/django-concurrency/branch/develop/graph/badge.svg\n :target: https://codecov.io/gh/saxix/django-concurrency\n\n.. |dev-doc| image:: https://readthedocs.org/projects/django-concurrency/badge/?version=stable\n :target: http://django-concurrency.readthedocs.io/en/stable/\n\n\n\n.. |wheel| image:: https://img.shields.io/pypi/wheel/django-concurrency.svg\n\n_list-editable: https://django-concurrency.readthedocs.org/en/latest/admin.html#list-editable\n\n\n.. _django-locking: https://github.com/stdbrouw/django-locking\n\n.. _django-optimistic-lock: https://github.com/gavinwahl/django-optimistic-lock\n\n.. _TriggerVersionField: https://django-concurrency.readthedocs.org/en/latest/fields.html#triggerversionfield\n\n.. _ConditionalVersionField: https://django-concurrency.readthedocs.org/en/latest/fields.html#conditionalversionfield\n\n.. _disable_concurrency: https://django-concurrency.readthedocs.org/en/latest/api.html?#disable-concurrency\n\n\n\n.. image:: https://badges.gitter.im/Join%20Chat.svg\n :alt: Join the chat at https://gitter.im/saxix/django-concurrency\n :target: https://gitter.im/saxix/django-concurrency?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\n\n\n", "description_content_type": "", "docs_url": "https://pythonhosted.org/django-concurrency/", "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/saxix/django-concurrency", "keywords": "django", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "django-concurrency", "package_url": "https://pypi.org/project/django-concurrency/", "platform": "", "project_url": "https://pypi.org/project/django-concurrency/", "project_urls": { "Homepage": "https://github.com/saxix/django-concurrency" }, "release_url": "https://pypi.org/project/django-concurrency/2.0/", "requires_dist": null, "requires_python": "", "summary": "Optimistic lock implementation for Django. Prevents users from doing concurrent editing.", "version": "2.0" }, "last_serial": 5001623, "releases": { "0.3.1": [ { "comment_text": "", "digests": { "md5": "ac0124081f62797c4c7b79e926ab4054", "sha256": "4ea038ba39ea45c7ec5b49a44160fbbf0f683f404217ce97c940bf5400485219" }, "downloads": -1, "filename": "django-concurrency-0.3.1.tar.gz", "has_sig": false, "md5_digest": "ac0124081f62797c4c7b79e926ab4054", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16441, "upload_time": "2012-09-21T05:59:24", "url": "https://files.pythonhosted.org/packages/0e/7e/6185e3682d0e886c80ce17aa7115579b2fb943ba1a9c667a7f6b5aa6366b/django-concurrency-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "8be2891c012a0ad07a849c9099078d75", "sha256": "9c7e951da4f9559ded98cee597cf6fde54c4a030c1b8682e95c0efce2007ed39" }, "downloads": -1, "filename": "django-concurrency-0.3.2.tar.gz", "has_sig": false, "md5_digest": "8be2891c012a0ad07a849c9099078d75", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16307, "upload_time": "2012-12-09T04:42:24", "url": "https://files.pythonhosted.org/packages/e0/2d/1d3b1c6b2dbcfab32f0414d1886f6bb986b9a3adeb54bba2c4823bdaf77f/django-concurrency-0.3.2.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "3d92d461be782b3a76fd2d8e0c2b0312", "sha256": "619c508f61c78354d495d42b9b37f81b9c05b7264a4429ab2dc5bc30df054781" }, "downloads": -1, "filename": "django-concurrency-0.4.tar.gz", "has_sig": false, "md5_digest": "3d92d461be782b3a76fd2d8e0c2b0312", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32265, "upload_time": "2013-02-22T10:19:32", "url": "https://files.pythonhosted.org/packages/03/ea/7ffb42fe213c391a32608904294c61d816527c3d421730356f84d0894c74/django-concurrency-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "e121174260670050cea17e2868237036", "sha256": "ec62491e9598c6ba3b857eb9228efe56885ac12d6f8399f6b100abd43849c70c" }, "downloads": -1, "filename": "django-concurrency-0.5.tar.gz", "has_sig": false, "md5_digest": "e121174260670050cea17e2868237036", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33507, "upload_time": "2013-06-08T04:46:52", "url": "https://files.pythonhosted.org/packages/d9/ba/e8bccc46d2bf5005a6b04c22c1d87fdb0de7ee340cd03ab88a59506bfafd/django-concurrency-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "2320c3d99d68e77089628b8b5e1c1857", "sha256": "a2fb03d707e541fffacc92c154e4272f77adef16eb8c22a414acfab341659e07" }, "downloads": -1, "filename": "django-concurrency-0.6.tar.gz", "has_sig": false, "md5_digest": "2320c3d99d68e77089628b8b5e1c1857", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32714, "upload_time": "2013-10-01T16:22:33", "url": "https://files.pythonhosted.org/packages/0a/d6/378cdd0ab88cbc3a7b0282a552fcb8479afd117c82910dc7eb3b637422e9/django-concurrency-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "3ac36e2440d4cbc8210e44a895eaa714", "sha256": "a6d3ef4554477c9207f703b39a52b5eea746a288993d0c33e1e0218bd6e8714f" }, "downloads": -1, "filename": "django-concurrency-0.7.tar.gz", "has_sig": false, "md5_digest": "3ac36e2440d4cbc8210e44a895eaa714", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20001, "upload_time": "2014-01-04T13:44:37", "url": "https://files.pythonhosted.org/packages/0f/00/1bb92c34194ef298e96c00433f9eb03cd1332668d141da5ec485f7ef7d1a/django-concurrency-0.7.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "0bc1f0e10470394900e1f0aec0eca9a1", "sha256": "eab655dc3fdee2ec8c2e8a93f76d2e6995ee9af5dc0f25d804d67a5a013c9046" }, "downloads": -1, "filename": "django-concurrency-0.7.1.tar.gz", "has_sig": false, "md5_digest": "0bc1f0e10470394900e1f0aec0eca9a1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20057, "upload_time": "2014-01-15T11:05:07", "url": "https://files.pythonhosted.org/packages/b5/7a/71069feccc65ade370a74e3f935b45cb4483b5a0ad57a1347e05fc5d2f09/django-concurrency-0.7.1.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "3720733849d96d979d834d92b1a5663f", "sha256": "b89605f7d423ba7361d43c0a5d7f193c92601b9706af3ea6251f326db1a8614e" }, "downloads": -1, "filename": "django-concurrency-0.8.tar.gz", "has_sig": false, "md5_digest": "3720733849d96d979d834d92b1a5663f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20652, "upload_time": "2014-09-20T11:01:51", "url": "https://files.pythonhosted.org/packages/5b/47/64100258609b09ae96ff1d303414a89dfb53d505eaa03b5e579cb2d6381c/django-concurrency-0.8.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "9fa374629e6791ae4c1cab3492efe8e2", "sha256": "57a0d7b7ae6f11be5a658f17c43ad55835f9e045e0a6339f28de8299e7995a9c" }, "downloads": -1, "filename": "django-concurrency-0.8.1.tar.gz", "has_sig": false, "md5_digest": "9fa374629e6791ae4c1cab3492efe8e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20812, "upload_time": "2014-10-30T08:01:36", "url": "https://files.pythonhosted.org/packages/40/72/987c835af2cc77d7f7e50d3ab0df17d05f4527ead8ecc2e87f1d06d12e0b/django-concurrency-0.8.1.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "bd9068a605ef16edd202b3414fefad6a", "sha256": "db54ce76f56750ab5505d4bc000b5324bed04421d9add73d22bfcb7c0284829b" }, "downloads": -1, "filename": "django-concurrency-0.9.tar.gz", "has_sig": false, "md5_digest": "bd9068a605ef16edd202b3414fefad6a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21544, "upload_time": "2015-04-05T11:05:21", "url": "https://files.pythonhosted.org/packages/3d/d7/979953946edaf65a4daddd92595e4f69473db21fce17cb0a633d5da8f561/django-concurrency-0.9.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "5efad82359931b8d6dda0b9f43254b52", "sha256": "ad65bf524464e67f4ab8d5e77f30a792892c9416d273164f2ec5beafe6c48546" }, "downloads": -1, "filename": "django-concurrency-1.0.tar.gz", "has_sig": false, "md5_digest": "5efad82359931b8d6dda0b9f43254b52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21431, "upload_time": "2015-12-15T07:02:58", "url": "https://files.pythonhosted.org/packages/a0/65/e1739468212854440c855c0178e1f4778a8e3a4e3bb92f661d5a5d6a636b/django-concurrency-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "b265be1b00e590dbab622fc895f5c82c", "sha256": "78cad37b7367978532b154aac15afe650c8e93aaec1696e9d0ca460a8282ca12" }, "downloads": -1, "filename": "django-concurrency-1.0.1.tar.gz", "has_sig": false, "md5_digest": "b265be1b00e590dbab622fc895f5c82c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21440, "upload_time": "2015-12-15T18:28:33", "url": "https://files.pythonhosted.org/packages/e1/6d/ada4810e0a839e8c5648e4fca435a4f17c29c4b77e13c39097b3ddc2f22c/django-concurrency-1.0.1.tar.gz" } ], "1.0c1": [ { "comment_text": "", "digests": { "md5": "04ce82541bf4f27389c434a033c36f7a", "sha256": "aedbdcc622e70c6fd02b8819805b8ee1f16e8d84b6187d35a5a1e2a102df376d" }, "downloads": -1, "filename": "django-concurrency-1.0c1.tar.gz", "has_sig": false, "md5_digest": "04ce82541bf4f27389c434a033c36f7a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21998, "upload_time": "2015-11-21T16:47:11", "url": "https://files.pythonhosted.org/packages/0b/26/0e1e56212a9abbd83ebe9d7a3a00b5e674b2ff79d5b7bd45d2b2b4256d87/django-concurrency-1.0c1.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "d3de4ac0dae0dceec5d8b517d3509346", "sha256": "9623a0470acef02f0eb4e07ecbad89c2aed41b956091d51e05b3f7bafa69ac7a" }, "downloads": -1, "filename": "django-concurrency-1.1.tar.gz", "has_sig": false, "md5_digest": "d3de4ac0dae0dceec5d8b517d3509346", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 157596, "upload_time": "2016-02-13T22:49:31", "url": "https://files.pythonhosted.org/packages/b2/3b/5f64b72b9bbbb0dc7a507806cd8b0fc7874ec8d82d5a3d253d112ec608ea/django-concurrency-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "70b48a9ef9ec4a2039c8e4502b3b792a", "sha256": "2d373d0fd71e221057da92cd2d9173110536c341c030e0dc6432e49fe889fb89" }, "downloads": -1, "filename": "django-concurrency-1.2.tar.gz", "has_sig": false, "md5_digest": "70b48a9ef9ec4a2039c8e4502b3b792a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 177665, "upload_time": "2016-04-05T10:11:05", "url": "https://files.pythonhosted.org/packages/ca/55/a166410c6d50d57fb7f59b3b68384b6f651770a03c7a440fb7f520e96c9f/django-concurrency-1.2.tar.gz" } ], "1.3": [], "1.3.1": [ { "comment_text": "", "digests": { "md5": "cd1cbcba18b59a8cb0f8c31ba7abf1ec", "sha256": "70d878ebe35214fa5e2c002b38cc33aabbf6c994a3915377366f00bc9a4638e7" }, "downloads": -1, "filename": "django-concurrency-1.3.1.tar.gz", "has_sig": false, "md5_digest": "cd1cbcba18b59a8cb0f8c31ba7abf1ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58083, "upload_time": "2016-07-15T19:46:31", "url": "https://files.pythonhosted.org/packages/25/f1/b0eac6686001de6588cc84d2ff2c47bfca4c754a00e2bdec5ccf3792fbed/django-concurrency-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "f67c7a83486897162da31abc8da545d6", "sha256": "ad760c3ab9e9ab36e90eda09d4588eb834ccf7abf512c7759b882ef430331feb" }, "downloads": -1, "filename": "django-concurrency-1.3.2.tar.gz", "has_sig": false, "md5_digest": "f67c7a83486897162da31abc8da545d6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 91128, "upload_time": "2016-09-13T12:22:53", "url": "https://files.pythonhosted.org/packages/34/f4/b402df6f73e27269202f310724f0a19343175d48d3ba228c39059a935dc1/django-concurrency-1.3.2.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "1a64c174d5f2f1000cef0f83897f165c", "sha256": "233d23a8751989df6db2886957a8fbcc2408a1f16bb28262aab8a538d756d9d2" }, "downloads": -1, "filename": "django-concurrency-1.4.tar.gz", "has_sig": false, "md5_digest": "1a64c174d5f2f1000cef0f83897f165c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61368, "upload_time": "2017-07-12T13:49:23", "url": "https://files.pythonhosted.org/packages/72/9f/c6b5e5203a7be7abdbc44eec9198d0248943b54c8a53fc2e2494c266be99/django-concurrency-1.4.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "4974a77dfa3ab17e527e7dc5f1e3f386", "sha256": "06871dc2d1e80fad6c0c2428845aa3c6a648bfbbd10f01e10245876e782149f9" }, "downloads": -1, "filename": "django_concurrency-2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4974a77dfa3ab17e527e7dc5f1e3f386", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27781, "upload_time": "2019-03-29T05:11:23", "url": "https://files.pythonhosted.org/packages/86/dc/8357326d158403c4e8d4d8bc192f1861e7a9a135905e374944b5b32eb10e/django_concurrency-2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "39f59e19bf418aea86780976300a9d33", "sha256": "1e749a28d20816092980f4048c2c841cc68a5df9125f1c6c752149c8e2437545" }, "downloads": -1, "filename": "django-concurrency-2.0.tar.gz", "has_sig": false, "md5_digest": "39f59e19bf418aea86780976300a9d33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61628, "upload_time": "2019-03-29T05:11:30", "url": "https://files.pythonhosted.org/packages/8f/f2/685ef1be992c01436a16cd617781a2f2420a98d6725c784ac208fa5d16a6/django-concurrency-2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4974a77dfa3ab17e527e7dc5f1e3f386", "sha256": "06871dc2d1e80fad6c0c2428845aa3c6a648bfbbd10f01e10245876e782149f9" }, "downloads": -1, "filename": "django_concurrency-2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4974a77dfa3ab17e527e7dc5f1e3f386", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27781, "upload_time": "2019-03-29T05:11:23", "url": "https://files.pythonhosted.org/packages/86/dc/8357326d158403c4e8d4d8bc192f1861e7a9a135905e374944b5b32eb10e/django_concurrency-2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "39f59e19bf418aea86780976300a9d33", "sha256": "1e749a28d20816092980f4048c2c841cc68a5df9125f1c6c752149c8e2437545" }, "downloads": -1, "filename": "django-concurrency-2.0.tar.gz", "has_sig": false, "md5_digest": "39f59e19bf418aea86780976300a9d33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 61628, "upload_time": "2019-03-29T05:11:30", "url": "https://files.pythonhosted.org/packages/8f/f2/685ef1be992c01436a16cd617781a2f2420a98d6725c784ac208fa5d16a6/django-concurrency-2.0.tar.gz" } ] }