django-ya-model-publisher 0.7.0
Publisher workflow for django models and Django CMS pages.
License: BSD
Requires Python: >=3.5
Keywords: publisher django cms parler workflow model-publisher

====================================
Django (yet another) Model Publisher
====================================

Publisher workflow for django models and Django CMS pages.

This is a fork of `andersinno/django-model-publisher-ai <https://github.com/andersinno/django-model-publisher-ai>`_ which is a fork of the origin `jp74/django-model-publisher <https://github.com/jp74/django-model-publisher>`_.

+-----------------------------------+--------------------------------------------------------+
| |Build Status on travis-ci.org|   | `travis-ci.org/wearehoods/django-ya-model-publisher`_  |
+-----------------------------------+--------------------------------------------------------+
| |Coverage Status on codecov.io|   | `codecov.io/gh/wearehoods/django-ya-model-publisher`_  |
+-----------------------------------+--------------------------------------------------------+
| |Coverage Status on coveralls.io| | `coveralls.io/r/wearehoods/django-ya-model-publisher`_ |
+-----------------------------------+--------------------------------------------------------+

.. |Build Status on travis-ci.org| image:: https://travis-ci.org/wearehoods/django-ya-model-publisher.svg
.. _travis-ci.org/wearehoods/django-ya-model-publisher: https://travis-ci.org/wearehoods/django-ya-model-publisher/
.. |Coverage Status on codecov.io| image:: https://codecov.io/gh/wearehoods/django-ya-model-publisher/branch/develop/graph/badge.svg
.. _codecov.io/gh/wearehoods/django-ya-model-publisher: https://codecov.io/gh/wearehoods/django-ya-model-publisher
.. |Coverage Status on coveralls.io| image:: https://coveralls.io/repos/wearehoods/django-ya-model-publisher/badge.svg
.. _coveralls.io/r/wearehoods/django-ya-model-publisher: https://coveralls.io/r/wearehoods/django-ya-model-publisher

--------
Features
--------

* Django CMS page support.

* Add request/reject buttons in Django CMS toolbar.

* Django CMS placeholders support.

* Hvad/Parler support.

* Restrict user access to publish functions with user permissions.

---------
base info
---------

We have these three user types:

* A user with only a few rights (we call it **'reporter'**)

* A user with more rights (We call it **'editor'**)

* The superuser with all rights

The user case is following:

* **'reporter'**:

    * can only change draft content

    * can't change public content

    * can't delete publisher model entries or CMS pages.

    * can send a *(un-)publish request* to the 'editor' with a text node.

* **'editor'**:

    * can response open publishing request from 'reporter'.

    * can change drafts and public content, but only if there is no pending request.

    * can delete publisher model entries or CMS pages.

    * can't delete/manipulate publisher state model entries.

-----------
permissions
-----------

Permissions for **'reporter'** who can only create *(un-)publish requests*:

::

    ...
    [ ] cms.publish_page
    ...
    [*] cms.add_page
    [*] cms.change_page
    [ ] cms.delete_page
    ...
    [ ] publisher.add_publisherstatemodel
    [*] publisher.change_publisherstatemodel
    [ ] publisher.delete_publisherstatemodel
    ...
    [ ] <app_name>.can_publish_<model_name>
    ...
    [*] <app_name>.add_<model_name>
    [*] <app_name>.change_<model_name>
    [ ] <app_name>.delete_<model_name>
    ...

Permissions for **'editor'** who can *accept/reject (un-)publish requests*:

::

    ...
    [*] cms.publish_page
    ...
    [*] cms.add_page
    [*] cms.change_page
    [*] cms.delete_page
    ...
    [ ] publisher.add_publisherstatemodel
    [*] publisher.change_publisherstatemodel
    [ ] publisher.delete_publisherstatemodel
    ...
    [*] <app_name>.can_publish_<model_name>
    ...
    [*] <app_name>.add_<model_name>
    [*] <app_name>.change_<model_name>
    [*] <app_name>.delete_<model_name>
    ...

**Important**: To prevent a privilege escalation, both users must **not** have access to these models:

* django.contrib.auth.models.Permission

* django.contrib.auth.models.Group

* cms.models.PagePermission

-----------
Test users:
-----------

See user permission tests in:

* `publisher_tests.test_basics.PermissionTestCase <https://github.com/wearehoods/django-ya-model-publisher/blob/master/publisher_tests/test_basics.py>`_

------------------------------
Primary key type compatibility
------------------------------

