forms.py 5.42 KB
Newer Older
1
from django import forms
2
from go.models import URL, RegisteredUser
3
from django.core.exceptions import ValidationError
4
from captcha.fields import CaptchaField
David Haynes's avatar
David Haynes committed
5
from crispy_forms.helper import FormHelper
6 7
from crispy_forms.layout import Layout, Fieldset, Submit, HTML, Div, Field
from crispy_forms.bootstrap import StrictButton, PrependedText, Accordion, AccordionGroup
8 9

class URLForm(forms.ModelForm):
10

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    # Custom target URL field
    target = forms.URLField(
        required=True,
        label='Long URL',
        max_length=1000,
        widget=forms.URLInput(attrs={
        })
    )

    # Check to make sure the short url has not been used
    def unique_short(value):
        try:
            URL.objects.get(short__iexact=value)
        except URL.DoesNotExist:
            return
        raise ValidationError('Short url already exists.')

    # Custom short-url field with validators.
    short = forms.SlugField(
        required=False,
        label='Short URL (Optional)',
        widget=forms.TextInput(),
        validators=[unique_short],
        max_length=20,
        min_length=3,
    )

    DAY = '1 Day'
    WEEK = '1 Week'
    MONTH = '1 Month'
    NEVER = 'Never'

    EXPIRATION_CHOICES = (
        (DAY, DAY),
        (WEEK, WEEK),
        (MONTH, MONTH),
        (NEVER, NEVER),
    )

    # Add a custom expiration choice field.
    expires = forms.ChoiceField(
        required=True,
        label='Expiration',
        choices=EXPIRATION_CHOICES,
        initial=NEVER,
        widget=forms.RadioSelect(),
    )

    def __init__(self, *args, **kwargs):
60
        super(URLForm, self).__init__(*args, **kwargs)
61
        self.helper = FormHelper()
62
        self.helper.form_method = 'POST'
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-md-1'
        self.helper.field_class = 'col-md-6'


        self.helper.layout = Layout(
            Fieldset(
                '',
                Accordion(
                    AccordionGroup('Step 1: Long URL',
                        Div(
                            HTML("""
                                <h4>Paste the URL you would like to shorten:</h4>
                                <br />
                            """),
                            PrependedText('target',
80
                            'https:// required',
81 82 83 84 85
                            ),
                            style="background: rgb(#F6F6F6);",
                            title="target_url",
                            css_class="first_group",
                        ),
86 87 88
                        css_id='firstCollapse',
                        active=True,
                        template='crispy/accordian-group.html',
89 90 91 92 93
                    ),
                    AccordionGroup('Step 2: Short URL',
                        Div(
                            HTML("""
                                <h4>Create a custom Go address:</h4>
94
                                <br />
95 96 97 98 99 100 101
                            """),
                            PrependedText('short',
                            'go.gmu.edu/',
                            ),
                            style="background: rgb(#F6F6F6);",
                            title="short_url",
                            css_class="second_group",
102 103
                        ),
                        css_id='secondCollapse',
104
                        active=True,
105
                        template='crispy/accordian-group.html',
106 107 108 109 110
                    ),
                    AccordionGroup('Step 3: URL Expiration',
                        Div(
                            HTML("""
                                <h4>Set when you would like your Go address to expire:</h4>
111
                                <br />
112 113 114 115 116
                            """),
                            'expires',
                            style="background: rgb(#F6F6F6);",
                            title="expires_url",
                            css_class="third_group",
117 118
                        ),
                        css_id='thirdCollapse',
119
                        active=True,
120 121 122 123
                        template='crispy/accordian-group.html',
                    ),
                    css_id='accordian',
                    template='crispy/accordian.html'
124 125 126 127
                ),
            HTML("""
                <br />
            """),
128
            StrictButton('Shorten', css_class="btn-success", type='submit'),
129 130 131
        )
    )

132

133 134 135 136 137 138
    class Meta:
        model = URL
        fields = ('target',)
        exclude = ('owner', 'short', 'date_created', 'clicks', 'expires')


139
class SignupForm(forms.ModelForm):
140 141 142 143 144 145 146 147

    def validate_username(username):
        try:
            registered = RegisteredUser.objects.get(username=username)
            raise ValidationError('Username "%s" is already in use.' % username)
        except RegisteredUser.DoesNotExist:
            return

148
    username = forms.CharField(
149 150 151
        required=True,
        label='Mason NetID',
        max_length=30,
152
        validators=[validate_username],
153
        widget=forms.TextInput(attrs={
154 155 156
        }),
    )
    full_name = forms.CharField(
157 158 159 160
        required=True,
        label='Full Name',
        max_length=100,
        widget=forms.TextInput(attrs={
161 162 163
        }),
    )
    description = forms.CharField(
164 165 166 167
        required=False,
        label='Description (Optional)',
        max_length=200,
        widget=forms.Textarea(attrs={
168 169
        }),
    )
170
    captcha = CaptchaField()
171 172 173

    class Meta:
        model = RegisteredUser
174
        fields = '__all__'