Using pydantic to validate form data
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is failing
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone/push Build is failing
				
					Details
				
			
		
	
							parent
							
								
									901a548d2e
								
							
						
					
					
						commit
						31ed66b1f5
					
				@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					import re
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from pydantic import BaseModel
 | 
				
			||||||
 | 
					from pydantic import Field
 | 
				
			||||||
 | 
					from pydantic import field_validator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from htmx_contact.models import PHONE_REGEX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EMAIL_REGEX = r'^[\w\-\.]+@([\w-]+\.)+[\w-]{2,}$'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def repack_validation_errors(errors):
 | 
				
			||||||
 | 
					    repackaged_errors = {error.get('loc')[0]: error.get('msg') for error in errors}
 | 
				
			||||||
 | 
					    return repackaged_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NewContactValidator(BaseModel):
 | 
				
			||||||
 | 
					    first_name: str = Field(min_length=2, max_length=30)
 | 
				
			||||||
 | 
					    last_name: str = Field(min_length=2, max_length=30)
 | 
				
			||||||
 | 
					    phone: str = Field(max_length=30)
 | 
				
			||||||
 | 
					    email: str = Field(max_length=120)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Field Validators used to prevent regex patterns returned in error message
 | 
				
			||||||
 | 
					    @field_validator('phone')
 | 
				
			||||||
 | 
					    def must_match_phone_pattern(value):
 | 
				
			||||||
 | 
					        if not bool(re.match(PHONE_REGEX, value)):
 | 
				
			||||||
 | 
					            raise ValueError("not a valid phone number. Please review and resubmit.")
 | 
				
			||||||
 | 
					        return value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @field_validator('email')
 | 
				
			||||||
 | 
					    def must_match_email_pattern(value):
 | 
				
			||||||
 | 
					        if not bool(re.match(EMAIL_REGEX, value)):
 | 
				
			||||||
 | 
					            raise ValueError("not a valid email. Please review and resubmit.")
 | 
				
			||||||
 | 
					        return value
 | 
				
			||||||
@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					import pytest
 | 
				
			||||||
 | 
					from pydantic import ValidationError
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from htmx_contact.validators import NewContactValidator
 | 
				
			||||||
 | 
					from htmx_contact.validators import repack_validation_errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def test_new_contact_errors():
 | 
				
			||||||
 | 
					    with pytest.raises(ValidationError) as error:
 | 
				
			||||||
 | 
					        NewContactValidator(first_name="Drew", last_name="bednar", phone="666-7777-3333", email="not a valid email")
 | 
				
			||||||
 | 
					    assert len(error.value.errors()) == 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def test_repackage_errors():
 | 
				
			||||||
 | 
					    with pytest.raises(ValidationError) as error:
 | 
				
			||||||
 | 
					        NewContactValidator(first_name="Drew", last_name="bednar", phone="666-7777-3333", email="not a valid email")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    repackaged_errors = repack_validation_errors(error.value.errors())
 | 
				
			||||||
 | 
					    assert len(repackaged_errors) == 2
 | 
				
			||||||
 | 
					    assert 'not a valid phone number' in repackaged_errors['phone']
 | 
				
			||||||
 | 
					    assert 'not a valid email' in repackaged_errors['email']
 | 
				
			||||||
					Loading…
					
					
				
		Reference in New Issue