Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/webapp/polls/forms.py
blob: 7de219da1ba57f86e658c87257c962ee870444ab (plain)
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