[Zope3-Users] Reusing Widgets

Christian Lück christian.lueck at ruhr-uni-bochum.de
Thu Feb 5 09:30:34 EST 2009


Hi Tim,

Tim Cook wrote:
> If I have an interface (IDvText) and a class DvText (shown below).  and
> I want it to act exactly as a zope.schema Textline (with some additional
> attributes) then is this correct and how do I (where do I find how to)
> register/add to the TextLine widget?  Apologies for the line wraps.

Seems like you mess schema and widget. Think about schema in terms of 
the structure of your data only, but not in terms of forms and widgets 
for browser views. Then, after modelling of your data is done, think of 
form elements (widgets).

So after you modelled your schema (as you did) the question would rather 
be: How do I get a textline-widget for the attribute of my class 
implementing my schema?

Let me guess: You want to have your DvText as part of an other data 
modell, like

class ISomeEnclosing(zope.interface.Interface):

...

text = zope.schema.Object(
	title = u"Text",
	schema = IDvText(...),
	)				

To get a textline-like widget for the 'text'-attribute you would have a 
subform. For the new z3c.form framework have a look at subforms.txt.
http://svn.zope.org/z3c.form/trunk/src/z3c/form/subform.txt?rev=91127&view=markup

Have a look at z3c.formdemo, too.

For the older framework (formlib, widgets from zope.app.form) think of 
an object widget with a textline widget as subwidget.
http://svn.zope.org/zope.app.form/trunk/src/zope/app/form/browser/objectwidget.txt?rev=80211&view=markup


But before, you should think about your schema again. It looks very 
complicated to me. I would try to make as little use of 
zope.schema.Object as possible. As an alternative you could inherit from 
your IDvText.

class ISomeEnclosing(IDvText):

...

At least, try to reduce zope.schema.Object in IDvText!

> 
> ******************************************************
> from zope.schema import TextLine,Text,List,Dict,URI,Object
> from zope.i18nmessageid.message import MessageFactory
> from zope.interface import Interface
> 
> from interfaces.codephrase import ICodePhrase
> from oship.openehr.rm.support.identification.interfaces.objectref import
> IObjectRef
> 
> _ = MessageFactory('oship')
> 
> class IDvText(Interface):
>     """
>     blah blah!
>     """
>     
>     value = TextLine(
>         title = _(u"Value"),
>         description = _(u"""Displayable rendition of the item,
> regardless of its underlying structure. For DV_CODED_TEXT, this is the
> rubric of the complete term as provided by the terminology service. No
> carriage returns, line feeds, or other non-printing characters
> permitted."""),
>     )
>     
>     mappings=List(
>         value_type=Object(schema=IObjectRef),
>         title = _(u"Mappings"),
>         description = _(u"""A list of MappingTerm,terms from other
> terminologies most closely matching this term, typically used where the
> originator (e.g.   pathology lab) of information uses a local
> terminology but also supplies one or more equivalents from wellknown
> terminologies (e.g. LOINC). The list contents should be of the type
> TermMapping"""),
>         required = False,
>         )
>     
>     formatting = Text(
>         title = _(u"Formatting"),
>         description = _(u"""A format string of the form "name:value;
> name:value...", e.g. "font-weight : bold; font-family : Arial;
> font-size : 12pt;". Values taken from W3C CSS2 properties lists
> "background" and "font"."""),
>         required = False
>         )

Huh, that mixes content and layout/formatting.
Suggestion 1) Think of a vocabulary of text types where types are 
defined by usage or some other non-layout but content-specific feature 
and then write HTML-renderers for each type.
formatting = Choice(
	title = u"Text-Type",
	vocabulary = 'dvtext-types',
	required = True,
	default = 'plain',
	)
Suggestion 2) Subclass for each type from DvTextBase. Then write 
html-renderers for each type.

>     
>     hyperlink = URI(
>         title = _(u"Hyperlink"),
>         description = _(u"""Optional link sitting behind a section of
> plain text or coded term item as type DvUri."""),
>         required = False
>         )
>     
>     language = Object(
>         schema = ICodePhrase,
>         title = _(u"Language"),
>         description = _(u"""Optional indicator of the localised language
> in which the value is written. Coded from openEHR Code Set "languages".
> Only used when either the text object is in a different language from
> the enclosing ENTRY, or else the text object is being used outside of an
> ENTRY or other enclosing structure which indicates the language."""),
>         required = False
>         )

Think of a vocabulary!
language = zope.schema.Choice(
	title = u"Language",
	vocubulary = 'openEHR-languages',
	required = False,
	)

Have a look at z3c.i18n for iso-languages.
	

>     
>     encoding = Object(
>         schema = ICodePhrase,
>         title = _(u"Encoding"),
>         description = _(u"""Name of character encoding scheme in which
> this value is encoded. Coded from openEHR Code Set "character sets".
> Unicode is the default assumption in openEHR, with UTF-8 being the
> assumed encoding. This attribute allows for variations from these
> assumptions."""),
>         required = False
>         )         
> 

The like! (encoding vocabulary)
Better: use unicode only (how do you integrate other encodings in zope 
at all?) and leave this attribute away. Write converters for output with 
other encoding if needed.

> 
> 
> ******************************************************
> from zope.interface import implements
> from zope.i18nmessageid.message import MessageFactory
> from zope.schema import TextLine
> 
> from interfaces.dvtext import IDvText
> 
> _ = MessageFactory('oship')
> 
> 
> class DvText(TextLine):
>     """
>    blah blah!

Write unittests instead of blahs. If you don't manage, improve your data 
modell!

>     """
> 
>     implements(IDvText)
>     
>     def __init__(self, value, mappings=None, formatting=None,
> hyperlink=None, language=None, encoding=None):
>         self.value = value
>         self.mappings = mappings
>         self.formatting = formatting
>         self.hyperlink = hyperlink
>         self.language = language
>         self.encoding = encoding
> ************************************************************** 
> 
> 


Regards,
Christian



More information about the Zope3-users mailing list