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']
     ])
Example #2
0
 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")
Example #4
0
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
Example #5
0
    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")
Example #6
0
    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))
Example #7
0
 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'
Example #9
0
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'
Example #10
0
    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}
Example #13
0
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}
Example #14
0
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)
Example #15
0
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"]]
Example #16
0
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")