跳转到主要内容

处理django模型草稿和发布状态

项目描述

Django-brouillons

处理Django ORM中模型的“草稿”和“公共”版本。

此模块仍在开发中,如果您不知道自己在做什么,则不应在生产环境中使用。此模块旨在处理一个相当复杂的问题,需要您为项目添加单元测试,以确保它在特定情况下确实做了您期望的事情。目前,我们知道该模块没有涵盖所有模型树复制的案例,但我们希望随着时间的推移增加这些案例。

它内部使用django-clone来复制Django ORM模型。我们建议您在深入研究django-brouillons之前先了解django-clone的工作原理。

Pipeline badge Coverage badge Release badge

它是如何工作的?

Schema

Django-brouillons复制了旨在在两个版本publicdraft中审核的给定模型的对象。

然后可以发布draft版本,以便其值更新到public版本。


贡献

请随时通过主页对该模块提供反馈。

有关贡献,请参阅CONTRIBUTING.md


安装

  1. PyPI安装模块

    python3 -m pip install django-brouillons
    

    或者,如果您正在使用poetry

    poetry add django-brouillons
    
  2. 将其添加到您的INSTALLED_APPS

      "django_brouillons",
    

配置

在您的模型中

  1. 要处理Django模型中的draftpublic状态,请从DraftModel类继承

    from django_brouillons.models import DraftModel
    
    class DraftableObject(DraftModel):
      ...
    
  2. 然后您需要配置模型的 django-clone 设置,这将描述关于模型相关字段应采用的策略(对于 多对多外键一对一 等)。

    from django_brouillons.models import DraftModel
    
    class DraftableObject(DraftModel):
      _clone_m2o_or_o2m_fields = ["draftable_object_many_to_many2_through"]
      _clone_linked_m2m_fields = ["many_to_many_objects"]
    
    ...
    many_to_many_objects = models.ManyToManyField("DraftableObjectManyToMany")
    many_to_many_2_objects_through = models.ManyToManyField(
        "DraftableObjectManyToMany2",
        through="DraftableObjectManyToMany2Through",
        through_fields=("draftable_object", "draftable_object_many_to_many_2"),
    )
    
    

例如,您可以查看 测试应用模型

在此示例中,将应用以下内容

  • many_to_many_objects 字段:m2m 字段将引用相同的关联对象,而不会重复关联对象
  • draftable_object_many_to_many2_through 字段:设计为 draftable_object_many_to_many2_through 相关名称的表的关联对象将被重复
  1. 如果您的模型包含一些具有 unique=TrueCharFields 字段,则必须在模型的 Draft 版本中对它们进行前缀,以确保它们在 PublicDraft 版本之间保持唯一。

    这可以通过填充从 DraftModel 抽象模型继承的模型的 _draft_prefixed_fields 属性来完成

    from django_brouillons.models import DraftModel
    
    class DraftableObject(DraftModel):
      _clone_m2o_or_o2m_fields = ["draftable_object_many_to_many2_through"]
      _clone_linked_m2m_fields = ["many_to_many_objects"]
      _draft_prefixed_fields = ["slug"]
    
      slug = models.SlugField(max_length=255, unique=True)
    

在此示例中,DraftableObject 包含一个唯一的 slug 字段。

将其列在 _draft_prefixed_fields 属性中指示 django-brouillonsdraft 重复时必须使用 _draft_prefix 属性的值进行前缀。

在管理界面中

Django-brouillon 提供了 管理集成

  1. 模型管理器可以继承自 DraftModelAdminMixinDraftModelAdmin

      from django_brouillons.admin import DraftModelAdminMixin
      @admin.register(DraftableObject)  # Must be referenced to allow autocomplete
      class DraftableObjectAdmin(
          DraftModelAdmin
      ):
        pass
    

    这样做,将在您的管理模型更改视图中添加几个按钮

    • 在管理界面中导航到对象的 PublicDraft 版本
    • 将对象的 draft 版本发布为 public 版本
    • 创建一个仅具有 public 的对象 draft 版本
  2. DraftModelAdminMixin 在其 list_filter 属性中包含一个 PublishedChangesListFilter 过滤器,该过滤器添加了过滤未发布更改或未更改的对象的能力

    如果需要,可以手动在 list_filter 中设置此过滤器

      from django_brouillons.admin import DraftModelAdminMixin, PublishedChangesListFilter
      @admin.register(DraftableObject)  # Must be referenced to allow autocomplete
      class DraftableObjectAdmin(
          DraftModelAdmin
      ):
        list_filter = (PublishedChangesListFilter,)
    

模型 API

Django-brouillons 在其模型属性中提供了以下内容

  • DraftableObject.is_public:指示当前实例是否为公共实例
  • DraftableObject.is_draft:指示当前实例是否为草稿
  • DraftableObject.has_public_version:指示当前实例是否有公共版本
  • DraftableObject.has_draft_version:指示当前实例是否有草稿版本
  • DraftableObject.has_unpublished_changes:指示当前实例是否有待发布的更改
  • DraftableObject.create_draft():从公共版本创建草稿
  • DraftableObject.publish_draft():在公共版本中发布草稿版本的更改
    • 如果没有存在,则创建并返回新的 public_version
    • 如果已存在,则更新并返回 public_version

测试

测试位于 tests 包中。

测试是用 pytest 编写的。它们基于 testapp 模型

Test app models schema

要运行测试,必须启动命令 ./launch_tests.sh

可以使用命令 ./run_coverage.sh 生成覆盖率报告

项目详情


下载文件

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

源代码分布

django_brouillons-0.0.4.tar.gz (25.6 kB 查看散列)

上传时间 源代码

构建分布

django_brouillons-0.0.4-py3-none-any.whl (26.5 kB 查看散列)

上传时间 Python 3

由...