merging old commit with current master
[oweals/karmaworld.git] / karmaworld / apps / courses / forms.py
1 #!/usr/bin/env python
2 # -*- coding:utf8 -*-
3 # Copyright (C) 2012  FinalsClub Foundation
4
5 from django.conf import settings
6 from django.forms import ModelForm
7 from django.forms import CharField
8
9 from ajax_select.fields import AutoCompleteSelectField
10 from ajax_select.fields import AutoCompleteSelectWidget
11 from ajax_select_cascade.fields import AutoCompleteDependentSelectField
12 from ajax_select_cascade.fields import AutoCompleteDependentSelectWidget
13
14 from karmaworld.apps.courses.models import Course
15
16 class CourseForm(ModelForm):
17     school = AutoCompleteSelectField(
18         'school',
19         widget=AutoCompleteSelectWidget(
20             'school',
21             attrs={'id': 'dom_autocomplete_school'}
22         )
23     )
24     department = AutoCompleteDependentSelectField(
25         'dept_given_school',
26         widget=AutoCompleteDependentSelectWidget(
27             'dept_given_school',
28              attrs={'data-upstream-id': 'dom_autocomplete_school'},
29         )
30     )
31
32     def __init__(self, *args, **kwargs):
33         """ Add a dynamically named field. """
34         super(CourseForm, self).__init__(*args, **kwargs)
35         self.fields[settings.HONEYPOT_FIELD_NAME] = CharField(required=False)
36
37     class Meta:
38         model = Course
39         # order the fields
40         fields = ('school', 'department', 'name', 'instructor_name',
41                   'instructor_email', 'url')
42
43     def clean(self, *args, **kwargs):
44         """ Additional form validation. """
45
46         # Call ModelFormMixin or whoever normally cleans house.
47         cleaned_data = super(CourseForm, self).clean(*args, **kwargs)
48
49         # parts of this code borrow from
50         # https://github.com/sunlightlabs/django-honeypot
51         hfn = settings.HONEYPOT_FIELD_NAME
52         formhoneypot = cleaned_data.get(hfn, None)
53         if formhoneypot and (formhoneypot != settings.HONEYPOT_VALUE):
54             # Highlight a failure to follow instructions.
55             # When the template dynamically generates the form, replace
56             # 'honeypot' with hfn
57             self._errors['honeypot'] = [u'You did not follow directions.']
58             del cleaned_data[hfn]
59         return cleaned_data