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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
# Copyright (c) 2004 Divmod.
# See LICENSE for details.
from __future__ import generators
from zope.interface import implements
from twisted.python import components
from nevow import inevow
from nevow.tags import *
from formless import iformless
import os.path
try:
enumerate = enumerate
except:
def enumerate(collection):
i = 0
it = iter(collection)
while 1:
yield (i, it.next())
i += 1
class PrefixerDict(dict):
def __init__(self, prefix, errors):
if prefix is None: prefix = ''
self.prefix = prefix
self.errors = errors
dict.__init__(self)
def __setitem__(self, key, value):
if key is None:
key = ''
if key == '':
pfxkey = self.prefix
else:
pfxkey = '.'.join((self.prefix, key))
self.errors[pfxkey] = value
def __getitem__(self, key):
if key == '':
pfxkey = self.prefix
else:
pfxkey = '.'.join((self.prefix, key))
return self.errors[pfxkey]
def update(self, other):
for key, value in other.items():
self[key] = value
class FormDefaults(components.Adapter):
def __init__(self):
self.defaults = {}
def setDefault(self, key, value, context=None):
self.defaults[key] = value
def getDefault(self, key, context=None):
#print "getting default for key", key, self.defaults
# 1) Check on the request
current = self.defaults.get(key, None)
if current is None:
# 2) Check on the session
if context is not None:
sessionDefaults = context.locate(iformless.IFormDefaults)
if sessionDefaults is not self:
current = sessionDefaults.getDefault(key)
if current is not None:
return current
# 3) Ask the Binding instance for the default values
try:
configurable = context.locate(iformless.IConfigurable)
except KeyError:
return ''
return configurable.getDefault(context.locate(inevow.IData))
return current
def getAllDefaults(self, key):
return PrefixerDict(key, self.defaults)
def clearAll(self):
self.defaults = {}
class FormErrors(components.Adapter):
"""An object which keeps track of which forms have which errors
"""
implements(iformless.IFormErrors)
def __init__(self):
self.errors = {}
def setError(self, errorKey, error):
self.errors[errorKey] = error
def getError(self, errorKey):
#print "get error", errorKey, self.__dict__
return self.errors.get(errorKey)
def getAllErrors(self, formName):
return PrefixerDict(formName, self.errors)
def updateErrors(self, formName, errors):
PrefixerDict(formName, self.errors).update(errors)
def clearErrors(self, formName):
for key in self.errors.keys():
if key.startswith(formName):
del self.errors[key]
def clearAll(self):
self.errors = {}
def calculatePostURL(context, data):
postLocation = inevow.ICurrentSegments(context)[-1]
if postLocation == '':
postLocation = '.'
try:
configurableKey = context.locate(iformless.IConfigurableKey)
except KeyError:
#print "IConfigurableKey was not remembered when calculating full binding name for %s in node %s" % (configurable, context.key)
configurableKey = ''
bindingName = context.key
return "%s/freeform_post!%s!%s" % (postLocation, configurableKey, bindingName)
def keyToXMLID(key):
"""Convert a key into an XML-styleinevow.ID """
if not key:
#print 'keyToXMLID: no key, but why?'
return '***Error: Unset***'
return '-'.join(key.split('.'))
def getError(context):
errors = context.locate(iformless.IFormErrors)
err = errors.getError(context.key)
if err is not None:
return err
return comment["\nNo error for error key: %s\n" % context.key]
|