[Checkins] SVN: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/ Move a lot more widgets tests and source implementation to zope.formlib.
Martijn Faassen
faassen at startifact.com
Wed Dec 30 17:26:35 EST 2009
Log message for revision 107398:
Move a lot more widgets tests and source implementation to zope.formlib.
Changed:
U zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/interfaces.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/objectwidget.txt
U zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/source.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/source.txt
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_choicecollections.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_choicewidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_datetimewidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_datewidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_decimalwidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_displaywidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_intwidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_itemswidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_multicheckboxwidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_objectwidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_passwordwidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_radiowidget.py
D zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_source.py
-=-
Modified: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/interfaces.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/interfaces.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/interfaces.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -28,7 +28,7 @@
from zope.formlib.interfaces import (
IBrowserWidget, ISimpleInputWidget, ITextBrowserWidget,
- IWidgetInputErrorView)
+ IWidgetInputErrorView, ISourceQueryView)
class IFormCollaborationView(Interface):
"""Views that collaborate to create a single form.
@@ -114,22 +114,3 @@
i.e. it delegates to the `IAdding` view.
"""
-class ISourceQueryView(Interface):
- """View support for querying non-iterable sources
- """
-
- def render(name):
- """Return a rendering of the search form elements
-
- The query view should use `name` as the prefix for its widgets.
- """
-
- def results(name):
- """Return the results of the query
-
- The query view should use `name` as the prefix for its widgets.
-
- The value returned is an iterable.
-
- None may be returned to indicate that there are no results.
- """
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/objectwidget.txt
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/objectwidget.txt 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/objectwidget.txt 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,149 +0,0 @@
-=============
-Object Widget
-=============
-
-The following example shows a Family with Mother and Father.
-First define the interface for a person:
-
- >>> from zope.interface import Interface, implements
- >>> from zope.schema import TextLine
-
- >>> class IPerson(Interface):
- ... """Interface for Persons."""
- ...
- ... name = TextLine(title=u'Name', description=u'The first name')
-
-Let's define the class:
-
- >>> class Person(object):
- ...
- ... implements(IPerson)
- ...
- ... def __init__(self, name=''):
- ... self.name = name
-
-Let's define the interface family:
-
- >>> from zope.schema import Object
-
- >>> class IFamily(Interface):
- ... """The familiy interface."""
- ...
- ... mother = Object(title=u'Mother',
- ... required=False,
- ... schema=IPerson)
- ...
- ... father = Object(title=u'Father',
- ... required=False,
- ... schema=IPerson)
-
-Let's define the class family with FieldProperty's mother and father
-FieldProperty validate the values if they get added:
-
- >>> from zope.schema.fieldproperty import FieldProperty
-
- >>> class Family(object):
- ... """The familiy interface."""
- ...
- ... implements(IFamily)
- ...
- ... mother = FieldProperty(IFamily['mother'])
- ... father = FieldProperty(IFamily['father'])
- ...
- ... def __init__(self, mother=None, father=None):
- ... self.mother = mother
- ... self.father = father
-
-Let's make a instance of Family with None attributes:
-
- >>> family = Family()
- >>> bool(family.mother == None)
- True
-
- >>> bool(family.father == None)
- True
-
-Let's make a instance of Family with None attributes:
-
- >>> mother = Person(u'Margrith')
- >>> father = Person(u'Joe')
- >>> family = Family(mother, father)
- >>> IPerson.providedBy(family.mother)
- True
-
- >>> IPerson.providedBy(family.father)
- True
-
-Let's define a dummy class which doesn't implements IPerson:
-
- >>> class Dummy(object):
- ... """Dummy class."""
- ... def __init__(self, name=''):
- ... self.name = name
-
-Raise a SchemaNotProvided exception if we add a Dummy instance to a Family
-object:
-
- >>> foo = Dummy('foo')
- >>> bar = Dummy('bar')
- >>> family = Family(foo, bar)
- Traceback (most recent call last):
- ...
- SchemaNotProvided
-
-Now let's setup a enviroment for use the widget like in a real application:
-
- >>> from zope.app.testing import ztapi
- >>> from zope.publisher.browser import TestRequest
- >>> from zope.schema.interfaces import ITextLine
- >>> from zope.schema import TextLine
- >>> from zope.app.form.browser import TextWidget
- >>> from zope.app.form.browser import ObjectWidget
- >>> from zope.formlib.interfaces import IInputWidget
-
-Register the TextLine widget used in the IPerson interface for the field 'name'.
-
- >>> ztapi.browserViewProviding(ITextLine, TextWidget, IInputWidget)
-
-Let's define a request and provide input value for the mothers name used
-in the family object:
-
- >>> request = TestRequest(HTTP_ACCEPT_LANGUAGE='pl')
- >>> request.form['field.mother.name'] = u'Margrith Ineichen'
-
-Before we update the object let's check the value name of the mother
-instance on the family object:
-
- >>> family.mother.name
- u'Margrith'
-
-Now let's initialize a ObjectWidget with the right attributes:
-
- >>> mother_field = IFamily['mother']
- >>> factory = Person
- >>> widget = ObjectWidget(mother_field, request, factory)
-
-Now comes the magic. Apply changes means we force the ObjectWidget to read
-the request, extract the value and save it on the content. The ObjectWidget
-instance uses a real Person class (factory) for add the value. The value is
-temporary stored in this factory class. The ObjectWidget reads the value from
-this factory and set it to the attribute 'name' of the instance mother
-(The object mother is allready there). If we don't have a instance mother
-allready store in the family object, the factory instance will be stored
-directly to the family attribute mother. For more information see the method
-'applyChanges()' in the interface
-zope.app.form.browser.objectwidget.ObjectWidget.
-
- >>> widget.applyChanges(family)
- True
-
-Test the updated mother's name value on the object family:
-
- >>> family.mother.name
- u'Margrith Ineichen'
-
- >>> IPerson.providedBy(family.mother)
- True
-
-So, now you know my mothers and fathers name. I hope it's also clear how to
-use the Object field and the ObjectWidget.
Modified: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/source.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/source.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/source.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -15,590 +15,18 @@
$Id$
"""
-
-from itertools import imap
-
-import xml.sax.saxutils
-
-from zope.component import adapts, getMultiAdapter
-from zope.interface import implements
-import zope.browser.interfaces
-import zope.schema.interfaces
-from zope.schema.interfaces import \
- ISourceQueriables, ValidationError, IVocabularyTokenized, IIterableSource
-
-import zope.formlib.interfaces
-import zope.formlib.widget
-import zope.app.form.browser.interfaces
-from zope.formlib.interfaces import WidgetInputError, MissingInputError
-from zope.app.form.browser.i18n import _
-from zope.app.form.browser.interfaces import IWidgetInputErrorView
-from zope.app.form.browser import \
- SelectWidget, RadioWidget, MultiSelectWidget, OrderedMultiSelectWidget, \
- MultiCheckBoxWidget, MultiSelectSetWidget, MultiSelectFrozenSetWidget
-import zope.app.form.browser.itemswidgets
-
-
-class SourceDisplayWidget(zope.formlib.widget.DisplayWidget):
-
- implements(zope.formlib.interfaces.IDisplayWidget)
-
- def __init__(self, field, source, request):
- super(SourceDisplayWidget, self).__init__(field, request)
- self.source = source
-
- required = False
-
- def hidden(self):
- return ''
-
- def error(self):
- return ''
-
- def __call__(self):
- """Render the current value
- """
-
- if self._renderedValueSet():
- value = self._data
- else:
- value = self.context.default
-
- if value == self.context.missing_value:
- value = self._translate(_("SourceDisplayWidget-missing",
- default="Nothing"))
- else:
- terms = getMultiAdapter((self.source, self.request),
- zope.browser.interfaces.ITerms)
-
- try:
- term = terms.getTerm(value)
- except LookupError:
- value = self._translate(_("SourceDisplayWidget-invalid",
- default="Invalid value"))
- else:
- value = self.renderTermForDisplay(term)
-
- return value
-
- def renderTermForDisplay(self, term):
- # Provide a rendering of `term` for display; this is not for
- # use when generating a select list.
- return xml.sax.saxutils.escape(self._translate(term.title))
-
-
-class SourceSequenceDisplayWidget(SourceDisplayWidget):
-
- def __call__(self):
-
- if self._renderedValueSet():
- seq = self._data
- else:
- seq = self.context.default
-
- terms = getMultiAdapter((self.source, self.request),
- zope.browser.interfaces.ITerms)
- result = []
- for value in seq:
- try:
- term = terms.getTerm(value)
- except LookupError:
- value = self._translate(_("SourceDisplayWidget-invalid",
- default="Invalid value"))
- else:
- value = self.renderTermForDisplay(term)
-
- result.append(value)
-
- return '<br />\n'.join(result)
-
-
-class SourceInputWidget(zope.app.form.InputWidget):
-
- _error = None
-
- implements(zope.formlib.interfaces.IInputWidget)
-
- def __init__(self, field, source, request):
- super(SourceInputWidget, self).__init__(field, request)
- self.source = source
- self.terms = getMultiAdapter((source, self.request),
- zope.browser.interfaces.ITerms)
-
- def queryviews(self):
- queriables = ISourceQueriables(self.source, None)
- if queriables is None:
- # treat the source itself as a queriable
- queriables = ((self.name + '.query', self.source), )
- else:
- queriables = [
- (self.name + '.' +
- unicode(i).encode('base64').strip().replace('=', '_'), s)
- for (i, s) in queriables.getQueriables()]
-
- return [
- (name, getMultiAdapter(
- (source, self.request),
- zope.app.form.browser.interfaces.ISourceQueryView,
- )
- ) for (name, source) in queriables]
-
- queryviews = property(queryviews)
-
- def _value(self):
- if self._renderedValueSet():
- value = self._data
- else:
- for name, queryview in self.queryviews:
- if name+'.apply' in self.request:
- token = self.request.form.get(name+'.selection')
- if token is not None:
- break
- else:
- token = self.request.form.get(self.name)
-
- if token is not None:
- try:
- value = self.terms.getValue(str(token))
- except LookupError:
- value = self.context.missing_value
- else:
- value = self.context.missing_value
-
- return value
-
- def hidden(self):
- value = self._value()
- if value == self.context.missing_value:
- return '' # Nothing to hide ;)
-
- try:
- term = self.terms.getTerm(value)
- except LookupError:
- # A value was set, but it's not valid. Treat
- # it as if it was missing and return nothing.
- return ''
-
- return ('<input type="hidden" name="%s" value=%s />'
- % (self.name, xml.sax.saxutils.quoteattr(term.token))
- )
-
- def error(self):
- if self._error:
- # TODO This code path is untested.
- return getMultiAdapter((self._error, self.request),
- IWidgetInputErrorView).snippet()
- return ""
-
- def __call__(self):
- result = ['<div class="value">']
- value = self._value()
- field = self.context
-
- term = None
- if value == field.missing_value:
- result.append(' <div class="row">')
- result.append(' <div class="label">')
- result.append(u' ' +
- self._translate(_("SourceDisplayWidget-label",
- default="Selected"))
- )
- result.append(' </div>')
- result.append(' <div class="field">')
- result.append(u' ' +
- self._translate(_("SourceDisplayWidget-missing",
- default="Nothing"))
- )
- result.append(' </div>')
- result.append(' </div>')
- else:
- try:
- term = self.terms.getTerm(value)
- except LookupError:
- result.append(u' ' +
- self._translate(_("SourceDisplayWidget-missing",
- default="Nothing Valid"))
- )
- else:
- result.append(' <div class="row">')
- result.append(' <div class="label">')
- result.append(u' ' +
- self._translate(_("SourceDisplayWidget-label",
- default="Selected"))
- )
- result.append(' </div>')
- result.append(' <div class="field">')
- result.append(u' ' + self.renderTermForDisplay(term))
- result.append(' </div>')
- result.append(' </div>')
- result.append(
- ' <input type="hidden" name="%s" value=%s />'
- % (self.name, xml.sax.saxutils.quoteattr(term.token)))
-
- result.append(' <input type="hidden" name="%s.displayed" value="y" />'
- % self.name)
-
- result.append(' <div class="queries">')
- for name, queryview in self.queryviews:
- result.append(' <div class="query">')
- result.append(' <div class="queryinput">')
- result.append(queryview.render(name))
- result.append(' </div> <!-- queryinput -->')
-
- qresults = queryview.results(name)
- if qresults:
- result.append(' <div class="queryresults">\n%s' %
- self._renderResults(qresults, name))
- result.append(' </div> <!-- queryresults -->')
- result.append(' </div> <!-- query -->')
- result.append(' </div> <!-- queries -->')
- result.append('</div> <!-- value -->')
- return '\n'.join(result)
-
- def _renderResults(self, results, name):
- terms = []
- for value in results:
- term = self.terms.getTerm(value)
- terms.append((self._translate(term.title), term.token))
- terms.sort()
-
- apply = self._translate(_("SourceInputWidget-apply", default="Apply"))
- return (
- '<select name="%s.selection">\n'
- '%s\n'
- '</select>\n'
- '<input type="submit" name="%s.apply" value="%s" />'
- % (name,
- '\n'.join(
- [('<option value="%s">%s</option>'
- % (token, title))
- for (title, token) in terms]),
- name,
- apply)
- )
-
- def renderTermForDisplay(self, term):
- # Provide a rendering of `term` for display; this is not for
- # use when generating a select list.
- return xml.sax.saxutils.escape(self._translate(term.title))
-
- required = property(lambda self: self.context.required)
-
- def getInputValue(self):
- for name, queryview in self.queryviews:
- if name+'.apply' in self.request:
- token = self.request.form.get(name+'.selection')
- if token is not None:
- break
- else:
- token = self.request.get(self.name)
-
- field = self.context
-
- if token is None:
- if field.required:
- # TODO This code path is untested.
- raise zope.formlib.interfaces.MissingInputError(
- field.__name__, self.label,
- )
- return field.missing_value
-
- try:
- value = self.terms.getValue(str(token))
- except LookupError:
- # TODO This code path is untested.
- err = zope.schema.interfaces.ValidationError(
- "Invalid value id", token)
- raise WidgetInputError(field.__name__, self.label, err)
-
- # Remaining code copied from SimpleInputWidget
-
- # value must be valid per the field constraints
- try:
- field.validate(value)
- except ValidationError, err:
- # TODO This code path is untested.
- self._error = WidgetInputError(field.__name__, self.label, err)
- raise self._error
-
- return value
-
- def hasInput(self):
- if self.name in self.request or self.name+'.displayed' in self.request:
- return True
-
- for name, queryview in self.queryviews:
- if name+'.apply' in self.request:
- token = self.request.form.get(name+'.selection')
- if token is not None:
- return True
-
- return False
-
-class SourceListInputWidget(SourceInputWidget):
-
- def _input_value(self):
- tokens = self.request.form.get(self.name)
- for name, queryview in self.queryviews:
- if name+'.apply' in self.request:
- newtokens = self.request.form.get(name+'.selection')
- if newtokens:
- if tokens:
- tokens = tokens + newtokens
- else:
- tokens = newtokens
-
- if tokens:
- remove = self.request.form.get(self.name+'.checked')
- if remove and (self.name+'.remove' in self.request):
- tokens = [token
- for token in tokens
- if token not in remove
- ]
- value = []
- for token in tokens:
- try:
- v = self.terms.getValue(str(token))
- except LookupError:
- pass # skip invalid tokens (shrug)
- else:
- value.append(v)
- else:
- if self.name+'.displayed' in self.request:
- value = []
- else:
- value = self.context.missing_value
-
- if value:
- r = []
- seen = {}
- for s in value:
- if s not in seen:
- r.append(s)
- seen[s] = 1
- value = r
-
- return value
-
- def _value(self):
- if self._renderedValueSet():
- value = self._data
- else:
- value = self._input_value()
-
- return value
-
- def hidden(self):
- value = self._value()
- if value == self.context.missing_value:
- return '' # Nothing to hide ;)
-
- result = []
- for v in value:
- try:
- term = self.terms.getTerm(value)
- except LookupError:
- # A value was set, but it's not valid. Treat
- # it as if it was missing and skip
- continue
- else:
- result.append(
- '<input type="hidden" name="%s:list" value=%s />'
- % (self.name, xml.sax.saxutils.quoteattr(term.token))
- )
-
- def __call__(self):
- result = ['<div class="value">']
- value = self._value()
- field = self.context
-
- if value:
- for v in value:
- try:
- term = self.terms.getTerm(v)
- except LookupError:
- continue # skip
- else:
- result.append(
- ' <input type="checkbox" name="%s.checked:list"'
- ' value=%s />'
- % (self.name, xml.sax.saxutils.quoteattr(term.token))
- )
- result.append(' ' + self.renderTermForDisplay(term))
- result.append(
- ' <input type="hidden" name="%s:list" value=%s />'
- % (self.name, xml.sax.saxutils.quoteattr(term.token)))
- result.append(' <br />')
-
- result.append(
- ' <input type="submit" name="%s.remove" value="%s" />'
- % (self.name,
- self._translate(_("MultipleSourceInputWidget-remove",
- default="Remove")))
- )
- result.append(' <br />')
-
- result.append(' <input type="hidden" name="%s.displayed" value="y" />'
- % self.name)
-
- result.append(' <div class="queries">')
-
- for name, queryview in self.queryviews:
- result.append(' <div class="query">')
- result.append(' <div class="queryinput">')
- result.append(queryview.render(name))
- result.append(' </div> <!-- queryinput -->')
-
- qresults = queryview.results(name)
- if qresults:
- result.append(' <div class="queryresults">\n%s' %
- self._renderResults(qresults, name))
- result.append(' </div> <!-- queryresults -->')
- result.append(' </div> <!-- query -->')
-
- result.append(' </div> <!-- queries -->')
- result.append('</div> <!-- value -->')
- return '\n'.join(result)
-
- def _renderResults(self, results, name):
- terms = []
- apply = self._translate(_("SourceListInputWidget-apply",
- default="Apply"))
- for value in results:
- term = self.terms.getTerm(value)
- terms.append((self._translate(term.title), term.token))
- terms.sort()
- return (
- '<select name="%s.selection:list" multiple>\n'
- '%s\n'
- '</select>\n'
- '<input type="submit" name="%s.apply" value="%s" />'
- % (name,
- '\n'.join([('<option value="%s">%s</option>' % (token, title))
- for (title, token) in terms]),
- name,
- apply)
- )
-
- def getInputValue(self):
- value = self._input_value()
-
- # Remaining code copied from SimpleInputWidget
-
- # value must be valid per the field constraints
- field = self.context
- try:
- field.validate(value)
- except ValidationError, err:
- # TODO This code path is untested.
- self._error = WidgetInputError(field.__name__, self.label, err)
- raise self._error
-
- return value
-
- def hasInput(self):
- return self.name+'.displayed' in self.request.form
-
-
-# Input widgets for IIterableSource:
-
-# These widgets reuse the old-style vocabulary widgets via the class
-# IterableSourceVocabulary that adapts a source (and its ITerms object)
-# into a vocabulary. When/if vocabularies go away, these classes
-# should be updated into full implementations.
-
-
-class IterableSourceVocabulary(object):
-
- """Adapts an iterable source into a legacy vocabulary.
-
- This can be used to wrap sources to make them usable with widgets that
- expect vocabularies. Note that there must be an ITerms implementation
- registered to obtain the terms.
- """
-
- implements(IVocabularyTokenized)
- adapts(IIterableSource);
-
- def __init__(self, source, request):
- self.source = source
- self.terms = getMultiAdapter((source, request),
- zope.browser.interfaces.ITerms)
-
- def getTerm(self, value):
- return self.terms.getTerm(value)
-
- def getTermByToken(self, token):
- value = self.terms.getValue(token)
- return self.getTerm(value)
-
- def __iter__(self):
- return imap(
- lambda value: self.getTerm(value), self.source.__iter__())
-
- def __len__(self):
- return self.source.__len__()
-
- def __contains__(self, value):
- return self.source.__contains__(value)
-
-
-class SourceSelectWidget(SelectWidget):
- """Provide a selection list for the item."""
-
- def __init__(self, field, source, request):
- super(SourceSelectWidget, self).__init__(
- field, IterableSourceVocabulary(source, request), request)
- # BBB
- if not zope.app.form.browser.itemswidgets.EXPLICIT_EMPTY_SELECTION:
- # Even if the field is required, no input is needed, so don't
- # worry the user about it:
- self.required = False
-
-class SourceDropdownWidget(SourceSelectWidget):
- """Variation of the SourceSelectWidget that uses a drop-down list."""
-
- size = 1
- explicit_empty_selection = True
-
-class SourceRadioWidget(RadioWidget):
- """Radio widget for single item choices."""
-
- def __init__(self, field, source, request):
- super(SourceRadioWidget, self).__init__(
- field, IterableSourceVocabulary(source, request), request)
-
-class SourceMultiSelectWidget(MultiSelectWidget):
- """A multi-selection widget with ordering support."""
-
- def __init__(self, field, source, request):
- super(SourceMultiSelectWidget, self).__init__(
- field, IterableSourceVocabulary(source, request), request)
-
-class SourceOrderedMultiSelectWidget(OrderedMultiSelectWidget):
- """A multi-selection widget with ordering support."""
-
- def __init__(self, field, source, request):
- super(SourceOrderedMultiSelectWidget, self).__init__(
- field, IterableSourceVocabulary(source, request), request)
-
-class SourceMultiSelectSetWidget(MultiSelectSetWidget):
- """Provide a selection list for the set to be selected."""
-
- def __init__(self, field, source, request):
- super(SourceMultiSelectSetWidget, self).__init__(
- field, IterableSourceVocabulary(source, request), request)
-
-class SourceMultiSelectFrozenSetWidget(MultiSelectFrozenSetWidget):
- """Provide a selection list for the frozenset to be selected."""
-
- def __init__(self, field, source, request):
- super(SourceMultiSelectFrozenSetWidget, self).__init__(
- field, IterableSourceVocabulary(source, request), request)
-
-class SourceMultiCheckBoxWidget(MultiCheckBoxWidget):
- """Provide a list of checkboxes that provide the choice for the list."""
-
- def __init__(self, field, source, request):
- super(SourceMultiCheckBoxWidget, self).__init__(
- field, IterableSourceVocabulary(source, request), request)
+# BBB
+from zope.formlib.source import (
+ SourceDisplayWidget,
+ SourceSequenceDisplayWidget,
+ SourceInputWidget,
+ SourceListInputWidget,
+ IterableSourceVocabulary,
+ SourceSelectWidget,
+ SourceDropdownWidget,
+ SourceRadioWidget,
+ SourceMultiSelectWidget,
+ SourceOrderedMultiSelectWidget,
+ SourceMultiSelectSetWidget,
+ SourceMultiSelectFrozenSetWidget,
+ SourceMultiCheckBoxWidget)
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/source.txt
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/source.txt 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/source.txt 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,1113 +0,0 @@
-==============
-Source Widgets
-==============
-
-Sources are objects that represent sets of values from which one might choose
-and are used with Choice schema fields. Source widgets currently fall into two
-categories:
-
-- widgets for iterable sources
-
-- widgets for queryable sources
-
-Sources (combined with the available adapters) may support both approaches, but
-no widgets currently support both.
-
-In both cases, the widgets need views that can be used to get tokens to
-represent source values in forms, as well as textual representations of values.
-We use the `zope.browser.interfaces.ITerms` views for that.
-
-All of our examples will be using the component architecture::
-
- >>> import zope.interface
- >>> import zope.component
- >>> import zope.schema
-
-This `ITerms` implementation can be used for the sources involved in
-our tests::
-
- >>> from zope.browser.interfaces import ITerms
- >>> import zope.publisher.interfaces.browser
- >>> import zope.app.form.browser.interfaces
- >>> from zope.schema.vocabulary import SimpleTerm
- >>> class ListTerms:
- ...
- ... zope.interface.implements(ITerms)
- ...
- ... def __init__(self, source, request):
- ... pass # We don't actually need the source or the request :)
- ...
- ... def getTerm(self, value):
- ... title = unicode(value)
- ... try:
- ... token = title.encode('base64').strip()
- ... except binascii.Error:
- ... raise LookupError(token)
- ... return SimpleTerm(value, token=token, title=title)
- ...
- ... def getValue(self, token):
- ... return token.decode('base64')
-
-This view just uses the unicode representations of values as titles and the
-base-64 encoding of the titles as tokens. This is a very simple strategy
-that's only approriate when the values have short and unique unicode
-representations.
-
-All of the source widgets are in a single module::
-
- >>> import zope.app.form.browser.source
-
-We'll also need request objects::
-
- >>> from zope.publisher.browser import TestRequest
-
-
-Iterable Source Widgets
-=======================
-
-Iterable sources are expected to be simpler than queriable sources, so they
-represent a good place to start. The most important aspect of iterable sources
-for widgets is that it's actually possible to enumerate all the values from the
-source. This allows each possible value to be listed in a <select> form field.
-
-Let's start with a simple example. We have a very trivial source,
-which is basically a list::
-
- >>> class SourceList(list):
- ... zope.interface.implements(zope.schema.interfaces.IIterableSource)
-
-We need to register our `ITerms` view::
-
- >>> zope.component.provideAdapter(
- ... ListTerms,
- ... (SourceList, zope.publisher.interfaces.browser.IBrowserRequest))
-
-Let's define a choice field using our iterable source::
-
- >>> dog = zope.schema.Choice(
- ... __name__ = 'dog',
- ... title=u"Dogs",
- ... source=SourceList(['spot', 'bowser', 'prince', 'duchess', 'lassie']),
- ... )
-
- >>> dog = dog.bind(object())
-
-When we get a choice input widget for a choice field, the default widget
-factory gets a view on the field and the field's source. We'll just create the
-view directly::
-
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceSelectWidget(
- ... dog, dog.source, request)
-
- >>> print widget()
- <div>
- <div class="value">
- <select id="field.dog" name="field.dog" size="5" >
- <option value="c3BvdA==">spot</option>
- <option value="Ym93c2Vy">bowser</option>
- <option value="cHJpbmNl">prince</option>
- <option value="ZHVjaGVzcw==">duchess</option>
- <option value="bGFzc2ll">lassie</option>
- </select>
- </div>
- <input name="field.dog-empty-marker" type="hidden" value="1" />
- </div>
-
-Since the field is required, an empty selection is not valid:
-
- >>> widget.getInputValue()
- Traceback (most recent call last):
- MissingInputError: ('field.dog', u'Dogs', None)
-
-Also, the widget is required in this case:
-
- >>> widget.required
- True
-
-If the request contains a value, it is marked as selected::
-
- >>> request.form["field.dog-empty-marker"] = "1"
- >>> request.form["field.dog"] = "Ym93c2Vy"
-
- >>> print widget()
- <div>
- <div class="value">
- <select id="field.dog" name="field.dog" size="5" >
- <option value="c3BvdA==">spot</option>
- <option selected="selected" value="Ym93c2Vy">bowser</option>
- <option value="cHJpbmNl">prince</option>
- <option value="ZHVjaGVzcw==">duchess</option>
- <option value="bGFzc2ll">lassie</option>
- </select>
- </div>
- <input name="field.dog-empty-marker" type="hidden" value="1" />
- </div>
-
-If we set the displayed value for the widget, that value is marked as
-selected::
-
- >>> widget.setRenderedValue("duchess")
- >>> print widget()
- <div>
- <div class="value">
- <select id="field.dog" name="field.dog" size="5" >
- <option value="c3BvdA==">spot</option>
- <option value="Ym93c2Vy">bowser</option>
- <option value="cHJpbmNl">prince</option>
- <option selected="selected" value="ZHVjaGVzcw==">duchess</option>
- <option value="bGFzc2ll">lassie</option>
- </select>
- </div>
- <input name="field.dog-empty-marker" type="hidden" value="1" />
- </div>
-
-Dropdown widgets are achieved with SourceDropdownWidget, which simply
-generates a selection list of size 1::
-
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceDropdownWidget(
- ... dog, dog.source, request)
- >>> print widget() # doctest: +ELLIPSIS
- <div>
- <div class="value">
- <select id="field.dog" name="field.dog" size="1" >
- <option selected="selected" value="">(no value)</option>...
-
-An alternative to SourceSelectWidget for small numbers of items is
-SourceRadioWidget that provides a radio button group for the items::
-
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceRadioWidget(
- ... dog, dog.source, request)
- >>> print widget() # doctest: +NORMALIZE_WHITESPACE
- <div>
- <div class="value">
- <label for="field.dog.0"><input class="radioType" id="field.dog.0"
- name="field.dog" type="radio" value="c3BvdA==" /> spot</label><br
- /><label for="field.dog.1"><input class="radioType" id="field.dog.1"
- name="field.dog" type="radio" value="Ym93c2Vy" /> bowser</label><br
- /><label for="field.dog.2"><input class="radioType" id="field.dog.2"
- name="field.dog" type="radio" value="cHJpbmNl" /> prince</label><br
- /><label for="field.dog.3"><input class="radioType" id="field.dog.3"
- name="field.dog" type="radio" value="ZHVjaGVzcw==" /> duchess</label><br
- /><label for="field.dog.4"><input class="radioType" id="field.dog.4"
- name="field.dog" type="radio" value="bGFzc2ll" /> lassie</label>
- </div>
- <input name="field.dog-empty-marker" type="hidden" value="1" />
- </div>
-
-We'll select an item by setting the appropriate fields in the request::
-
- >>> request.form['field.dog-empty-marker'] = '1'
- >>> request.form['field.dog'] = 'bGFzc2ll'
- >>>
- >>> widget = zope.app.form.browser.source.SourceRadioWidget(
- ... dog, dog.source, request)
- >>> print widget() # doctest: +NORMALIZE_WHITESPACE
- <div>
- <div class="value">
- <label for="field.dog.0"><input class="radioType" id="field.dog.0"
- name="field.dog" type="radio" value="c3BvdA==" /> spot</label><br
- /><label for="field.dog.1"><input class="radioType" id="field.dog.1"
- name="field.dog" type="radio" value="Ym93c2Vy" /> bowser</label><br
- /><label for="field.dog.2"><input class="radioType" id="field.dog.2"
- name="field.dog" type="radio" value="cHJpbmNl" /> prince</label><br
- /><label for="field.dog.3"><input class="radioType" id="field.dog.3"
- name="field.dog" type="radio" value="ZHVjaGVzcw==" /> duchess</label><br
- /><label for="field.dog.4"><input class="radioType" checked="checked"
- id="field.dog.4" name="field.dog" type="radio" value="bGFzc2ll"
- /> lassie</label>
- </div>
- <input name="field.dog-empty-marker" type="hidden" value="1" />
- </div>
-
-For list-valued fields with items chosen from iterable sources, there are the
-SourceMultiSelectWidget and SourceOrderedMultiSelectWidget widgets. The latter
-widget includes support for re-ording the list items.
-SourceOrderedMultiSelectWidget is configured as the default widget for lists of
-choices.
-
-If you don't need ordering support through the web UI, then you can use
-the simpler SourceMultiSelectWidget::
-
- >>> dogSource = SourceList([
- ... u'spot', u'bowser', u'prince', u'duchess', u'lassie'])
- >>> dogs = zope.schema.List(
- ... __name__ = 'dogs',
- ... title=u"Dogs",
- ... value_type=zope.schema.Choice(
- ... source=dogSource,
- ... )
- ... )
- >>> dogs = dogs.bind(object()) # give the field a context
-
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceMultiSelectWidget(
- ... dogs, dogSource, request)
-
-Let's look at the rendered widget::
-
- >>> print widget() # doctest: +NORMALIZE_WHITESPACE
- <div>
- <div class="value">
- <select id="field.dogs" multiple="multiple" name="field.dogs:list"
- size="5" ><option value="c3BvdA==">spot</option>
- <option value="Ym93c2Vy">bowser</option>
- <option value="cHJpbmNl">prince</option>
- <option value="ZHVjaGVzcw==">duchess</option>
- <option value="bGFzc2ll">lassie</option></select>
- </div>
- <input name="field.dogs-empty-marker" type="hidden" value="1" />
- </div>
-
-We have no input yet::
-
- >>> try:
- ... widget.getInputValue()
- ... except zope.formlib.interfaces.MissingInputError:
- ... print 'no input'
- no input
-
-Select an item::
-
- >>> request.form['field.dogs-empty-marker'] = '1'
- >>> request.form['field.dogs'] = ['bGFzc2ll']
- >>> widget.getInputValue()
- ['lassie']
-
-and another::
-
- >>> request.form['field.dogs'] = ['cHJpbmNl', 'bGFzc2ll']
- >>> widget.getInputValue()
- ['prince', 'lassie']
-
-Finally, what does the widget look like now::
-
- >>> print widget() # doctest: +NORMALIZE_WHITESPACE
- <div>
- <div class="value">
- <select id="field.dogs" multiple="multiple" name="field.dogs:list"
- size="5" ><option value="c3BvdA==">spot</option>
- <option value="Ym93c2Vy">bowser</option>
- <option selected="selected" value="cHJpbmNl">prince</option>
- <option value="ZHVjaGVzcw==">duchess</option>
- <option selected="selected" value="bGFzc2ll">lassie</option></select>
- </div>
- <input name="field.dogs-empty-marker" type="hidden" value="1" />
- </div>
-
-
-An alternative for small numbers of items is to use SourceMultiCheckBoxWidget::
-
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceMultiCheckBoxWidget(
- ... dogs, dogSource, request)
-
-The rendered widget::
-
- >>> print widget() # doctest: +NORMALIZE_WHITESPACE
- <div>
- <div class="value">
- <label for="field.dogs.0"><input class="checkboxType" id="field.dogs.0"
- name="field.dogs" type="checkbox" value="c3BvdA==" /> spot</label><br
- /><label for="field.dogs.1"><input class="checkboxType" id="field.dogs.1"
- name="field.dogs" type="checkbox" value="Ym93c2Vy"
- /> bowser</label><br
- /><label for="field.dogs.2"><input class="checkboxType" id="field.dogs.2"
- name="field.dogs" type="checkbox" value="cHJpbmNl"
- /> prince</label><br
- /><label for="field.dogs.3"><input class="checkboxType" id="field.dogs.3"
- name="field.dogs" type="checkbox"
- value="ZHVjaGVzcw==" /> duchess</label><br
- /><label for="field.dogs.4"><input class="checkboxType" id="field.dogs.4"
- name="field.dogs" type="checkbox" value="bGFzc2ll"
- /> lassie</label>
- </div>
- <input name="field.dogs-empty-marker" type="hidden" value="1" />
- </div>
-
-We have no input yet::
-
- >>> try:
- ... widget.getInputValue()
- ... except zope.formlib.interfaces.MissingInputError:
- ... print 'no input'
- no input
-
-Select an item::
-
- >>> request.form['field.dogs-empty-marker'] = '1'
- >>> request.form['field.dogs'] = ['bGFzc2ll']
- >>> widget.getInputValue()
- ['lassie']
-
-and another::
-
- >>> request.form['field.dogs'] = ['c3BvdA==', 'bGFzc2ll']
- >>> widget.getInputValue()
- ['spot', 'lassie']
-
-Finally, what does the widget look like now::
-
- >>> print widget() # doctest: +NORMALIZE_WHITESPACE
- <div>
- <div class="value">
- <label for="field.dogs.0"><input class="checkboxType" checked="checked"
- id="field.dogs.0" name="field.dogs" type="checkbox" value="c3BvdA=="
- /> spot</label><br
- /><label for="field.dogs.1"><input class="checkboxType" id="field.dogs.1"
- name="field.dogs" type="checkbox" value="Ym93c2Vy"
- /> bowser</label><br
- /><label for="field.dogs.2"><input class="checkboxType" id="field.dogs.2"
- name="field.dogs" type="checkbox" value="cHJpbmNl"
- /> prince</label><br
- /><label for="field.dogs.3"><input class="checkboxType" id="field.dogs.3"
- name="field.dogs" type="checkbox"
- value="ZHVjaGVzcw==" /> duchess</label><br
- /><label for="field.dogs.4"><input class="checkboxType" checked="checked"
- id="field.dogs.4" name="field.dogs" type="checkbox" value="bGFzc2ll"
- /> lassie</label>
- </div>
- <input name="field.dogs-empty-marker" type="hidden" value="1" />
- </div>
-
-
-For list ordering support, use SourceOrderedMultiSelectWidget::
-
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceOrderedMultiSelectWidget(
- ... dogs, dogSource, request)
-
-The widget is too complicated to show in complete rendered form here.
-Insted, we'll inspect the properties of the widget::
-
- >>> from zope.formlib.interfaces import MissingInputError
- >>> try:
- ... widget.getInputValue()
- ... except MissingInputError:
- ... print 'no input'
- no input
-
- >>> widget.choices() == [
- ... {'text': u'spot', 'value': 'c3BvdA=='},
- ... {'text': u'bowser', 'value': 'Ym93c2Vy'},
- ... {'text': u'prince', 'value': 'cHJpbmNl'},
- ... {'text': u'duchess', 'value': 'ZHVjaGVzcw=='},
- ... {'text': u'lassie', 'value': 'bGFzc2ll'}
- ... ]
- True
-
- >>> widget.selected()
- []
-
-Let's try out selecting items. Select one item::
-
- >>> request.form['field.dogs-empty-marker'] = '1'
- >>> request.form['field.dogs'] = ['bGFzc2ll']
- >>> widget.selected() # doctest: +NORMALIZE_WHITESPACE
- [{'text': u'lassie', 'value': 'bGFzc2ll'}]
-
- >>> widget.getInputValue()
- ['lassie']
-
-Select two items::
-
- >>> request.form['field.dogs'] = ['c3BvdA==', 'bGFzc2ll']
- >>> widget.selected() # doctest: +NORMALIZE_WHITESPACE
- [{'text': u'spot', 'value': 'c3BvdA=='},
- {'text': u'lassie', 'value': 'bGFzc2ll'}]
-
- >>> widget.getInputValue()
- ['spot', 'lassie']
-
-
-For set-valued fields, use SourceMultiSelectSetWidget::
-
- >>> dogSet = zope.schema.Set(
- ... __name__ = 'dogSet',
- ... title=u"Dogs",
- ... value_type=zope.schema.Choice(
- ... source=dogSource,
- ... )
- ... )
- >>> dogSet = dogSet.bind(object()) # give the field a context
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceMultiSelectSetWidget(
- ... dogSet, dogSource, request)
-
- >>> try:
- ... widget.getInputValue()
- ... except zope.formlib.interfaces.MissingInputError:
- ... print 'no input'
- no input
-
- >>> print widget() # doctest: +NORMALIZE_WHITESPACE
- <div>
- <div class="value">
- <select id="field.dogSet" multiple="multiple"
- name="field.dogSet:list" size="5" ><option value="c3BvdA==">spot</option>
- <option value="Ym93c2Vy">bowser</option>
- <option value="cHJpbmNl">prince</option>
- <option value="ZHVjaGVzcw==">duchess</option>
- <option value="bGFzc2ll">lassie</option></select>
- </div>
- <input name="field.dogSet-empty-marker" type="hidden" value="1" />
- </div>
-
-Let's try out selecting items. Select one item::
-
- >>> request.form['field.dogSet-empty-marker'] = '1'
- >>> request.form['field.dogSet'] = ['bGFzc2ll']
- >>> widget.getInputValue()
- set(['lassie'])
-
-Select two items::
-
- >>> request.form['field.dogSet'] = ['c3BvdA==', 'bGFzc2ll']
- >>> widget.getInputValue()
- set(['spot', 'lassie'])
-
-The rendered widget (still with the two items selected) looks like this::
-
- >>> print widget() # doctest: +NORMALIZE_WHITESPACE
- <div>
- <div class="value">
- <select id="field.dogSet" multiple="multiple"
- name="field.dogSet:list" size="5" ><option selected="selected"
- value="c3BvdA==">spot</option>
- <option value="Ym93c2Vy">bowser</option>
- <option value="cHJpbmNl">prince</option>
- <option value="ZHVjaGVzcw==">duchess</option>
- <option selected="selected" value="bGFzc2ll">lassie</option></select>
- </div>
- <input name="field.dogSet-empty-marker" type="hidden" value="1" />
- </div>
-
-
-
-Source Widget Query Framework
-=============================
-
-An important aspect of sources is that they may have too many values to
-enumerate. Rather than listing all of the values, we, instead, provide
-interfaces for querying values and selecting values from query results.
-Matters are further complicated by the fact that different sources may have
-very different interfaces for querying them.
-
-To make matters more interesting, a source may be an aggregation of several
-collections, each with their own querying facilities. An example of such a
-source is a principal source, where principals might come from a number of
-places, such as an LDAP database and ZCML-based principal definitions.
-
-The default widgets for selecting values from sources use the
-following approach:
-
-- One or more query objects are obtained from the source by adapting the source
- to `zope.schema.ISourceQueriables`. If no adapter is obtained, then the
- source itself is assumed to be queriable.
-
-- For each queriable found, a
- `zope.app.form.browser.interfaces.ISourceQueryView` view is looked up. This
- view is used to obtain the HTML for displaying a query form. The view is also
- used to obtain search results.
-
-Let's start with a simple example. We have a very trivial source,
-which is basically a list:
-
- >>> class SourceList(list):
- ... zope.interface.implements(zope.schema.interfaces.ISource)
-
-We need to register our `ITerms` view::
-
- >>> zope.component.provideAdapter(
- ... ListTerms,
- ... (SourceList, zope.publisher.interfaces.browser.IBrowserRequest))
-
-We aren't going to provide an adapter to `ISourceQueriables`, so the source
-itself will be used as it's own queriable. We need to provide a query view
-for the source::
-
- >>> class ListQueryView:
- ...
- ... zope.interface.implements(
- ... zope.app.form.browser.interfaces.ISourceQueryView)
- ... zope.component.adapts(
- ... SourceList,
- ... zope.publisher.interfaces.browser.IBrowserRequest,
- ... )
- ...
- ... def __init__(self, source, request):
- ... self.source = source
- ... self.request = request
- ...
- ... def render(self, name):
- ... return (
- ... '<input name="%s.string">\n'
- ... '<input type="submit" name="%s" value="Search">'
- ... % (name, name)
- ... )
- ...
- ... def results(self, name):
- ... if name in self.request:
- ... search_string = self.request.get(name+'.string')
- ... if search_string is not None:
- ... return [value
- ... for value in self.source
- ... if search_string in value
- ... ]
- ... return None
-
- >>> zope.component.provideAdapter(ListQueryView)
-
-Now, we can define a choice field::
-
- >>> dog = zope.schema.Choice(
- ... __name__ = 'dog',
- ... title=u"Dogs",
- ... source=SourceList(['spot', 'bowser', 'prince', 'duchess', 'lassie']),
- ... )
-
-As before, we'll just create the view directly::
-
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceInputWidget(
- ... dog, dog.source, request)
-
-Now if we render the widget, we'll see the input value (initially nothing) and
-a form elements for seaching for values::
-
- >>> print widget()
- <div class="value">
- <div class="row">
- <div class="label">
- Selected
- </div>
- <div class="field">
- Nothing
- </div>
- </div>
- <input type="hidden" name="field.dog.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.dog.query.string">
- <input type="submit" name="field.dog.query" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-This shows that we haven't selected a dog. We get a search box that we can type
-seach strings into. Let's supply a search string. We do this by providing data
-in the form and by "selecting" the submit button::
-
- >>> request.form['field.dog.displayed'] = u'y'
- >>> request.form['field.dog.query.string'] = u'o'
- >>> request.form['field.dog.query'] = u'Search'
-
-Because the field is required, a non-selection is not valid. Thus, while the
-widget still hasInput, it will raise an error when you getInputValue::
-
- >>> widget.hasInput()
- True
- >>> widget.getInputValue()
- Traceback (most recent call last):
- ...
- MissingInputError: ('dog', u'Dogs', None)
-
-If the field is not required::
-
- >>> dog.required = False
-
-then as long as the field is displayed, the widget still has input but returns
-the field's missing value::
-
- >>> widget.hasInput()
- True
- >>> widget.getInputValue() # None
-
-Now if we render the widget, we'll see the search results::
-
- >>> dog.required = True
- >>> print widget()
- <div class="value">
- <div class="row">
- <div class="label">
- Selected
- </div>
- <div class="field">
- Nothing
- </div>
- </div>
- <input type="hidden" name="field.dog.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.dog.query.string">
- <input type="submit" name="field.dog.query" value="Search">
- </div> <!-- queryinput -->
- <div class="queryresults">
- <select name="field.dog.query.selection">
- <option value="Ym93c2Vy">bowser</option>
- <option value="c3BvdA==">spot</option>
- </select>
- <input type="submit" name="field.dog.query.apply" value="Apply" />
- </div> <!-- queryresults -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-If we select an item::
-
- >>> request.form['field.dog.displayed'] = u'y'
- >>> del request.form['field.dog.query.string']
- >>> del request.form['field.dog.query']
- >>> request.form['field.dog.query.selection'] = u'c3BvdA=='
- >>> request.form['field.dog.query.apply'] = u'Apply'
-
-Then we'll show the newly selected value::
-
- >>> print widget()
- <div class="value">
- <div class="row">
- <div class="label">
- Selected
- </div>
- <div class="field">
- spot
- </div>
- </div>
- <input type="hidden" name="field.dog" value="c3BvdA==" />
- <input type="hidden" name="field.dog.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.dog.query.string">
- <input type="submit" name="field.dog.query" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-Note that we should have an input value now, since pressing the 'Apply' button
-provides us with input::
-
- >>> widget.hasInput()
- True
-
-We should also be able to get the input value::
-
- >>> widget.getInputValue()
- 'spot'
-
-Now, let's look at a more complicated example. We'll define a source that
-combines multiple sources::
-
- >>> class MultiSource:
- ...
- ... zope.interface.implements(
- ... zope.schema.interfaces.ISource,
- ... zope.schema.interfaces.ISourceQueriables,
- ... )
- ...
- ... def __init__(self, *sources):
- ... self.sources = [(unicode(i), s) for (i, s) in enumerate(sources)]
- ...
- ... def __contains__(self, value):
- ... for i, s in self.sources:
- ... if value in s:
- ... return True
- ... return False
- ...
- ... def getQueriables(self):
- ... return self.sources
-
-This multi-source implements `ISourceQueriables`. It assumes that the sources
-it's given are queriable and just returns the sources as the queryable objects.
-
-We can reuse our terms view::
-
- >>> zope.component.provideAdapter(
- ... ListTerms,
- ... (MultiSource, zope.publisher.interfaces.browser.IBrowserRequest))
-
-Now, we'll create a pet choice that combines dogs and cats::
-
- >>> pet = zope.schema.Choice(
- ... __name__ = 'pet',
- ... title=u"Dogs and Cats",
- ... source=MultiSource(
- ... dog.source,
- ... SourceList(['boots', 'puss', 'tabby', 'tom', 'tiger']),
- ... ),
- ... )
-
-and a widget::
-
- >>> widget = zope.app.form.browser.source.SourceInputWidget(
- ... pet, pet.source, request)
-
-Now if we display the widget, we'll see search inputs for both dogs
-and cats::
-
- >>> print widget()
- <div class="value">
- <div class="row">
- <div class="label">
- Selected
- </div>
- <div class="field">
- Nothing
- </div>
- </div>
- <input type="hidden" name="field.pet.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.pet.MA__.string">
- <input type="submit" name="field.pet.MA__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- <div class="query">
- <div class="queryinput">
- <input name="field.pet.MQ__.string">
- <input type="submit" name="field.pet.MQ__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-As before, we can perform a search::
-
- >>> request.form['field.pet.displayed'] = u'y'
- >>> request.form['field.pet.MQ__.string'] = u't'
- >>> request.form['field.pet.MQ__'] = u'Search'
-
-In which case, we'll get some results::
-
- >>> print widget() # doctest:
- <div class="value">
- <div class="row">
- <div class="label">
- Selected
- </div>
- <div class="field">
- Nothing
- </div>
- </div>
- <input type="hidden" name="field.pet.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.pet.MA__.string">
- <input type="submit" name="field.pet.MA__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- <div class="query">
- <div class="queryinput">
- <input name="field.pet.MQ__.string">
- <input type="submit" name="field.pet.MQ__" value="Search">
- </div> <!-- queryinput -->
- <div class="queryresults">
- <select name="field.pet.MQ__.selection">
- <option value="Ym9vdHM=">boots</option>
- <option value="dGFiYnk=">tabby</option>
- <option value="dGlnZXI=">tiger</option>
- <option value="dG9t">tom</option>
- </select>
- <input type="submit" name="field.pet.MQ__.apply" value="Apply" />
- </div> <!-- queryresults -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-from which we can choose::
-
- >>> request.form['field.pet.displayed'] = u'y'
- >>> del request.form['field.pet.MQ__.string']
- >>> del request.form['field.pet.MQ__']
- >>> request.form['field.pet.MQ__.selection'] = u'dGFiYnk='
- >>> request.form['field.pet.MQ__.apply'] = u'Apply'
-
-and get a selection::
-
- >>> print widget()
- <div class="value">
- <div class="row">
- <div class="label">
- Selected
- </div>
- <div class="field">
- tabby
- </div>
- </div>
- <input type="hidden" name="field.pet" value="dGFiYnk=" />
- <input type="hidden" name="field.pet.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.pet.MA__.string">
- <input type="submit" name="field.pet.MA__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- <div class="query">
- <div class="queryinput">
- <input name="field.pet.MQ__.string">
- <input type="submit" name="field.pet.MQ__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-Note that we should have an input value now, since pressing the 'Apply' button
-provides us with input::
-
- >>> widget.hasInput()
- True
-
-and we can get the input value::
-
- >>> widget.getInputValue()
- 'tabby'
-
-There's a display widget, which doesn't use queriables, since it doesn't assign
-values::
-
- >>> request = TestRequest()
- >>> widget = zope.app.form.browser.source.SourceDisplayWidget(
- ... pet, pet.source, request)
- >>> print widget()
- Nothing
- >>> from zope.app.form.browser.interfaces import IBrowserWidget
- >>> IBrowserWidget.providedBy(widget)
- True
-
- >>> widget.setRenderedValue('tabby')
- >>> print widget()
- tabby
-
-Like any good display widget, input is not required::
-
- >>> widget.required
- False
-
-If we specify a list of choices::
-
- >>> pets = zope.schema.List(__name__ = 'pets', title=u"Pets",
- ... value_type=pet)
-
-when a widget is computed for the field, a view will be looked up for the field
-and the source, where, in this case, the field is a list field. We'll just call
-the widget factory directly::
-
- >>> widget = zope.app.form.browser.source.SourceListInputWidget(
- ... pets, pets.value_type.source, request)
-
-If we render the widget::
-
- >>> print widget()
- <div class="value">
- <input type="hidden" name="field.pets.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.pets.MA__.string">
- <input type="submit" name="field.pets.MA__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- <div class="query">
- <div class="queryinput">
- <input name="field.pets.MQ__.string">
- <input type="submit" name="field.pets.MQ__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-Here the output looks very similar to the simple choice case. We get a search
-input for each source. In this case, we don't show any inputs
-(TODO we probably should make it clearer that there are no selected values.)
-
-As before, we can search one of the sources::
-
- >>> request.form['field.pets.displayed'] = u'y'
- >>> request.form['field.pets.MQ__.string'] = u't'
- >>> request.form['field.pets.MQ__'] = u'Search'
-
-In which case, we'll get some results::
-
- >>> print widget()
- <div class="value">
- <input type="hidden" name="field.pets.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.pets.MA__.string">
- <input type="submit" name="field.pets.MA__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- <div class="query">
- <div class="queryinput">
- <input name="field.pets.MQ__.string">
- <input type="submit" name="field.pets.MQ__" value="Search">
- </div> <!-- queryinput -->
- <div class="queryresults">
- <select name="field.pets.MQ__.selection:list" multiple>
- <option value="Ym9vdHM=">boots</option>
- <option value="dGFiYnk=">tabby</option>
- <option value="dGlnZXI=">tiger</option>
- <option value="dG9t">tom</option>
- </select>
- <input type="submit" name="field.pets.MQ__.apply" value="Apply" />
- </div> <!-- queryresults -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-from which we can select some values::
-
- >>> request.form['field.pets.displayed'] = u'y'
- >>> del request.form['field.pets.MQ__.string']
- >>> del request.form['field.pets.MQ__']
- >>> request.form['field.pets.MQ__.selection'] = [
- ... u'dGFiYnk=', u'dGlnZXI=', u'dG9t']
- >>> request.form['field.pets.MQ__.apply'] = u'Apply'
-
-Which then leads to the selections appearing as widget selections::
-
- >>> print widget()
- <div class="value">
- <input type="checkbox" name="field.pets.checked:list" value="dGFiYnk=" />
- tabby
- <input type="hidden" name="field.pets:list" value="dGFiYnk=" />
- <br />
- <input type="checkbox" name="field.pets.checked:list" value="dGlnZXI=" />
- tiger
- <input type="hidden" name="field.pets:list" value="dGlnZXI=" />
- <br />
- <input type="checkbox" name="field.pets.checked:list" value="dG9t" />
- tom
- <input type="hidden" name="field.pets:list" value="dG9t" />
- <br />
- <input type="submit" name="field.pets.remove" value="Remove" />
- <br />
- <input type="hidden" name="field.pets.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.pets.MA__.string">
- <input type="submit" name="field.pets.MA__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- <div class="query">
- <div class="queryinput">
- <input name="field.pets.MQ__.string">
- <input type="submit" name="field.pets.MQ__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-We can get the selected values::
-
- >>> widget.getInputValue()
- ['tabby', 'tiger', 'tom']
-
-We now see the values we selected. We also have checkboxes and buttons that
-allow us to remove selections::
-
- >>> request.form['field.pets.displayed'] = u'y'
- >>> request.form['field.pets'] = [u'dGFiYnk=', u'dGlnZXI=', u'dG9t']
- >>> del request.form['field.pets.MQ__.selection']
- >>> del request.form['field.pets.MQ__.apply']
- >>> request.form['field.pets.checked'] = [u'dGFiYnk=', u'dG9t']
- >>> request.form['field.pets.remove'] = u'Remove'
-
- >>> print widget()
- <div class="value">
- <input type="checkbox" name="field.pets.checked:list" value="dGlnZXI=" />
- tiger
- <input type="hidden" name="field.pets:list" value="dGlnZXI=" />
- <br />
- <input type="submit" name="field.pets.remove" value="Remove" />
- <br />
- <input type="hidden" name="field.pets.displayed" value="y" />
- <div class="queries">
- <div class="query">
- <div class="queryinput">
- <input name="field.pets.MA__.string">
- <input type="submit" name="field.pets.MA__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- <div class="query">
- <div class="queryinput">
- <input name="field.pets.MQ__.string">
- <input type="submit" name="field.pets.MQ__" value="Search">
- </div> <!-- queryinput -->
- </div> <!-- query -->
- </div> <!-- queries -->
- </div> <!-- value -->
-
-
-Using vocabulary-dependent widgets with sources
-===============================================
-
-if you have a widget that uses old-style vocabularies but don't have the time
-to rewrite it for sources, all is not lost! The wrapper
-IterableSourceVocabulary can be used to make sources and ITerms look like a
-vocabulary. This allows us to use vocabulary-based widgets with sources
-instead of vocabularies.
-
-Usage::
-
- >>> from zope.schema.vocabulary import SimpleTerm
-
- >>> values = [u'a', u'b', u'c']
- >>> tokens = [ '0', '1', '2']
- >>> titles = [u'A', u'B', u'C']
-
- >>> terms = [SimpleTerm(values[i], token=tokens[i], title=titles[i]) \
- ... for i in range(0,len(values))]
-
- >>> class TestSource(list):
- ... zope.interface.implements(zope.schema.interfaces.IIterableSource)
- >>> source = TestSource(values)
-
- >>> class TestTerms(object):
- ... zope.interface.implements(ITerms)
- ... def __init__(self, source, request):
- ... pass
- ... def getTerm(self, value):
- ... index = values.index(value)
- ... return terms[index]
- ... def getValue(self, token):
- ... index = tokens.index(token)
- ... return values[index]
-
- >>> zope.component.provideAdapter(
- ... TestTerms,
- ... (TestSource, zope.publisher.interfaces.browser.IBrowserRequest))
-
- >>> from zope.app.form.browser.source import IterableSourceVocabulary
- >>> request = TestRequest()
- >>> vocab = IterableSourceVocabulary(source, request)
- >>> from zope.interface.verify import verifyClass, verifyObject
- >>> verifyClass(zope.schema.interfaces.IVocabularyTokenized, \
- ... IterableSourceVocabulary)
- True
- >>> verifyObject(zope.schema.interfaces.IVocabularyTokenized, vocab)
- True
-
- >>> len(vocab)
- 3
- >>> (u'a' in vocab) and (u'b' in vocab) and (u'c' in vocab)
- True
- >>> [value for value in vocab] == terms
- True
- >>> term = vocab.getTerm(u'b')
- >>> (term.value, term.token, term.title)
- (u'b', '1', u'B')
- >>> term = vocab.getTermByToken('2')
- >>> (term.value, term.token, term.title)
- (u'c', '2', u'C')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_choicecollections.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_choicecollections.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_choicecollections.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,68 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Test the choice collections widgets (function).
-
-$Id$
-"""
-import unittest
-from zope.component.testing import PlacelessSetup
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.publisher.browser import TestRequest
-from zope.schema.interfaces import IList, IChoice, IIterableVocabulary
-from zope.schema import Choice, List
-
-from zope.app.testing import ztapi
-from zope.formlib.interfaces import IInputWidget, IDisplayWidget
-from zope.app.form.browser import CollectionDisplayWidget
-from zope.app.form.browser import CollectionInputWidget
-from zope.app.form.browser import ChoiceCollectionDisplayWidget
-from zope.app.form.browser import ChoiceCollectionInputWidget
-from zope.app.form.browser import ItemsMultiDisplayWidget, SelectWidget
-
-class ListOfChoicesWidgetTest(PlacelessSetup, unittest.TestCase):
-
- def test_ListOfChoicesDisplayWidget(self):
- ztapi.provideMultiView((IList, IChoice), IBrowserRequest,
- IDisplayWidget, '', ChoiceCollectionDisplayWidget)
- ztapi.provideMultiView((IList, IIterableVocabulary), IBrowserRequest,
- IDisplayWidget, '', ItemsMultiDisplayWidget)
- field = List(value_type=Choice(values=[1, 2, 3]))
- bound = field.bind(object())
- widget = CollectionDisplayWidget(bound, TestRequest())
- self.assert_(isinstance(widget, ItemsMultiDisplayWidget))
- self.assertEqual(widget.context, bound)
- self.assertEqual(widget.vocabulary, bound.value_type.vocabulary)
-
-
- def test_ChoiceSequenceEditWidget(self):
- ztapi.provideMultiView((IList, IChoice), IBrowserRequest,
- IInputWidget, '', ChoiceCollectionInputWidget)
- ztapi.provideMultiView((IList, IIterableVocabulary), IBrowserRequest,
- IInputWidget, '', SelectWidget)
- field = List(value_type=Choice(values=[1, 2, 3]))
- bound = field.bind(object())
- widget = CollectionInputWidget(bound, TestRequest())
- self.assert_(isinstance(widget, SelectWidget))
- self.assertEqual(widget.context, bound)
- self.assertEqual(widget.vocabulary, bound.value_type.vocabulary)
-
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(ListOfChoicesWidgetTest),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_choicewidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_choicewidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_choicewidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,62 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Test the Choice display and edit widget (function).
-
-$Id$
-"""
-import unittest
-from zope.component.testing import PlacelessSetup
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.publisher.browser import TestRequest
-from zope.schema.interfaces import IChoice, IIterableVocabulary
-from zope.schema import Choice
-
-from zope.app.testing import ztapi
-from zope.formlib.interfaces import IInputWidget, IDisplayWidget
-from zope.app.form.browser import ChoiceDisplayWidget, ChoiceInputWidget
-from zope.app.form.browser import ItemDisplayWidget, DropdownWidget
-
-
-class ChoiceWidgetTest(PlacelessSetup, unittest.TestCase):
-
- def test_ChoiceDisplayWidget(self):
- ztapi.provideMultiView((IChoice, IIterableVocabulary), IBrowserRequest,
- IDisplayWidget, '', ItemDisplayWidget)
- field = Choice(values=[1, 2, 3])
- bound = field.bind(object())
- widget = ChoiceDisplayWidget(bound, TestRequest())
- self.assert_(isinstance(widget, ItemDisplayWidget))
- self.assertEqual(widget.context, bound)
- self.assertEqual(widget.vocabulary, bound.vocabulary)
-
-
- def test_ChoiceInputWidget(self):
- ztapi.provideMultiView((IChoice, IIterableVocabulary), IBrowserRequest,
- IInputWidget, '', DropdownWidget)
- field = Choice(values=[1, 2, 3])
- bound = field.bind(object())
- widget = ChoiceInputWidget(bound, TestRequest())
- self.assert_(isinstance(widget, DropdownWidget))
- self.assertEqual(widget.context, bound)
- self.assertEqual(widget.vocabulary, bound.vocabulary)
-
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(ChoiceWidgetTest),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_datetimewidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_datetimewidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_datetimewidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,177 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Datetime Widget Tests
-
-$Id$
-"""
-import datetime
-import unittest
-from zope.testing import doctest
-
-from zope.schema import Datetime
-from zope.datetime import parseDatetimetz, tzinfo
-from zope.interface.verify import verifyClass
-
-from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
-from zope.formlib.interfaces import IInputWidget
-from zope.app.form.browser import DatetimeWidget
-from zope.app.form.browser import DatetimeI18nWidget
-from zope.formlib.interfaces import ConversionError, WidgetInputError
-
-
-class DatetimeWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the datetime widget.
-
- >>> verifyClass(IInputWidget, DatetimeWidget)
- True
- """
-
- _FieldFactory = Datetime
- _WidgetFactory = DatetimeWidget
-
- def testRender(self):
- super(DatetimeWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- 'value="2004-03-26 12:58:59"'))
-
- def test_hasInput(self):
- del self._widget.request.form['field.foo']
- self.failIf(self._widget.hasInput())
- # widget has input, even if input is an empty string
- self._widget.request.form['field.foo'] = u''
- self.failUnless(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u'2003-03-26 12:00:00'
- self.failUnless(self._widget.hasInput())
-
- def test_getInputValue(self,
- value=u'2004-03-26 12:58:59',
- check_value=parseDatetimetz('2004-03-26 12:58:59')):
- self._widget.request.form['field.foo'] = u''
- self.assertRaises(WidgetInputError, self._widget.getInputValue)
- self._widget.request.form['field.foo'] = value
- self.assertEquals(self._widget.getInputValue(), check_value)
- self._widget.request.form['field.foo'] = u'abc'
- self.assertRaises(ConversionError, self._widget.getInputValue)
-
-class DatetimeI18nWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the i18n datetime widget.
-
- >>> verifyClass(IInputWidget, DatetimeI18nWidget)
- True
- """
-
- _FieldFactory = Datetime
- _WidgetFactory = DatetimeI18nWidget
-
- def testDefaultDisplayStyle(self):
- self.failIf(self._widget.displayStyle)
-
- def testRender(self):
- super(DatetimeI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- 'value="26.03.2004 12:58:59"'))
-
- def testRenderShort(self):
- self._widget.displayStyle = "short"
- super(DatetimeI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- 'value="26.03.04 12:58"'))
-
- def testRenderMedium(self):
- self._widget.displayStyle = "medium"
- super(DatetimeI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- 'value="26.03.2004 12:58:59"'))
-
- def testRenderLong(self):
- self._widget.displayStyle = "long"
- super(DatetimeI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- u'value="26 \u043c\u0430\u0440\u0442\u0430 2004 \u0433.'
- u' 12:58:59 +000"'))
-
- def testRenderFull(self):
- self._widget.displayStyle = "full"
- super(DatetimeI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- u'value="26 \u043c\u0430\u0440\u0442\u0430 2004 \u0433.'
- u' 12:58:59 +000"'))
-
- def test_hasInput(self):
- del self._widget.request.form['field.foo']
- self.failIf(self._widget.hasInput())
- # widget has input, even if input is an empty string
- self._widget.request.form['field.foo'] = u''
- self.failUnless(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u'26.03.2003 12:00:00'
- self.failUnless(self._widget.hasInput())
-
- def test_getDefaultInputValue(self,
- value=u'26.03.2004 12:58:59',
- check_value=datetime.datetime(2004, 3, 26, 12, 58, 59)):
- self._widget.request.form['field.foo'] = u''
- self.assertRaises(WidgetInputError, self._widget.getInputValue)
- self._widget.request.form['field.foo'] = value
- self.assertEquals(self._widget.getInputValue(), check_value)
- self._widget.request.form['field.foo'] = u'abc'
- self.assertRaises(ConversionError, self._widget.getInputValue)
-
- def test_getShortInputValue(self):
- self._widget.displayStyle = "short"
- self.test_getDefaultInputValue(
- value=u'26.03.04 12:58',
- check_value=datetime.datetime(2004, 3, 26, 12, 58)
- )
-
- def test_getMediumInputValue(self):
- self._widget.displayStyle = "medium"
- self.test_getDefaultInputValue(
- value=u'26.03.2004 12:58:59',
- check_value=datetime.datetime(2004, 3, 26, 12, 58, 59)
- )
-
- def test_getLongInputValue(self):
- self._widget.displayStyle = "long"
- self.test_getDefaultInputValue(
- value=(u'26 \u043c\u0430\u0440\u0442\u0430 2004 \u0433.'
- u' 12:58:59 +030'),
- check_value=datetime.datetime(2004, 3, 26, 12, 58, 59,
- tzinfo=tzinfo(30))
- )
-
- def test_getFullInputValue(self):
- self._widget.displayStyle = "full"
- self.test_getDefaultInputValue(
- value=(u'26 \u043c\u0430\u0440\u0442\u0430 2004 \u0433.'
- u' 12:58:59 +030'),
- check_value=datetime.datetime(2004, 3, 26, 12, 58, 59,
- tzinfo=tzinfo(30))
- )
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(DatetimeWidgetTest),
- unittest.makeSuite(DatetimeI18nWidgetTest),
- doctest.DocTestSuite(),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_datewidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_datewidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_datewidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,160 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Date Widget tests
-
-$Id$
-"""
-import datetime
-import unittest
-from zope.testing import doctest
-from zope.datetime import parseDatetimetz
-from zope.schema import Date
-from zope.interface.verify import verifyClass
-
-from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
-from zope.formlib.interfaces import IInputWidget
-from zope.app.form.browser import DateWidget
-from zope.app.form.browser import DateI18nWidget
-from zope.formlib.interfaces import ConversionError, WidgetInputError
-
-
-class DateWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the date widget.
-
- >>> verifyClass(IInputWidget, DateWidget)
- True
- """
-
- _FieldFactory = Date
- _WidgetFactory = DateWidget
-
- def testRender(self):
- super(DateWidgetTest, self).testRender(
- datetime.date(2003, 3, 26),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- 'value="2003-03-26"'))
-
- def test_hasInput(self):
- del self._widget.request.form['field.foo']
- self.failIf(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u''
- self.failUnless(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u'2003-03-26'
- self.failUnless(self._widget.hasInput())
-
- def test_getInputValue(self,
- value=u'2004-03-26',
- check_value=datetime.date(2004, 3, 26)):
- self._widget.request.form['field.foo'] = u''
- self.assertRaises(WidgetInputError, self._widget.getInputValue)
- self._widget.request.form['field.foo'] = value
- self.assertEquals(self._widget.getInputValue(), check_value)
- self._widget.request.form['field.foo'] = u'abc'
- self.assertRaises(ConversionError, self._widget.getInputValue)
-
-class DateI18nWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the i18n date widget.
-
- >>> verifyClass(IInputWidget, DateI18nWidget)
- True
- """
-
- _FieldFactory = Date
- _WidgetFactory = DateI18nWidget
-
- def testDefaultDisplayStyle(self):
- self.failIf(self._widget.displayStyle)
-
- def testRender(self):
- super(DateI18nWidgetTest, self).testRender(
- datetime.date(2003, 3, 26),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- 'value="26.03.2003"'))
-
- def testRenderShort(self):
- self._widget.displayStyle = "short"
- super(DateI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- 'value="26.03.04"'))
-
- def testRenderMedium(self):
- self._widget.displayStyle = "medium"
- super(DateI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- 'value="26.03.2004"'))
-
- def testRenderLong(self):
- self._widget.displayStyle = "long"
- super(DateI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- u'value="26 \u043c\u0430\u0440\u0442\u0430 2004 \u0433."'))
-
- def testRenderFull(self):
- self._widget.displayStyle = "full"
- super(DateI18nWidgetTest, self).testRender(
- datetime.datetime(2004, 3, 26, 12, 58, 59),
- ('type="text"', 'id="field.foo"', 'name="field.foo"',
- u'value="26 \u043c\u0430\u0440\u0442\u0430 2004 \u0433."'))
-
- def test_hasInput(self):
- del self._widget.request.form['field.foo']
- self.failIf(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u''
- self.failUnless(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u'26.03.2003'
- self.failUnless(self._widget.hasInput())
-
- def test_getDefaultInputValue(self,
- value=u'26.03.2004',
- check_value=datetime.date(2004, 3, 26)):
- self._widget.request.form['field.foo'] = u''
- self.assertRaises(WidgetInputError, self._widget.getInputValue)
- self._widget.request.form['field.foo'] = value
- self.assertEquals(self._widget.getInputValue(), check_value)
- self._widget.request.form['field.foo'] = u'abc'
- self.assertRaises(ConversionError, self._widget.getInputValue)
-
- def test_getShortInputValue(self):
- self._widget.displayStyle = "short"
- self.test_getDefaultInputValue(u'26.03.04')
-
- def test_getMediumInputValue(self):
- self._widget.displayStyle = "medium"
- self.test_getDefaultInputValue(u'26.03.2004')
-
- def test_getLongInputValue(self):
- self._widget.displayStyle = "long"
- self.test_getDefaultInputValue(
- u'26 \u043c\u0430\u0440\u0442\u0430 2004 \u0433.'
- )
-
- def test_getFullInputValue(self):
- self._widget.displayStyle = "full"
- self.test_getDefaultInputValue(
- u'26 \u043c\u0430\u0440\u0442\u0430 2004 \u0433.'
- )
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(DateWidgetTest),
- unittest.makeSuite(DateI18nWidgetTest),
- doctest.DocTestSuite(),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_decimalwidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_decimalwidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_decimalwidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,66 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002, 2006 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Decimal Widget tests
-
-$Id$
-"""
-import unittest
-import decimal
-from zope.testing import doctest
-from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
-from zope.formlib.interfaces import IInputWidget
-from zope.app.form.browser import DecimalWidget
-from zope.formlib.interfaces import ConversionError, WidgetInputError
-from zope.interface.verify import verifyClass
-
-from zope.schema import Decimal
-
-
-class DecimalWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the float widget.
-
- >>> verifyClass(IInputWidget, DecimalWidget)
- True
- """
-
- _FieldFactory = Decimal
- _WidgetFactory = DecimalWidget
-
- def test_hasInput(self):
- del self._widget.request.form['field.foo']
- self.failIf(self._widget.hasInput())
- # widget has input, even if input is an empty string
- self._widget.request.form['field.foo'] = u''
- self.failUnless(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u'123'
- self.failUnless(self._widget.hasInput())
-
- def test_getInputValue(self):
- self._widget.request.form['field.foo'] = u''
- self.assertRaises(WidgetInputError, self._widget.getInputValue)
- self._widget.request.form['field.foo'] = u'123.45'
- self.assertEquals(self._widget.getInputValue(),
- decimal.Decimal("123.45"))
- self._widget.request.form['field.foo'] = u'abc'
- self.assertRaises(ConversionError, self._widget.getInputValue)
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(DecimalWidgetTest),
- doctest.DocTestSuite(),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_displaywidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_displaywidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_displaywidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,129 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Generic Text Widgets tests
-
-$Id$
-"""
-import unittest
-from zope.interface.verify import verifyClass
-from zope.interface.exceptions import DoesNotImplement
-from zope.publisher.browser import TestRequest
-from zope.schema import TextLine
-from zope.testing.doctest import DocTestSuite
-
-from zope.formlib.widget import DisplayWidget, UnicodeDisplayWidget
-
-
-def test_implemented_interfaces():
- """Make sure that the display widget implements the correct interfaces.
-
- Like all browser-used widgets, DisplayWidget must implement
- `IBrowserWidget`.
-
- >>> from zope.app.form.browser.interfaces import IBrowserWidget
- >>> verifyClass(IBrowserWidget, DisplayWidget)
- True
-
- But unlike most other widgets in this package, the display widget is *not*
- an `IInputWidget`.
-
- >>> from zope.formlib.interfaces import IInputWidget
- >>> try:
- ... verifyClass(IInputWidget, DisplayWidget)
- ... except DoesNotImplement:
- ... 'not implemented'
- 'not implemented'
- """
-
-def test_not_required():
- """Make sure that display widgets are not required
-
- >>> field = TextLine(title = u'Title',
- ... __name__ = u'title',
- ... default = u'<My Title>')
- >>> widget = DisplayWidget(field, TestRequest())
- >>> widget.required
- False
-
- """
-
-def test_value_escaping():
- """Make sure that the returned values are correctly escaped.
-
- First we need to create a field that is the context of the display widget.
- >>> field = TextLine(title = u'Title',
- ... __name__ = u'title',
- ... default = u'<My Title>')
-
- >>> field = field.bind(None)
-
- Now we are ready to instantiate our widget.
-
- >>> widget = DisplayWidget(field, TestRequest())
-
- If no data was specified in the widget, the field's default value will be
- chosen.
-
- >>> widget()
- u'<My Title>'
-
- Now let's set a value and make sure that, when output, it is also
- correctly escaped.
-
- >>> widget.setRenderedValue(u'<Another Title>')
- >>> widget()
- u'<Another Title>'
-
- When the value is the missing_value, the empty string should be
- displayed::
-
- >>> field = TextLine(title = u'Title',
- ... __name__ = u'title',
- ... required = False)
-
- >>> field = field.bind(None)
- >>> widget = DisplayWidget(field, TestRequest())
- >>> widget.setRenderedValue(field.missing_value)
-
- >>> widget()
- ''
-
- If there's no default for the field and the value is missing on
- the bound object, the empty string should still be displayed::
-
- >>> field = TextLine(title=u'Title',
- ... __name__=u'title',
- ... required=False)
-
- >>> class Thing:
- ... title = field.missing_value
-
- >>> field = field.bind(Thing())
- >>> widget = DisplayWidget(field, TestRequest())
-
- >>> widget()
- ''
-
- """
-
-
-def test_suite():
- suite = unittest.TestSuite()
- suite.addTest(DocTestSuite())
- suite.addTest(DocTestSuite(
- extraglobs={"DisplayWidget": UnicodeDisplayWidget}))
- return suite
-
-if __name__ == '__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_intwidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_intwidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_intwidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,65 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Integer Widget Tests
-
-$Id$
-"""
-import unittest
-from zope.testing import doctest
-from unittest import main, makeSuite
-from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
-from zope.formlib.interfaces import IInputWidget
-from zope.app.form.browser import IntWidget
-from zope.formlib.interfaces import ConversionError, WidgetInputError
-from zope.interface.verify import verifyClass
-
-from zope.schema import Int
-
-
-class IntWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the int widget.
-
- >>> verifyClass(IInputWidget, IntWidget)
- True
- """
-
- _FieldFactory = Int
- _WidgetFactory = IntWidget
-
- def test_hasInput(self):
- del self._widget.request.form['field.foo']
- self.failIf(self._widget.hasInput())
- # widget has input, even if input is an empty string
- self._widget.request.form['field.foo'] = u''
- self.failUnless(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u'123'
- self.failUnless(self._widget.hasInput())
-
- def test_getInputValue(self):
- self._widget.request.form['field.foo'] = u''
- self.assertRaises(WidgetInputError, self._widget.getInputValue)
- self._widget.request.form['field.foo'] = u'123'
- self.assertEquals(self._widget.getInputValue(), 123)
- self._widget.request.form['field.foo'] = u'abc'
- self.assertRaises(ConversionError, self._widget.getInputValue)
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(IntWidgetTest),
- doctest.DocTestSuite(),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_itemswidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_itemswidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_itemswidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,595 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Select Widget Tests
-
-$Id$
-"""
-import unittest
-
-from zope.component.testing import PlacelessSetup
-from zope.interface import Interface, implements
-from zope.publisher.browser import TestRequest
-from zope.schema import Choice, List, Set, FrozenSet
-from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
-
-import zope.app.form.browser.itemswidgets
-from zope.app.form.browser.itemswidgets import ItemsWidgetBase
-from zope.app.form.browser.itemswidgets import ItemDisplayWidget
-from zope.app.form.browser.itemswidgets import ItemsMultiDisplayWidget
-from zope.app.form.browser.itemswidgets import ListDisplayWidget
-from zope.app.form.browser.itemswidgets import SetDisplayWidget
-from zope.app.form.browser.itemswidgets import ItemsEditWidgetBase
-from zope.app.form.browser.itemswidgets import SelectWidget, DropdownWidget
-from zope.app.form.browser.itemswidgets import RadioWidget
-from zope.app.form.browser.itemswidgets import ItemsMultiEditWidgetBase
-from zope.app.form.browser.itemswidgets import MultiSelectWidget
-from zope.app.form.browser.itemswidgets import OrderedMultiSelectWidget
-from zope.app.form.browser.itemswidgets import MultiCheckBoxWidget
-from zope.app.form.browser.tests.support import VerifyResults
-
-vocab = SimpleVocabulary(
- [SimpleTerm(value, token, title) for value, token, title in (
- ('one', 'token1', 'One'),
- ('two', 'token2', 'Two'),
- ('three', 'token3', 'Three'))])
-
-class ICollector(Interface):
- choice = Choice(
- title=u"Number",
- description=u"The Number",
- # we want to be able to distinguish between tokens and values
- vocabulary=vocab,
- required=True)
-
- numbers = List(
- title=u"Numbers",
- description=u"The Numbers",
- value_type=choice,
- required=False)
-
- letters = Set(
- title=u"Letters",
- description=u"The Letters",
- value_type=choice,
- required=False)
-
- frozenLetters = FrozenSet(
- title=u"Frozen Letters",
- description=u"The Frozen Letters",
- value_type=choice,
- required=False)
-
-
-class Collector(object):
- implements(ICollector)
-
- def __init__(self, numbers=None):
- self.numbers = numbers or []
-
-
-class ItemsWidgetBaseTest(VerifyResults, PlacelessSetup, unittest.TestCase):
-
- _widget = ItemsWidgetBase
- _field = ICollector.get('choice')
- _vocabulary = _field.vocabulary
-
- def _makeWidget(self, form=None, nums=None):
- request = TestRequest(form=form or {})
- collector = Collector(nums)
- bound = self._field.bind(collector)
- return self._widget(bound, self._vocabulary, request)
-
- def test_setPrefix(self):
- widget = self._makeWidget()
- name = self._field.getName()
- # Default prefix
- self.assertEqual(widget._prefix, 'field.')
- self.assertEqual(widget.name, 'field.%s' %name)
- self.assertEqual(widget.empty_marker_name,
- 'field.%s-empty-marker' %name)
- # Declaring custom prefix
- widget.setPrefix('foo')
- self.assertEqual(widget._prefix, 'foo.')
- self.assertEqual(widget.name, 'foo.%s' %name)
- self.assertEqual(widget.empty_marker_name,
- 'foo.%s-empty-marker' %name)
- # Declaring empty prefix
- widget.setPrefix('')
- self.assertEqual(widget._prefix, '')
- self.assertEqual(widget.name, name)
- self.assertEqual(widget.empty_marker_name,
- '%s-empty-marker' %name)
-
- def test_convertTokensToValues(self):
- widget = self._makeWidget()
- self.assertEqual(widget.convertTokensToValues(['token1', 'token2']),
- ['one', 'two'])
-
-
-class ItemDisplayWidgetTest(ItemsWidgetBaseTest):
-
- _widget = ItemDisplayWidget
-
- def test_setVocabulary(self):
- widget = self._makeWidget()
- self.assert_(widget.vocabulary is not None)
- self.assertEqual(widget.vocabulary, self._field.vocabulary)
-
- def test__call__(self):
- widget = self._makeWidget()
- self.assertEqual(widget(), '')
- widget = self._makeWidget(form={'field.choice': 'token1'})
- self.assertEqual(widget(), 'One')
-
- def test_not_required(self):
- self.failIf(self._makeWidget().required)
-
-
-class ItemsMultiDisplayWidgetTest(ItemsWidgetBaseTest):
-
- _widget = ItemsMultiDisplayWidget
- _field = ICollector.get('numbers')
- _vocabulary = _field.value_type.vocabulary
- _tag = 'ol'
-
- def test__call__(self):
- widget = self._makeWidget()
- self.assertEqual(widget(), '')
- widget = self._makeWidget(form={'field.numbers': ['token1', 'token2']})
- self.assertEqual(
- widget(),
- '<%s id="field.numbers" >'
- '<li>One</li>\n<li>Two</li>'
- '</%s>' %(self._tag, self._tag))
-
- def test_renderItems(self):
- widget = self._makeWidget()
- self.assertEqual(
- widget.renderItems(['one', 'two']),
- [u'<li>One</li>', u'<li>Two</li>'])
- self.assertRaises(LookupError, widget.renderItems, 'one')
- self.assertRaises(TypeError, widget.renderItems, 1)
-
-
- def test_not_required(self):
- numbers = List(value_type=ICollector['choice']).bind(Collector(None))
- request = TestRequest()
- widget = self._widget(numbers, self._vocabulary, request)
- self.failIf(widget.required)
-
-
-class ListDisplayWidgetTest(ItemsMultiDisplayWidgetTest):
- _widget = ListDisplayWidget
- _tag = 'ol'
-
-
-class SetDisplayWidgetTest(ItemsMultiDisplayWidgetTest):
- _widget = SetDisplayWidget
- _tag = 'ul'
-
-
-class ItemsEditWidgetBaseTest(ItemsWidgetBaseTest):
-
- _widget = ItemsEditWidgetBase
-
- def test_div(self):
- widget = self._makeWidget()
- self.assertEqual(widget._div('', ''), '')
- self.assertEqual(widget._div('foo', ''), '')
- self.assertEqual(widget._div('', 'bar'), '<div>\nbar\n</div>')
- self.assertEqual(widget._div('foo', 'bar'),
- '<div class="foo">\nbar\n</div>')
- self.assertEqual(widget._div('foo', 'bar', style='blah'),
- '<div class="foo" style="blah">\nbar\n</div>')
-
- def test_renderItem(self):
- widget = self._makeWidget()
- self.assertEqual(widget.renderItem('', 'Foo', 'foo', '', None),
- '<option value="foo">Foo</option>')
- self.assertEqual(widget.renderItem('', 'Foo', 'foo', '', 'klass'),
- '<option class="klass" value="foo">Foo</option>')
-
- def test_renderSelectedItem(self):
- widget = self._makeWidget()
- self.verifyResult(
- widget.renderSelectedItem('', 'Foo', 'foo', '', None),
- ['<option', 'value="foo"', 'selected="selected"', '>Foo</option>'])
- self.verifyResult(
- widget.renderSelectedItem('', 'Foo', 'foo', '', 'klass'),
- ['<option', 'class="klass"', 'value="foo"', 'selected="selected"',
- '>Foo</option>'])
-
- def test_renderItemsWithValues(self):
- widget = self._makeWidget()
- self.assertEqual(
- widget.renderItemsWithValues(['one', 'two']),
- [u'<option selected="selected" value="token1">One</option>',
- u'<option selected="selected" value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
- self.assertEqual(
- widget.renderItemsWithValues([]),
- [u'<option value="token1">One</option>',
- u'<option value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
-
-# This test is disabled because it tests for the presense of a missfeature,
-# which has been removed. Did someone actually *want* this?
-## def test_error(self):
-## widget = self._makeWidget(form={'field.choice': 'ten'})
-## widget.setPrefix('field.')
-## widget._getFormValue()
-## self.assert_(isinstance(widget._error, ConversionError))
-
- def test_hidden(self):
- widget = self._makeWidget(form={'field.choice': 'token2'})
- widget.setPrefix('field.')
- widget.context.required = False
- self.verifyResult(
- widget.hidden(),
- ['<input', 'type="hidden"', 'value="token2"', 'id="field.choice"',
- 'name="field.choice"'])
-
-class SelectWidgetTest(ItemsEditWidgetBaseTest):
-
- _widget = SelectWidget
- _size = 5
-
- def test__call__(self):
- widget = self._makeWidget(form={'field.choice': 'token1'})
- widget.setPrefix('field.')
- widget.context.required = False
- self.assertEqual(
- widget(),
- '<div>\n'
- '<div class="value">\n'
- '<select id="field.choice" name="field.choice" size="%i" >\n'
- '<option value="">(no value)</option>\n'
- '<option selected="selected" value="token1">One</option>\n'
- '<option value="token2">Two</option>\n'
- '<option value="token3">Three</option>\n'
- '</select>\n</div>\n'
- '<input name="field.choice-empty-marker" '
- 'type="hidden" value="1" />\n</div>' %self._size)
-
- def test_renderValue(self):
- widget = self._makeWidget()
- widget.setPrefix('field.')
- self.assertEqual(
- widget.renderValue('one'),
- '<select id="field.choice" name="field.choice" size="%i" >\n'
- '<option selected="selected" value="token1">One</option>\n'
- '<option value="token2">Two</option>\n'
- '<option value="token3">Three</option>\n'
- '</select>' %self._size)
-
- def test_renderItems(self):
- widget = self._makeWidget()
- widget.setPrefix('field.')
- self.assertEqual(
- widget.renderItems('one'),
- [u'<option selected="selected" value="token1">One</option>',
- u'<option value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
- self.assertEqual(
- widget.renderItems('two'),
- [u'<option value="token1">One</option>',
- u'<option selected="selected" value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
- self.assertEqual(
- widget.renderItems(None),
- [u'<option value="token1">One</option>',
- u'<option value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
-
- def test_renderItems_notRequired(self):
- widget = self._makeWidget()
- widget.setPrefix('field.')
- widget.context.required = False
- self.assertEqual(
- widget.renderItems([]),
- [u'<option value="">(no value)</option>',
- u'<option value="token1">One</option>',
- u'<option value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
-
- def test_renderItems_firstItem(self):
- widget = self._makeWidget()
- widget.setPrefix('field.')
- widget.firstItem = True
- self.assertEqual(
- widget.renderItems(widget._toFormValue(widget.context.missing_value)),
- [u'<option value="token1">One</option>',
- u'<option value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
-
-
-class DropdownWidgetTest(SelectWidgetTest):
-
- _widget = DropdownWidget
- _size = 1
-
- def test_renderItems_firstItem(self):
- widget = self._makeWidget()
- widget.setPrefix('field.')
- widget.firstItem = True
- self.assertEqual(
- widget.renderItems(widget._toFormValue(widget.context.missing_value)),
- [u'<option selected="selected" value="">(no value)</option>',
- u'<option value="token1">One</option>',
- u'<option value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
- try:
- # test BBB starting with 3.6.0
- zope.formlib.itemswidgets.EXPLICIT_EMPTY_SELECTION = False
- self.assertEqual(
- widget.renderItems(widget._toFormValue(widget.context.missing_value)),
- [u'<option value="token1">One</option>',
- u'<option value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
- finally:
- zope.formlib.itemswidgets.EXPLICIT_EMPTY_SELECTION = True
-
-
-class RadioWidgetTest(ItemsEditWidgetBaseTest):
-
- _widget = RadioWidget
-
- def test_renderItem(self):
- widget = self._makeWidget()
- self.verifyResult(
- widget.renderItem('', 'Foo', 'foo', 'bar', None),
- ['<label', '<input', 'type="radio"', 'name="bar"', 'value="foo"',
- 'class="radioType"', '> Foo'])
- self.verifyResult(
- widget.renderItem('bar', 'Foo', 'foo', 'bar', 'klass'),
- ['<input', 'type="radio"', 'name="bar"', 'value="foo"',
- 'class="klass radioType"', '> Foo'])
-
- def test_renderSelectedItem(self):
- widget = self._makeWidget()
- self.verifyResult(
- widget.renderSelectedItem('', 'Foo', 'foo', 'bar', 'klass'),
- ['<label', '<input', 'type="radio"', 'name="bar"', 'value="foo"',
- 'checked="checked"', '> Foo'])
- self.verifyResult(
- widget.renderSelectedItem('', 'Foo', 'foo', 'bar', 'klass'),
- ['<label', '<input', 'type="radio"', 'name="bar"', 'value="foo"',
- 'class="klass radioType"', 'checked="checked"', '> Foo'])
-
- def test_renderItemsWithValues(self):
- widget = self._makeWidget()
- items = widget.renderItemsWithValues(['one'])
- values = [('token1','One'), ('token2','Two'), ('token3','Three')]
- for index, item in enumerate(items):
- self.verifyResult(
- item,
- ['<label', '<input', 'class="radioType"', 'name="field.choice"',
- 'id="field.choice.%i' %index, 'type="radio"',
- 'value="%s"' %values[index][0],
- ' %s' %values[index][1]])
- self.verifyResult(items[0], ['checked="checked"'])
-
- def test_renderItems(self):
- widget = self._makeWidget()
- items = widget.renderItems('one')
- values = [('token1','One'), ('token2','Two'), ('token3','Three')]
- for index, item in enumerate(items):
- self.verifyResult(
- item,
- ['<label', '<input', 'class="radioType"', 'name="field.choice"',
- 'id="field.choice.%i' %index, 'type="radio"',
- 'value="%s"' %values[index][0], ' %s' %values[index][1]])
- self.verifyResult(items[0], ['checked="checked"'])
-
- def test_renderItems_notRequired(self):
- widget = self._makeWidget()
- widget.context.required = False
- items = widget.renderItems([])
- values = [('', '(no value)'),
- ('token1','One'),
- ('token2','Two'),
- ('token3','Three')]
- for index, item in enumerate(items):
- self.verifyResult(
- item,
- ['<label', '<input', 'class="radioType"',
- 'name="field.choice"', 'type="radio"',
- 'value="%s"' %values[index][0], ' %s' %values[index][1]])
-
- def test_renderItems_firstItem(self):
- widget = self._makeWidget()
- items = widget.renderItems(
- widget._toFormValue(widget.context.missing_value))
- values = [('token1','One'), ('token2','Two'), ('token3','Three')]
- for index, item in enumerate(items):
- self.verifyResult(
- item,
- ['<label', '<input', 'class="radioType"',
- 'name="field.choice"', 'id="field.choice.%i"' % index,
- 'type="radio"', 'value="%s"' % values[index][0],
- ' %s' % values[index][1]])
-
- def test_renderValue(self):
- widget = self._makeWidget()
- self.verifyResult(widget.renderValue(None), ['<br /><label for='])
- widget.orientation = 'horizontal'
- self.verifyResult(widget.renderValue(None),
- [' <label for='])
-
-
-class ItemsMultiEditWidgetBaseTest(ItemsEditWidgetBaseTest):
-
- _widget = ItemsMultiEditWidgetBase
- _field = ICollector.get('numbers')
- _vocabulary = _field.value_type.vocabulary
-
- def test_renderValue(self):
- widget = self._makeWidget()
- self.verifyResult(
- widget.renderValue(['one', 'two']),
- ['<select', 'multiple="multiple"', 'name="field.numbers:list"',
- 'size="5"', '><option', 'selected="selected"', 'value="token1"',
- '>One</option>\n', 'value="token2"', '>Two</option>\n',
- 'value="token3"', '>Three</option>', '</select>'])
-
- def test_renderItemsWithValues(self):
- widget = self._makeWidget()
- self.assertEqual(
- widget.renderItemsWithValues(['one', 'two']),
- [u'<option selected="selected" value="token1">One</option>',
- u'<option selected="selected" value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
- self.assertEqual(
- widget.renderItemsWithValues([]),
- [u'<option value="token1">One</option>',
- u'<option value="token2">Two</option>',
- u'<option value="token3">Three</option>'])
-
-# This test is disabled because it tests for the presense of a missfeature,
-# which has been removed. Did someone actually *want* this?
-## def test_error(self):
-## widget = self._makeWidget(form={'field.numbers': ['ten']})
-## widget.setPrefix('field.')
-## widget._getFormValue()
-## self.assert_(isinstance(widget._error, ConversionError))
-
- def test_hidden(self):
- widget = self._makeWidget(
- form={'field.numbers': ['two','three']})
- widget.setPrefix('field.')
- widget.context.required = False
- self.verifyResult(
- widget.hidden(),
- ['<input', 'type="hidden"', 'value="token2"', 'id="field.numbers"',
- 'name="field.numbers:list"', 'value="token3"'])
-
- def test_getInputValue(self):
- widget = self._makeWidget(form={'field.numbers': ['token2', 'token3']})
- widget.setPrefix('field.')
- self.assertEqual(widget.getInputValue(), ['two', 'three'])
-
- self._field = ICollector.get('letters')
- widget = self._makeWidget(form={'field.letters-empty-marker': '1'})
- widget.setPrefix('field.')
- self.assertEqual(widget.getInputValue(), set([]))
- widget = self._makeWidget(form={'field.letters': ['token2', 'token3']})
- widget.setPrefix('field.')
- self.assertEqual(widget.getInputValue(), set(['two', 'three']))
-
- self._field = ICollector.get('frozenLetters')
- widget = self._makeWidget(form={'field.frozenLetters-empty-marker':
- '1'})
- widget.setPrefix('field.')
- field_value = widget.getInputValue()
- self.assertEqual(field_value, frozenset())
- widget = self._makeWidget(form={'field.frozenLetters':
- ['token2', 'token3']})
- widget.setPrefix('field.')
- field_value = widget.getInputValue()
- self.assertEqual(field_value, frozenset(['two', 'three']))
- self.assert_(isinstance(field_value, frozenset))
-
-
-class MultiSelectWidgetTest(ItemsMultiEditWidgetBaseTest):
-
- _widget = MultiSelectWidget
-
-
-class OrderedMultiSelectWidgetTest(ItemsMultiEditWidgetBaseTest):
-
- _widget = OrderedMultiSelectWidget
-
- def test_choices(self):
- widget = self._makeWidget()
- choices = [choice['text'] for choice in widget.choices()]
- choices.sort()
- self.assertEqual(choices, ['One', 'Three', 'Two'])
-
- def test_selected(self):
- widget = self._makeWidget(nums=['one'])
- widget._data = ['two']
- selected = [select['text'] for select in widget.selected()]
- selected.sort()
- self.assertEqual(selected, ['One', 'Two'])
- widget._data = ['one']
- selected = [select['text'] for select in widget.selected()]
- selected.sort()
- self.assertEqual(selected, ['One'])
-
-
-class MultiCheckBoxWidgetTest(ItemsMultiEditWidgetBaseTest):
-
- _widget = MultiCheckBoxWidget
-
- def test_renderItem(self):
- widget = self._makeWidget()
- self.verifyResult(
- widget.renderItem('', 'Foo', 'foo', 'bar', None),
- ['<input', 'type="checkbox"', 'name="bar"', 'value="foo"',
- 'class="checkboxType"', '> Foo'])
- self.verifyResult(
- widget.renderItem('bar', 'Foo', 'foo', 'bar', 'klass'),
- ['<input', 'type="checkbox"', 'name="bar"', 'value="foo"',
- 'class="klass checkboxType"', '> Foo'])
-
- def test_renderSelectedItem(self):
- widget = self._makeWidget()
- self.verifyResult(
- widget.renderSelectedItem('', 'Foo', 'foo', 'bar', 'klass'),
- ['<input', 'type="checkbox"', 'name="bar"', 'value="foo"',
- 'checked="checked"', '> Foo'])
- self.verifyResult(
- widget.renderSelectedItem('', 'Foo', 'foo', 'bar', 'klass'),
- ['<input', 'type="checkbox"', 'name="bar"', 'value="foo"',
- 'class="klass checkboxType"', 'checked="checked"', '> Foo'])
-
- def test_renderValue(self):
- widget = self._makeWidget()
- self.verifyResult(widget.renderValue(None), ['<br /><label for='])
- widget.orientation='horizontal'
- self.verifyResult(widget.renderValue(None),
- [' <label for='])
-
- def test_renderItemsWithValues(self):
- widget = self._makeWidget()
- items = widget.renderItemsWithValues(['one'])
- values = [('token1','One'), ('token2','Two'), ('token3','Three')]
- for index, item in enumerate(items):
- self.verifyResult(
- item,
- ['<input', 'class="checkboxType',
- 'id="field.numbers.%i"' %index, 'type="checkbox"',
- 'value="%s"' % values[index][0],
- '/> %s' % values[index][1]])
-
- self.verifyResult(items[0], ['checked="checked"'])
-
-
-def test_suite():
- suite = unittest.makeSuite(ItemDisplayWidgetTest)
- suite.addTest(unittest.makeSuite(ItemsMultiDisplayWidgetTest))
- suite.addTest(unittest.makeSuite(ListDisplayWidgetTest))
- suite.addTest(unittest.makeSuite(SetDisplayWidgetTest))
- suite.addTest(unittest.makeSuite(ItemsEditWidgetBaseTest))
- suite.addTest(unittest.makeSuite(SelectWidgetTest))
- suite.addTest(unittest.makeSuite(DropdownWidgetTest))
- suite.addTest(unittest.makeSuite(RadioWidgetTest))
- suite.addTest(unittest.makeSuite(ItemsMultiEditWidgetBaseTest))
- suite.addTest(unittest.makeSuite(MultiSelectWidgetTest))
- suite.addTest(unittest.makeSuite(OrderedMultiSelectWidgetTest))
- suite.addTest(unittest.makeSuite(MultiCheckBoxWidgetTest))
- return suite
-
-if __name__ == '__main__':
- unittest.main(defaultTest="test_suite")
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_multicheckboxwidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_multicheckboxwidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_multicheckboxwidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,105 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Multi-Checkbox Widget Tests
-
-$Id$
-"""
-import unittest
-from zope.testing import doctest
-from zope.interface import Interface, implements
-from zope.publisher.browser import TestRequest
-from zope.schema import Choice, List
-
-from zope.formlib.interfaces import IInputWidget
-from zope.app.form.browser import MultiCheckBoxWidget
-from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
-from zope.interface.verify import verifyClass
-
-class MultiCheckBoxWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the multi checkbox widget.
-
- >>> verifyClass(IInputWidget, MultiCheckBoxWidget)
- True
- """
-
- _WidgetFactory = MultiCheckBoxWidget
- _FieldFactory = List
-
- def setUpContent(self, desc=u'', title=u'Foo Title'):
- class ITestContent(Interface):
- foo = self._FieldFactory(
- title=title,
- description=desc,
- value_type=Choice(values=[u'foo', u'bar'])
- )
- class TestObject(object):
- implements(ITestContent)
-
- self.content = TestObject()
- field = ITestContent['foo']
- field = field.bind(self.content)
- request = TestRequest(HTTP_ACCEPT_LANGUAGE='pl',
- form={'field.foo': u'bar'})
- self._widget = self._WidgetFactory(field, field.value_type.vocabulary,
- request)
-
- def testProperties(self):
- self.assertEqual(self._widget.cssClass, "")
- self.assertEqual(self._widget.extra, '')
- self.assertEqual(self._widget.orientation, 'vertical')
-
-
- def testRenderItem(self):
- check_list = ('type="checkbox"', 'id="field.bar.',
- 'name="field.bar"', 'value="foo"', 'Foo')
- self.verifyResult(
- self._widget.renderItem(0, 'Foo', 'foo', 'field.bar', None),
- check_list)
- check_list += ('checked="checked"',)
- self.verifyResult(
- self._widget.renderSelectedItem(
- 0, 'Foo', 'foo', 'field.bar', None),
- check_list)
-
-
- def testRenderItems(self):
- check_list = ('type="checkbox"', 'id="field.foo.',
- 'name="field.foo"', 'value="bar"', 'bar',
- 'value="foo"', 'foo', 'checked="checked"')
- self.verifyResult('\n'.join(self._widget.renderItems(['bar'])),
- check_list)
-
-
- def testRender(self):
- check_list = ('type="checkbox"', 'id="field.foo.',
- 'name="field.foo"', 'value="bar"', 'bar',
- 'value="foo"', 'foo', 'checked="checked"')
- self.verifyResult(self._widget(), check_list)
-
- check_list = ('type="hidden"', 'id="field.foo', 'name="field.foo:list"',
- 'value="bar"')
- self.verifyResult(self._widget.hidden(), check_list)
- check_list = ('style="color: red"',) + check_list
- self._widget.extra = 'style="color: red"'
- self.verifyResult(self._widget.hidden(), check_list)
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(MultiCheckBoxWidgetTest),
- doctest.DocTestSuite(),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_objectwidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_objectwidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_objectwidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,145 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Object Widget tests
-
-$Id$
-"""
-import unittest
-import sys
-from zope.component import testing
-from zope.interface import Interface, implements
-from zope.publisher.browser import TestRequest
-from zope.schema import Object, TextLine
-from zope.schema.interfaces import ITextLine
-from zope.testing import doctest
-
-from zope.app.testing import ztapi
-
-from zope.formlib.interfaces import IInputWidget, MissingInputError
-from zope.app.form.browser import TextWidget, ObjectWidget
-from zope.formlib.tests.test_browserwidget import BrowserWidgetTest
-from zope.app.form.browser.interfaces import IWidgetInputErrorView
-
-class ITestContact(Interface):
- name = TextLine()
- email = TextLine()
-
-class TestContact(object):
- implements(ITestContact)
-
-class ObjectWidgetInputErrorView(object):
- implements(IWidgetInputErrorView)
-
- def __init__(self, error, request):
- self.error = error
- self.request = request
-
- def snippet(self):
- return repr(self.error)
-
-class ObjectWidgetTest(BrowserWidgetTest):
- """Documents and tests the object widget.
-
- >>> from zope.interface.verify import verifyClass
- >>> verifyClass(IInputWidget, ObjectWidget)
- True
- """
-
- _FieldFactory = Object
- def _WidgetFactory(self, context, request, **kw):
- kw.update({'factory': TestContact})
- return ObjectWidget(context, request, **kw)
-
- def setUpContent(self, desc=u'', title=u'Foo Title'):
- ztapi.browserViewProviding(ITextLine, TextWidget, IInputWidget)
-
- class ITestContent(Interface):
- foo = self._FieldFactory(
- ITestContact,
- title=title,
- description=desc
- )
- class TestObject(object):
- implements(ITestContent)
-
- self.content = TestObject()
- self.field = ITestContent['foo']
- self.request = TestRequest(HTTP_ACCEPT_LANGUAGE='pl')
- self.request.form['field.foo'] = u'Foo Value'
- self._widget = self._WidgetFactory(self.field, self.request)
-
- def setUp(self):
- super(ObjectWidgetTest, self).setUp()
- self.field = Object(ITestContact, __name__=u'foo')
- ztapi.browserViewProviding(ITextLine, TextWidget, IInputWidget)
-
- def test_applyChanges(self):
- self.request.form['field.foo.name'] = u'Foo Name'
- self.request.form['field.foo.email'] = u'foo at foo.test'
- widget = self._WidgetFactory(self.field, self.request)
-
- self.assertEqual(widget.applyChanges(self.content), True)
- self.assertEqual(hasattr(self.content, 'foo'), True)
- self.assertEqual(isinstance(self.content.foo, TestContact), True)
- self.assertEqual(self.content.foo.name, u'Foo Name')
- self.assertEqual(self.content.foo.email, u'foo at foo.test')
-
- def test_error(self):
- ztapi.provideAdapter(
- required=(MissingInputError, TestRequest),
- provided=IWidgetInputErrorView,
- factory=ObjectWidgetInputErrorView)
-
- widget = self._WidgetFactory(self.field, self.request)
- self.assertRaises(MissingInputError, widget.getInputValue)
- error_html = widget.error()
- if sys.version_info < (2, 5):
- self.failUnless("email: <zope.formlib.interfaces.Mis"
- in error_html)
- self.failUnless("name: <zope.formlib.interfaces.Miss"
- in error_html)
- else:
- self.failUnless("email: MissingInputError(u'field.foo.email', u'', None)"
- in error_html)
- self.failUnless("name: MissingInputError(u'field.foo.name', u'', None)"
- in error_html)
-
- def test_applyChangesNoChange(self):
- self.content.foo = TestContact()
- self.content.foo.name = u'Foo Name'
- self.content.foo.email = u'foo at foo.test'
-
- self.request.form['field.foo.name'] = u'Foo Name'
- self.request.form['field.foo.email'] = u'foo at foo.test'
- widget = self._WidgetFactory(self.field, self.request)
- widget.setRenderedValue(self.content.foo)
-
- self.assertEqual(widget.applyChanges(self.content), False)
- self.assertEqual(hasattr(self.content, 'foo'), True)
- self.assertEqual(isinstance(self.content.foo, TestContact), True)
- self.assertEqual(self.content.foo.name, u'Foo Name')
- self.assertEqual(self.content.foo.email, u'foo at foo.test')
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(ObjectWidgetTest),
- doctest.DocFileSuite('../objectwidget.txt',
- setUp=testing.setUp,
- tearDown=testing.tearDown),
- doctest.DocTestSuite(),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_passwordwidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_passwordwidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_passwordwidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,60 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Password Widget Tests
-
-$Id$
-"""
-import unittest
-from zope.testing import doctest
-from zope.formlib.interfaces import IInputWidget
-from zope.app.form.browser import PasswordWidget
-from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
-from zope.interface.verify import verifyClass
-
-class PasswordWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the password widget.
-
- >>> verifyClass(IInputWidget, PasswordWidget)
- True
- """
-
- _WidgetFactory = PasswordWidget
-
- def testProperties(self):
- self.assertEqual(self._widget.tag, 'input')
- self.assertEqual(self._widget.type, 'password')
- self.assertEqual(self._widget.cssClass, '')
- self.assertEqual(self._widget.extra, '')
- self.assertEqual(self._widget.default, '')
- self.assertEqual(self._widget.displayWidth, 20)
- self.assertEqual(self._widget.displayMaxWidth, '')
-
- def testRender(self):
- value = 'Foo Value'
- self._widget.setRenderedValue(value)
- check_list = ('type="password"', 'id="field.foo"',
- 'name="field.foo"', 'value=""', 'size="20"')
- self.verifyResult(self._widget(), check_list)
-
- def testHidden(self):
- self.assertRaises(NotImplementedError, self._widget.hidden)
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(PasswordWidgetTest),
- doctest.DocTestSuite(),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_radiowidget.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_radiowidget.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_radiowidget.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,125 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Radio Widget Tests
-
-$Id$
-"""
-import unittest
-from zope.testing import doctest
-from zope.interface import Interface, implements
-from zope.interface.verify import verifyClass
-from zope.publisher.browser import TestRequest
-from zope.schema import Choice
-
-from zope.formlib.interfaces import IInputWidget
-from zope.app.form.browser import RadioWidget
-from zope.formlib.tests.test_browserwidget import SimpleInputWidgetTest
-
-class RadioWidgetTest(SimpleInputWidgetTest):
- """Documents and tests the radio widget.
-
- >>> verifyClass(IInputWidget, RadioWidget)
- True
- """
-
- _FieldFactory = Choice
- _WidgetFactory = RadioWidget
-
- def setUpContent(self, desc=u'', title=u'Foo Title'):
- class ITestContent(Interface):
- foo = self._FieldFactory(
- title=title,
- description=desc,
- values=(u'foo', u'bar')
- )
- class TestObject(object):
- implements(ITestContent)
-
- self.content = TestObject()
- field = ITestContent['foo']
- field = field.bind(self.content)
- request = TestRequest(HTTP_ACCEPT_LANGUAGE='pl')
- request.form['field.foo'] = u'Foo Value'
- self._widget = self._WidgetFactory(field, field.vocabulary, request)
-
- def testProperties(self):
- self.assertEqual(self._widget.cssClass, "")
- self.assertEqual(self._widget.extra, '')
- self.assertEqual(self._widget.orientation, 'vertical')
-
-
- def testRenderItem(self):
- check_list = ('type="radio"', 'id="field.bar.0"',
- 'name="field.bar"', 'value="foo"', 'Foo')
- self.verifyResult(
- self._widget.renderItem(0, 'Foo', 'foo', 'field.bar', None),
- check_list)
- check_list += ('checked="checked"',)
- self.verifyResult(
- self._widget.renderSelectedItem(
- 0, 'Foo', 'foo', 'field.bar', None),
- check_list)
-
-
- def testRenderItems(self):
- check_list = ('type="radio"', 'id="field.foo.0"', 'name="field.foo"',
- 'value="bar"', 'bar', 'value="foo"', 'foo',
- 'checked="checked"')
- self.verifyResult('\n'.join(self._widget.renderItems('bar')),
- check_list)
-
-
- def testRender(self):
- value = 'bar'
- self._widget.setRenderedValue(value)
- check_list = ('type="radio"', 'id="field.foo.0"',
- 'name="field.foo"', 'value="bar"', 'bar',
- 'value="foo"', 'foo', 'checked="checked"')
- self.verifyResult(self._widget(), check_list)
-
- check_list = ('type="hidden"', 'id="field.foo"',
- 'name="field.foo"', 'value="bar"')
- self.verifyResult(self._widget.hidden(), check_list)
- check_list = ('style="color: red"',) + check_list
- self._widget.extra = 'style="color: red"'
- self.verifyResult(self._widget.hidden(), check_list)
-
-
- def testHasInput(self):
- self._widget.request.form.clear()
- self.assert_(not self._widget.hasInput())
- self._widget.request.form['field.foo-empty-marker'] = '1'
- self.assert_(self._widget.hasInput())
- self._widget.request.form['field.foo'] = u'Foo Value'
- self.assert_(self._widget.hasInput())
- del self._widget.request.form['field.foo-empty-marker']
- self.assert_(self._widget.hasInput())
-
-
- def testRenderEmptyMarker(self):
- self.verifyResult(self._widget(), ('field.foo-empty-marker',))
- self._widget.setRenderedValue(u'bar')
- self.verifyResult(self._widget(), ('field.foo-empty-marker',))
- self._widget.setRenderedValue(u'not a legal value')
- self.verifyResult(self._widget(), ('field.foo-empty-marker',))
-
-
-def test_suite():
- return unittest.TestSuite((
- unittest.makeSuite(RadioWidgetTest),
- doctest.DocTestSuite(),
- ))
-
-if __name__=='__main__':
- unittest.main(defaultTest='test_suite')
Deleted: zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_source.py
===================================================================
--- zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_source.py 2009-12-30 22:26:15 UTC (rev 107397)
+++ zope.app.form/branches/faassen-zaf/src/zope/app/form/browser/tests/test_source.py 2009-12-30 22:26:34 UTC (rev 107398)
@@ -1,29 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Source Widget Tests
-
-$Id$
-"""
-from zope.component import testing
-
-def test_suite():
- from zope.testing import doctest
- return doctest.DocFileSuite(
- '../source.txt',
- setUp=testing.setUp, tearDown=testing.tearDown)
-
-if __name__ == '__main__':
- import unittest
- unittest.main(defaultTest='test_suite')
-
More information about the checkins
mailing list