def test_filter(self): if settings.CRISPY_TEMPLATE_PACK != 'uni_form': warnings.warn('skipping uniform tests with CRISPY_TEMPLATE_PACK=%s' % settings.CRISPY_TEMPLATE_PACK) return helper = FormHelper() helper.layout = Layout( Div( MultiField('field_name'), 'field_name2', ), Div('password'), 'extra_field' ) self.assertEqual(helper.filter(Div, MultiField).slice, [ [[0], 'div'], [[1], 'div'] ]) self.assertEqual(helper.filter(Div, MultiField, max_level=1).slice, [ [[0], 'div'], [[0, 0], 'multifield'], [[1], 'div'] ]) self.assertEqual(helper.filter(MultiField, max_level=1).slice, [ [[0, 0], 'multifield'] ])
def test_filter(self): helper = FormHelper() helper.layout = Layout(Div(MultiField("field_name"), "field_name2"), Div("password"), "extra_field") self.assertEqual(helper.filter(Div, MultiField).slice, [[[0], "div"], [[1], "div"]]) self.assertEqual( helper.filter(Div, MultiField, max_level=1).slice, [[[0], "div"], [[0, 0], "multifield"], [[1], "div"]] ) self.assertEqual(helper.filter(MultiField, max_level=1).slice, [[[0, 0], "multifield"]])
def test_filter_and_wrap_side_effects(): helper = FormHelper() layout = Layout( Div( 'extra_field', Div('password1'), ), ) helper.layout = layout with pytest.raises(DynamicError): helper.filter(Div, max_level=2).wrap(Div, css_class="test-class")
class UserForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput) confirm_password = forms.CharField(widget=forms.PasswordInput) class Meta: model = User fields = ('first_name', 'last_name', 'email', 'password', 'confirm_password', ) def __init__(self, *args, **kwargs): super(UserForm, self).__init__(*args, **kwargs) self.helper = FormHelper() self.helper.form_id = 'id-registration' #self.helper.form_class = 'form-horizontal' self.helper.form_method = 'post' self.helper.form_action = '/account/register/' #self.helper.add_input(Submit('submit', 'Sign up')) self.helper.layout = Layout( Fieldset( 'Sign up', 'first_name', 'last_name', 'email', 'password', 'confirm_password' ), FormActions( Submit('submit', 'Signup', css_class="btn-large") ) ) self.helper.filter(basestring, greedy=True).wrap(Field, css_class="input-xlarge") def clean_confirm_password(self): password = self.cleaned_data.get('password') confirm_password = self.cleaned_data.get('confirm_password') if not confirm_password: raise forms.ValidationError("You must confirm your password") if password != confirm_password: raise forms.ValidationError("Your passwords do not match") return confirm_password def save(self): new_user = User.objects.create_user( email=self.cleaned_data['email'], password=self.cleaned_data.get('password'), first_name=self.cleaned_data['first_name'], last_name=self.cleaned_data['last_name'], is_active=True, ) new_user.save() return new_user
def test_filter_and_wrap(self): helper = FormHelper() layout = Layout("email", Div("password1"), "password2") helper.layout = layout helper.filter(basestring).wrap(Field, css_class="test-class") self.assertTrue(isinstance(layout.fields[0], Field)) self.assertTrue(isinstance(layout.fields[1], Div)) self.assertTrue(isinstance(layout.fields[2], Field)) self.assertEqual(layout[2][0], "password2") # Wrapping a div in a div helper.filter(Div).wrap(Div, css_class="test-class") self.assertTrue(isinstance(layout.fields[1], Div)) self.assertTrue(isinstance(layout.fields[1].fields[0], Div)) self.assertEqual(layout[1][0][0], "password1")
def test_wrap_filtered_fields(self): helper = FormHelper() layout = Layout( 'email', Div('password1'), 'password2', ) helper.layout = layout helper.filter(basestring).wrap(Field, css_class="test-class") self.assertTrue(isinstance(layout.fields[0], Field)) self.assertTrue(isinstance(layout.fields[1], Div)) self.assertTrue(isinstance(layout.fields[2], Field)) # Wrapping a div in a div helper.filter(Div).wrap(Div, css_class="test-class") self.assertTrue(isinstance(layout.fields[1], Div)) self.assertTrue(isinstance(layout.fields[1].fields[0], Div))
def test_filter_and_wrap_side_effects(self): helper = FormHelper() layout = Layout( Div( 'extra_field', Div('password1'), ), ) helper.layout = layout self.assertRaises(DynamicError, lambda: helper.filter(Div, max_level=2).wrap(Div, css_class="test-class"))
def test_filter_and_wrap(): helper = FormHelper() layout = Layout( 'email', Div('password1'), 'password2', ) helper.layout = layout helper.filter(string_types).wrap(Field, css_class="test-class") assert isinstance(layout.fields[0], Field) assert isinstance(layout.fields[1], Div) assert isinstance(layout.fields[2], Field) assert layout[2][0] == 'password2' # Wrapping a div in a div helper.filter(Div).wrap(Div, css_class="test-class") assert isinstance(layout.fields[1], Div) assert isinstance(layout.fields[1].fields[0], Div) assert layout[1][0][0] == 'password1'
def test_filter_and_wrap(self): helper = FormHelper() layout = Layout( 'email', Div('password1'), 'password2', ) helper.layout = layout helper.filter(basestring).wrap(Field, css_class="test-class") self.assertTrue(isinstance(layout.fields[0], Field)) self.assertTrue(isinstance(layout.fields[1], Div)) self.assertTrue(isinstance(layout.fields[2], Field)) self.assertEqual(layout[2][0], 'password2') # Wrapping a div in a div helper.filter(Div).wrap(Div, css_class="test-class") self.assertTrue(isinstance(layout.fields[1], Div)) self.assertTrue(isinstance(layout.fields[1].fields[0], Div)) self.assertEqual(layout[1][0][0], 'password1')
def test_filter(): helper = FormHelper() helper.layout = Layout( Div( MultiField('field_name'), 'field_name2', ), Div('password'), 'extra_field' ) assert helper.filter(Div, MultiField).slice == [ [[0], 'div'], [[1], 'div'] ] assert helper.filter(Div, MultiField, max_level=1).slice == [ [[0], 'div'], [[0, 0], 'multifield'], [[1], 'div'] ] assert helper.filter(MultiField, max_level=1).slice == [ [[0, 0], 'multifield'] ]
def test_update_attributes_and_wrap_once(): helper = FormHelper() layout = Layout( 'email', Field('password1'), 'password2', ) helper.layout = layout helper.filter(Field).update_attributes(readonly=True) assert isinstance(layout[1], Field) assert layout[1].attrs == {'readonly': True} layout = Layout( 'email', Div(Field('password1')), 'password2', ) helper.layout = layout helper.filter(Field, max_level=2).update_attributes(readonly=True) assert isinstance(layout[1][0], Field) assert layout[1][0].attrs == {'readonly': True} layout = Layout( 'email', Div(Field('password1')), 'password2', ) helper.layout = layout helper.filter(string_types, greedy=True).wrap_once(Field) helper.filter(Field, greedy=True).update_attributes(readonly=True) assert isinstance(layout[0], Field) assert isinstance(layout[1][0], Field) assert isinstance(layout[1][0][0], string_types) assert isinstance(layout[2], Field) assert layout[1][0].attrs == {'readonly': True} assert layout[0].attrs == {'readonly': True} assert layout[2].attrs == {'readonly': True}
def test_update_attributes_and_wrap_once(): helper = FormHelper() layout = Layout( "email", Field("password1"), "password2", ) helper.layout = layout helper.filter(Field).update_attributes(readonly=True) assert isinstance(layout[1], Field) assert layout[1].attrs == {"readonly": True} layout = Layout( "email", Div(Field("password1")), "password2", ) helper.layout = layout helper.filter(Field, max_level=2).update_attributes(readonly=True) assert isinstance(layout[1][0], Field) assert layout[1][0].attrs == {"readonly": True} layout = Layout( "email", Div(Field("password1")), "password2", ) helper.layout = layout helper.filter(str, greedy=True).wrap_once(Field) helper.filter(Field, greedy=True).update_attributes(readonly=True) assert isinstance(layout[0], Field) assert isinstance(layout[1][0], Field) assert isinstance(layout[1][0][0], str) assert isinstance(layout[2], Field) assert layout[1][0].attrs == {"readonly": True} assert layout[0].attrs == {"readonly": True} assert layout[2].attrs == {"readonly": True}
class SurveyForm(ModelForm): institution = forms.CharField( max_length=256, widget=FKAutoCompleteWidget(InstitutionLookup) ) department = forms.CharField( max_length=256, label='Field of study', help_text='Choose the best available option. Be as specific as possible.', widget=FKAutoCompleteWidget(DepartmentLookup) ) def __init__(self, *args, **kwargs): self.helper = FormHelper() self.helper.form_class = 'form-horizontal' self.helper.add_input(Submit('submit', 'Submit')) # Set up fieldsets self.helper.layout = Layout( Div( HTML(''' <div class="alert alert-block alert-info"> Note: Participation in this survey is voluntary; you may opt out at any time. If you have any questions about GradPay, please contact us at <a href="mailto:[email protected]">[email protected]</a>. You can see our privacy policy <a href="/privacy/">here</a>. </div> '''), Fieldset( 'Program details', 'email', 'institution', 'department', 'degree', 'start_year', 'graduation_year', 'gender', 'age', 'international_student', 'linkedin', ), id='details', css_class='anchor' ), Div( Fieldset( 'Stipend and support: Current academic year', HTML(""" <div class="alert alert-info"> If you are a current student, please answer for the <strong>current</strong> year only. <br /> If you have already graduated, please answer for the <strong>last</strong> year of your program. </div> """), 'stipend', 'support_types', 'summer_stipend', 'tuition_coverage', 'tuition_amount', 'fees', 'fees_amount', id='stipend-now' ), id='stipend-current', css_class='anchor' ), Div( Fieldset( 'Stipend and support: General', 'total_terms', 'teaching_terms', 'contract', 'part_time_work', 'student_loans', 'union_member', id='stipend-general' ), id='stipend-general', css_class='anchor' ), Div( Fieldset( 'Health benefits', 'health_benefits', 'dental_benefits', 'vision_benefits', 'leave', ), id='benefits', css_class='anchor' ), Div( Fieldset( 'General', 'satisfaction', 'career', 'comments', ), id='comments', css_class='anchor' ) ) # Widen form fields self.helper.filter(basestring, max_level=2).wrap(Field, css_class='span5') super(SurveyForm, self).__init__(*args, **kwargs) for name, field in self.fields.items(): # Remove default help_text # Based on http://djangosnippets.org/snippets/2400/ if field.help_text: field.help_text = field.help_text.replace(remove_message, '').strip() # Add HTML5 attribs if field.required != False: field.widget.attrs['required'] = 'required' if isinstance(field, fields.IntegerField): # Only allow [0-9]* for integer fields # Prevent browsers from adding commas field.widget.input_type = 'text' field.widget.attrs['pattern'] = '[0-9]*' field.widget.attrs['reppattern'] = '[^0-9]' if isinstance(field.widget, SelectMultiple): field.widget.attrs['size'] = len(field.choices) if hasattr(field, 'min_value') and field.min_value is not None: field.widget.attrs['min'] = field.min_value if hasattr(field, 'max_value') and field.max_value is not None: field.widget.attrs['max'] = field.max_value class Meta: model = Survey widgets = { 'support_types': HelpSelectMultiple( help_texts=[val[0] for val in Support.objects.values_list('tooltip')] ), 'satisfaction': RadioSelect(attrs={'class': 'radio'}), } def clean(self): # Get cleaned data cleaned_data = super(ModelForm, self).clean() # Stop year must be later than start year start_year = cleaned_data.get('start_year') stop_year = cleaned_data.get('stop_year') if start_year and stop_year: if start_year > stop_year: msg = 'Stop year must be greater than or equal to start year.' self._errors['stop_year'] = self.error_class([msg]) # Teaching terms must be <= total terms total_terms = cleaned_data.get('total_terms') teaching_terms = cleaned_data.get('teaching_terms') research_terms = cleaned_data.get('research_terms') if teaching_terms and total_terms: if teaching_terms > total_terms: self._errors['teaching_terms'] = self.error_class(['Teaching terms must be less than or equal to total terms']) if research_terms and total_terms: if teaching_terms > total_terms: self._errors['research_terms'] = self.error_class(['Research terms must be less than or equal to total terms']) # Return cleaned data return cleaned_data def clean_email(self): # Email must end in .edu if not re.search('\.edu$', self.cleaned_data['email'], re.I): raise forms.ValidationError(_('Must be a valid academic [.edu] email address.')) return self.cleaned_data['email'] def clean_linkedin(self): """ Verify that LinkedIn URL is valid and points to an existing profile. """ # Get LinkedIn URL from form url = self.cleaned_data['linkedin'] # OK if empty if not url: return url # Check LinkedIn URL if not re.search('linkedin\.com/(in|pub)/', url, re.I): raise forms.ValidationError(_('Invalid LinkedIn URL.')) # Check for // to assure absolute path if '//' not in url: url = '//' + url # Set URL scheme to http by default url = urlparse.urlparse(url, 'http').geturl() # Open LinkedIn page req = requests.head(url) # Check for Not Found in <title> if req.status_code != 200: raise forms.ValidationError(_('LinkedIn profile not found.')) # Return full URL return url def clean_institution(self): # Institution must be in suggestions institution = self.cleaned_data.get('institution') if institution: try: institution_record = Institution.objects.get(name=institution) except: raise forms.ValidationError(_('Institution must be chosen from suggestions.')) return institution_record def clean_department(self): # Department must be in suggestions department = self.cleaned_data.get('department') if department: try: department_record = Department.objects.get(name=department) except: raise forms.ValidationError(_('Department must be chosen from suggestions.')) return department_record def save(self): instance = super(SurveyForm, self).save(commit=False) # Generate random salt salt = hashlib.sha1(str(random.random())).hexdigest()[:5] # Generate activation key instance.activation_key = hashlib.sha1(salt + instance.email).hexdigest() # Set active to False instance.active = False # Save changes instance.save() self.save_m2m() instance.save_hidden() # Send activation email activation.send_activation_email(instance)
def test_filter(): helper = FormHelper() helper.layout = Layout(Div(MultiField("field_name"), "field_name2",), Div("password"), "extra_field") assert helper.filter(Div, MultiField).slice == [[[0], "div"], [[1], "div"]] assert helper.filter(Div, MultiField, max_level=1).slice == [[[0], "div"], [[0, 0], "multifield"], [[1], "div"]] assert helper.filter(MultiField, max_level=1).slice == [[[0, 0], "multifield"]]
def test_filter_and_wrap_side_effects(): helper = FormHelper() layout = Layout(Div("extra_field", Div("password1"),),) helper.layout = layout with pytest.raises(DynamicError): helper.filter(Div, max_level=2).wrap(Div, css_class="test-class")