File: index.py

package info (click to toggle)
python-formencode 2.1.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,852 kB
  • sloc: python: 6,772; makefile: 130; sh: 96; javascript: 61
file content (101 lines) | stat: -rw-r--r-- 2,705 bytes parent folder | download | duplicates (2)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from formencode import Invalid, htmlfill, Schema, validators

from WebKit.Page import Page


page_style = '''
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>Tell me about yourself</title>
  <style type="text/css">
    .error {background-color: #ffdddd}
    .error-message {border: 2px solid #f00}
  </style>
 </head>
 <body>

 <h1>Tell me about yourself</h1>
 <p><i>A FormEncode example</i></p>

 %s

 </body></html>'''

form_template = '''
<form action="" method="POST">

<p>Your name:<br>
<form:error name="name">
<input type="text" name="name"></p>

<p>Your age:<br>
<form:error name="age">
<input type="text" name="age"></p>

<p>Your favorite color:<br>
<form:error name="color">
<input type="checkbox" value="red" name="color"> Red<br>
<input type="checkbox" value="blue" name="color"> Blue<br>
<input type="checkbox" value="black" name="color"> Black<br>
<input type="checkbox" value="green" name="color"> Green<br>
<input type="checkbox" value="pink" name="color"> Pink</p>

<input type="submit" name="_action_save" value="Submit">
</form>'''

response_template = '''
<h2>Hello, %(name)s!</h2>
<p>You are %(age)d years old
and your favorite color is %(color)s.</p>'''


class FormSchema(Schema):
    name = validators.String(not_empty=True)
    age = validators.Int(min=13, max=99)
    color = validators.OneOf(['red', 'blue', 'black', 'green'])
    filter_extra_fields = True
    allow_extra_fields = True


class index(Page):

    def awake(self, trans):
        Page.awake(self, trans)
        self.rendered_form = None

    def actions(self):
        return ['save']

    def save(self):
        fields = self.request().fields()
        try:
            fields = FormSchema.to_python(fields, self)
        except Invalid as e:
            errors = {k: v.encode('utf-8')
                for k, v in e.unpack_errors().items()}
            print("Errors:", errors)
            self.rendered_form = htmlfill.render(form_template,
                defaults=fields, errors=errors)
            self.writeHTML()
        else:
            self.doAction(fields)

    def doAction(self, fields):
        print("Fields:", fields)
        self.rendered_form = response_template % fields
        self.writeHTML()

    def writeHTML(self):
        if self.rendered_form is None:
            self.rendered_form = htmlfill.render(form_template,
                defaults=self.getDefaults())
        self.write(page_style % self.rendered_form)

    def getDefaults(self):
        return dict(age='enter your age', color=['blue'])

    def preAction(self, trans):
        pass
    postAction = preAction