A simple Django app to add draft/publish capabilities to your models.
Project description
# Django-Publishable
Django library that add to your models the draft/publish features.
## 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
```
Django library that add to your models the draft/publish features.
## 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
Built Distribution
Close
Hashes for django_publishable-0.1.7-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | eb6482c7ee2aff2db110c515bdfdecbec1a9dc5b58e8f31d47b449889fe7978c |
|
MD5 | eb525079e12bf38a9d289a74b3e71110 |
|
BLAKE2b-256 | 506589a5031350e94f2bd8e33f49ed6e50cfe597c8993e3b47951d0401319642 |