def test_clean_invalid_url(self): non_required_block = EmbedBlock(required=False) with self.assertRaises(ValidationError): non_required_block.clean( EmbedValue('http://no-oembed-here.com/something')) required_block = EmbedBlock() with self.assertRaises(ValidationError): required_block.clean( EmbedValue('http://no-oembed-here.com/something'))
def test_clean_invalid_url(self, get_embed): get_embed.side_effect = EmbedNotFoundException non_required_block = EmbedBlock(required=False) with self.assertRaises(ValidationError): non_required_block.clean( EmbedValue('http://no-oembed-here.com/something')) required_block = EmbedBlock() with self.assertRaises(ValidationError): required_block.clean( EmbedValue('http://no-oembed-here.com/something'))
def handle_block(self, block_type, block_value, segments): # Need to check if the app is installed before importing EmbedBlock # See: https://github.com/wagtail/wagtail-localize/issues/309 if apps.is_installed("wagtail.embeds"): from wagtail.embeds.blocks import EmbedBlock, EmbedValue if isinstance(block_type, EmbedBlock): if len(segments) > 1: raise ValueError( "EmbedBlock can only have a single segment. Found {}". format(len(segments))) segment = segments[0] if isinstance(segment, OverridableSegmentValue): return EmbedValue(segment.data) if hasattr(block_type, "restore_translated_segments"): return block_type.restore_translated_segments( block_value, segments) elif isinstance( block_type, (blocks.CharBlock, blocks.TextBlock, blocks.URLBlock, blocks.EmailBlock), ): if len(segments) > 1: raise ValueError( "TextBlock/CharBlock can only have a single segment. Found {}" .format(len(segments))) segment = segments[0] if isinstance(segment, OverridableSegmentValue): return segment.data else: # Assume it's a StringSegmentValue return segment.render_text() elif isinstance(block_type, blocks.RichTextBlock): format, template, strings = organise_template_segments(segments) assert format == "html" return RichText(restore_strings(template, strings)) elif isinstance(block_type, blocks.ChooserBlock): return self.handle_related_object_block(block_value, segments) elif isinstance(block_type, blocks.StructBlock): return self.handle_struct_block(block_value, segments) elif isinstance(block_type, blocks.ListBlock): return self.handle_list_block(block_value, segments) elif isinstance(block_type, blocks.StreamBlock): return self.handle_stream_block(block_value, segments) else: raise Exception( "Unrecognised StreamField block type '{}'. Have you implemented restore_translated_segments() on this class?" .format(block_type.__class__.__name__))
def test_serialize(self): block = EmbedBlock(required=False) block_val = EmbedValue('http://www.example.com/foo') serialized_val = block.get_prep_value(block_val) self.assertEqual(serialized_val, 'http://www.example.com/foo') serialized_empty_val = block.get_prep_value(None) self.assertEqual(serialized_empty_val, '')
def setUp(self): super().setUp() # Create Blog self.blog_page = BlogPageFactory(body=[ ("heading", "Test heading 1"), ("paragraph", RichText("This is a paragraph.")), ("heading", "Test heading 2"), ("image", wagtail_factories.ImageFactory()), ("decimal", decimal.Decimal(1.2)), ("date", datetime.date.today()), ("datetime", datetime.datetime.now()), ( "carousel", StreamValue( stream_block=CarouselBlock(), stream_data=[ ("image", wagtail_factories.ImageChooserBlockFactory()), ("image", wagtail_factories.ImageChooserBlockFactory()), ], ), ), ( "gallery", { "title": "Gallery title", "images": StreamValue( stream_block=ImageGalleryImages(), stream_data=[ ( "image", { "image": wagtail_factories.ImageChooserBlockFactory( ) }, ), ( "image", { "image": wagtail_factories.ImageChooserBlockFactory( ) }, ), ], ), }, ), ("objectives", ["Read all of article!"]), ("video", { "youtube_link": EmbedValue("https://youtube.com/") }), ])
def test_render_form(self): """ The form field for an EmbedBlock should be a text input containing the URL """ block = EmbedBlock() form_html = block.render_form(EmbedValue('http://www.example.com/foo'), prefix='myembed') self.assertIn('<input ', form_html) self.assertIn('value="http://www.example.com/foo"', form_html)
def test_clean(self): required_block = EmbedBlock() nonrequired_block = EmbedBlock(required=False) # a valid EmbedValue should return the same value on clean cleaned_value = required_block.clean(EmbedValue('http://www.example.com/foo')) self.assertIsInstance(cleaned_value, EmbedValue) self.assertEqual(cleaned_value.url, 'http://www.example.com/foo') cleaned_value = nonrequired_block.clean(EmbedValue('http://www.example.com/foo')) self.assertIsInstance(cleaned_value, EmbedValue) self.assertEqual(cleaned_value.url, 'http://www.example.com/foo') # None should only be accepted for nonrequired blocks cleaned_value = nonrequired_block.clean(None) self.assertEqual(cleaned_value, None) with self.assertRaises(ValidationError): required_block.clean(None)
def test_clean_non_required(self): block = EmbedBlock(required=False) cleaned_value = block.clean( EmbedValue('https://www.youtube.com/watch?v=_U79Wc965vw')) self.assertIsInstance(cleaned_value, EmbedValue) self.assertEqual(cleaned_value.url, 'https://www.youtube.com/watch?v=_U79Wc965vw') cleaned_value = block.clean(None) self.assertIsNone(cleaned_value)
def test_clean_required(self): block = EmbedBlock() cleaned_value = block.clean( EmbedValue('https://www.youtube.com/watch?v=_U79Wc965vw')) self.assertIsInstance(cleaned_value, EmbedValue) self.assertEqual(cleaned_value.url, 'https://www.youtube.com/watch?v=_U79Wc965vw') with self.assertRaisesMessage(ValidationError, ''): block.clean(None)
def test_clean_non_required(self, get_embed): get_embed.return_value = Embed(html='<h1>Hello world!</h1>') block = EmbedBlock(required=False) cleaned_value = block.clean( EmbedValue('https://www.youtube.com/watch?v=_U79Wc965vw')) self.assertIsInstance(cleaned_value, EmbedValue) self.assertEqual(cleaned_value.url, 'https://www.youtube.com/watch?v=_U79Wc965vw') cleaned_value = block.clean(None) self.assertIsNone(cleaned_value)
def test_clean_required(self, get_embed): get_embed.return_value = Embed(html='<h1>Hello world!</h1>') block = EmbedBlock() cleaned_value = block.clean( EmbedValue('https://www.youtube.com/watch?v=_U79Wc965vw')) self.assertIsInstance(cleaned_value, EmbedValue) self.assertEqual(cleaned_value.url, 'https://www.youtube.com/watch?v=_U79Wc965vw') with self.assertRaisesMessage(ValidationError, ''): block.clean(None)
def test_default(self): block1 = EmbedBlock() self.assertEqual(block1.get_default(), None) block2 = EmbedBlock(default='') self.assertEqual(block2.get_default(), None) block3 = EmbedBlock(default=None) self.assertEqual(block3.get_default(), None) block4 = EmbedBlock(default='http://www.example.com/foo') self.assertIsInstance(block4.get_default(), EmbedValue) self.assertEqual(block4.get_default().url, 'http://www.example.com/foo') block5 = EmbedBlock(default=EmbedValue('http://www.example.com/foo')) self.assertIsInstance(block5.get_default(), EmbedValue) self.assertEqual(block5.get_default().url, 'http://www.example.com/foo')
def test_default(self): block1 = EmbedBlock() self.assertIsNone(block1.get_default()) block2 = EmbedBlock(default="") self.assertIsNone(block2.get_default()) block3 = EmbedBlock(default=None) self.assertIsNone(block3.get_default()) block4 = EmbedBlock(default="http://www.example.com/foo") self.assertIsInstance(block4.get_default(), EmbedValue) self.assertEqual(block4.get_default().url, "http://www.example.com/foo") block5 = EmbedBlock(default=EmbedValue("http://www.example.com/foo")) self.assertIsInstance(block5.get_default(), EmbedValue) self.assertEqual(block5.get_default().url, "http://www.example.com/foo")
def _make_video_page(data, extra_kwargs): _video_url = data.get("url") instance_data = dict( title=data["title"], draft_title=data["title"], slug=_get_slug(data), date=data["timestamp"].date(), live=False, # Needs to be set because default is True has_unpublished_changes=True, # again, overriding a default owner=extra_kwargs.get("owner"), ) page = video_models.Video(**instance_data) page.video_url = [("embed", EmbedValue(_video_url))] parent_page = Page.objects.filter(slug="videos").first().specific parent_page.add_child(instance=page) # Takes care of saving return page
def setUp(self): super().setUp() # Create Blog self.blog_page = BlogPageFactory( body=[ ("heading", "Test heading 1"), ("paragraph", RichText("This is a paragraph.")), ("heading", "Test heading 2"), ("image", wagtail_factories.ImageFactory()), ("decimal", decimal.Decimal(1.2)), ("date", datetime.date.today()), ("datetime", datetime.datetime.now()), ( "carousel", StreamValue( stream_block=CarouselBlock(), stream_data=[ ("image", wagtail_factories.ImageChooserBlockFactory()), ("image", wagtail_factories.ImageChooserBlockFactory()), ], ), ), ( "gallery", { "title": "Gallery title", "images": StreamValue( stream_block=ImageGalleryImages(), stream_data=[ ( "image", { "image": wagtail_factories. ImageChooserBlockFactory() }, ), ( "image", { "image": wagtail_factories. ImageChooserBlockFactory() }, ), ], ), }, ), ("callout", { "text": RichText("<p>Hello, World</p>") }), ("objectives", ["Read all of article!"]), ( "video", { "youtube_link": EmbedValue( "https://www.youtube.com/watch?v=_U79Wc965vw") }, ), ( "text_and_buttons", { "text": "Button text", "buttons": [{ "button_text": "btn", "button_link": "https://www.graphql.com/", }], "mainbutton": { "button_text": "Take me to the source", "button_link": "https://wagtail.io/", }, }, ), ("text_with_callable", TextWithCallableBlockFactory()), ], parent=self.home, )