{ "info": { "author": "Craig de Stigter", "author_email": "craig.ds@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "[![Build Status](https://travis-ci.org/craigds/django-fieldsignals.svg?branch=master)](https://travis-ci.org/craigds/django-fieldsignals)\n\n# Introduction\n\ndjango-fieldsignals simply makes it easy to tell when the fields on your model have changed.\n\nOften model updates are quite expensive. Sometimes the expensive operations\nare very rare. This makes it tempting to put the update logic in a view,\nrather than in a save() method or in a signal receiver:\n\n```python\n # A bad example. Don't do this!\n def edit_poll(request, poll_id):\n\n # ...\n\n if form.cleaned_data['poll_name'] != poll.name:\n poll.update_slug(form.cleaned_data['poll_name'])\n poll.save()\n```\n\nThat's a bad idea, because your model consistency is now dependent on your view.\n\nInstead, use django-fieldsignals:\n\n```python\n from fieldsignals import pre_save_changed\n\n def update_poll_slug(sender, instance, **kwargs):\n instance.slug = slugify(instance.name)\n\n pre_save_changed.connect(update_poll_slug, sender=Poll, fields=['name'])\n```\n\n\nIn case you want to know what changed, django-fieldsignals even tells you the old and\nnew values of your fields:\n\n```python\n from fieldsignals import pre_save_changed\n\n def print_all_field_changes(sender, instance, changed_fields=None, **kwargs):\n for field, (old, new) in changed_fields.items():\n print \"%s changed from %s to %s\" % (field.name, old, new)\n\n pre_save_changed.connect(print_all_field_changes, sender=Poll)\n```\n\n# Installation\n\n1. This library is on PyPI so you can install it with:\n\n```bash\n pip install django-fieldsignals\n```\n\nor from github:\n\n```bash\n pip install 'git+https://github.com/craigds/django-fieldsignals.git#egg=django-fieldsignals'\n```\n\n2. Add `\"fieldsignals\"` to your `INSTALLED_APPS` setting like this:\n\n```python\n INSTALLED_APPS = (\n ...\n 'fieldsignals',\n )\n```\n\n3. Add some signals!\n\n# Where should my signals code live?\n\nField signals must be connected after the django apps are ready.\nSo putting signal connectors at the bottom of your models file, or other random places won't work.\n\nThe best place to connect fieldsignals is an [`AppConfig.ready()` handler](https://docs.djangoproject.com/en/1.11/ref/applications/#for-application-authors).\n\n# Notes\n\n* Currently no support for `ManyToManyField` or reverse side of `ForeignKey` (one to many).\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/craigds/django-fieldsignals", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-fieldsignals", "package_url": "https://pypi.org/project/django-fieldsignals/", "platform": "", "project_url": "https://pypi.org/project/django-fieldsignals/", "project_urls": { "Homepage": "https://github.com/craigds/django-fieldsignals" }, "release_url": "https://pypi.org/project/django-fieldsignals/0.4.0/", "requires_dist": null, "requires_python": "", "summary": "Django fieldsignals simply makes it easy to tell when the fields on your model have changed.", "version": "0.4.0" }, "last_serial": 4666797, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "e8608cd71acd274d5e84c1a9e90db10f", "sha256": "fb2536b942f599828a5d255fb320838592013bf1367074686bf5fa399d96f344" }, "downloads": -1, "filename": "django_fieldsignals-0.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "e8608cd71acd274d5e84c1a9e90db10f", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 5548, "upload_time": "2015-04-20T04:22:33", "url": "https://files.pythonhosted.org/packages/c0/b7/9b51333f9d042286fc8c73cd57c914e8fafc3fa1b9641676d182a51eef46/django_fieldsignals-0.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2f3921b706a8cbad617b90ea5884a4d3", "sha256": "c80c4c4d5e369e9fb0c41e87c854412e0babf4c012f30a1f6ff74ebfcfd84089" }, "downloads": -1, "filename": "django-fieldsignals-0.1.1.tar.gz", "has_sig": false, "md5_digest": "2f3921b706a8cbad617b90ea5884a4d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4470, "upload_time": "2015-04-20T04:22:30", "url": "https://files.pythonhosted.org/packages/42/4d/d0c54fb3d3066ad14cefb31889bb3f94ce8f21856c81b03995c6cb4bce0c/django-fieldsignals-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "22d672ea4df3f0a83f4f18bef2225b0f", "sha256": "603f078869f0e9ebe10e3e975bd070d362c77eb548e7020c02cfb4e5ed2ee8de" }, "downloads": -1, "filename": "django_fieldsignals-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "22d672ea4df3f0a83f4f18bef2225b0f", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7101, "upload_time": "2016-01-25T23:42:42", "url": "https://files.pythonhosted.org/packages/9e/b4/46eeca7eca503e49f43a688d22370066b8f5a08caa7b1717154362986b54/django_fieldsignals-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "11275b8a97ea9ed08e1796ef46049ab7", "sha256": "552eb5fdbd51ef5c9218a071f7c9b69d0e680dbc2ef2b8282dbf62f726bd0810" }, "downloads": -1, "filename": "django-fieldsignals-0.2.0.tar.gz", "has_sig": false, "md5_digest": "11275b8a97ea9ed08e1796ef46049ab7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5267, "upload_time": "2016-01-25T23:42:30", "url": "https://files.pythonhosted.org/packages/70/91/e3455a5d4f70850daf3e9037a51d7901a97f8120b9d1f0a157ee2a0e92c9/django-fieldsignals-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "3d5154bc09b44e2fb5498a3d26fd1bc8", "sha256": "087f4033e742b039101ffb6a2451ec33680da50bbbe9fa66508da7c4b7258e25" }, "downloads": -1, "filename": "django_fieldsignals-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3d5154bc09b44e2fb5498a3d26fd1bc8", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7405, "upload_time": "2016-01-26T00:12:04", "url": "https://files.pythonhosted.org/packages/7f/4e/8c7a6cc216475b56fe539d931d0a0923dd4d0a25ee28dcfaaf7f112558a6/django_fieldsignals-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c21ee5c43bdb9af192ccf4775c37521e", "sha256": "d1c5cde4e27fe7b9a238a7aac021ba42dd8bc95df510844cc86375c440f0bed7" }, "downloads": -1, "filename": "django-fieldsignals-0.2.1.tar.gz", "has_sig": false, "md5_digest": "c21ee5c43bdb9af192ccf4775c37521e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5500, "upload_time": "2016-01-26T00:11:52", "url": "https://files.pythonhosted.org/packages/a4/01/972663a2523a35482f34839671e1fbb407842c21afe67dec91f0436ec9eb/django-fieldsignals-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "7983fdaaad35d4b49821b6fcc81968f1", "sha256": "8af2bc5914e6f1fcedaa05d5b110a45d9f64fe22963105a43c48d5afb519f4fb" }, "downloads": -1, "filename": "django_fieldsignals-0.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7983fdaaad35d4b49821b6fcc81968f1", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7595, "upload_time": "2016-01-28T20:45:27", "url": "https://files.pythonhosted.org/packages/cc/cc/43415a9c6cbc35eb31f1e9ea616fb1b48b4119dcd6183af3009a5d2810a9/django_fieldsignals-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "561d500a82da53a6623cf699f5ec9330", "sha256": "a58c3cf1892a236d965234f54cec66fc10d9850200c04760b9f1eeb0da9c2d04" }, "downloads": -1, "filename": "django-fieldsignals-0.2.2.tar.gz", "has_sig": false, "md5_digest": "561d500a82da53a6623cf699f5ec9330", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5669, "upload_time": "2016-01-28T20:45:16", "url": "https://files.pythonhosted.org/packages/b9/d9/9bf5e7d2378b98146f658d651f27d7c0585f3df12137ea650971cc363134/django-fieldsignals-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "31353daf83939439fa992b90e4f59647", "sha256": "de094c5706e9dc8b7d10af2e48894b943e9f68f44c45044fff3f2f907757c1e1" }, "downloads": -1, "filename": "django_fieldsignals-0.2.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "31353daf83939439fa992b90e4f59647", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 8320, "upload_time": "2016-02-23T19:17:03", "url": "https://files.pythonhosted.org/packages/80/81/7fdf7fd67180860fa2c29798a12f5006e506acb4c298e69aa3f9d207c22c/django_fieldsignals-0.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "51a9a87990e6d99929bc3f0988cc8274", "sha256": "7282dba7f3815c0562163dcd48f2668d1de3db3b76672da68bf7cbcf6da2d5dd" }, "downloads": -1, "filename": "django-fieldsignals-0.2.3.tar.gz", "has_sig": false, "md5_digest": "51a9a87990e6d99929bc3f0988cc8274", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6139, "upload_time": "2016-02-23T19:16:54", "url": "https://files.pythonhosted.org/packages/cd/6c/8d3e3e4c5462c66c018258e381e8cd4c653d5669a833865c5941c0b7ebee/django-fieldsignals-0.2.3.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "d18c2d721b6bf6cc3ccc21bf67de202a", "sha256": "b731b3df3821c5c25829c6397780b9c2e6f09d5ed984cafab37dfb91d82b39d8" }, "downloads": -1, "filename": "django_fieldsignals-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d18c2d721b6bf6cc3ccc21bf67de202a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7975, "upload_time": "2017-07-04T08:27:34", "url": "https://files.pythonhosted.org/packages/6d/4a/4213bf7411be1e8af2fda4a6a51cb617ea80973eafb4d1ec87af8a48e05a/django_fieldsignals-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "24937efa81be7c07420f5cb506a9eee1", "sha256": "12343299744df7637704388e3484ffe2c7b051881a2a7275a626ac646aefec28" }, "downloads": -1, "filename": "django-fieldsignals-0.3.0.tar.gz", "has_sig": false, "md5_digest": "24937efa81be7c07420f5cb506a9eee1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5934, "upload_time": "2017-07-04T08:27:31", "url": "https://files.pythonhosted.org/packages/81/73/89420f36a47ec86a8b50e8b4449d0101b4d26a010e5da67d5615ce9fc844/django-fieldsignals-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "e38d4eec81d82961157807cbfed1d5b1", "sha256": "1e98691c4eb96ee9b2ae148cc38c3727c7821a2a606ddd5a6bed344e61910af2" }, "downloads": -1, "filename": "django_fieldsignals-0.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e38d4eec81d82961157807cbfed1d5b1", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 8738, "upload_time": "2018-02-26T02:59:28", "url": "https://files.pythonhosted.org/packages/78/60/c6c83b48b67eb5fdd9c36d7244eb77e477ee45c882b783a196c6f43b95e4/django_fieldsignals-0.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7b1cdef2ec973b1b0d73c478eb7be2b9", "sha256": "fe50390b92ec9b162d4b65118f90aef0968ce74f8f901014dd241970328151ae" }, "downloads": -1, "filename": "django-fieldsignals-0.3.1.tar.gz", "has_sig": false, "md5_digest": "7b1cdef2ec973b1b0d73c478eb7be2b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6459, "upload_time": "2018-02-26T02:59:26", "url": "https://files.pythonhosted.org/packages/34/c5/9626d1e1cfd184ca1188e99974557f491214a1d5564f0eab3a9211305e35/django-fieldsignals-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "ce8e00c3aaf4dcdc9065b7f1cc8b377c", "sha256": "b6df7cab26225cc188aeb9fd6ccaf6a4f6ab1650b09036b9247434802c1207d4" }, "downloads": -1, "filename": "django_fieldsignals-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ce8e00c3aaf4dcdc9065b7f1cc8b377c", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 8908, "upload_time": "2018-03-21T02:03:25", "url": "https://files.pythonhosted.org/packages/35/9b/db2603bdbf2226370e79e8f08b5845cd4f278b865c5f87c204ca8f001147/django_fieldsignals-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "35bd31e7fbbbcc9656cfedc7c0a413c5", "sha256": "4923d1ef9cc768cec46e49cd3f00014808b9d0b23620e038f895236661bf2344" }, "downloads": -1, "filename": "django-fieldsignals-0.3.2.tar.gz", "has_sig": false, "md5_digest": "35bd31e7fbbbcc9656cfedc7c0a413c5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6828, "upload_time": "2018-03-21T02:03:23", "url": "https://files.pythonhosted.org/packages/b7/17/4c5b938544ce29743f105b6419bc75a314728eb96e4d7bee60b05cf18b4b/django-fieldsignals-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "58a0d28fa8ac9817275e3a5c65f666f1", "sha256": "0036d1d97c6d7571b8b237218c7697842c2ba131e10f17e03ad31f8a98cb2bd8" }, "downloads": -1, "filename": "django_fieldsignals-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "58a0d28fa8ac9817275e3a5c65f666f1", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9130, "upload_time": "2018-03-25T22:24:27", "url": "https://files.pythonhosted.org/packages/a2/67/6aec148312442143b10e9cf403a7efc26857e8c5e677ce6e5c9e0fadc47f/django_fieldsignals-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ac0339143e9debdecdb5ef43203a3c81", "sha256": "65c560dc28838571346646a6f035002e8803c9164553e67033bc74457385c9a6" }, "downloads": -1, "filename": "django-fieldsignals-0.3.3.tar.gz", "has_sig": false, "md5_digest": "ac0339143e9debdecdb5ef43203a3c81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7044, "upload_time": "2018-03-25T22:24:24", "url": "https://files.pythonhosted.org/packages/30/13/596ce285ba75ab004352a88f4354efac7cc452546bbb5524e687d95c7320/django-fieldsignals-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "4e3178fb036c22f1bba3e3970e80ccd6", "sha256": "acddc379012ab342be45042e807541717ff355878fc996732f1e628d4fe7e516" }, "downloads": -1, "filename": "django_fieldsignals-0.3.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4e3178fb036c22f1bba3e3970e80ccd6", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 9131, "upload_time": "2018-03-25T22:35:35", "url": "https://files.pythonhosted.org/packages/a0/1f/160b560e5504328d16324ae15979c1ddd1b55c400a6b33d4e50b4b416846/django_fieldsignals-0.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "283c3ed68ce9315e8128eb9e5a859f22", "sha256": "04d02a6e1085fe9e7aa549486dfa9635b1ff624eefb5df73b6fd51ca9d5c78c7" }, "downloads": -1, "filename": "django-fieldsignals-0.3.4.tar.gz", "has_sig": false, "md5_digest": "283c3ed68ce9315e8128eb9e5a859f22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7037, "upload_time": "2018-03-25T22:35:33", "url": "https://files.pythonhosted.org/packages/1d/e6/d563e015f7fa0cc43187c1f0b4ace02032eb68dcf57a59e3e4fc96b887e6/django-fieldsignals-0.3.4.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "4c53b92e7419d37bda112d85bb6a4b88", "sha256": "8151847dee9e1e13af96535e6db2931d99e9b5d01ceb5a60ea4f7a2e0786bfdf" }, "downloads": -1, "filename": "django_fieldsignals-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4c53b92e7419d37bda112d85bb6a4b88", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7111, "upload_time": "2019-01-06T23:07:56", "url": "https://files.pythonhosted.org/packages/6f/ee/b3015e2f9d102e3213cee349a1953cd11a51183dde6d45a3fb04cfcf7b2b/django_fieldsignals-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0137e716f460c90d94c52580f2c81bce", "sha256": "6d789f271d655fd8fc33397f91bcc58e796a1f3ac054706dfe1c28ae90763487" }, "downloads": -1, "filename": "django-fieldsignals-0.4.0.tar.gz", "has_sig": false, "md5_digest": "0137e716f460c90d94c52580f2c81bce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7045, "upload_time": "2019-01-06T23:07:53", "url": "https://files.pythonhosted.org/packages/7f/10/8c3203a052a54977953c30cd192abe433231a8e427b5bbdcda21cb465c84/django-fieldsignals-0.4.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4c53b92e7419d37bda112d85bb6a4b88", "sha256": "8151847dee9e1e13af96535e6db2931d99e9b5d01ceb5a60ea4f7a2e0786bfdf" }, "downloads": -1, "filename": "django_fieldsignals-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4c53b92e7419d37bda112d85bb6a4b88", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 7111, "upload_time": "2019-01-06T23:07:56", "url": "https://files.pythonhosted.org/packages/6f/ee/b3015e2f9d102e3213cee349a1953cd11a51183dde6d45a3fb04cfcf7b2b/django_fieldsignals-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0137e716f460c90d94c52580f2c81bce", "sha256": "6d789f271d655fd8fc33397f91bcc58e796a1f3ac054706dfe1c28ae90763487" }, "downloads": -1, "filename": "django-fieldsignals-0.4.0.tar.gz", "has_sig": false, "md5_digest": "0137e716f460c90d94c52580f2c81bce", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7045, "upload_time": "2019-01-06T23:07:53", "url": "https://files.pythonhosted.org/packages/7f/10/8c3203a052a54977953c30cd192abe433231a8e427b5bbdcda21cb465c84/django-fieldsignals-0.4.0.tar.gz" } ] }