{ "info": { "author": "Ilyes Hammadi", "author_email": "hammadiilyesahmed@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.11", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6" ], "description": "# Django Publishable \ud83e\udd84\n\n[![PyPI version](https://badge.fury.io/py/django-publishable.svg)](https://badge.fury.io/py/django-publishable) [![CircleCI](https://circleci.com/gh/Ilyes-Hammadi/django-publishable.svg?style=svg)](https://circleci.com/gh/Ilyes-Hammadi/django-publishable)\n\n## What is Django-Publishable?\n\nDjango library that add to your models the draft/publish features.\n\n## Instalation\n```shell\n$ pip install django-publishable\n```\n\n## Quick start\n\n\n1. Add \"publishable\" to your INSTALLED_APPS setting like this::\n ```python\n\n INSTALLED_APPS = [\n ...\n 'publishable',\n ]\n ```\n2. Run `python manage.py migrate` to create the publishable models.\n3. Try to replicate this with your models:\n ```python\n from django.db import models\n from publishable.models import Publishable, Publisher\n\n # A Publisher is responsible for triggering \n # the publish all drafts that he contains\n class User(Publisher):\n pass\n\n # Overdide the Publishable to implement the logic\n # of broadcast_need_to_published\n class MyPublishable(Publishable):\n class Meta:\n abstract = True\n\n def broadcast_need_to_published(self):\n \"\"\"\n This function will return a Draft instance\n then it's up to you select your Publisher\n and add it to it's draft\n \"\"\"\n draft = super(MyPublishable, self).broadcast_need_to_published()\n chatbot, _ = User.objects.get_or_create(pk=1)\n chatbot.add_draft(draft)\n\n # After setting up your Publishable\n # then inherit from it into the model that you need to receie\n # draft/publish features\n class Article(MyPublishable):\n title = models.CharField(max_length=255)\n content = models.TextField()\n\n comments = models.ManyToManyField('Comment', related_name='comments')\n\n highlighted_comment = models.ForeignKey('Comment', related_name='highlighted_comment', null=True)\n\n\n class Comment(MyPublishable):\n content = models.CharField(max_length=255)\n\n ```\n4. By default now all your model will store changes into the draft\n ```python\n # Add changes and publish one model\n >>> a = Article.objects.create()\n >>> a.title = \"foo\"\n >>> a.publish()\n >>> a.published.title\n foo\n\n # Let's add changes and publish using a publisher\n >>> a.title = \"boo\"\n >>> a.save()\n >>> a.published.title\n foo\n >>> user = User.objects.get(pk=1)\n >>> user.publish()\n\n # You can track the status of the publishing process\n >>> user.publishing_status\n PUBLISHED\n\n ```\n\n## Using the Context Manager\nIn order to keep your code clean and avoid replication of code by doing `article.published` all the time, you can use the `PublishedContextManager`. Every operation that you do inside the `with` will target the published version of the model. But be carful do not do any changes to the `published`, you're only supposed to read data, inserting the data should target the `draft`.\n\n```python\n>>> from publishable.context_managers import PublishedContextManager\n>>> a = Article.objects.create(title=\"foo\")\n>>> a.publish()\n>>> a.title = \"boo\"\n>>> a.save()\n>>> with PublishedContextManager():\n print(a.title)\nfoo\n>>> print(a.title)\nboo\n```\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Ilyes-Hammadi/django-publishable", "keywords": "", "license": "Apache Software License", "maintainer": "", "maintainer_email": "", "name": "django-publishable", "package_url": "https://pypi.org/project/django-publishable/", "platform": "", "project_url": "https://pypi.org/project/django-publishable/", "project_urls": { "Homepage": "https://github.com/Ilyes-Hammadi/django-publishable" }, "release_url": "https://pypi.org/project/django-publishable/0.1.13/", "requires_dist": null, "requires_python": "", "summary": "A simple Django app to add draft/publish capabilities to your models.", "version": "0.1.13" }, "last_serial": 4750427, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "8a8732757511352e5b7afc647afa3e0c", "sha256": "301095595da4a69d6dbee4460535e495beaab170240c3646c4bf6d988621e368" }, "downloads": -1, "filename": "django-publishable-0.1.tar.gz", "has_sig": false, "md5_digest": "8a8732757511352e5b7afc647afa3e0c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8719, "upload_time": "2019-01-22T14:28:04", "url": "https://files.pythonhosted.org/packages/3b/fb/91776ac70298617c17110853a31ac70ee34a1d3e327f7e793d06bb8f1636/django-publishable-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "aa53557ed443035ccda60a499b51e552", "sha256": "b1d490d7c7a06dddb5403c93ad28be86141ee9864a7c54191cc4892e76b85cc8" }, "downloads": -1, "filename": "django-publishable-0.1.1.tar.gz", "has_sig": false, "md5_digest": "aa53557ed443035ccda60a499b51e552", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8708, "upload_time": "2019-01-22T14:47:45", "url": "https://files.pythonhosted.org/packages/dd/4e/a819c613a69e9b34964472143947c4e53e2accc9456f9842d97bffd35255/django-publishable-0.1.1.tar.gz" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "70ec94a187c05ab12ff39a74336e4a76", "sha256": "28dead795eef82cf19638bd808ae8775e3db38c8643660eb7263e98d1401b25d" }, "downloads": -1, "filename": "django_publishable-0.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "70ec94a187c05ab12ff39a74336e4a76", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11387, "upload_time": "2019-01-23T16:12:26", "url": "https://files.pythonhosted.org/packages/68/9d/df9f366a5e486dc253f748bdaf278ab838cccbefd1cb7e7f16a4f13569cf/django_publishable-0.1.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b796361081b2965d3565491de7130cd7", "sha256": "cbc17aabd64caf3b0d6a3b2545542c1e767508cc1959e9174fde97154de07752" }, "downloads": -1, "filename": "django-publishable-0.1.10.tar.gz", "has_sig": false, "md5_digest": "b796361081b2965d3565491de7130cd7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9128, "upload_time": "2019-01-23T16:12:27", "url": "https://files.pythonhosted.org/packages/7a/3c/6eb34f36f46f053e181bf31d1e1383c452845fac79aedfaf3f5b45471c24/django-publishable-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "a5008169aa3812630f7114ed38f593d2", "sha256": "6d1a59f12c8f22e1f1f593e741e42f8b0cb53629cf3d409c7d05c8d70549aae3" }, "downloads": -1, "filename": "django_publishable-0.1.11-py3-none-any.whl", "has_sig": false, "md5_digest": "a5008169aa3812630f7114ed38f593d2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11392, "upload_time": "2019-01-25T11:22:28", "url": "https://files.pythonhosted.org/packages/30/30/1163c578324fb512dd3a3c63bb5678661d5f6b3fc5f43ff69f40f1ff3f01/django_publishable-0.1.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8f60a48435d71e7f3c8042dca3ba4e45", "sha256": "46493d490c6b40a8260375440a634f807ccb8ce80ef5398c2809782535ef537b" }, "downloads": -1, "filename": "django-publishable-0.1.11.tar.gz", "has_sig": false, "md5_digest": "8f60a48435d71e7f3c8042dca3ba4e45", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9113, "upload_time": "2019-01-25T11:22:29", "url": "https://files.pythonhosted.org/packages/c5/71/6ff48b756e3667601b01870af7a1669e5a01076fe4f0e2bb25cab8deb90c/django-publishable-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "90ebcd983d0b6bea144fb1dbfda639a7", "sha256": "0904f6c3dff22f0c712e73656f9d561b3f5482dd9c324308c50ead6f05ce0d82" }, "downloads": -1, "filename": "django_publishable-0.1.12-py3-none-any.whl", "has_sig": false, "md5_digest": "90ebcd983d0b6bea144fb1dbfda639a7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11653, "upload_time": "2019-01-25T15:53:28", "url": "https://files.pythonhosted.org/packages/91/fa/ada7b3c9c0256191428c8ea042940c6335eaabe516f05c286a7a949ea57f/django_publishable-0.1.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b85ef6d2ccf93920e474c18975d57b4c", "sha256": "3b5f0e98724925c977f0bd0f5429eca3da7cbf032ab6f244371f14030ece0d15" }, "downloads": -1, "filename": "django-publishable-0.1.12.tar.gz", "has_sig": false, "md5_digest": "b85ef6d2ccf93920e474c18975d57b4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9393, "upload_time": "2019-01-25T15:53:29", "url": "https://files.pythonhosted.org/packages/33/9a/946125346591052470808ad111250adf57cca76b0948e3d888c6273ee94c/django-publishable-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "9152fbfd9d42c3588a0ec8c9cc2f7790", "sha256": "9d00c211ba3b1e71ccf9604cdfc74e9494a18ff60bbf56baa8fd94ec6bb3c999" }, "downloads": -1, "filename": "django_publishable-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "9152fbfd9d42c3588a0ec8c9cc2f7790", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12141, "upload_time": "2019-01-28T14:39:28", "url": "https://files.pythonhosted.org/packages/72/ae/4a5770ae98faa8c146e024c5179a533476c2450e402d1b7abee86aa5b58b/django_publishable-0.1.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "25d20519a77a23a12faeca7c330beb16", "sha256": "69e5dd50717da8b0e5d9fd279c024d244c4685b338c38b9f921c86d66a50bb67" }, "downloads": -1, "filename": "django-publishable-0.1.13.tar.gz", "has_sig": false, "md5_digest": "25d20519a77a23a12faeca7c330beb16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10279, "upload_time": "2019-01-28T14:39:30", "url": "https://files.pythonhosted.org/packages/58/ae/8176859e231a1ffe4d785d8718de143a268806ff9edbd57b057d4a4fd9f4/django-publishable-0.1.13.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "3c6014c8ebcf034855ebe048aeda3121", "sha256": "1cadd39b412bce25d4ea067bfb1a904736a3e6857c74fe1726830af1dc3bf0e0" }, "downloads": -1, "filename": "django_publishable-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "3c6014c8ebcf034855ebe048aeda3121", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11059, "upload_time": "2019-01-22T15:12:05", "url": "https://files.pythonhosted.org/packages/25/0e/16508c90566e2e5cc189ee84b4fa755e0a066d079d90d49496bfc74fb32e/django_publishable-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5c060517823c349c726e8d8910b2db4", "sha256": "dd97eaefce48cd91cd3caba33ed1d7b769a49f59aea8a0bef5d4de41ac013336" }, "downloads": -1, "filename": "django-publishable-0.1.2.tar.gz", "has_sig": false, "md5_digest": "b5c060517823c349c726e8d8910b2db4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8711, "upload_time": "2019-01-22T14:48:35", "url": "https://files.pythonhosted.org/packages/31/0f/158914c19ad10ce6ab987c1165afd3526d637adec11cf574825c84fea462/django-publishable-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "b3e01c982e940be3162910bc51a01b86", "sha256": "5b215629253e142c503e68307c5c820a02715dac0f26d52a3d257d6f552da4b8" }, "downloads": -1, "filename": "django_publishable-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "b3e01c982e940be3162910bc51a01b86", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11061, "upload_time": "2019-01-22T15:18:00", "url": "https://files.pythonhosted.org/packages/bc/a6/7185d4faefc2b8a0d6f02c9db0e4d11830163e6a831fc88bdef87d0b0702/django_publishable-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5f29f9e10f836eb284a5dadcda491809", "sha256": "e75f2eb166a91f824986b2b4406695d86f8ab60ca47ad77af4fc2dcb5a08f00f" }, "downloads": -1, "filename": "django-publishable-0.1.3.tar.gz", "has_sig": false, "md5_digest": "5f29f9e10f836eb284a5dadcda491809", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8921, "upload_time": "2019-01-22T15:18:01", "url": "https://files.pythonhosted.org/packages/91/be/ddbe3e3f38af13c8b63ac2672b46163f035e17576d2960cf1679a19a11af/django-publishable-0.1.3.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "d3d20da87f3e5eda1a53661cb523a58b", "sha256": "2c0ce39264156dd4b9c5ed1764cb301b8b625026daedbc3d3359db543fe0aa1b" }, "downloads": -1, "filename": "django_publishable-0.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "d3d20da87f3e5eda1a53661cb523a58b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11313, "upload_time": "2019-01-22T15:42:39", "url": "https://files.pythonhosted.org/packages/20/a3/d293464fd66af7e845d201ee4c0f4681207b5e3d65cc8af803d62c9b82f6/django_publishable-0.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3b66b684e835f3b4a806992bb33b27cc", "sha256": "b65c610f3471a61086a21f667145bc92ced36915040df74b56247796dd8f84cc" }, "downloads": -1, "filename": "django-publishable-0.1.6.tar.gz", "has_sig": false, "md5_digest": "3b66b684e835f3b4a806992bb33b27cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9026, "upload_time": "2019-01-22T15:42:41", "url": "https://files.pythonhosted.org/packages/75/c1/bc733a7947fe3be85251cc475bfa2b8c1bb24354e345eb72b39cd1b44227/django-publishable-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "eb525079e12bf38a9d289a74b3e71110", "sha256": "eb6482c7ee2aff2db110c515bdfdecbec1a9dc5b58e8f31d47b449889fe7978c" }, "downloads": -1, "filename": "django_publishable-0.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "eb525079e12bf38a9d289a74b3e71110", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11238, "upload_time": "2019-01-22T16:02:56", "url": "https://files.pythonhosted.org/packages/50/65/89a5031350e94f2bd8e33f49ed6e50cfe597c8993e3b47951d0401319642/django_publishable-0.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bdbad46af3d4412dde489dec5a7c35cb", "sha256": "c24407a8c67b880675815ac6f4b4038406c4e00147068b0617e86c82b2a03ab7" }, "downloads": -1, "filename": "django-publishable-0.1.7.tar.gz", "has_sig": false, "md5_digest": "bdbad46af3d4412dde489dec5a7c35cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8919, "upload_time": "2019-01-22T16:02:57", "url": "https://files.pythonhosted.org/packages/43/4d/409951b360d5453003fc62a01e92b39c0b1dd1bcdb7cb497b88972c98ddb/django-publishable-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "09e649c2fc07fb7234ec252d9e8f0c26", "sha256": "229b8a1434ae2876e1b80ddb4ccb9ef9c966c47153ba50e9054f18b19e521f66" }, "downloads": -1, "filename": "django_publishable-0.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "09e649c2fc07fb7234ec252d9e8f0c26", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11236, "upload_time": "2019-01-22T16:10:52", "url": "https://files.pythonhosted.org/packages/10/6a/9cabd44790138a6700fb0d915d7bb7ab799496c1417123efbce1565f6438/django_publishable-0.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8c7c8b8e44ad545ff0d8a524accf7e77", "sha256": "44f29c616df7e3a7b9ac9c5be77530832321fd383fda17e9ced4c9012eeaffbf" }, "downloads": -1, "filename": "django-publishable-0.1.8.tar.gz", "has_sig": false, "md5_digest": "8c7c8b8e44ad545ff0d8a524accf7e77", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8909, "upload_time": "2019-01-22T16:10:53", "url": "https://files.pythonhosted.org/packages/e9/92/af8e9214e1433eda38907aa64487079ee2127897d3677733bd37da904315/django-publishable-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "6d0d1c91558f665f15862c42f0a196f9", "sha256": "c1fbc2a0ae26a43fb45e2b6c3295aae665710234e5903d341d42d9e41ce4a0b4" }, "downloads": -1, "filename": "django_publishable-0.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "6d0d1c91558f665f15862c42f0a196f9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11359, "upload_time": "2019-01-22T16:37:01", "url": "https://files.pythonhosted.org/packages/36/1b/c3a3606dfdc9f8cb85f22074146119b0cf884977bf84e1e1f88b5b3af5ca/django_publishable-0.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "28f3d3deed83c7c7ea6d9c89377526e6", "sha256": "43a01190b803df6d925d66c937bc77bd2e95a0321c79b7da0d567e156d05680d" }, "downloads": -1, "filename": "django-publishable-0.1.9.tar.gz", "has_sig": false, "md5_digest": "28f3d3deed83c7c7ea6d9c89377526e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9142, "upload_time": "2019-01-22T16:37:02", "url": "https://files.pythonhosted.org/packages/72/ce/f5855858f2924e6ded7c052eeaa1ec8ab663e1e2a905761fec130683db2b/django-publishable-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9152fbfd9d42c3588a0ec8c9cc2f7790", "sha256": "9d00c211ba3b1e71ccf9604cdfc74e9494a18ff60bbf56baa8fd94ec6bb3c999" }, "downloads": -1, "filename": "django_publishable-0.1.13-py3-none-any.whl", "has_sig": false, "md5_digest": "9152fbfd9d42c3588a0ec8c9cc2f7790", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12141, "upload_time": "2019-01-28T14:39:28", "url": "https://files.pythonhosted.org/packages/72/ae/4a5770ae98faa8c146e024c5179a533476c2450e402d1b7abee86aa5b58b/django_publishable-0.1.13-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "25d20519a77a23a12faeca7c330beb16", "sha256": "69e5dd50717da8b0e5d9fd279c024d244c4685b338c38b9f921c86d66a50bb67" }, "downloads": -1, "filename": "django-publishable-0.1.13.tar.gz", "has_sig": false, "md5_digest": "25d20519a77a23a12faeca7c330beb16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10279, "upload_time": "2019-01-28T14:39:30", "url": "https://files.pythonhosted.org/packages/58/ae/8176859e231a1ffe4d785d8718de143a268806ff9edbd57b057d4a4fd9f4/django-publishable-0.1.13.tar.gz" } ] }