The ``publisher.models.PublisherStateModel`` used a ``PositiveIntegerField`` for the ``GenericForeignKey`` so it can only be used for models with a integer primary keys!
See also: `https://docs.djangoproject.com/en/1.11/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey <https://docs.djangoproject.com/en/1.11/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey>`_

--------------------
Django compatibility
--------------------

+---------------------------+------------+----------------------+--------------------+
| django-ya-model-publisher | django cms | django version       | python             |
+===========================+============+======================+====================+
| >=v0.6.x                  | 3.4.x      | 1.11                 | 3.5, 3.6           |
+---------------------------+------------+----------------------+--------------------+
| >=v0.5.x                  | 3.4.x      | 1.8, 1.9, 1.10, 1.11 | 3.5, 3.6           |
+---------------------------+------------+----------------------+--------------------+
| v0.4.x                    | 3.4.x      | 1.8, 1.9, 1.10, 1.11 | 2.7, 3.4, 3.5, 3.6 |
+---------------------------+------------+----------------------+--------------------+

Note: See travis/tox config files for current test matrix

Currently Django CMS v3.5 is not supported, yet.
It's on the TODO, see: `issues #10 <https://github.com/wearehoods/django-ya-model-publisher/issues/10>`_

---------
run tests
---------

run tests via *py.test* with current python/environment:

::

    $ make test
    or
    $ ./setup.py test
    or
    $ python tests/manage.py test myapp

run test via *tox* e.g.:

::

    $ make tox
    or
    $ ./setup.py tox
    or
    $ tox

run test project
================

You can run the test environment by:

::

    $ ./run_test_project_dev_server.sh

or:

::

    $ ./publisher_test_project/manage.py run_test_project_dev_server

The following steps will be executed:

* Create django users if not exists:

    * A django **'superuser'**

    * The user **editor**: He can accept/reject un-/publish requests

    * The user **reporter**: He can create un-/publish requests

    * note: Both users will used the same password as the 'superuser' !

* run migration

* insert test fixtures (Create Django CMS pages)

* collect static files

* run the django development server on localhost

You can pass arguments to the helper script, e.g.:

::

    $ ./run_test_project_dev_server.sh --help
    ...
    usage: manage.py run_test_project_dev_server [-h] [--version] [-v {0,1,2,3}]
                                                 [--settings SETTINGS]
                                                 [--pythonpath PYTHONPATH]
                                                 [--traceback] [--no-color]
                                                 [--ipv6] [--nothreading]
                                                 [--noreload] [--nostatic]
                                                 [--insecure]
                                                 [addrport]
    ...

To 'reset' the test fixtures, run this:

::

    $ ./publisher_test_project/manage.py create_test_data --fresh

For a complete fresh database, just remove the sqlite file, e.g.:

::

    $ rm publisher_test_project/publisher_test_database.sqlite3

------------------------------
Backwards-incompatible changes
------------------------------

v0.7.0
======

``PublisherCmsViewMixin, PublisherCmsDetailView, PublisherCmsListView``

moved from:

``publisher.views``

to:

``publisher_cms.views``

v0.6.0
======

The permission names changed! Please update your django user permissions, too.

These permissions are removed:

* direct_publisher

* ask_publisher_request

* reply_publisher_request

Please read the information above.

-------
history
-------

* *dev* `compare v0.7.0...master <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.7.0...master>`_

* v0.7.0 - 22.02.2018 - `compare v0.6.9...v0.7.0 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.9...v0.7.0>`_ 

    * Backwards-incompatible changes (see above)

    * Remove support for Django 1.8

    * NEW: Add publish links to Django CMS toolbar in ``PublisherCmsDetailView``

    * Change ``PublisherPageToolbar`` link text and add "page" to them (to differentiate them better from ``PublisherCmsDetailView`` links)

* v0.6.9 - 01.02.2018 - `compare v0.6.8...v0.6.9 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.8...v0.6.9>`_ 

    * Bugfix ``AttributeError: 'PublisherPageToolbar' object has no attribute 'current_request'`` if superuser edit a cms page

* v0.6.8 - 01.02.2018 - `compare v0.6.7...v0.6.8 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.7...v0.6.8>`_ 

    * Fix `#9 Redirect after "request publishing" <https://github.com/wearehoods/django-ya-model-publisher/issues/9>`_

    * Add reply/history Links in Django CMS Toolbar (specially for page with pending requests)

* v0.6.7 - 31.01.2018 - `compare v0.6.6...v0.6.7 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.6...v0.6.7>`_ 

    * NEW: 'History' view in admin (e.g.: see status/history of closed request and status for users that can only create requests)

    * No 404 when "reply" closed requests or deleted instance.

