wiki/python
Framework Structure
garter.form.*
garter.site.*
garter.utils.*
garter.validations.*
New Form Structure
The function of a high level form structure is multifaceted. First off the form has to be a representation of the form data where the data elements of the form can be easily accessible.
class Form(object):
def __init__(self, form, formSet):
self.formSet = formSet
self.formData = self.processForm(formSet, form)
def __getitem__(self, k):
return self.formData[k]
Example:
import garter.form
import garter.transaction
...
try:
loginForm = mafi.form.Form(form, {'username': validateUserName,
'password': validatePassword})
except garter.form.Error, e:
self.pageData.update(e.pageData)
return self.render()
try:
transaction.login(conn, loginForm['username'],
loginForm['password'])
except garter.transaction.Error, e:
self.pageData['errorMessage'] = e.message
self.pageData.update(loginForm.pageData)
return self.render()
Example 2:
def do_login(self, form):
db = self.db()
try:
login = FormLogin()
login.login(db)
except garter.form.Error, e:
self.pageData.update(e.pageData)
return self.render()
except garter.transaction.Error, e:
self.pageData.update(e.pageData)
self.pageData['errorMessage'] = e.message
return self.render()
Example 3:
def formicate(meth):
def aux(self, form):
try:
return meth(self, form)
except garter.forms.Error, e:
self.pageData.update(e.pageData)
return self.render()
except garter.transactions.Error, e:
self.pageData.update(e.pageData)
self.pageData['errorMessage'] = e.message
return self.render()
return aux
...
@formicate
def do_login(self, form):
db = self.db()
loginForm = FormLogin(form)
transactions.login(db, self, loginForm.username,
loginForm.password)
return self.redirect('/')
Value Flipper
class Flipper(object):
def __init__(self, values):
self.values = values
self.itr = iter(values)
if len(values) == 0:
raise Exception('Flipper initialization error')
def __iter__(self):
return self
def _next(self):
try:
val = self.itr.next()
except StopIteration:
self.itr = iter(self.values)
val = self.itr.next()
return val
def next(self):
return self._next()
def value(self):
return self._next()
flip = Flipper(['white', 'grey'])
for x in xrange(1, 20):
print '<td style="background-color:%s">\n' % flip.value()
