Skip to main content

A simple Django app to add draft/publish capabilities to your models.

Project description

# Django Publishable 🦄

[![PyPI version](]( [![CircleCI](](

## What is Django-Publishable?

Django library that add to your models the draft/publish features.

## Instalation
$ pip install django-publishable

## Quick start

1. Add "publishable" to your INSTALLED_APPS setting like this::

2. Run `python migrate` to create the publishable models.
3. Try to replicate this with your models:
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):

# 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)

# 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
# Add changes and publish one model
>>> a = Article.objects.create()
>>> a.title = "foo"
>>> a.publish()
>>> a.published.title

# Let's add changes and publish using a publisher
>>> a.title = "boo"
>>> a.published.title
>>> user = User.objects.get(pk=1)
>>> user.publish()

# You can track the status of the publishing process
>>> user.publishing_status


## 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`.

>>> from publishable.context_managers import PublishedContextManager
>>> a = Article.objects.create(title="foo")
>>> a.publish()
>>> a.title = "boo"
>>> with PublishedContextManager():
>>> print(a.title)

Project details

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)

Uploaded source

Built Distribution

django_publishable-0.1.13-py3-none-any.whl (12.1 kB view hashes)

Uploaded py3

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Fastly Fastly CDN Google Google Object Storage and Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page