跳转到主要内容

Django的项目发布工作流程。

项目描述

django-werewolf

描述

为Django提供项目发布工作流程(完全集成到Django管理界面)。

先决条件

  • Django 1.5.+

  • Python 2.6.8+, 2.7.+, 3.3.+

安装

  1. 将django-werewolf安装到您的虚拟环境

    $ pip install django-werewolf

  2. werewolf添加到您的INSTALLED_APPS

这就完成了。有关更多信息,请参阅使用和示例部分。

使用和示例

这一切都关于工作流程中的项目发布。我们有各种中间状态(工作正在进行中)和一个最终状态,表示项目实际上已发布。一些用户应该能够将项目状态设置为已发布,而另一些则不能。此应用程序允许您(并提供了一个带有预先配置的Django环境的良好工作示例)以最小的努力编写自定义工作流程来发布您的项目。

要查看一个完整的django-werewolf应用程序示例,请参阅 (https://github.com/barseghyanartur/django-werewolf/tree/stable/example) 并阅读 news 应用程序的 readme.rst 文件。

虚构应用程序概念

存在三个用户组。他们都应该能够登录到Django管理界面。

  • 撰稿人

  • 编辑

  • 主编

简而言之,我们的虚构应用程序将按以下方式工作。

  • 主编创建一个新闻条目并选择一个撰稿人和一个编辑。然后,新的新闻条目状态设置为 new

  • 一旦创建了一个状态为 new 的新闻条目,分配的撰稿人和编辑都会收到一封电子邮件通知,告知他们已分配了新闻条目。

  • 撰稿人应填写分配的新闻条目内容,一旦新闻条目准备就绪,将其状态更改为 ready

  • 分配的编辑会收到一封电子邮件通知,告知新闻条目状态已更改为 ready

  • 分配的编辑应检查状态为 ready 的新闻条目,如果可接受,则将新闻条目状态更改为 reviewed

  • 一旦新闻条目状态被设置为 reviewed,分配的撰稿人将无法在Django管理界面中访问它。

  • 分配的主编会收到一封电子邮件通知,告知新闻条目状态已更改为 reviewed

  • 分配的主编应检查状态为 reviewed 的新闻条目,如果可接受,则将新闻条目状态更改为 published

  • 一旦新闻条目状态被设置为 published,分配的编辑将无法在Django管理界面中访问它。

  • 一旦新闻条目状态被更改为 published,系统中的所有主编以及分配的撰稿人和编辑都会收到一封电子邮件通知,告知新闻条目已发布。

演示

为了能够快速评估django-werewolf,已创建一个演示应用程序(带有快速安装程序)(仅限Debian)。按照以下说明,在一分钟内运行演示。

获取最新的 django-werewolf-example-app-install.sh

$ wget https://raw.github.com/barseghyanartur/django-werewolf/stable/django-werewolf-example-app-install.sh

创建一个新虚拟环境或切换到现有的虚拟环境,将执行权限赋予安装程序,并运行 django-werewolf-example-app-install.sh

$ chmod +x django-werewolf-example-app-install.sh

$ ./django-werewolf-example-app-install.sh

转到后端并测试应用程序。

  • URL: http://127.0.0.1:8001/admin/news/newsitem/

  • 管理员用户名: admin

  • 管理员密码: test

  • 主编用户名: chief_editor

  • 主编密码: test

  • 编辑用户名: editor

  • 编辑密码: test

  • 撰稿人用户名: writer

  • 撰稿人密码: test

现在,让我们一步一步地审查我们的虚构示例应用程序。

settings.py

>>> # Workflow statuses; order is preserved.
>>> WEREWOLF_STATUS_CHOICES = (
>>>     ('new', gettext('New')), # New - this is how it's assigned to a writer.
>>>     ('draft', gettext('Draft')), # Draft - this is how the writer works on it.
>>>     ('ready', gettext('Ready')), # Ready to be reviewed by editor.
>>>     ('reviewed', gettext('Reviewed')), # Reviewed by editor (means positive
>>>                                        # and ready to be published).
>>>     ('published', gettext('Published')), # Published.
>>> )
>>>
>>> # Published status.
>>> WEREWOLF_STATUS_PUBLISHED = 'published'
>>>
>>> # When set to True, django-reversion is used.
>>> WEREWOLF_USE_DJANGO_REVERSION = True

news/models.py

以下是一个基本的新闻条目模型示例。我们有主编,他们可以完全访问新闻条目,我们有编辑,他们拥有较少的权限,以及撰稿人,他们拥有非常少的权限。主编创建文章,选择一个编辑和一个撰稿人(他们都收到通知)并让他们在文章上工作。撰稿人只能将文章状态设置为 newdraftready(准备检查)。编辑审查状态为 ready 的文章并将状态设置为 reviewed。主编发布状态为 reviewed 的文章。您的实现可以像您想要的那样自定义。思考Django用户组(django.contrib.auth.models.Group)和Django权限系统。

注意:请参阅 权限调整 部分。

>>> from django.contrib.auth.models import User
>>>
>>> from werewolf.models import WerewolfBaseModel, WerewolfBaseMeta
>>>
>>> _chief_editors = {'groups__name__iexact': 'Chief editors'}
>>> _editors = {'groups__name__iexact': 'Editors'}
>>> _writers = {'groups__name__iexact': 'Writers'}
>>>
>>> class NewsItem(WerewolfBaseModel): # Important!
>>>     title = models.CharField(_("Title"), max_length=100)
>>>     body = models.TextField(_("Body"))
>>>     date_published = models.DateTimeField(_("Date published"), \
>>>                                           default=datetime.datetime.now())
>>>     author = models.ForeignKey(User, verbose_name=_("Author"), \
>>>                                related_name='authors', \
>>>                                limit_choices_to=_writers)
>>>     editor = models.ForeignKey(User, verbose_name=_("Editor"), \
>>>                                related_name='editors', \
>>>                                limit_choices_to=_editors)
>>>     chief_editor = models.ForeignKey(User, verbose_name=_("Chief editor"), \
>>>                                      related_name='chief_editors', \
>>>                                      limit_choices_to=_chief_editors)
>>>
>>>     class Meta(WerewolfBaseMeta): # Important!
>>>         verbose_name = "News item"
>>>         verbose_name_plural = "News items"

或者,如果您还想为您的模型定义自定义权限,可以像以下那样扩展django-werewolf权限

>>> from werewolf.models import WerewolfBaseModel
>>> from werewolf.utils import extend_werewolf_permissions
>>>
>>> class NewsItem(WerewolfBaseModel):
>>>     # Your fields here
>>>     class Meta:
>>>         verbose_name = "News item"
>>>         verbose_name_plural = "News items"
>>>
>>>         # Important!
>>>         permissions = extend_werewolf_permissions(
>>>             ('can_change_author', _("Can change author")),
>>>             ('can_change_editor', _("Can change editor")),
>>>             ('can_change_chief_editor', _("Can change chief editor"))
>>>         )

news/admin.py

新闻条目模型的基本管理。

注意:请参阅 权限调整 部分。

>>> from werewolf.admin import WerewolfBaseAdmin
>>>
>>> from news.models import NewsItem
>>>
>>> class NewsItemAdmin(WerewolfBaseAdmin):
>>>     werewolf_protected_fields = (
>>>         ('author', 'can_change_author'),
>>>         ('editor', 'can_change_editor'),
>>>         ('chief_editor', 'can_change_chief_editor')
>>>     )
>>>
>>> admin.site.register(NewsItem, NewsItemAdmin)

《werewolf_protected_fields》属性是一个应该保护的字段列表。列表中的每个项目都是一个元组(field_name_to_protectrequired_permission)。如果提供,django-werewolf 将隐藏未拥有所需权限的用户列出的受保护字段。为了做到这一点,django-werewolf 覆盖了 Django 的 ModelAdmin 的 get_fieldget_fieldsets 方法。如果您意外地覆盖了该方法以满足自己的需求,请确保它也反映了 django-werewolf 的概念。

注意:如果您覆盖了模型管理类中的 queryset 方法,请确保查看 werewolf.admin.WerewolfBaseAdmin.queryset 的源代码,并从那里复制方法。否则,您的用户(没有更改 published 状态的权限)将能够将已发布的项的状态更改为非发布状态。

news/views.py

>>> from news.models import NewsItem
>>>
>>> def browse(request):
>>>     news_items = NewsItem._default_manager.published()
>>>     # Other code

news/werewolf_triggers.py

为了在状态更改时执行额外任务,使用触发器。您只需在您的应用程序中创建一个新的名为 werewolf_triggers.py 的文件,并定义当您的模型的 status 字段更改为特定值时应调用的自定义类。每个触发器都应该继承自 werewolf.triggers.WerewolfBaseTrigger 类。

>>> from werewolf.triggers import WerewolfBaseTrigger, registry
>>>
>>> class StatusNewTrigger(WerewolfBaseTrigger):
>>>     """
>>>     News item status changed to `new`.
>>>     """
>>>     def process(self):
>>>         # Your code
>>>
>>> class StatusReadyTrigger(WerewolfBaseTrigger):
>>>     """
>>>     News item status changed to `ready` (ready for review).
>>>     """
>>>     def process(self):
>>>         # Your code
>>>
>>> # Triggers status change to `new` for news.newsitem model.
>>> registry.register('news', 'newsitem', 'new', StatusNewTrigger)
>>>
>>> # Triggers status change to `ready` for news.newsitem model.
>>> registry.register('news', 'newsitem', 'ready', StatusReadyTrigger)

urls.py

为了自动发现触发器,将以下代码放入您的主 urls 模块中。

>>> from werewolf import autodiscover as werewolf_autodiscover
>>> werewolf_autodiscover()

权限调整

请记住我们的 news.models.NewsItem 模型。

  1. 创建三个用户组

    1. 主编(列出权限)

    • news | News item | 可添加新闻项

    • news | News item | 可更改作者

    • news | News item | 可更改主编

    • news | News item | 可更改编辑

    • news | News item | 可更改新闻项

    • news | News item | 可将状态更改为草稿

    • news | News item | 可将状态更改为新状态

    • news | News item | 可将状态更改为发布状态

    • news | News item | 可将状态更改为准备状态

    • news | News item | 可将状态更改为审查状态

    • news | News item | 可删除新闻项

    1. 编辑(列出权限)

    • news | News item | 可更改新闻项

    • news | News item | 可更改作者

    • news | News item | 可将状态更改为草稿

    • news | News item | 可将状态更改为新状态

    • news | News item | 可将状态更改为准备状态

    • news | News item | 可将状态更改为审查状态

    1. 作家(列出权限)

    • news | News item | 可更改新闻项

    • news | News item | 可将状态更改为草稿

    • news | News item | 可将状态更改为新状态

    • news | News item | 可将状态更改为准备状态

  1. 创建三个用户

    • 主编:属于 Chief editors 组。

    • 编辑:属于 Editors 组。

    • 作家:属于 Writers 组。

  2. 现在用不同的用户登录 admin,看看您的 News item admin(使用 chiefeditor 账户创建的项目,然后用 editorwriter 查看)。

就是这样。如果您无法看到新的权限(可更改状态为草稿可更改状态为新状态 等),请运行管理命令 syncww

$ ./manage.py syncww

运行示例项目

一个 django-werewolf 应用程序的示例可以在这里找到:https://github.com/barseghyanartur/django-werewolf/tree/stable/example

  1. 转到 example/example 目录

    $ cd example/example

  2. 安装需求(在您的虚拟环境中)

    $ pip install -r ../requirements.txt

  3. 将 local_settings.example 复制到 local_settings.py

    $ cp local_settings.example local_settings.py

  4. 创建数据库

    $ ./manage.py syncdb

  5. 插入示例测试组和用户

    $ ./manage.py news_create_groups_and_test_users

  6. 运行项目

    $ ./manage.py runserver

许可证

GPL 2.0/LGPL 2.1

支持

有关任何问题,请联系作者部分提供的电子邮件。

作者

Artur Barseghyan <artur.barseghyan@gmail.com>

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

django-werewolf-0.4.2.tar.gz (20.1 kB 查看哈希值)

上传时间

由以下支持