* v0.6.6 - 30.01.2018 - `compare v0.6.5...v0.6.6 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.5...v0.6.6>`_ 

    * Bugfix: redirect after "Request publishing" can result in a 404, see: `issues #9 <https://github.com/wearehoods/django-ya-model-publisher/issues/9>`_

* v0.6.5 - 30.01.2018 - `compare v0.6.4...v0.6.5 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.4...v0.6.5>`_ 

    * Bugfix: Missing "Request publishing" toobar link on new created pages

    * Add username list on test pages

* v0.6.4 - 29.01.2018 - `compare v0.6.3...v0.6.4 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.3...v0.6.4>`_ 

    * Hide PublisherStateModel admin actions for all non-superusers

* v0.6.3 - 26.01.2018 - `compare v0.6.2...v0.6.3 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.2...v0.6.3>`_ 

    * Security Fix: User without 'can_publish' permission can accept/reject requests.

    * Hide 'change' PublisherStateModel admin view for all non-superusers

    * Disable 'add' PublisherStateModel admin view for all users

* v0.6.2 - 02.01.2018 - `compare v0.6.1...v0.6.2 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.1...v0.6.2>`_ 

    * Handle publishes states with deletes instance: Add a admin view to close the request.

    * Bugfix: deny editing pending request objects

    * Create messages after (un-)/publish request created.

* v0.6.1 - 28.12.2017 - `compare v0.6.0...v0.6.1 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.6.0...v0.6.1>`_ 

    * remove own "unique_together": Add ``"publisher_is_draft"`` to your own "unique_together" tuple

    * remove out dated manage command "update_permissions" (can be found in `django-tools <https://github.com/jedie/django-tools>`_)

* v0.6.0 - 27.12.2017 - `compare v0.5.1...v0.6.0 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.5.1...v0.6.0>`_ 

    * refactor permissions and publisher workflow

    * NEW: ``publisher.views.PublisherCmsViewMixin``

    * NEW: ``publisher.admin.VisibilityMixin``

    * bugfix django v1.11 compatibility

    * Expand tests with ``publisher_test_project.publisher_list_app``

* v0.5.1 - 20.12.2017 - `compare v0.5.0...v0.5.1 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.5.0...v0.5.1>`_ 

    * fix python package (add missing parts)

    * change travis/tox/pytest configuration

    * minor code update

* v0.5.0 - 19.12.2017 - `compare v0.4.1...v0.5.0 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.4.1...v0.5.0>`_ 

    * Skip official support for python v2.7 and v3.4 (remove from text matrix)

    * Implement "request/reject/accept publishing" workflow with a shot messages and logging

    * Add "request/reject/accept publishing" buttons to Django CMS toolbar for cms pages.

* v0.4.1 - 14.11.2017 - `compare v0.4.0.dev1...v0.4.1 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.4.0.dev1...v0.4.1>`_ 

    * Refactor test run setup

    * bugfix project name

* v0.4.0.dev1 - 14.11.2017 - `compare v0.3.1...v0.4.0.dev1 <https://github.com/wearehoods/django-ya-model-publisher/compare/v0.3.1...v0.4.0.dev1>`_ 

    * Just create the fork and apply all pull requests from `andersinno/django-model-publisher-ai/pull/14 <https://github.com/andersinno/django-model-publisher-ai/pull/14>`_

-----
links
-----

+---------------+-----------------------------------------------------------+
| Homepage      | `http://github.com/wearehoods/django-ya-model-publisher`_ |
+---------------+-----------------------------------------------------------+
| PyPi.org      | `https://pypi.org/project/django-ya-model-publisher/`_    |
+---------------+-----------------------------------------------------------+
| PyPi (legacy) | `http://pypi.python.org/pypi/django-ya-model-publisher/`_ |
+---------------+-----------------------------------------------------------+

.. _http://github.com/wearehoods/django-ya-model-publisher: http://github.com/wearehoods/django-ya-model-publisher
.. _https://pypi.org/project/django-ya-model-publisher/: https://pypi.org/project/django-ya-model-publisher/
.. _http://pypi.python.org/pypi/django-ya-model-publisher/: http://pypi.python.org/pypi/django-ya-model-publisher/

--------
donation
--------

* `paypal.me/JensDiemer <https://www.paypal.me/JensDiemer>`_

* `Flattr This! <https://flattr.com/submit/auto?uid=jedie&url=https%3A%2F%2Fgithub.com%2Fwearehoods%2Fdjango-ya-model-publisher%2F>`_

* Send `Bitcoins <http://www.bitcoin.org/>`_ to `1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F <https://blockexplorer.com/address/1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F>`_