django-pubtools is a helper library for creating publishable django
models.

|Circle CI| |codecov| |Latest Version|

Overview
--------

Extend the ``AbstractPublishableModel`` class to create a publishable
model class.

-  Publishable content can be in either draft, preview, or published
   status.
-  Draft content may be previewed on the site by a logged-in staff
   member
-  Preview content may be previewed publicly, via a special url

Installation
------------

::

    pip install django-pubtools

Example implementation
----------------------

models.py:

.. code:: python

    from django.db import models
    import pubtools.models

    class Article(pubtools.models.AbstractPublishableModel):
        title = models.CharField(max_length=100)

views.py:

.. code:: python

    from django.http import HttpResponse
    from .models import Article

    def article(request, id):
        # pass the request to enable staff preview
        articles = Article.objects.published(request)
        article = articles.get(id=id)
        return HttpResponse(article.title)

admin.py:

.. code:: python

    from django.contrib import admin
    from baseclasses.admin import PublishableModelAdminMixin

    from .models import Article

    @admin.register(Article)
    class DisciplineAdmin(PublishableModelAdminMixin, admin.ModelAdmin):
        list_display = ['title']

Reference
---------

``pubtools.models.AbstractPublishableModel``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Model fields
''''''''''''

-  ``created`` (datetime, set on creation)
-  ``last_updated`` (datetime, updated on save)
-  ``pub_date`` (date)
-  ``pub_status`` (one of draft, review or published)

Model methods
'''''''''''''

-  ``published`` (property) return True if the instance is published
-  ``get_prev_published(qs=None, loop=False)`` get previous published
   instance
-  ``get_next_published(qs=None, loop=False)`` get next published
   instance

``pubtools.models.AbstractPublishableModel``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Manager/queryset methods
''''''''''''''''''''''''

-  ``published(self, request=None)`` If request is passed, and a preview
   status flag is in request.GET, then check if the user is a staff
   member, and return objects with the requested status if so.
   Otherwise, return only published objects.

``pubtools.admin.PublishableModelAdminMixin``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-  Overrides ``view_on_site`` to add a flag to urls for draft/preview
   content.
-  Adds a "Publish selected" action to the admin

.. |Circle CI| image:: https://circleci.com/gh/gregplaysguitar/django-pubtools.svg?style=svg
   :target: https://circleci.com/gh/gregplaysguitar/django-pubtools
.. |codecov| image:: https://codecov.io/gh/gregplaysguitar/django-pubtools/branch/master/graph/badge.svg
   :target: https://codecov.io/gh/gregplaysguitar/django-pubtools
.. |Latest Version| image:: https://img.shields.io/pypi/v/django-pubtools.svg?style=flat
   :target: https://pypi.python.org/pypi/django-pubtools/
