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.

Files for django-publishable, version 0.1.13
Filename, size File type Python version Upload date Hashes
Filename, size django_publishable-0.1.13-py3-none-any.whl (12.1 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size django-publishable-0.1.13.tar.gz (10.3 kB) File type Source Python version None Upload date Hashes View

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page