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()