def update_accordion_panel(panel): accordion_block = StreamBlock([('accordion_items_panel', AccordionItemsPanel(required=True, icon='collapse-down')) ]) rich_text_block = StreamBlock([('rich_text_panel', StandardRichTextPanel(required=False))]) accordion_item_panel = [] for item in panel.value['accordions']: items = [] for text in item.value['items']: items.append(('rich_text_panel', StructValue(StandardRichTextPanel, [ ('text', text.value['text']), ('meta_variant', text.value['meta_variant']), ]))) accordion_item_panel.append( ('accordion_items_panel', StructValue(AccordionItemsPanel, [ ('heading', item.value['heading']), ('items', StreamValue(rich_text_block, items)), ]))) panel.value['accordions'] = StreamValue(accordion_block, accordion_item_panel) return panel
def update_action_plan_shelf(shelf): action_groups_block = StreamBlock([ ('action_group', ActionGroupPanel(required=False, icon='collapse-down')), ]) action_plan_block = StreamBlock([ ('action_panel', ActionChooserBlock(target_model='oneyou.Action', icon='list-ul')), ]) action_group_items = [] for action_group in shelf.value['action_groups']: items = [] for item in action_group.value['actions']: item.value = get_or_create_action(item.value) item.block = ActionChooserBlock(target_model='oneyou.Action') items.append(('action_panel', item.value)) action_group_items.append( ('action_group', StructValue(ActionGroupPanel, [ ('title', action_group.value['title']), ('actions', StreamValue(action_plan_block, items)), ]))) shelf.value['action_groups'] = StreamValue(action_groups_block, action_group_items) cta_stream_block = StreamBlock([('simple_menu_item', SimpleCtaLinkBlock()) ]) ctas = [] for item in shelf.value['cta']: ctas.append(('simple_menu_item', StructValue(SimpleCtaLinkBlock, [ ('link_text', item.value['link_text']), ('link_external', item.value['link_external']), ('link_page', item.value['link_page']), ('link_id', item.value['link_id']), ('meta_cta_variant', 'button'), ]))) shelf.value['ctas'] = StreamValue(cta_stream_block, ctas) del (shelf.value['cta']) shelf.block = ActionPlanShelf() return shelf
def setUpTestData(cls): home_page = PostFactory.create_homepage() program = PostFactory.create_program(home_page=home_page) report_home = PostFactory.create_program_content_page( program=program, content_page_type=ReportsHomepage) cls.report1 = PostFactory.create_content(1, content_page=report_home, post_type=Report)[0] cls.report2 = PostFactory.create_content( 1, content_page=report_home, post_type=Report, post_data={ 'sections': [('section', { 'title': 'Section 1', 'body': StreamValue(ReportBody(), [('heading', 'Subsection 1'), ('paragraph', RichText('<p></p>')), ('heading', 'Subsection 2'), ('paragraph', RichText('<p></p>'))]) }), ('section', { 'title': 'Section 2', 'body': StreamValue(ReportBody(), [ ('heading', 'Subsection 1'), ('paragraph', RichText('<p>Paragraph \{\{1\}\}</p>')), ('heading', 'Subsection 2'), ('paragraph', RichText('<p>Paragraph \{\{2\}\}</p>')) ]) })], 'endnotes': [('endnote', { 'number': 1, 'note': RichText('<a>endnote 1</a>') }), ('endnote', { 'number': 2, 'note': RichText('<a>endnote 2</a>') })] })[0]
def get_or_create_promo(promo_values): try: return Banner.objects.get(shelf_id=promo_values.shelf_id) except Banner.DoesNotExist: contenttype = ContentType.objects.get(app_label='dctcmsbase', model='banner') cta_stream_block = StreamBlock([('cta', SimpleCtaLinkBlock())]) ctas = StreamValue( cta_stream_block, [('cta', StructValue(SimpleCtaLinkBlock, [ ('link_text', promo_values.cta_text), ('link_external', promo_values.cta_link), ('link_page', promo_values.cta_page), ('link_id', ''), ('meta_cta_variant', 'button'), ]))], ) promo = Banner.objects.create( shelf_id=promo_values.shelf_id, heading=promo_values.heading, tracking_group=promo_values.tracking_group, content_type=contenttype, ctas=ctas, ) return promo
def update_carousel_shelf(shelf): item_block = StreamBlock([ ('video_teaser_panel', StandardVideoTeaserPanel(icon='media')), ('image_teaser_panel', StandardImageTeaserPanel(icon='pick')), ('cta_panel', CtaPanel(icon='plus')), ('banner_panel', BannerChooserBlock(target_model='dctcmsbase.Banner', icon='image')), ('app_teaser_panel', AppTeaserChooserBlock(target_model='dctcmsbase.AppTeaser', icon='image')), ]) items = [] for item in shelf.value['items']: if item.block_type in panels_name_conversion.keys(): block_type = panels_name_conversion[item.block_type] else: block_type = item.block_type if item.block_type.endswith( '_panel') else '{}_panel'.format(item.block_type) item = globals()['update_{}'.format(block_type)](item) item.block.name = block_type items.append((block_type, item.value)) shelf.value['items'] = StreamValue(item_block, items) shelf.block = CarouselShelf() return shelf
def stream_field_filter_map(stream_field, block_type, mapper_func): new_stream_data = [] for block in stream_field.stream_data: new_stream_data.append(block_filter_map(block, block_type, mapper_func)) raw_text = dumps(new_stream_data, cls=DjangoJSONEncoder) stream_block = stream_field.stream_block return StreamValue(stream_block, [], is_lazy=True, raw_text=raw_text)
def test_rendition_image_field_original(self): """ test_rendition_image_field_original """ image = CustomImageFactory() test_page = TestPage(title='test', slug='test') parent_page = Page.objects.get(id=2) parent_page.add_child(instance=test_page) field = TestPage._meta.get_field('body') test_page.body = StreamValue(field.stream_block, [('image', StructValue(ImageWithRenditionsBlock, [ ('image', image), ('meta_mobile_rendition', 'none'), ('meta_desktop_rendition', 'none'), ]))]) test_page.save() image_with_renditions = HeaderImageTestPage( image=image, image_mobile_rendition='none', image_desktop_rendition='none', test_page=test_page, ) image_with_renditions.save() c = Client() response = c.get('/api/v2/pages/{}/'.format(test_page.id)) self.assertEqual(response.status_code, 200) content = json.loads(response.content) self.assertEqual(len(content['header_image']), 1) mobile_header_image = Image.open('./{}'.format( content['header_image'][0]['mobile_image'])) width, height = mobile_header_image.size self.assertEqual(width, 1200) self.assertEqual(height, 1200) desktop_header_image = Image.open('./{}'.format( content['header_image'][0]['desktop_image'])) width, height = desktop_header_image.size self.assertEqual(width, 1200) self.assertEqual(height, 1200) mobile_body_image = Image.open('./{}'.format( content['body'][0]['value']['renditions']['mobile'])) width, height = mobile_body_image.size self.assertEqual(width, 1200) self.assertEqual(height, 1200) desktop_body_image = Image.open('./{}'.format( content['body'][0]['value']['renditions']['desktop'])) width, height = desktop_body_image.size self.assertEqual(width, 1200) self.assertEqual(height, 1200) image.delete()
def get_or_create_banner(banner_values): try: return Banner.objects.get(shelf_id=banner_values.shelf_id) except Banner.DoesNotExist: contenttype = ContentType.objects.get(app_label='dctcmsbase', model='banner') expanded_stream_block = ExpandedStreamBlock([('background_image', BackgroundImageBlock())]) cta_stream_block = StreamBlock([('cta', SimpleCtaLinkBlock())]) attributes = StreamValue( expanded_stream_block, [('background_image', StructValue(BackgroundImageBlock, [ ('image', banner_values.background_image), ('meta_variant', 'gradient' if banner_values.meta_gradient else 'none'), ('meta_mobile_rendition', 'none'), ('meta_desktop_rendition', 'none'), ('meta_image_display', 'cover'), ]))], ) ctas = StreamValue( cta_stream_block, [('cta', StructValue(SimpleCtaLinkBlock, [ ('link_text', banner_values.cta_text), ('link_external', banner_values.cta_link), ('link_page', banner_values.cta_page), ('link_id', ''), ('meta_cta_variant', 'button'), ]))], ) banner = Banner.objects.create( shelf_id=banner_values.shelf_id, heading=banner_values.heading, body=banner_values.body, tracking_group=banner_values.tracking_group, content_type=contenttype, attributes=attributes, ctas=ctas, ) return banner
def test_get_serializable_data_for_fields_correctly_serialises_the_page(self): page = create_test_page(OneYouPage) field = OneYouPage._meta.get_field('body') page.body = StreamValue(field.stream_block, [('section_heading_shelf', StructValue([('heading', 'This is a section heading'), ('shelf_id', 'shelf1')]))]) serialized_data = get_serializable_data_for_fields(page) self.assertEqual(type(serialized_data), dict)
def generate_docx_streamfields(document): parsed = DocxParse(document) panels = [] figure_index = {'i': 1} box_num = 0 for s in parsed.sections: if len(s.blocks) == 0: continue body = [] for b in s.blocks: val = None if b['type'] == 'box': box_num += 1 box_body = [] for box_block in b['blocks']: v = parse_block(box_block, figure_index) if v: box_body.append(v) title = 'Box %s' % box_num val = ('box', { 'title': title, 'body': StreamValue(BoxBody(), box_body) }) else: val = parse_block(b, figure_index) if val is not None: body.append(val) panel = ('section', { 'title': s.title, 'body': StreamValue(ReportBody(), body) }) panels.append(panel) endnotes = [] for e in parsed.endnotes: endnotes.append(('endnote', { 'number': e['number'], 'note': RichText(e['note']) })) return {'endnotes': endnotes, 'sections': panels}
def update_grid_shelf(shelf): shelf.value['background_image'] = StructValue(BackgroundImageBlock, [ ('image', shelf.value['background_image']['image']), ('meta_variant', 'none'), ('meta_mobile_rendition', 'none'), ('meta_desktop_rendition', 'none'), ('meta_image_display', shelf.value['meta_image_display']), ]) item_block = StreamBlock([ ('rich_text_panel', StandardRichTextPanel(icon='title')), ('information_panel', StandardInformationPanel(target_model='shelves.AppTeaser', icon='image')), ('cta_panel', CtaPanel(icon='plus')), ('icon_card_panel', IconCardPanel(icon='snippet')), ('image_teaser_panel', StandardImageTeaserPanel(icon='pick')), ('video_teaser_panel', StandardVideoTeaserPanel(icon='pick')), ('plain_text_panel', PlainTextPanel(required=False)), ('simple_image_panel', StandardSimpleImagePanel(icon='image')), ('accordion_panel', AccordionPanel(required=False, icon='form')), ('inline_script_panel', InlineScriptPanel(icon='code')), ('inline_svg_panel', InlineSvgPanel(icon='snippet')), ('app_teaser_panel', AppTeaserPanel(target_model='shelves.AppTeaser', icon='image')), ('oneyou_teaser_panel', BackwardsCompatibleContentPanel(label='OneYou1 teaser', icon='folder-inverse')), ('list_item_panel', ListItemPanel(icon='list-ul')), ('action_plan_shelf', ActionPlanShelf(label='Action Plan Builder shelf', icon='form')), ('action_plan_display_shelf', ActionPlanDisplayShelf(label='Action Plan Display shelf', icon='form')), ]) items = [] for item in shelf.value['items']: if item.block_type in panels_name_conversion.keys(): block_type = panels_name_conversion[item.block_type] else: block_type = item.block_type if item.block_type.endswith( '_panel') else '{}_panel'.format(item.block_type) item = globals()['update_{}'.format(block_type)](item) item.block.name = block_type items.append((block_type, item.value)) shelf.value['items'] = StreamValue(item_block, items) keys_to_remove = ['meta_image_display'] for key in keys_to_remove: del (shelf.value[key]) shelf.block = OneYouGridShelf() return shelf
def sections_to_body(stream_field): new_stream_data = [] for block in stream_field.stream_data: if('type' in block and block['type'] == 'section'): new_stream_data = new_stream_data + block['value']['body'] else: new_stream_data.append(block) raw_text = dumps(new_stream_data, cls=DjangoJSONEncoder) stream_block = stream_field.stream_block return StreamValue(stream_block, [], is_lazy=True, raw_text=raw_text)
def create_page(parent_page, stream_data): """Create a valid page by saving data to a real page model and getting it back out of the database""" stream_block = HomePage.body.field.stream_block test_page = HomePage( body=StreamValue(stream_block, [], is_lazy=True, raw_text=json.dumps(stream_data)), title="Home Page", slug="homepage", ) parent_page.add_child(instance=test_page) test_page.refresh_from_db() return test_page
def get_or_create_app_teaser(app_teaser_values): try: return AppTeaser.objects.get(shelf_id=app_teaser_values.shelf_id) except AppTeaser.DoesNotExist: contenttype = ContentType.objects.get(app_label='dctcmsbase', model='appteaser') expanded_stream_block = ExpandedStreamBlock([('image', ImageBlock())]) cta_stream_block = StreamBlock([('cta', SimpleCtaLinkBlock())]) attributes = StreamValue( expanded_stream_block, [('image', StructValue(ImageBlock, [ ('image', app_teaser_values.image), ]))], ) ctas = StreamValue( cta_stream_block, [('cta', StructValue(SimpleCtaLinkBlock, [ ('link_text', app_teaser_values.cta_text), ('link_external', app_teaser_values.cta_link), ('link_page', app_teaser_values.cta_page), ('link_id', ''), ('meta_cta_variant', 'button'), ]))], ) app_teaser = AppTeaser.objects.create( shelf_id=app_teaser_values.shelf_id, heading=app_teaser_values.heading, body=app_teaser_values.body, attributes=attributes, tracking_group=app_teaser_values.tracking_group, content_type=contenttype, ctas=ctas, cta_googleplay=app_teaser_values.cta_googleplay, cta_appstore=app_teaser_values.cta_appstore, ) return app_teaser
def backwards(self, apps, schema_editor): if self.streamfield_backwards is None: return PageModel = apps.get_model(self.app_label, self.model_name) pages = PageModel.objects.all() for page in pages: stream_data = list(page.body.stream_data) stream_data = self.streamfield_backwards(stream_data) stream_block = page.body.stream_block page.body = StreamValue(stream_block, [], is_lazy=True, raw_text=json.dumps(stream_data)) page.save()
def update_information_panel(panel): (rendition_mobile, rendition_desktop) = get_renditions(panel.value['image_meta']) panel.value['image'] = StructValue(BackgroundImageBlock, [ ('image', panel.value['image']), ('meta_mobile_rendition', rendition_mobile if panel.value['mobile_use_renditions'] else 'none'), ('meta_desktop_rendition', rendition_desktop if panel.value['desktop_use_renditions'] else 'none'), ]) panel.value['meta_layout'] = 'desktop-image-left-mobile-image-top' if panel.value['meta_variant'] not in [ 'light_background', 'dark_background' ]: variant = { 'mobile-image-top-text-right': 'desktop-image-left-mobile-image-top', 'mobile-image-right': 'desktop-image-right-mobile-image-right', } panel.value['meta_layout'] = variant[panel.value['meta_variant']] panel.value['meta_variant'] = 'light_background' cta_stream_block = StreamBlock([('simple_menu_item', SimpleCtaLinkBlock()) ]) ctas = [] for item in panel.value['cta']: ctas.append(('simple_menu_item', StructValue(SimpleCtaLinkBlock, [ ('link_text', item.value['link_text']), ('link_external', item.value['link_external']), ('link_page', item.value['link_page']), ('link_id', item.value['link_id']), ('meta_cta_variant', 'button'), ]))) panel.value['ctas'] = StreamValue(cta_stream_block, ctas) panel.value['panel_id'] = panel.value.pop('shelf_id') keys_to_remove = [ 'image_meta', 'mobile_use_renditions', 'desktop_use_renditions', 'cta' ] for key in keys_to_remove: del (panel.value[key]) panel.block = StandardInformationPanel() return panel
def many_pages(root_page): pages = [] # Create 10 pages containing a range of different content blocks for i in range(0, 20): body_data = get_blocks(seed=i) stream_block = HomePage.body.field.stream_block page = HomePage( body=StreamValue(stream_block, [], is_lazy=True, raw_text=json.dumps(body_data)), title=f"Home Page {i}", slug=f"homepage-{i}", ) root_page.add_child(instance=page) page.refresh_from_db() pages.append(page) return pages
def body_to_section(stream_field): page_blocks = block_filter(copy.deepcopy(stream_field.stream_data), lambda block: block['type'] == 'html' or block['type'] == 'news') section = { 'type': 'section', 'value': { 'padding': "S", 'full_width': False, 'body': block_filter(copy.deepcopy(stream_field.stream_data), lambda block: block['type'] != 'html' and block['type'] != 'news') } } raw_text = dumps([section] + page_blocks, cls=DjangoJSONEncoder) stream_block = stream_field.stream_block return StreamValue(stream_block, [], is_lazy=True, raw_text=raw_text)
def test_none_value(root_page): """ Sometimes get_prep_value can return None. We need to make sure we're handling this case """ body_data = [{"type": "image", "value": None}] stream_block = HomePage.body.field.stream_block home_page = HomePage( body=StreamValue(stream_block, [], is_lazy=True, raw_text=json.dumps(body_data)), title="Home Page", slug="homepage", ) root_page.add_child(instance=home_page) home_page.refresh_from_db() indexer.index_page(home_page) assert IndexEntry.objects.count() == 1
def convertBlocksOfModel(model, streamfield): logger.info( 'Converting all blocks for pages using the {} model.'.format(model)) for page in model.objects.all(): global page_was_changed page_was_changed = False new_stream_data = [ convertBlock(block) for block in getattr(page, streamfield).stream_data ] if page_was_changed: stream_block = getattr(page, streamfield).stream_block setattr(page, streamfield, StreamValue(stream_block, new_stream_data, is_lazy=True)) page.save() logger.info( "{} had Image or LinkedImage blocks which were converted.". format(page.title))
def update_accordion_group_shelf(shelf): item_block = StreamBlock([ ('accordion_panel', AccordionPanel(required=False, icon='form')), ]) panel = update_accordion_panel(shelf) # shelf.value['items'] = StreamValue(item_block, [('accordion_panel', panel.value)]) shelf.value['items'] = StreamValue( item_block, [('accordion_panel', StructValue(AccordionPanel, [ ('accordions', panel.value['accordions']), ('scroll_items_to_top_when_selected', True), ]))]) keys_to_remove = ['tracking_group', 'accordions'] for key in keys_to_remove: del (shelf.value[key]) shelf.block = OneYouGridShelf() return shelf
def better_steps(apps, schema_editor): ''' We can't import the models directly as they may be a newer version than this migration expects. We use the historical versions. ''' ServicePage = apps.get_model('base', 'ServicePage') ServicePageStep = apps.get_model('base', 'ServicePageStep') for page in ServicePage.objects.all(): pageSteps = [] for step in ServicePageStep.objects.all(): if step.page_id == page.id: streamStep = { 'type': 'basic_step', 'value': step.step_description } pageSteps.append(streamStep) stream_block = page.steps.stream_block page.steps = StreamValue(stream_block, pageSteps, is_lazy=True) page.save()
def update_two_column_shelf(shelf): item_block = StreamBlock([ ('rich_text_panel', StandardRichTextPanel(icon='title')), ('information_panel', StandardInformationPanel(target_model='shelves.AppTeaser', icon='image')), ('cta_panel', CtaPanel(icon='plus')), ('image_teaser_panel', StandardImageTeaserPanel(icon='pick')), ('video_teaser_panel', StandardVideoTeaserPanel(icon='pick')), ('plain_text_panel', PlainTextPanel(required=False)), ('simple_image_panel', StandardSimpleImagePanel(icon='image')), ('accordion_panel', AccordionPanel(required=False, icon='form')), ('inline_script_panel', InlineScriptPanel(icon='code')), ('inline_svg_panel', InlineSvgPanel(icon='snippet')), ('app_teaser_panel', AppTeaserPanel(target_model='shelves.AppTeaser', icon='image')), ('oneyou_teaser_panel', BackwardsCompatibleContentPanel(label='OneYou1 teaser', icon='folder-inverse')), ]) for column_item in ['column_1_items', 'column_2_items']: items = [] for item in shelf.value[column_item]: if item.block_type in panels_name_conversion.keys(): block_type = panels_name_conversion[item.block_type] else: block_type = item.block_type if item.block_type.endswith( '_panel') else '{}_panel'.format(item.block_type) item = globals()['update_{}'.format(block_type)](item) item.block.name = block_type items.append((block_type, item.value)) shelf.value[column_item] = StreamValue(item_block, items) keys_to_remove = ['meta_image_display'] for key in keys_to_remove: del (shelf.value[key]) shelf.block = OneYouTwoColumnShelf() return shelf
def test_block_type_change(root_page, get_migration_executor): stream_data = [{ "type": "title", "value": "Heading 1" }, { "type": "paragraph", "value": "abcdef" }] stream_block = HomePage.body.field.stream_block body = StreamValue(stream_block, [], is_lazy=True, raw_text=json.dumps(stream_data)) root_page.add_child(instance=HomePage(title="test", body=body)) get_migration_executor().migrate([("home", "0003_rename_title_to_heading") ]) homepage = HomePageAfterMigration.objects.get(title="test") heading_block = homepage.body[0] assert heading_block.block_type == "heading" assert heading_block.value == "Heading 1"
def update_accordion_items_panel(panel): accordion_items_block = StreamBlock([ ('rich_text_panel', StandardRichTextPanel(required=False)) ]) items = [] for item in panel.value['items']: if item.block_type in panels_name_conversion.keys(): block_type = panels_name_conversion[item.block_type] else: block_type = item.block_type if item.block_type.endswith( '_panel') else '{}_panel'.format(item.block_type) item = globals()['update_{}'.format(block_type)](item) item.block.name = block_type items.append((block_type, item.value)) panel.value['items'] = StreamValue(accordion_items_block, items) panel.value['panel_id'] = panel.value.pop('shelf_id') panel.block = AccordionItemsPanel() return panel
def update_oneyou_teaser_panel(panel): (rendition_mobile, rendition_desktop) = get_renditions(panel.value['image_meta']) panel.value['image'] = StructValue(BackgroundImageBlock, [ ('image', panel.value['image']), ('meta_mobile_rendition', rendition_mobile if panel.value['mobile_use_renditions'] else 'none'), ('meta_desktop_rendition', rendition_desktop if panel.value['desktop_use_renditions'] else 'none'), ]) cta_stream_block = StreamBlock([('simple_menu_item', SimpleCtaLinkBlock()) ]) ctas = [] for item in panel.value['cta']: ctas.append(('simple_menu_item', StructValue(SimpleCtaLinkBlock, [ ('link_text', item.value['link_text']), ('link_external', item.value['link_external']), ('link_page', item.value['link_page']), ('link_id', item.value['link_id']), ('meta_cta_variant', 'link'), ]))) panel.value['ctas'] = StreamValue(cta_stream_block, ctas) panel.value['panel_id'] = panel.value.pop('shelf_id') keys_to_remove = [ 'image_meta', 'mobile_use_renditions', 'desktop_use_renditions', 'cta' ] for key in keys_to_remove: del (panel.value[key]) panel.block = BackwardsCompatibleContentPanel() return panel
def test_rendition_image_field_custom(self): """ test_rendition_image_field_custom """ image = CustomImageFactory() test_page = TestPage(title='test', slug='test') parent_page = Page.objects.get(id=2) parent_page.add_child(instance=test_page) field = TestPage._meta.get_field('body') test_page.body = StreamValue( field.stream_block, [('image', StructValue(ImageWithRenditionsBlock, [ ('image', image), ('meta_mobile_rendition', '100x50'), ('meta_desktop_rendition', '400x200'), ]))]) test_page.save() image_with_renditions = HeaderImageTestPage( image=image, image_mobile_rendition='100x200', image_desktop_rendition='400x800', test_page=test_page, ) image_with_renditions.save() c = Client() response = c.get('/api/v2/pages/{}/'.format(test_page.id)) self.assertEqual(response.status_code, 200) content = json.loads(response.content) self.assertEqual(len(content['header_image']), 1) mobile_header_image = Image.open('./{}'.format( content['header_image'][0]['mobile_image'])) width, height = mobile_header_image.size self.assertEqual(width, 100) self.assertEqual(height, 200) desktop_header_image = Image.open('./{}'.format( content['header_image'][0]['desktop_image'])) width, height = desktop_header_image.size self.assertEqual(width, 400) self.assertEqual(height, 800) mobile_body_image = Image.open('./{}'.format( content['body'][0]['value']['renditions']['mobile'])) width, height = mobile_body_image.size self.assertEqual(width, 100) self.assertEqual(height, 50) desktop_body_image = Image.open('./{}'.format( content['body'][0]['value']['renditions']['desktop'])) width, height = desktop_body_image.size self.assertEqual(width, 400) self.assertEqual(height, 200) with self.settings(LOCAL_ASSET_FULL_PATH=True): regexp = re.compile( '^http\:\/\/localhost\:8000\/media\/images\/example\.[A-z0-9]+\.fill-[0-9]+x[0-9]+\.jpg$' ) self.assertIsNotNone( regexp.match(image_with_renditions.mobile_image)) self.assertIsNotNone( regexp.match(image_with_renditions.desktop_image)) c = Client() response = c.get('/api/v2/pages/{}/'.format(test_page.id)) self.assertEqual(response.status_code, 200) content = json.loads(response.content) self.assertIsNotNone( regexp.match( content['body'][0]['value']['renditions']['mobile'])) self.assertIsNotNone( regexp.match( content['body'][0]['value']['renditions']['desktop'])) image.delete()