Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/formless/formutils.py
blob: b01bc96c158f504d167f96d01cf25a92ec67dde8 (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
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]