1
2
3
4
5
6
7
8
9
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
import re
import copy
from django import forms
from utils.forms import BadFormValidation
from utils.mongo_connection import get_db
from polls.models import Poll
from pollster.models import Pollster
class PollForm(forms.Form):
id = forms.RegexField(
required=False, regex=r'[0-9A-Fa-f]{24}', widget=forms.HiddenInput())
name = forms.CharField(
required=True, label="Nombre")
status = forms.ChoiceField(
required=False,
choices=[('', '')] + [c for c in Poll.status_choices()],
label="Estado")
pollsters = forms.MultipleChoiceField(
required=False,
label="Encuestadores asignados"
)
def __init__(self, *args, **kwargs):
super(PollForm, self).__init__(*args, **kwargs)
# Hack for django class-based view cache
self.fields['pollsters'].choices = [('', 'Ninguno')] + [
(str(p.id), p.username) for p in Pollster.all()]
def clean_name(self):
id = self.cleaned_data['id']
name = self.cleaned_data['name']
if not id:
existing = get_db().polls.find_one(
{'name': re.compile("^%s$" % name, re.IGNORECASE)})
if existing:
msg = u"Poll name '%s' already in use." % name
raise forms.ValidationError(msg)
return name
def clean_pollsters(self):
status = self.cleaned_data['status']
if status == Poll.CLOSED:
del self.cleaned_data['pollsters']
return None
return filter(lambda p: p, self.cleaned_data['pollsters'])
def save(self):
# REQUIRE: when use this method, run is_valid method first
_data = copy.deepcopy(self.cleaned_data)
for field_name, field_value in self.cleaned_data.iteritems():
if not field_value and not isinstance(field_value, list):
del _data[field_name]
id = self.cleaned_data['id']
if id:
# Preserving!. REFACTORING: Idea to preserve in any document
# The refactoring is big, django form must be capable that accept
# any type of mongo document
poll = Poll.get(id)
old_data = poll.to_python(with_dates=True)
if len(poll.pollsters) and poll.status == Poll.CLOSED:
if "pollsters" in _data.keys():
del _data['pollsters']
old_data.update(_data)
_data = old_data
poll = Poll(data=_data)
try:
poll_id = poll.save()
return Poll.get(id=poll_id)
except Poll.ValidationError:
raise BadFormValidation(poll.errors)
return None
|