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

class URLForm(forms.ModelForm):
9

10 11 12
    # Custom target URL field
    target = forms.URLField(
        required=True,
13
        label='Long URL (Required)',
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
        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,
52
        label='Expiration (Required)',
53 54 55 56 57 58
        choices=EXPIRATION_CHOICES,
        initial=NEVER,
        widget=forms.RadioSelect(),
    )

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

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

131

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


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

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

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

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