项目作者: wagtail

项目描述 :
Factory boy classes for wagtail
高级语言: Python
项目地址: git://github.com/wagtail/wagtail-factories.git
创建时间: 2016-12-08T18:54:13Z
项目社区:https://github.com/wagtail/wagtail-factories

开源协议:MIT License

下载


wagtail-factories

Factory boy classes for Wagtail CMS

Join the Community at Wagtail Space!

Join us at Wagtail Space US this year! The Call for Participation and Registration for both Wagtail Space 2024 events is open. We would love to have you give a talk, or just us as an attendee in June.

Status

image
image
image

Installation

  1. pip install wagtail-factories

Usage

Documentation is still in progress, but see the
tests
for more examples.

  1. import wagtail_factories
  2. from . import models
  3. class MyCarouselItemFactory(wagtail_factories.StructBlockFactory):
  4. label = 'my-label'
  5. image = factory.SubFactory(
  6. wagtail_factories.ImageChooserBlockFactory)
  7. class Meta:
  8. model = models.MyBlockItem
  9. class MyCarouselFactory(wagtail_factories.StructBlockFactory):
  10. title = "Carousel title"
  11. items = wagtail_factories.ListBlockFactory(
  12. MyCarouselItemFactory)
  13. class Meta:
  14. model = models.MyCarousel
  15. class MyNewsPageFactory(wagtail_factories.PageFactory):
  16. class Meta:
  17. model = models.MyNewsPage
  18. class MyNewsPageChooserBlockFactory(wagtail_factories.PageChooserBlockFactory):
  19. page = factory.SubFactory(MyNewsPageFactory)
  20. class MyTestPageFactory(wagtail_factories.PageFactory):
  21. body = wagtail_factories.StreamFieldFactory({
  22. 'carousel': factory.SubFactory(MyCarouselFactory),
  23. 'news_page': factory.SubFactory(MyNewsPageChooserBlockFactory),
  24. })
  25. class Meta:
  26. model = models.MyTestPage
  27. def test_my_page():
  28. root_page = wagtail_factories.PageFactory(parent=None)
  29. my_page = MyTestPageFactory(
  30. parent=root_page,
  31. body__0__carousel__items__0__label='Slide 1',
  32. body__0__carousel__items__0__image__image__title='Image Slide 1',
  33. body__0__carousel__items__1__label='Slide 2',
  34. body__0__carousel__items__1__image__image__title='Image Slide 2',
  35. body__0__carousel__items__2__label='Slide 3',
  36. body__0__carousel__items__2__image__image__title='Image Slide 3',
  37. body__1__news_page__page__title="News",
  38. )

Using StreamBlockFactory

StreamBlockFactory can be used in conjunction with the other block
factory types to create complex, nested StreamValues, much like how
StreamBlock can be used to declare the blocks for a complex
StreamField.

First, define your StreamBlockFactory subclass, using
factory.SubFactory to wrap child block declarations. Be sure to
include your StreamBlock subclass as the model attribute on the inner
Meta class.

  1. class MyStreamBlockFactory(wagtail_factories.StreamBlockFactory):
  2. my_struct_block = factory.SubFactory(MyStructBlockFactory)
  3. class Meta:
  4. model = MyStreamBlock

Then include your StreamBlockFactory subclass on a model factory as
the argument to a StreamFieldFactory.

  1. class MyPageFactory(wagtail_factories.PageFactory):
  2. body = wagtail_factories.StreamFieldFactory(MyStreamBlockFactory)
  3. class Meta:
  4. model = MyPage

You can then use a modified version of factory_boy\’s deep object
declaration syntax to build up StreamValues on the fly.

  1. MyPageFactory(
  2. body__0__my_struct_block__some_field="some value",
  3. body__0__my_struct_block__some_other_field="some other value",
  4. )

To generate the default value for a block factory, terminate your
declaration at the index and provide the block name as the value.

  1. MyPageFactory(body__0="my_struct_block")

Alternative StreamFieldFactory declaration syntax

Prior to version 3.0, StreamFieldFactory could only be used by
providing a dict mapping block names to block factory classes as the
single argument, for example:

  1. class MyTestPageWithStreamFieldFactory(wagtail_factories.PageFactory):
  2. body = wagtail_factories.StreamFieldFactory(
  3. {
  4. "char_array": wagtail_factories.ListBlockFactory(
  5. wagtail_factories.CharBlockFactory
  6. ),
  7. "int_array": wagtail_factories.ListBlockFactory(
  8. wagtail_factories.IntegerBlockFactory
  9. ),
  10. "struct": MyBlockFactory,
  11. "image": wagtail_factories.ImageChooserBlockFactory,
  12. }
  13. )
  14. class Meta:
  15. model = models.MyTestPage

This style of declaration is still supported, with the caveat that
nested stream blocks are not supported for this approach. From version
3.0, all BlockFactory values in a StreamFieldFactory definition of
this style must be wrapped in factory_boy SubFactories. For
example, the above example must be updated to the following for 3.0
compatibility.

  1. class MyTestPageWithStreamFieldFactory(wagtail_factories.PageFactory):
  2. body = wagtail_factories.StreamFieldFactory(
  3. {
  4. "char_array": wagtail_factories.ListBlockFactory(
  5. wagtail_factories.CharBlockFactory
  6. ),
  7. "int_array": wagtail_factories.ListBlockFactory(
  8. wagtail_factories.IntegerBlockFactory
  9. ),
  10. "struct": factory.SubFactory(MyBlockFactory),
  11. "image": factory.SubFactory(wagtail_factories.ImageChooserBlockFactory),
  12. }
  13. )
  14. class Meta:
  15. model = models.MyTestPage

This requirement does not apply to ListBlockFactory, which is a
subclass of SubFactory.