コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
    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]
コード例 #4
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
コード例 #5
0
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
コード例 #6
0
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)
コード例 #7
0
    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()
コード例 #8
0
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
コード例 #9
0
    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)
コード例 #10
0
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}
コード例 #11
0
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
コード例 #12
0
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)
コード例 #13
0
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
コード例 #14
0
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
コード例 #15
0
 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()
コード例 #16
0
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
コード例 #17
0
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
コード例 #18
0
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)
コード例 #19
0
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
コード例 #20
0
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))
コード例 #21
0
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
コード例 #22
0
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()
コード例 #23
0
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
コード例 #24
0
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"
コード例 #25
0
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
コード例 #26
0
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
コード例 #27
0
    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()