A simple Django app to add draft/publish capabilities to your models.
Project description
# Django Publishable 🦄
[](https://badge.fury.io/py/django-publishable) [](https://circleci.com/gh/Ilyes-Hammadi/django-publishable)
## What is Django-Publishable?
Django library that add to your models the draft/publish features.
## Instalation
```shell
$ pip install django-publishable
```
## Quick start
1. Add "publishable" to your INSTALLED_APPS setting like this::
```python
INSTALLED_APPS = [
...
'publishable',
]
```
2. Run `python manage.py migrate` to create the publishable models.
3. Try to replicate this with your models:
```python
from django.db import models
from publishable.models import Publishable, Publisher
# A Publisher is responsible for triggering
# the publish all drafts that he contains
class User(Publisher):
pass
# Overdide the Publishable to implement the logic
# of broadcast_need_to_published
class MyPublishable(Publishable):
class Meta:
abstract = True
def broadcast_need_to_published(self):
"""
This function will return a Draft instance
then it's up to you select your Publisher
and add it to it's draft
"""
draft = super(MyPublishable, self).broadcast_need_to_published()
chatbot, _ = User.objects.get_or_create(pk=1)
chatbot.add_draft(draft)
# After setting up your Publishable
# then inherit from it into the model that you need to receie
# draft/publish features
class Article(MyPublishable):
title = models.CharField(max_length=255)
content = models.TextField()
comments = models.ManyToManyField('Comment', related_name='comments')
highlighted_comment = models.ForeignKey('Comment', related_name='highlighted_comment', null=True)
class Comment(MyPublishable):
content = models.CharField(max_length=255)
```
4. By default now all your model will store changes into the draft
```python
# Add changes and publish one model
>>> a = Article.objects.create()
>>> a.title = "foo"
>>> a.publish()
>>> a.published.title
foo
# Let's add changes and publish using a publisher
>>> a.title = "boo"
>>> a.save()
>>> a.published.title
foo
>>> user = User.objects.get(pk=1)
>>> user.publish()
# You can track the status of the publishing process
>>> user.publishing_status
PUBLISHED
```
## Using the Context Manager
In 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`.
```python
>>> from publishable.context_managers import PublishedContextManager
>>> a = Article.objects.create(title="foo")
>>> a.publish()
>>> a.title = "boo"
>>> a.save()
>>> with PublishedContextManager():
print(a.title)
foo
>>> print(a.title)
boo
```
[](https://badge.fury.io/py/django-publishable) [](https://circleci.com/gh/Ilyes-Hammadi/django-publishable)
## What is Django-Publishable?
Django library that add to your models the draft/publish features.
## Instalation
```shell
$ pip install django-publishable
```
## Quick start
1. Add "publishable" to your INSTALLED_APPS setting like this::
```python
INSTALLED_APPS = [
...
'publishable',
]
```
2. Run `python manage.py migrate` to create the publishable models.
3. Try to replicate this with your models:
```python
from django.db import models
from publishable.models import Publishable, Publisher
# A Publisher is responsible for triggering
# the publish all drafts that he contains
class User(Publisher):
pass
# Overdide the Publishable to implement the logic
# of broadcast_need_to_published
class MyPublishable(Publishable):
class Meta:
abstract = True
def broadcast_need_to_published(self):
"""
This function will return a Draft instance
then it's up to you select your Publisher
and add it to it's draft
"""
draft = super(MyPublishable, self).broadcast_need_to_published()
chatbot, _ = User.objects.get_or_create(pk=1)
chatbot.add_draft(draft)
# After setting up your Publishable
# then inherit from it into the model that you need to receie
# draft/publish features
class Article(MyPublishable):
title = models.CharField(max_length=255)
content = models.TextField()
comments = models.ManyToManyField('Comment', related_name='comments')
highlighted_comment = models.ForeignKey('Comment', related_name='highlighted_comment', null=True)
class Comment(MyPublishable):
content = models.CharField(max_length=255)
```
4. By default now all your model will store changes into the draft
```python
# Add changes and publish one model
>>> a = Article.objects.create()
>>> a.title = "foo"
>>> a.publish()
>>> a.published.title
foo
# Let's add changes and publish using a publisher
>>> a.title = "boo"
>>> a.save()
>>> a.published.title
foo
>>> user = User.objects.get(pk=1)
>>> user.publish()
# You can track the status of the publishing process
>>> user.publishing_status
PUBLISHED
```
## Using the Context Manager
In 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`.
```python
>>> from publishable.context_managers import PublishedContextManager
>>> a = Article.objects.create(title="foo")
>>> a.publish()
>>> a.title = "boo"
>>> a.save()
>>> with PublishedContextManager():
print(a.title)
foo
>>> print(a.title)
boo
```
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
django-publishable-0.1.13.tar.gz
(10.3 kB
view hashes)
Built Distribution
Close
Hashes for django-publishable-0.1.13.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 69e5dd50717da8b0e5d9fd279c024d244c4685b338c38b9f921c86d66a50bb67 |
|
MD5 | 25d20519a77a23a12faeca7c330beb16 |
|
BLAKE2b-256 | 58ae8176859e231a1ffe4d785d8718de143a268806ff9edbd57b057d4a4fd9f4 |
Close
Hashes for django_publishable-0.1.13-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9d00c211ba3b1e71ccf9604cdfc74e9494a18ff60bbf56baa8fd94ec6bb3c999 |
|
MD5 | 9152fbfd9d42c3588a0ec8c9cc2f7790 |
|
BLAKE2b-256 | 72ae4a5770ae98faa8c146e024c5179a533476c2450e402d1b7abee86aa5b58b |