{ "info": { "author": "Till Theato", "author_email": "till.theato@evocount.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "\n[![PyPI version](https://badge.fury.io/py/drf-channels-oneway-ws.svg)](https://badge.fury.io/py/drf-channels-oneway-ws)\n[![Build Status](https://travis-ci.org/evocount/drf-channels-oneway-ws.svg?branch=master)](https://travis-ci.org/evocount/drf-channels-oneway-ws)\n[![codecov](https://codecov.io/gh/evocount/drf-channels-oneway-ws/branch/master/graph/badge.svg)](https://codecov.io/gh/evocount/drf-channels-oneway-ws)\n\n# DRF channels one-way WS\n\nSimple one-way bindings for django-channels with some specific support for django-rest-framework serializers and websockets. I.e. enrich your existing API with push notifications.\n\n## Installation\n\n* `pipenv install drf-channels-oneway-ws` or `pip install drf-channels-oneway-ws`\n\n## Usage\n\n### Bindings\n```python\nfrom django.db import models\nfrom rest_framework import serializers\nfrom channels_oneway.bindings import Binding\n\nclass Family(models.Model):\n name = models.CharField(max_length=255)\n\nclass Bird(models.Model):\n name = models.CharField(max_length=255)\n family = models.ForeignKey('Family', models.CASCADE)\n\n\nclass BirdSerializer(serializers.ModelSerializer):\n class Meta:\n model = Customer\n fields = ('__all__')\n\n\nclass BirdBinding(Binding):\n model = Bird\n stream = 'birds'\n serializer = BirdSerializer\n\n @classmethod\n def group_names(cls, instance):\n return [instance.family.name]\n\nclass FamilyBinding(Binding):\n \"\"\"\n example of a binding not using a drf serializer\n \"\"\"\n model = Family\n stream = 'bird-families'\n\n @classmethod\n def group_names(cls, instance):\n return [instance.name]\n\n def serialize_data(self, instance):\n return {'id': instance.id, 'name': instance.name}\n```\n\nNow you make sure you have a WebsocketConsumer, which does something like `self.channel_layer.group_add('thrushes', self.channel_name)` in its connect coroutine.\n`Family.objects.create(name='thrushes')` will then cause the following to be sent over the associated websocket:\n\n```json\n{\n \"stream\": \"bird-families\",\n \"payload\": {\n \"action\": \"create\",\n \"data\": {\"id\": 1, \"name\": \"thrushes\"},\n \"model\": \"your_app.family\",\n \"pk\": 1\n }\n}\n```\n\nUpon modification (`\"action\": \"update\"`) or deletion (`\"action\": \"delete\"`) you will receive messages with an equal structure.\n\n\n#### Registration\nIn order to let the bindings register their signals make sure they are imported at some point. In case you use a dedicated file, import it from [`AppConfig.ready`](https://docs.djangoproject.com/en/2.2/ref/applications/#django.apps.AppConfig.ready) just like your signals.\n\n\n### Helpers\nIn order to send a ws message from outside a binding, but using the same format (stream + payload) (and also the drf json encoder) use the async `channels_oneway.utils.groupSend(group, stream, payload)` or its sync equivalent `groupSendSync`.\n\n## Contributing\n\n### Installation\n\n* `git clone git@github.com:evocount/drf-channels-oneway-ws.git`\n* `cd drf-channels-oneway-ws`\n* `pipenv install --dev`\n\n### Running tests\n\n* `pipenv run pytest --cov`\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE.md).\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/evocount/drf-channels-oneway-ws", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "drf-channels-oneway-ws", "package_url": "https://pypi.org/project/drf-channels-oneway-ws/", "platform": "", "project_url": "https://pypi.org/project/drf-channels-oneway-ws/", "project_urls": { "Homepage": "https://github.com/evocount/drf-channels-oneway-ws" }, "release_url": "https://pypi.org/project/drf-channels-oneway-ws/0.3.0/", "requires_dist": [ "Django", "channels", "djangorestframework", "pytest ; extra == 'test'", "pytest-cov ; extra == 'test'", "pytest-django ; extra == 'test'", "pytest-asyncio ; extra == 'test'" ], "requires_python": ">=3.6.0", "summary": "Simple one-way bindings for django-channels with some specific support for django-rest-framework serializers and websockets. I.e. enrich your existing API with push notifications.", "version": "0.3.0" }, "last_serial": 5687275, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "3c538187ade7080897497c113c092b91", "sha256": "977fd607eb29565473b6dcce11a82c2acd3ba899c9dcf5f6eb3983a00bfa8faa" }, "downloads": -1, "filename": "drf_channels_oneway_ws-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3c538187ade7080897497c113c092b91", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 6298, "upload_time": "2019-03-21T17:58:09", "url": "https://files.pythonhosted.org/packages/fd/69/395b33b5de3dc14b67263e55280c097b08fcc6982b1679d6d8bb9fa1f741/drf_channels_oneway_ws-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c619599260dc8599a4cacb5f604d738", "sha256": "574b113875cc961f7a402e49c1ac6d7e507841987ab2ddc1831d4d0b5d839bc3" }, "downloads": -1, "filename": "drf-channels-oneway-ws-0.1.0.tar.gz", "has_sig": false, "md5_digest": "5c619599260dc8599a4cacb5f604d738", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6028, "upload_time": "2019-03-21T17:58:11", "url": "https://files.pythonhosted.org/packages/6f/50/e167fadc19fb393546c628eaf3fe43e6a173d60bee69d04cd11dc2031a09/drf-channels-oneway-ws-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "dc47ba5cfb849c4e3241e6027529c5fc", "sha256": "21f17a584fd59f1302a69fb8f814123bd7ad6b2be8e9fd53df3587ac31ae1672" }, "downloads": -1, "filename": "drf_channels_oneway_ws-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dc47ba5cfb849c4e3241e6027529c5fc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 6728, "upload_time": "2019-08-16T09:20:50", "url": "https://files.pythonhosted.org/packages/86/21/b383cd318463083431ece4af757887abaaca4f5cdbbccbc287f2d71b7561/drf_channels_oneway_ws-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "734fba93e85c087b6ce4a0aa15f284c9", "sha256": "ec05889ac2364ded3c96581d8854e418ef35c2ddd81095dfadc832900b5b6adf" }, "downloads": -1, "filename": "drf-channels-oneway-ws-0.2.0.tar.gz", "has_sig": false, "md5_digest": "734fba93e85c087b6ce4a0aa15f284c9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6462, "upload_time": "2019-08-16T09:20:52", "url": "https://files.pythonhosted.org/packages/33/57/48dd048c5cf8eba53b9df6b6225398e9faaa40f6623218b1336dbbb9fc34/drf-channels-oneway-ws-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "b35bc29e28bb0f194f9a0531d44834ae", "sha256": "3a6ebaec2e5985a5818b42c55090e0abf38f6f5e575595190d02bf940f7c8b1f" }, "downloads": -1, "filename": "drf_channels_oneway_ws-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b35bc29e28bb0f194f9a0531d44834ae", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 6825, "upload_time": "2019-08-16T12:05:22", "url": "https://files.pythonhosted.org/packages/f0/87/61a937cf031bf8804a0fa51e417258dcfa132d58cef59a71853cd95f2a3f/drf_channels_oneway_ws-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5a3d11eb92ab0a671832c8e4df305427", "sha256": "fca8159c4d439fc02cda744d868feb7ecad1ff25d75f9bcd70756b9af17c03d6" }, "downloads": -1, "filename": "drf-channels-oneway-ws-0.3.0.tar.gz", "has_sig": false, "md5_digest": "5a3d11eb92ab0a671832c8e4df305427", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6555, "upload_time": "2019-08-16T12:05:23", "url": "https://files.pythonhosted.org/packages/4d/66/da2d420473f8604dc4b3857ef6ead8bbc44a80c45112b401b1a7b9dcc616/drf-channels-oneway-ws-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b35bc29e28bb0f194f9a0531d44834ae", "sha256": "3a6ebaec2e5985a5818b42c55090e0abf38f6f5e575595190d02bf940f7c8b1f" }, "downloads": -1, "filename": "drf_channels_oneway_ws-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b35bc29e28bb0f194f9a0531d44834ae", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 6825, "upload_time": "2019-08-16T12:05:22", "url": "https://files.pythonhosted.org/packages/f0/87/61a937cf031bf8804a0fa51e417258dcfa132d58cef59a71853cd95f2a3f/drf_channels_oneway_ws-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5a3d11eb92ab0a671832c8e4df305427", "sha256": "fca8159c4d439fc02cda744d868feb7ecad1ff25d75f9bcd70756b9af17c03d6" }, "downloads": -1, "filename": "drf-channels-oneway-ws-0.3.0.tar.gz", "has_sig": false, "md5_digest": "5a3d11eb92ab0a671832c8e4df305427", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6555, "upload_time": "2019-08-16T12:05:23", "url": "https://files.pythonhosted.org/packages/4d/66/da2d420473f8604dc4b3857ef6ead8bbc44a80c45112b401b1a7b9dcc616/drf-channels-oneway-ws-0.3.0.tar.gz" } ] }