{ "info": { "author": "Tonye Jack", "author_email": "tonyejck@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Framework :: Django :: 3.0", "Framework :: Django :: 3.1", "Framework :: Django :: 3.2", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "[![PyPI](https://img.shields.io/pypi/v/django-model-subscription)](https://pypi.org/project/django-model-subscription/) [![Actions Status](https://github.com/jackton1/django-model-subscription/workflows/django%20model%20subscription%20test./badge.svg)](https://github.com/jackton1/django-model-subscription/actions?query=workflow%3A\"django+model+subscription+test.\")\n[![Documentation Status](https://readthedocs.org/projects/django-model-subscription/badge/?version=latest)](https://django-model-subscription.readthedocs.io/en/latest/?badge=latest)\n\n [![Codacy Badge](https://app.codacy.com/project/badge/Grade/353aa86af402423cbcd4e810bca664cc)](https://www.codacy.com/gh/tj-django/django-model-subscription/dashboard?utm_source=github.com&utm_medium=referral&utm_content=tj-django/django-model-subscription&utm_campaign=Badge_Grade) [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/353aa86af402423cbcd4e810bca664cc)](https://www.codacy.com/gh/tj-django/django-model-subscription/dashboard?utm_source=github.com&utm_medium=referral&utm_content=tj-django/django-model-subscription&utm_campaign=Badge_Coverage) [![codecov](https://codecov.io/gh/tj-django/django-model-subscription/branch/master/graph/badge.svg?token=P5X3FM234E)](https://codecov.io/gh/tj-django/django-model-subscription)\n\n[![Total alerts](https://img.shields.io/lgtm/alerts/g/tj-django/django-model-subscription.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/tj-django/django-model-subscription/alerts/) [![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/tj-django/django-model-subscription.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/tj-django/django-model-subscription/context:python) [![PyPI - License](https://img.shields.io/pypi/l/django-model-subscription.svg)](https://github.com/jackton1/django-model-subscription/blob/master/LICENSE)\n\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/django-model-subscription.svg)](https://pypi.org/project/django-model-subscription)\n[![PyPI - Django Version](https://img.shields.io/pypi/djversions/django-model-subscription.svg)](https://docs.djangoproject.com/en/2.2/releases/)\n[![Downloads](https://pepy.tech/badge/django-model-subscription)](https://pepy.tech/project/django-model-subscription)\n\n# [django-model-subscription](https://django-model-subscription.readthedocs.io/en/latest/installation.html)\n\n![Sreenshot](https://media.giphy.com/media/IgvrR33L6S7nFgH1by/giphy.gif)\n\n## Table of contents\n* [Motivation](#Motivation)\n* [Installation](#Installation)\n* [Usage](#Usage)\n * [Decorators](#Decorators)\n * [Setup Subscribers using AppConfig.ready](#setup-subscribers-using-appconfigready-recomended)\n * [Setup Subscribers with auto discovery](#setup-subscribers-using-auto-discovery)\n* [Credits](#credits)\n* [Resources](#resources)\n\n\n### Motivation\n\n- Using Observer Pattern notify subscribers about changes to a django model.\n- Decouple Business logic from Models.save\n- Support for bulk actions (Not available using django signals.)\n- Use noop subscribers when `settings.SUBSCRIPTION_RUN_EXTERNAL` is `False`\n which prevents having to mock subscribers that call external services in testing, local development\n environments.\n- Show changes to the instance after it has been updated i.e diff's the initial state and the\ncurrent state.\n\n![Screenshot](Subscriber.png)\n\n\n### Installation\n\n```bash\n$ pip install django-model-subscription\n```\n\nAdd `model_subscription` to your INSTALLED_APPS\n\n```python\nINSTALLED_APPS = [\n ...,\n 'model_subscription',\n ...\n]\n```\n\n\n### Usage\n\n##### Using the `SubscriptionModelMixin` and `SubscriptionQuerySet`\n\n```py\nfrom model_subscription.mixin import SubscriptionModelMixin\nfrom model_subscription.model import SubscriptionQuerySet\n\n\nclass TestModel(SubscriptionModelMixin, models.Model):\n name = models.CharField(max_length=255)\n\n objects = SubscriptionQuerySet.as_manager()\n```\n\n##### Subclassing the `SubscriptionModel` base class.\n\n```py\nfrom model_subscription.model import SubscriptionModel\n\n\nclass TestModel(SubscriptionModel):\n name = models.CharField(max_length=255)\n\n```\n\n#### Creating subscribers.\n\n- Using `OperationType`\n\n```python\nimport logging\nfrom model_subscription.decorators import subscribe\nfrom model_subscription.constants import OperationType\n\nlog = logging.getLogger(__name__)\n\n@subscribe(OperationType.CREATE, TestModel)\ndef handle_create(instance):\n log.debug('Created {}'.format(instance.name))\n\n\n```\n\n- Using `create_subscription` directly (succinct version).\n\n```python\n\nimport logging\nfrom model_subscription.decorators import create_subscription\n\nlog = logging.getLogger(__name__)\n\n@create_subscription(TestModel)\ndef handle_create(instance):\n log.debug('Created {}'.format(instance.name))\n\n\n```\n\n\n### Decorators\n\n* `subscribe`: Explicit (Requires a valid OperationType).\n\n\n#### (Create, Update, Delete) operations.\n\n* `create_subscription`: Subscribes to create operation i.e a new instance.\n\n```python\n@create_subscription(TestModel)\ndef handle_create(instance):\n log.debug('1. Created {}'.format(instance.name))\n```\n\n* `update_subscription`: Subscribes to updates also includes (`changed_data`).\n```python\n@update_subscription(TestModel)\ndef handle_update(instance, changed_data):\n log.debug('Updated {} {}'.format(instance.name, changed_data))\n```\n\n\n* `delete_subscription`: Subscribes to delete operation:\n\n> NOTE: The instance.pk is already set to None.\n\n```python\n@delete_subscription(TestModel)\ndef handle_delete(instance):\n log.debug('Deleted {}'.format(instance.name))\n```\n\n#### (Bulk Create, Bulk Update, Bulk Delete) operations.\n\n* `bulk_create_subscription`: Subscribe to bulk create operations.\n\n```python\n\n@bulk_create_subscription(TestModel)\ndef handle_bulk_create(instances):\n for instance in instances:\n log.debug('Bulk Created {}'.format(instance.name))\n\n```\n\n\n* `bulk_update_subscription`: Subscribe to bulk update operations.\n\n```python\n@bulk_update_subscription(TestModel)\ndef handle_bulk_update(instances):\n for instance in instances:\n log.debug('Updated {}'.format(instance.name))\n```\n\n\n* `bulk_delete_subscription`: Subscribe to bulk delete operations.\n\n```python\n\n@bulk_delete_subscription(TestModel)\ndef handle_bulk_delete(instances):\n for instance in instances:\n log.debug('Deleted {}'.format(instance.name))\n\n```\n\n\n### Setup Subscribers using AppConfig.ready `(Recomended)`.\n\n\nUpdate you `apps.py`\n\n\n```python\n\nfrom django.apps import AppConfig\n\n\nclass MyAppConfig(AppConfig):\n name = 'myapp'\n\n def ready(self):\n from myapp import subscriptions\n\n```\n\n\n### Setup Subscribers using auto discovery.\n\nBy default the `settings.SUBSCRIPTION_AUTO_DISCOVER` is set to `False`.\n\nTo use auto discovery this is not recommended as it would notify the subscribers\nwherever the model is used i.e IPython notebook, external scripts.\n\nIn your `settings.py` add\n\n```python\n\nSUBSCRIPTION_AUTO_DISCOVER = True\n\n```\n\n#### Setting up the `SUBSCRIPTION_MODULE`\n\n> NOTE: This is only required when ``SUBSCRIPTION_AUTO_DISCOVER = True``\n\n```python\n\nSUBSCRIPTION_MODULE = 'subscription'\n```\n\n#### Credits\n- [django-lifecycle](https://github.com/rsinger86/django-lifecycle)\n\n\nIf you feel generous and want to show some extra appreciation:\n\n[![Buy me a coffee][buymeacoffee-shield]][buymeacoffee]\n\n[buymeacoffee]: https://www.buymeacoffee.com/jackton1\n[buymeacoffee-shield]: https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png\n\n\n#### Resources\n- https://python-3-patterns-idioms-test.readthedocs.io/en/latest/Observer.html\n- https://refactoring.guru/design-patterns/observer\n- https://hackernoon.com/observer-vs-pub-sub-pattern-50d3b27f838c\n\n### TODO's\n- Supporting field level subscriptions.\n- Support class based subscribers which implements `__call__`\n- Extend to include custom OperationType.\n- Add support for using a single class to manage multiple actions i.e MyClass.update, MyClass.create.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://django-model-subscription.readthedocs.io/en/latest/index.html", "keywords": "django model subscription,model observer,model change subscriber,model subscriptions,model instance subscription", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-model-subscription", "package_url": "https://pypi.org/project/django-model-subscription/", "platform": "", "project_url": "https://pypi.org/project/django-model-subscription/", "project_urls": { "Documentation": "https://django-model-subscription.readthedocs.io/en/latest/index.html", "Homepage": "https://django-model-subscription.readthedocs.io/en/latest/index.html", "Repository": "https://github.com/jackton1/django-model-subscription" }, "release_url": "https://pypi.org/project/django-model-subscription/0.2.2/", "requires_dist": [ "typing (>=3.6,<4.0); python_version >= \"3.4\" and python_version < \"3.5\"", "django-lifecycle (>=0.9.0,<0.10.0)", "typing_extensions (>=3.7,<4.0)", "six (>=1.14,<2.0)" ], "requires_python": ">=3.6.0,<3.10.0", "summary": "Subscription model for a django model instance.", "version": "0.2.2", "yanked": false, "yanked_reason": null }, "last_serial": 11490983, "releases": { "0.0.10": [ { "comment_text": "", "digests": { "md5": "9a7393416b5deaa58ae57cbf0303d1ff", "sha256": "3d0890590839f061813897728643fe8feb24e2c0fd9d7a62086ab3f29e9536b4" }, "downloads": -1, "filename": "django_model_subscription-0.0.10-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9a7393416b5deaa58ae57cbf0303d1ff", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 15948, "upload_time": "2020-02-28T11:04:53", "upload_time_iso_8601": "2020-02-28T11:04:53.107771Z", "url": "https://files.pythonhosted.org/packages/4d/38/c935a1a5b69de4043609390faf12b1ade6ece535c00612d1f19ef3fd86db/django_model_subscription-0.0.10-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "638d8c7c5761265c6da7648f284dcdc8", "sha256": "14a4d53b5b0fcd01ceb7f1b5d13382043cdc3bdd0092ae670873b50be2e75e1f" }, "downloads": -1, "filename": "django-model-subscription-0.0.10.tar.gz", "has_sig": false, "md5_digest": "638d8c7c5761265c6da7648f284dcdc8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 15249, "upload_time": "2020-02-28T11:04:51", "upload_time_iso_8601": "2020-02-28T11:04:51.149940Z", "url": "https://files.pythonhosted.org/packages/e5/39/2d9ff77bb1a0850e8e082379f52099a353fe715e99c0ec2c58e1af4dbc42/django-model-subscription-0.0.10.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "643950847cf20240362c30cbdd56f48c", "sha256": "71f4d1643715f19701b86156e19035c6cf4d4e67c7dec7065f3371917ec2fd35" }, "downloads": -1, "filename": "django_model_subscription-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "643950847cf20240362c30cbdd56f48c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 5187, "upload_time": "2019-10-21T05:46:25", "upload_time_iso_8601": "2019-10-21T05:46:25.647825Z", "url": "https://files.pythonhosted.org/packages/d6/24/24a0cbce03733ce80b25c2514ae15ea9f37a72c4b9db4854de0bad2ca46d/django_model_subscription-0.0.2-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "31c86aaebd20e798a813dd749103b2f4", "sha256": "1a83ccee2181d0fcd6ddb03043778bf29d8382911f7a1fc3599b5a5320976ad8" }, "downloads": -1, "filename": "django-model-subscription-0.0.2.tar.gz", "has_sig": false, "md5_digest": "31c86aaebd20e798a813dd749103b2f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 4235, "upload_time": "2019-10-21T05:46:22", "upload_time_iso_8601": "2019-10-21T05:46:22.512178Z", "url": "https://files.pythonhosted.org/packages/4b/b8/3f002ff3f4577a6f075e4feefebea7009884d7664b00c67623ba164d5cbe/django-model-subscription-0.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "1ab25eb26787ffb9dad85c7d74862ecf", "sha256": "1525627792fa8a4f0c3d8f2f195dca7b53192d198ebd21dc9c05cd3869d60c4c" }, "downloads": -1, "filename": "django_model_subscription-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1ab25eb26787ffb9dad85c7d74862ecf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 5186, "upload_time": "2019-10-21T05:50:02", "upload_time_iso_8601": "2019-10-21T05:50:02.256670Z", "url": "https://files.pythonhosted.org/packages/2a/35/daeb03f0271af280f81c774f7df4e846d496ebd0c78e873d567178da5b59/django_model_subscription-0.0.3-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fbbb25781db40982288d9ee63c429808", "sha256": "f4d686d618b0e657a942bcc7c021f5a591acfd60374854ecf21de7809b244673" }, "downloads": -1, "filename": "django-model-subscription-0.0.3.tar.gz", "has_sig": false, "md5_digest": "fbbb25781db40982288d9ee63c429808", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 4234, "upload_time": "2019-10-21T05:50:00", "upload_time_iso_8601": "2019-10-21T05:50:00.738780Z", "url": "https://files.pythonhosted.org/packages/b4/c1/b9788b27c361c70cfe6c7a83c1e0f82a15be98878fa83b65afea4f89ea27/django-model-subscription-0.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "2a0036f4c2def302d4c99e95f787ed5d", "sha256": "be6c7e7d9ea35cadaafc6966c84a2400be28dbf3af04217b73a92e148f795cea" }, "downloads": -1, "filename": "django_model_subscription-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2a0036f4c2def302d4c99e95f787ed5d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 11300, "upload_time": "2019-10-21T13:07:47", "upload_time_iso_8601": "2019-10-21T13:07:47.327249Z", "url": "https://files.pythonhosted.org/packages/fb/56/b4b2b92c1976df6a0d5f0c27820ad73a16205ef304f109e2eeaace262e04/django_model_subscription-0.0.4-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "78f6012ae311f6f1bcf7db104af0e14f", "sha256": "cdf77677274830fd878aecf6e6f0ba87210fdcd4d236cea1fae8e0744ac06fd7" }, "downloads": -1, "filename": "django-model-subscription-0.0.4.tar.gz", "has_sig": false, "md5_digest": "78f6012ae311f6f1bcf7db104af0e14f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 8163, "upload_time": "2019-10-21T13:07:45", "upload_time_iso_8601": "2019-10-21T13:07:45.458427Z", "url": "https://files.pythonhosted.org/packages/45/1d/5077811aa45eaec4c39cf8d31d2268a2d71e7cadec3b9e237cfa8d6d73a5/django-model-subscription-0.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "2385993447824c59f0aeced0ca3fdbb6", "sha256": "c23fcb4ef0bf5ed9cf9f004933b3a7a57117df0a1be94be1471cf0aa52e940ba" }, "downloads": -1, "filename": "django_model_subscription-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2385993447824c59f0aeced0ca3fdbb6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 11633, "upload_time": "2019-10-23T16:50:45", "upload_time_iso_8601": "2019-10-23T16:50:45.926009Z", "url": "https://files.pythonhosted.org/packages/b1/55/762359726060cbeb1350f53e1809ddef23ba9f1c8b4c6074aaa9e863cdd4/django_model_subscription-0.0.5-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7076927fd1484a4bd5ab64af9946946e", "sha256": "402c48b3449919e90897985b759892d8ccc51aa8b984ba3f57d25f6f13b7f778" }, "downloads": -1, "filename": "django-model-subscription-0.0.5.tar.gz", "has_sig": false, "md5_digest": "7076927fd1484a4bd5ab64af9946946e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 8535, "upload_time": "2019-10-23T16:50:44", "upload_time_iso_8601": "2019-10-23T16:50:44.056152Z", "url": "https://files.pythonhosted.org/packages/54/63/ff37860d4fccbb9f86194dce4656a517c75d5629d5709fd514863ddf2522/django-model-subscription-0.0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "6bf4bc0c9b03a84caac12bfb832ad492", "sha256": "0342973351a6f6d813bca1cf80798da647a25ff470ca6f28b61496b0df4d03b4" }, "downloads": -1, "filename": "django_model_subscription-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6bf4bc0c9b03a84caac12bfb832ad492", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 12027, "upload_time": "2019-11-04T00:09:39", "upload_time_iso_8601": "2019-11-04T00:09:39.105292Z", "url": "https://files.pythonhosted.org/packages/70/3a/5f759e5a2d508b422a0d7c3c780a9b3713b5a05d2ca0eca392ea5a806bba/django_model_subscription-0.0.6-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "732748111d38298a942c5e2059be7bd1", "sha256": "461519ac7440a20f1bec5de40a04dbec17fbd79478c40b53d7e99035ab9938ed" }, "downloads": -1, "filename": "django-model-subscription-0.0.6.tar.gz", "has_sig": false, "md5_digest": "732748111d38298a942c5e2059be7bd1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*", "size": 9353, "upload_time": "2019-11-04T00:09:37", "upload_time_iso_8601": "2019-11-04T00:09:37.687229Z", "url": "https://files.pythonhosted.org/packages/31/29/74b941c035e54d3fcfcfaa9e00ea05cd392b516af6bbc1c34f06643274a1/django-model-subscription-0.0.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "61d3cd0c24c1c439f72df20925ce4d7d", "sha256": "96a900d0ace8e3d97cb0c86a019cff587daac1264c31ebc1dfa22a5fbf4c4162" }, "downloads": -1, "filename": "django_model_subscription-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "61d3cd0c24c1c439f72df20925ce4d7d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 13442, "upload_time": "2019-11-09T19:06:43", "upload_time_iso_8601": "2019-11-09T19:06:43.709085Z", "url": "https://files.pythonhosted.org/packages/e0/b7/741d167fd92fe1ed4b4dc104119574680547231489a633c97816a1e62ff4/django_model_subscription-0.0.7-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3dffc33bd4f38e7939010a37034269cf", "sha256": "997eabefd93abaf5552d36339d827714a36fa3769946629e9bcd1b8f56df30ac" }, "downloads": -1, "filename": "django-model-subscription-0.0.7.tar.gz", "has_sig": false, "md5_digest": "3dffc33bd4f38e7939010a37034269cf", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 11084, "upload_time": "2019-11-09T19:06:42", "upload_time_iso_8601": "2019-11-09T19:06:42.091753Z", "url": "https://files.pythonhosted.org/packages/c9/f4/c67a91a0abe453cdbc3f5545157b793fd05706931d42d7e82454ed9dcc34/django-model-subscription-0.0.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "f5ba705c86435dcdf1d6398bc2c09099", "sha256": "a3173366c56845029cdb93f1160c6a770010d7f3e786e72eaa50e2a4ee07344a" }, "downloads": -1, "filename": "django_model_subscription-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f5ba705c86435dcdf1d6398bc2c09099", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 14475, "upload_time": "2019-11-18T19:44:31", "upload_time_iso_8601": "2019-11-18T19:44:31.466531Z", "url": "https://files.pythonhosted.org/packages/06/ab/710fc03bf5b96854c1c3b0b9f0f18d8e3e8da67858a818fc36311992d0c7/django_model_subscription-0.0.8-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c34d3b54e070d3a894a52b3878159b64", "sha256": "c912230d7a1a44914369d2d686f8adedda7d96f835cef3105b585a31bda43f44" }, "downloads": -1, "filename": "django-model-subscription-0.0.8.tar.gz", "has_sig": false, "md5_digest": "c34d3b54e070d3a894a52b3878159b64", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 12279, "upload_time": "2019-11-18T19:44:29", "upload_time_iso_8601": "2019-11-18T19:44:29.769452Z", "url": "https://files.pythonhosted.org/packages/fd/0d/7e6bbadd2eff2d95c31ea2c833f324b7cdbfb9fcfadc20fe660fc1b1c382/django-model-subscription-0.0.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "7f86268275dcae905f4c89c15247dc9a", "sha256": "af445465fbf6c76cbd9d21de0b32e63ec42ff39c1e08f1b9fbccc545c1c0a5bf" }, "downloads": -1, "filename": "django_model_subscription-0.0.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7f86268275dcae905f4c89c15247dc9a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 16523, "upload_time": "2019-11-19T02:01:30", "upload_time_iso_8601": "2019-11-19T02:01:30.082884Z", "url": "https://files.pythonhosted.org/packages/5b/2d/5b2b15ca0b8566299a9bfbeadb9a07dd5f5e6f3f305438761567dfac43a3/django_model_subscription-0.0.9-py2.py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c53cb086ab6080695a5a53b489773a5c", "sha256": "e4952424fa91c4ec27e2103dbeea56d99eff95f18212408c6001ed505515391d" }, "downloads": -1, "filename": "django-model-subscription-0.0.9.tar.gz", "has_sig": false, "md5_digest": "c53cb086ab6080695a5a53b489773a5c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*", "size": 15555, "upload_time": "2019-11-19T02:01:28", "upload_time_iso_8601": "2019-11-19T02:01:28.416638Z", "url": "https://files.pythonhosted.org/packages/3c/50/e88eea869892ef041e2afd4e22751b7f4732a3e0567d4a733d1432bb0396/django-model-subscription-0.0.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "b669fcb3161907ab90c0828aafa119be", "sha256": "4221bba41fc7512908e7a96d4c8b84cd19c72610c650f9888bedeaeac0614764" }, "downloads": -1, "filename": "django_model_subscription-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b669fcb3161907ab90c0828aafa119be", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0,<3.10.0", "size": 13902, "upload_time": "2021-02-28T23:04:10", "upload_time_iso_8601": "2021-02-28T23:04:10.155071Z", "url": "https://files.pythonhosted.org/packages/92/12/ebc39e919f1aa89fb760c71036bb1bb90b1b1bc18fd78744fe39b48168ab/django_model_subscription-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7963b96952ea0ad675a5cef267447ce2", "sha256": "03e4764477392eca1130447c711639b6682186cae8a1519a3035faf61585afc6" }, "downloads": -1, "filename": "django-model-subscription-0.1.0.tar.gz", "has_sig": false, "md5_digest": "7963b96952ea0ad675a5cef267447ce2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0,<3.10.0", "size": 14603, "upload_time": "2021-02-28T23:04:08", "upload_time_iso_8601": "2021-02-28T23:04:08.828531Z", "url": "https://files.pythonhosted.org/packages/f3/6c/d1b14e1ebe7aaf128914f0a49e9b9120216e02839f5b2626018ba89652f4/django-model-subscription-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "788cd8ba611cb5c209efd6c845fd3675", "sha256": "f504297acf48070ec53f6f6832008b2910b76e1641fbebe836692bc5d42908c8" }, "downloads": -1, "filename": "django_model_subscription-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "788cd8ba611cb5c209efd6c845fd3675", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0,<3.10.0", "size": 15895, "upload_time": "2021-03-03T11:28:09", "upload_time_iso_8601": "2021-03-03T11:28:09.968185Z", "url": "https://files.pythonhosted.org/packages/08/a6/72dcbd1ab2f310bc4f6019a7f787a905694e750335c7d4a949137a2bc6d9/django_model_subscription-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "dc6ec2f91834820bd2658d06caf2e2ba", "sha256": "74561a20a497f7ab320e9ea67f905c8870cf22299d1af2176a9faf70c9eee3f4" }, "downloads": -1, "filename": "django-model-subscription-0.2.0.tar.gz", "has_sig": false, "md5_digest": "dc6ec2f91834820bd2658d06caf2e2ba", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0,<3.10.0", "size": 16779, "upload_time": "2021-03-03T11:28:08", "upload_time_iso_8601": "2021-03-03T11:28:08.714337Z", "url": "https://files.pythonhosted.org/packages/83/c6/a5bc8a32e609f6c720ad3a4a7cdb67287bbcf9c34854fbb151fdd2251255/django-model-subscription-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "1723072f8d0a02072fa76b4f4e33b561", "sha256": "c21bb53decbb20658c9e659306ad40bb296ab16336d3b5834387c2e5b0e130c4" }, "downloads": -1, "filename": "django_model_subscription-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1723072f8d0a02072fa76b4f4e33b561", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0,<3.10.0", "size": 12465, "upload_time": "2021-09-19T11:17:05", "upload_time_iso_8601": "2021-09-19T11:17:05.490811Z", "url": "https://files.pythonhosted.org/packages/2a/72/1717a6d6becac83064b5d9d855e6e137d110a16653a1edffe02d818740b0/django_model_subscription-0.2.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e42575a6566bad19cfef119c23d5d6d4", "sha256": "a874ae344f094e9a0b800e4035f8abc4272f21c3c0596b69f0b34a01b2747eac" }, "downloads": -1, "filename": "django-model-subscription-0.2.2.tar.gz", "has_sig": false, "md5_digest": "e42575a6566bad19cfef119c23d5d6d4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0,<3.10.0", "size": 13260, "upload_time": "2021-09-19T11:17:03", "upload_time_iso_8601": "2021-09-19T11:17:03.777030Z", "url": "https://files.pythonhosted.org/packages/84/fc/9943f9997527c946dc714b8d03e313b7da40f8b930608baa5cf1ea72328d/django-model-subscription-0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1723072f8d0a02072fa76b4f4e33b561", "sha256": "c21bb53decbb20658c9e659306ad40bb296ab16336d3b5834387c2e5b0e130c4" }, "downloads": -1, "filename": "django_model_subscription-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1723072f8d0a02072fa76b4f4e33b561", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0,<3.10.0", "size": 12465, "upload_time": "2021-09-19T11:17:05", "upload_time_iso_8601": "2021-09-19T11:17:05.490811Z", "url": "https://files.pythonhosted.org/packages/2a/72/1717a6d6becac83064b5d9d855e6e137d110a16653a1edffe02d818740b0/django_model_subscription-0.2.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e42575a6566bad19cfef119c23d5d6d4", "sha256": "a874ae344f094e9a0b800e4035f8abc4272f21c3c0596b69f0b34a01b2747eac" }, "downloads": -1, "filename": "django-model-subscription-0.2.2.tar.gz", "has_sig": false, "md5_digest": "e42575a6566bad19cfef119c23d5d6d4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0,<3.10.0", "size": 13260, "upload_time": "2021-09-19T11:17:03", "upload_time_iso_8601": "2021-09-19T11:17:03.777030Z", "url": "https://files.pythonhosted.org/packages/84/fc/9943f9997527c946dc714b8d03e313b7da40f8b930608baa5cf1ea72328d/django-model-subscription-0.2.2.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }