skillbox/server/rooms/factories.py

81 lines
3.4 KiB
Python

import random
import factory
import wagtail_factories
from django.contrib.auth import get_user_model
from factory import CREATE_STRATEGY
from wagtail.core.rich_text import RichText
from books.blocks import ImageUrlBlock
from books.factories import TextBlockFactory, BasicKnowledgeBlockFactory, ImageUrlBlockFactory, LinkBlockFactory
from core.factories import fake, fake_paragraph
from rooms.models import Room, RoomEntry
from user.models import UserGroup
class RoomFactory(factory.django.DjangoModelFactory):
class Meta:
model = Room
title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(4, 8)))
user_group = factory.Iterator(UserGroup.objects.all())
appearance = factory.LazyAttribute(lambda x: random.choice(['red', 'green', 'brown']))
block_types = ['text_block', 'image_block']
class RoomEntryFactory(factory.django.DjangoModelFactory):
class Meta:
model = RoomEntry
title = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(8, 12)))
subtitle = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(8, 12)))
description = factory.LazyAttribute(lambda x: fake.sentence(nb_words=random.randint(20, 30)))
author = factory.Iterator(get_user_model().objects.all())
contents = wagtail_factories.StreamFieldFactory({
'text_block': TextBlockFactory,
'image_url_block': ImageUrlBlockFactory,
'link_block': LinkBlockFactory
})
@classmethod
def stream_field_magic(cls, kwargs, stream_field_name):
if stream_field_name in kwargs:
for idx, resource in enumerate(kwargs[stream_field_name]):
value = resource['value']
for jdx, field in enumerate(value):
block_type = resource['type']
if block_type == 'text_block':
kwargs['{}__{}__{}__{}'.format(stream_field_name, idx, block_type, field)] = RichText(value[field])
if block_type == 'image_url_block':
kwargs['{}__{}__{}__{}'.format(stream_field_name, idx, block_type, field)] = value[field]
if block_type == 'link_block':
kwargs['{}__{}__{}__{}'.format(stream_field_name, idx, block_type, field)] = value[field]
# elif block_type == 'image_block':
# kwargs['{}__{}__{}__{}'.format(stream_field_name, idx, block_type, 'image__title')] = fake_paragraph()
# if field == 'path':
# field_value = value[field]
# kwargs['{}__{}__{}__{}'.format(stream_field_name, idx, block_type, 'image__file')] = field_value
# # kwargs['{}__{}__{}__{}'.format(stream_field_name, i, 'image_block', )] = fake_paragraph()
del kwargs[stream_field_name]
else:
for i in range(0, random.randint(3, 7)):
block_type = random.choice(block_types)
if block_type == 'text_block':
kwargs['{}__{}__{}__{}'.format(stream_field_name, i, 'text_block', 'text')] = RichText(fake_paragraph())
# elif block_type == 'image_block':
# kwargs['{}__{}__{}__{}'.format(stream_field_name, i, 'image_block', 'image__title')] = fake_paragraph()
@classmethod
def create(cls, **kwargs):
cls.stream_field_magic(kwargs, 'contents')
return cls._generate(CREATE_STRATEGY, kwargs)