kopia lustrzana https://github.com/wagtail/wagtail
				
				
				
			Support deferring validation on StreamField
							rodzic
							
								
									5015eddef3
								
							
						
					
					
						commit
						397edf2ec5
					
				| 
						 | 
				
			
			@ -69,7 +69,8 @@ class FieldPanel(Panel):
 | 
			
		|||
            else:
 | 
			
		||||
                required_on_save = getattr(db_field, "required_on_save", False) or (
 | 
			
		||||
                    db_field.null is False
 | 
			
		||||
                    and db_field.get_internal_type() not in ("CharField", "TextField")
 | 
			
		||||
                    and db_field.get_internal_type()
 | 
			
		||||
                    not in ("CharField", "TextField", "JSONField")
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
        if not required_on_save:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ from wagtail.test.testapp.models import (
 | 
			
		|||
    StandardIndex,
 | 
			
		||||
)
 | 
			
		||||
from wagtail.test.utils import WagtailTestUtils
 | 
			
		||||
from wagtail.test.utils.form_data import nested_form_data, streamfield
 | 
			
		||||
from wagtail.test.utils.timestamps import submittable_timestamp
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -755,6 +756,68 @@ class TestPageCreation(WagtailTestUtils, TestCase):
 | 
			
		|||
            ).exists()
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def test_create_streampage_post_with_blank_body(self):
 | 
			
		||||
        post_data = nested_form_data(
 | 
			
		||||
            {
 | 
			
		||||
                "title": "Stream page",
 | 
			
		||||
                "slug": "stream-page",
 | 
			
		||||
                "body": streamfield([]),
 | 
			
		||||
            }
 | 
			
		||||
        )
 | 
			
		||||
        response = self.client.post(
 | 
			
		||||
            reverse(
 | 
			
		||||
                "wagtailadmin_pages:add",
 | 
			
		||||
                args=("tests", "streampage", self.root_page.id),
 | 
			
		||||
            ),
 | 
			
		||||
            post_data,
 | 
			
		||||
        )
 | 
			
		||||
        # Find the page and check it
 | 
			
		||||
        page = Page.objects.get(
 | 
			
		||||
            path__startswith=self.root_page.path, slug="stream-page"
 | 
			
		||||
        ).specific
 | 
			
		||||
 | 
			
		||||
        # Should be redirected to edit page
 | 
			
		||||
        self.assertRedirects(
 | 
			
		||||
            response, reverse("wagtailadmin_pages:edit", args=(page.id,))
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(len(page.body), 0)
 | 
			
		||||
        self.assertFalse(page.live)
 | 
			
		||||
 | 
			
		||||
    def test_cannot_publish_streampage_with_blank_body(self):
 | 
			
		||||
        post_data = nested_form_data(
 | 
			
		||||
            {
 | 
			
		||||
                "title": "Stream page",
 | 
			
		||||
                "slug": "stream-page",
 | 
			
		||||
                "body": streamfield([]),
 | 
			
		||||
                "action-publish": "Publish",
 | 
			
		||||
            }
 | 
			
		||||
        )
 | 
			
		||||
        response = self.client.post(
 | 
			
		||||
            reverse(
 | 
			
		||||
                "wagtailadmin_pages:add",
 | 
			
		||||
                args=("tests", "streampage", self.root_page.id),
 | 
			
		||||
            ),
 | 
			
		||||
            post_data,
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(response.status_code, 200)
 | 
			
		||||
 | 
			
		||||
        # Check that a form error was raised. The actual message as rendered
 | 
			
		||||
        # ("This field is required.") is passed to the StreamBlock as part of
 | 
			
		||||
        # StreamBlockValidationError.non_block_errors, whereas assertFormError
 | 
			
		||||
        # only considers the message attribute (which is a generic error).
 | 
			
		||||
        self.assertFormError(
 | 
			
		||||
            response.context["form"], "body", "Validation error in StreamBlock"
 | 
			
		||||
        )
 | 
			
		||||
        self.assertContains(response, "This field is required.")
 | 
			
		||||
 | 
			
		||||
        # Page should not have been created
 | 
			
		||||
        self.assertFalse(
 | 
			
		||||
            Page.objects.filter(
 | 
			
		||||
                path__startswith=self.root_page.path, slug="stream-page"
 | 
			
		||||
            ).exists()
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def test_create_simplepage_scheduled(self):
 | 
			
		||||
        go_live_at = timezone.now() + datetime.timedelta(days=1)
 | 
			
		||||
        expire_at = timezone.now() + datetime.timedelta(days=2)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -756,6 +756,9 @@ class BlockField(forms.Field):
 | 
			
		|||
        super().__init__(**kwargs)
 | 
			
		||||
 | 
			
		||||
    def clean(self, value):
 | 
			
		||||
        # Pass required flag to the top-level block, so that dynamically setting it on the
 | 
			
		||||
        # field (e.g. by defer_required_fields) is respected by the block.
 | 
			
		||||
        self.block.set_meta_options({"required": self.required})
 | 
			
		||||
        return self.block.clean(value)
 | 
			
		||||
 | 
			
		||||
    def has_changed(self, initial_value, data_value):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue