Skip to content

Commit

Permalink
allow add buttons directly to form
Browse files Browse the repository at this point in the history
  • Loading branch information
fafhrd91 committed Oct 10, 2011
1 parent 2348bfc commit 43afa10
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 20 deletions.
43 changes: 27 additions & 16 deletions memphis/form/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,30 @@ def __init__(self, *args):
buttons = []
for arg in args:
if isinstance(arg, Buttons):
buttons += arg.items()
buttons += arg.values()
else:
buttons.append((arg.name, arg))
buttons.append(arg)

for name, button in buttons:
self[name] = button
self.add(*buttons)

def add(self, *btns):
for btn in btns:
if btn.name in self:
raise ValueError("Duplicate name", btn.name)

self[btn.name] = btn

def addAction(self, title, **kwargs):
# Add the title to button constructor keyword arguments
kwargs['title'] = title
if 'name' not in kwargs:
kwargs['name'] = createId(title)

button = Button(**kwargs)

self.add(button)

return button

def __add__(self, other):
return self.__class__(self, other)
Expand Down Expand Up @@ -143,25 +161,18 @@ def createId(name):


def button(title, **kwargs):
# Add the title to button constructor keyword arguments
kwargs['title'] = title
if 'name' not in kwargs:
kwargs['name'] = createId(title)

# Create button and add it to the button manager
button = Button(**kwargs)

# install buttons manager
f_locals = sys._getframe(1).f_locals

buttons = f_locals.get('buttons')
if buttons is None:
f_locals['buttons'] = Buttons(button)
else:
buttons[button.name] = button
buttons = Buttons()
f_locals['buttons'] = buttons

btn = buttons.addAction(title, **kwargs)

def createHandler(func):
button.actionName = func.__name__
btn.actionName = func.__name__
return func

return createHandler
8 changes: 7 additions & 1 deletion memphis/form/form.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class Form(view.View):
interface.implements(IForm, IInputForm)

fields = Fieldset()
buttons = Buttons()
buttons = None

label = None
description = ''
Expand All @@ -118,6 +118,12 @@ class Form(view.View):

params = UnicodeMultiDict(MultiDict({}), 'utf-8')

def __init__(self, context, request):
super(Form, self).__init__(context, request)

if self.buttons is None:
self.buttons = Buttons()

@reify
def action(self):
return self.request.url
Expand Down
16 changes: 13 additions & 3 deletions memphis/form/interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
FORM_INPUT = 'form-input'
FORM_DISPLAY = 'form-display'

required = object()


class Invalid(Exception):

Expand All @@ -25,7 +23,7 @@ def __repr__(self):


class _null(object):
""" Represents a null value in colander-related operations. """
""" Represents a null value in field-related operations. """
def __nonzero__(self):
return False

Expand All @@ -35,6 +33,18 @@ def __repr__(self):
null = _null()


class _required(object):
""" Represents a required value in field-related operations. """

def __nonzero__(self):
return False

def __repr__(self):
return '<widget.required>'

required = _required()


# ----[ Vocabulary ]----------------------------------------------------------

# vocabulary/term interfaces
Expand Down
33 changes: 33 additions & 0 deletions memphis/form/tests/test_button.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,39 @@ def test_add(self):
btn1 = form.Button(name='test1', actionName='action')
btn2 = form.Button(name='test2', actionName='action')

btns = form.Buttons(btn1)

btns.add(btn2)
self.assertEqual(btns.keys(), [btn1.name, btn2.name])
self.assertEqual(btns.values(), [btn1, btn2])

def test_add_duplicate(self):
from memphis import form

btn1 = form.Button(name='test1', actionName='action')
btn2 = form.Button(name='test1', actionName='action')

btns = form.Buttons(btn1)

self.assertRaises(ValueError, btns.add, btn2)

def test_add_action(self):
from memphis import form

btns = form.Buttons()

btn1 = btns.addAction('Test action')

self.assertIsInstance(btn1, form.Button)
self.assertEqual(btns.keys(), [btn1.name])
self.assertEqual(btns.values(), [btn1])

def test_iadd(self):
from memphis import form

btn1 = form.Button(name='test1', actionName='action')
btn2 = form.Button(name='test2', actionName='action')

btns1 = form.Buttons(btn1)
btns2 = form.Buttons(btn2)

Expand Down
3 changes: 3 additions & 0 deletions memphis/form/tests/test_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,9 @@ def test_fieldset_errors(self):
self.assertEqual(repr(err1), "Invalid(<TextField 'test'>: <error1>)")
self.assertEqual(str(form.null), '<widget.null>')

self.assertFalse(form.required)
self.assertEqual(repr(form.required), '<widget.required>')


class TestField(Base):

Expand Down

0 comments on commit 43afa10

Please sign in to comment.