view apps/snippet/forms.py @ 203:c5087ce140c9

modified snippets model file to add rating field. This series of updates should be applied carefully and south should be used so that it can add additional fields into the database without resetting the database
author Ahsan Ali Shahid <ahsan.ali.shahid@gmail.com>
date Fri, 19 Jul 2013 22:11:52 +0500
parents 499e5f47f278
children d534881629ff
line wrap: on
line source

import datetime

from django import forms
from django.conf import settings
from django.utils.translation import ugettext_lazy as _

from apps.snippet.models import Snippet
from apps.snippet.highlight import LEXER_LIST_ALL, LEXER_LIST, LEXER_DEFAULT

#===============================================================================
# Snippet Form and Handling
#===============================================================================

EXPIRE_CHOICES = (
    (3600, _(u'In one hour')),
    (3600*24*7, _(u'In one week')),
    (3600*24*30, _(u'In one month')),
    (3600*24*30*12*100, _(u'Save forever')), # 100 years, I call it forever ;)
)

EXPIRE_DEFAULT = 3600*24*30

class SnippetForm(forms.ModelForm):
    file = forms.FileField(help_text=_("If the snippet you want to post is \
        saved as a file on your computer, you can upload it directly rather \
        than having to copy and paste it into the box above. If a file \
        is specified, the text in the content field above will be \
        ignored."),
        required=False)

    expire_options = forms.ChoiceField(
        choices=EXPIRE_CHOICES,
        initial=EXPIRE_DEFAULT,
        label=_(u'Expires'),
    )


    form_choices = ( (x,x) for x in range(1,6) )
    Rate = forms.ChoiceField(form_choices,widget=forms.RadioSelect(attrs={'onclick' :"document.getElementById('rate_form').submit();","class":"rate_radio"}))

    def __init__(self, *args, **kwargs):
        request = kwargs.pop('request')
        super(SnippetForm, self).__init__(*args, **kwargs)
        self.request = request

        try:
            if self.request.session['userprefs'].get('display_all_lexer',
                                                     False):
                self.fields['lexer'].choices = LEXER_LIST_ALL
        except KeyError:
            pass

        try:
            self.fields['author'].initial = \
                    self.request.session['userprefs'].get('default_name', '')
        except KeyError:
            pass

        # Make the content field not required (validated in clean())
        self.fields['content'].required = False
        self.fields['title'].required = True

    def clean(self):
        cleaned_data = super(SnippetForm, self).clean()
        file_data = cleaned_data.get('file')
        content = cleaned_data.get('content')

        if file_data:
            file_data.open()
            content_type = file_data.content_type

            # Do some very basic checking of types. NOT SECURE.
            if (content_type.startswith('text/') or
                content_type.startswith('application')):
                cleaned_data['content'] = file_data.read()
            else:
                raise forms.ValidationError(_("Please ensure that you upload \
                    a text file."))
        elif not content:
            # No snippet data specified
            raise forms.ValidationError(_("Please specify some content for \
                the snippet, either in the content field or by uploading \
                a file."))

        return cleaned_data

    def save(self, parent=None, *args, **kwargs):

        # Set parent snippet
        if parent:
            self.instance.parent = parent

        # Add expire datestamp
        self.instance.expires = datetime.datetime.now() + \
            datetime.timedelta(seconds=int(self.cleaned_data['expire_options']))

        # Save snippet in the db
        super(SnippetForm, self).save(*args, **kwargs)

        # Add the snippet to the user session list
        if self.request.session.get('snippet_list', False):
            if len(self.request.session['snippet_list']) >= \
                   getattr(settings, 'MAX_SNIPPETS_PER_USER', 10):
                self.request.session['snippet_list'].pop(0)
            self.request.session['snippet_list'] += [self.instance.pk]
        else:
            self.request.session['snippet_list'] = [self.instance.pk]

        return self.request, self.instance

    class Meta:
        model = Snippet
        fields = (
            'title',
            'content',
            'lexer',
        )


#===============================================================================
# User Settings
#===============================================================================

USERPREFS_FONT_CHOICES = [(None, _(u'Default'))] + [
    (i, i) for i in sorted((
        'Monaco',
        'Bitstream Vera Sans Mono',
        'Courier New',
        'Consolas',
    ))
]

USERPREFS_SIZES = [(None, _(u'Default'))] + [(i, '%dpx' % i) for i in range(5, 25)]

class UserSettingsForm(forms.Form):

    default_name = forms.CharField(label=_(u'Default Name'), required=False)
    display_all_lexer = forms.BooleanField(
        label=_(u'Display all lexer'),
        required=False,
        widget=forms.CheckboxInput,
        help_text=_(u'This also enables the super secret ' \
                     '\'guess lexer\' function.'),
    )
    font_family = forms.ChoiceField(label=_(u'Font Family'),
                                    required=False,
                                    choices=USERPREFS_FONT_CHOICES)
    font_size = forms.ChoiceField(label=_(u'Font Size'),
                                  required=False,
                                  choices=USERPREFS_SIZES)
    line_height = forms.ChoiceField(label=_(u'Line Height'),
                                    required=False,
                                    choices=USERPREFS_SIZES)