Skip to main content

Dexterity is a content type framework for CMF applications, with particular emphasis on Plone. It can be viewed as an alternative to Archetypes that is more light-weight and modular.

Project description

Introduction

Dexterity wants to make some things really easy. These are:

  • Create a “real” content type entirely through-the-web without having to know programming.

  • As a business user, create a schema using visual or through-the-web tools, and augment it with adapters, event handlers, and other Python code written on the filesystem by a Python programmer.

  • Create content types in filesystem code quickly and easily, without losing the ability to customise any aspect of the type and its operation later if required.

  • Support general “behaviours” that can be enabled on a custom type in a declarative fashion. Behaviours can be things like title-to-id naming, support for locking or versioning, or sets of standard metadata with associated UI elements.

  • Easily package up and distribute content types defined through-the-web, on the filesystem, or using a combination of the two.

Philosophy

Dexterity is designed with a specific philosophy in mind. This can be summarised as follows:

Reuse over reinvention

As far as possible, Dexterity should reuse components and technologies that already exist. More importantly, however, Dexterity should reuse concepts that exist elsewhere. It should be easy to learn Dexterity by analogy, and to work with Dexterity types using familiar APIs and techniques.

Small over big

Mega-frameworks be damned. Dexterity consists of a number of specialised packages, each of which is independently tested and reusable. Furthermore, packages should has as few dependencies as possible, and should declare their dependencies explicitly. This helps keep the design clean and the code manageable.

Natural interaction over excessive generality

The Dexterity design was driven by several use cases that express the way in which we want people to work with Dexterity. The end goal is to make it easy to get started, but also easy to progress from an initial prototype to a complex set of types and associated behaviours through step-wise learning and natural interaction patterns. Dexterity aims to consider its users - be they business analysts, light integrators or Python developers, and be they new or experienced - and cater to them explicitly with obvious, well-documented, natural interaction patterns.

Real code over generated code

Generated code is difficult to understand and difficult to debug when it doesn’t work as expected. There is rarely, if ever, any reason to scribble methods or ‘exec’ strings of Python code.

Zope 3 over Zope 2

Although Dexterity does not pretend to work with non-CMF systems, as many components as possible should work with plain Zope 3, and even where there are dependencies on Zope 2, CMF or Plone, they should - as far as is practical - follow Zope 3 techniques and best practices. Many operations (e.g. managing objects in a folder, creating new objects or manipulating objects through a defined schema) are better designed in Zope 3 than they were in Zope 2.

Zope concepts over new paradigms

We want Dexterity to be “Zope-ish”. Zope is a mature, well-designed (well, mostly) and battle tested platform. We do not want to invent brand new paradigms and techniques if we can help it.

Automated testing over wishful thinking

“Everything” should be covered by automated tests. Dexterity necessarily has a lot of moving parts. Untested moving parts tend to come loose and fall on people’s heads. Nobody likes that.

Getting started

Please read the installation guide to get Dexterity up and running.

Then log in to Plone, go to Site Setup, and go to the Dexterity Types control panel to get started creating content types through the web.

Or read the Dexterity developer manual to get started developing Dexterity content types on the filesystem.

This release of Dexterity is compatible with Plone 3, 4, and 4.1.

Upgrading

If you are upgrading from a previous release of Dexterity, you need to:

  1. Update your buildout with the new versions (or extend the updated KGS), and re-run it.

  2. Restart Zope.

  3. Go to the Add-ons control panel in Plone Site Setup, and run the upgrade steps for “Dexterity Content Types” if there are any available.

Documentation

Various documentation is available:

The following documents are not Dexterity-specific, but will likely be useful to users of Dexterity:

Mailing list

The dexterity-development group provides a place to discuss development and use of Dexterity.

Issue tracker

Please report issues in our Google Code issue tracker.

Contributing

Most Dexterity code is owned by the Plone Foundation and maintained in the Plone svn repository. We’re happy to share commit access so that you can share code with us, but first you must sign the Plone contributor agreement.

Dexterity wouldn’t be possible without the hard work of a lot of people, including:

  • Martin Aspeli

  • Jian Aijun

  • Wichert Akkerman

  • Jonas Baumann

  • David Brenneman

  • Joel Burton

  • Vincent Fretin

  • Rok Garbas

  • Anthony Gerrard

  • Nathan van Gheem

  • David Glick

  • Craig Haynal

  • Wouter Vanden Hove

  • Jean-Michel Francois

  • Jim Fulton

  • Jamie Lentin

  • Alex Limi

  • Steve McMahon

  • Jason Mehring

  • Alec Mitchell

  • Daniel Nouri

  • Ross Patterson

  • Maurits van Rees

  • Lennart Regebro

  • Laurence Rowe

  • Israel Saeta Perez

  • Hanno Schlichting

  • Christian Schneider

  • Carsten Senger

  • Jon Stahl

  • Eric Steele

  • Gaudenz Steinlin

  • Dorneles Tremea

  • Sean Upton

  • Sylvain Viollon

  • Matthew Wilkes

  • Matt Yoder

  • Andi Zeidler

(Please add your name if we have neglected to.)

Release Notes

Welcome to the first final release of the Dexterity content type system!

This release is compatible with Plone 3, 4, and 4.1, as long as you use the correct set of version pins from good-py (see the installation guide).

Following this release, the Dexterity team will begin work on the Dexterity 2.0 series, which will only be compatible with Plone 4.1. Maintenance releases for the 1.0 series will still be made as necessary, for now.

Changes

The following packages have been updated since Dexterity 1.0rc1:

plone.app.dexterity 1.0

  • Fix publishing dates DateTime/datetime conversions so as not to drift by the timezone delta every save. [elro]

  • Make sure cloned types get a new factory. [davisagli]

  • Don’t override overlay CSS in Plone 4. [davisagli]

  • Fixed cloning of types with a period (.) in their short name. [davisagli]

  • Allow specifying a type’s short name when adding a type. [davisagli]

  • Make sure the Basic metadata adapter accesses the content’s title attribute directly so it doesn’t get encoded. Also make sure encoded data can’t be set via this adapter. [davisagli]

plone.dexterity 1.0

  • Make sure the Title and Description accessors handle a value of None. [davisagli]

  • Make sure the Title() accessor for Dexterity content returns an encoded bytestring as expected for CMF-style accessors. [davisagli]

plone.directives.dexterity 1.0

  • Fix reST. [davisagli]

plone.directives.form 1.0

  • Final release; no changes.

plone.autoform 1.0

  • Raise a NotImplementedError instead of NotImplemented as that is not an exception but meant for comparisons and is not callable. [maurits]

plone.behavior 1.0.1

plone.app.z3cform 0.5.4

  • Customize templates for multi and object widgets for more consistent styling. [elro]

  • Remove dependency on zope.app.component. [davisagli]

  • Add MANIFEST.in. [WouterVH]

  • Raise LookupError when terms are not found (e.g. they are no longer visible due to security) [lentinj]

plone.namedfile 1.0.1, 1.0.2, 1.0.3

  • Relicense under BSD license. [davisagli]

  • Don’t omit empty string attributes from ImageScale tag. [elro]

  • In the tag method of ImageScale to allow height/width/alt/title to be omitted when they are supplied as a None argument. [elro]

  • In marshalled file fields, encode the filename parameter of the Content-Disposition header in accordance with RFC 2231. This ensures that filenames with non-ASCII characters can be successfully demarshalled. [davisagli]

  • Make the various file classes be strict about only accepting unicode filenames. [davisagli]

plone.rfc822 1.0

  • Relicensed under the BSD license. [davisagli]

plone.schemaeditor 1.0.1

  • Relicense under the BSD license. [davisagli]

  • On multiple choice fields (List of Choice), read/write attributes other than values in the correct place (on the List rather than its value_type Choice). [davisagli]

  • Remove unneeded dependency on plone.i18n. [davisagli]

plone.supermodel 1.0.1, 1.0.2, 1.0.3

  • Relicense under BSD license. [davisagli]

  • Only convert Choice field values attribute into a vocabulary when it is necessary to handle unicode values. This fixes a regression in compatibility with plone.registry. [davisagli]

  • Adjust manifest to exclude .pyc files. [davisagli]

plone.synchronize 1.0.1

  • Add license metadata. [davisagli]

plone.z3cform 0.7.3, 0.7.4, 0.7.5, 0.7.6

  • Add ability to find widgets with non-integer names in lists. This shouldn’t generally be something that happens, and ideally should be removed if DataGridField looses it’s ‘AA’ and ‘TT’ rows. [lentinj]

  • Fix traversal tests on Zope 2.10 to handle TraversalError instead of LocationError. [elro]

  • Fix traversal.py syntax to be python2.4 compatible.

  • Define ‘hidden’ within field macro. [elro]

  • Ignore “form.widgets.” if ++widget++ path begins with it. [lentinj]

  • Rework traverser to handle lists and subforms [lentinj]

  • Only search a group’s widgets if they exist. collective.z3cform.wizard doesn’t create widgets for pages/groups other than the current one [lentinj, elro]

  • Adds Brazilian Portuguese translation. [davilima6]

  • Handle wrong fieldnames more cleanly in the ++widget++ traverser. [elro]

z3c.form 2.4.3

  • Declare TextLinesFieldWidget as an IFieldWidget implementer.

  • Clarify MultiWidget.extract(), when there are zero items, this is now [] instead of <NO_VALUE>

  • Some typos fixed

  • Fixed test failure due to change in floating point representation in Python 2.7.

  • Ensure at least min_length widgets are rendered for a MultiWidget in input mode.

  • Added Japanese translation.

  • Added base of Czech translation.

  • Added Portuguese Brazilian translation.

plone.formwidget.autocomplete 1.2.1

  • Use full widget name in ++widget++ path, don’t try and remove form prefix (which will not behave correctly if widget is part of a subform). [lentinj]

plone.formwidget.contenttree 1.0.1

  • Make placeholder terms for hidden / missing items, so that you can still see something in the editing interface and not accidentally remove them. Ideally we should say if a page is invisible or missing, but not today. [lentinj]

  • Use javascript function from plone.formwidget.autocomplete to add new input boxes, make javascript as clone-safe (when making new rows in datagridfield) as possible [lentinj]

  • Just use full widget name in ++widget++ URL, don’t try and strip form prefix off. If within a subform, this is the wrong thing to do and the traverser now supports stripping the initial ‘form.widgets’ [lentinj]

  • Workaround for sources being used without being bound first. [lentinj]

  • Check the request for context before falling back to getSite() [lentinj]

  • Add a UUIDSource that stores plone.uuid pointers to content. [lentinj]

  • Use tokens as full URL of content, move all token<->value operations into the source. Rename methods so that actually-public methods have public names [lentinj]

  • Alter terms so that token is the full path to an item, value is the path without portal_url that is stored in the DB. This means all the path parsing can be kept within the source. [lentinj]

  • _filter is used outside the source, so not an internal helper function anymore. [lentinj]

plone.app.referenceablebehavior 0.3

  • Try obj first in event handlers, fall back to getSite(). When a site is being deleted getSite() will return None so isn’t useful. [lentinj]

plone.app.stagingbehavior 0.1b1

  • Add functional tests. [anthonygerrard, davisagli]

collective.z3cform.datagridfield 0.6

  • Added to KGS.

Contributed packages

The Dexterity known good set (KGS) of version pins includes a number of contributed packages that are not installed by default:

plone.app.referenceablebehavior

Adds support for the Archetypes reference engine to Dexterity content, so that Dexterity items can be referenced from Archetypes items. Requires Plone 4.1.

plone.app.stagingbehavior

Adds support for staging Dexterity content, based on plone.app.iterate. Requires Plone 4.1.

plone.app.versioningbehavior

Adds support for storing historic versions of Dexterity content, based on Products.CMFEditions. Requires Plone 4.0 or greater.

collective.z3cform.datagridfield

A z3c.form widget for editing lists of subobjects via a tabular UI.

Changelog for plone.app.dexterity

1.0 - 2011-05-20

  • Fix publishing dates DateTime/datetime conversions so as not to drift by the timezone delta every save. [elro]

  • Make sure cloned types get a new factory. [davisagli]

  • Don’t override overlay CSS in Plone 4. [davisagli]

  • Fixed cloning of types with a period (.) in their short name. [davisagli]

  • Allow specifying a type’s short name when adding a type. [davisagli]

  • Make sure the Basic metadata adapter accesses the content’s title attribute directly so it doesn’t get encoded. Also make sure encoded data can’t be set via this adapter. [davisagli]

1.0rc1 - 2011-04-30

  • Added upgrade step to install new javascript from plone.formwidget.autocomplete [davisagli]

  • Added basic support for making TTW changes to schemas defined in filesystem models and code. (Note: This feature will not actually work until some further changes are completed in plone.dexterity.)

    In order to support this change, the event handling to serialize schema changes was revised. We now register a single event handler for the SchemaModifiedEvent raised for the schema context. This allows us to keep track of the FTI that changes need to be serialized to on the schema context. The serializeSchemaOnFieldEvent and serializeSchemaOnSchemaEvent handlers were removed from the serialize module and replaced by serializeSchemaContext. The serializeSchema helper remains but is deprecated. [davisagli]

  • Add MANIFEST.in. [WouterVH]

  • Add “export” button to types editor. Exports GS-style zip archive of type info for selected types. [stevem]

  • Fix old jquery alias in types_listing.pt. This closes http://code.google.com/p/dexterity/issues/detail?id=159 [davisagli]

  • Make display templates fill content-core on Plone 4. [elro]

  • Add ids to the group fieldsets on display forms. [elro]

  • Exclude from navigation behavior should be restricted to IDexterityContent. [elro]

1.0b4 - 2011-03-15

  • Add a “Name from file name” behavior. [elro]

  • Remove the NameFromTitle behavior factory, it is not necessary. [elro]

  • Add “Next previous navigation” and “Next previous navigation toggle” behaviors. [elro]

  • Add an “Exclude from navigation” behavior. [lentinj]

  • Put the folder listing within a fieldset. [lentinj]

1.0b3 - 2011-02-11

  • Add a navigation root behavior. [elro]

  • Fix decoding error when an encoded description is stored in the FTI. [davisagli]

  • Avoid empty <div class=”field”> tag for title and description in item.pt and container.pt. [gaudenzius]

  • Add locales structure for translations with cs , de, es, eu, fr, ja, nl, pt_BR [toutpt]

  • Update french translation [toutpt]

1.0b2 - 2010-08-05

  • Fix several XML errors in templates. Needed for Chameleon compatibility. [wichert]

  • cloning a type through the dexterity UI in the control panel did not work if the type had a hyphen in it’s name. This fixes http://code.google.com/p/dexterity/issues/detail?id=126 [vangheem]

1.0b1 - 2010-04-20

  • Require plone.app.jquerytools for the schema editor UI, and make sure it is installed when upgrading. [davisagli]

  • Remove unused schemaeditor.css. [davisagli]

  • Omit the metadata fields except on edit and add forms. [davisagli]

  • Enable the “Name from title” behavior for new types, by default. [davisagli]

  • Include plone.formwidget.namedfile so that File upload and Image fields are available out of the box. You must explicitly include z3c.blobfile in your environment if you want blob-based files. [davisagli]

  • Added a DexterityLayer that can be used in tests. [davisagli]

  • Fix issue with the BehaviorsForm accidentally polluting the title of the z3c.form EditForm ‘Apply’ button. [davisagli]

  • Add upgrades folder and make sure plone.app.z3cform profile gets installed on upgrades from previous versions of Dexterity. [davisagli]

  • Depend on the plone.app.z3cform profile, to make sure the Plone browser layer for z3c.form gets installed. [davisagli]

  • Avoid relying on acquisition to get the portal_url for links in the type listing table. [davisagli]

1.0a7 - 2010-01-08

  • Make sure the Dublin Core fieldsets appear in the same order as they do in AT content. [davisagli]

  • Make sure the current user is loaded as the default creator for the IOwnership schema in an add form. [davisagli]

  • Include behavior descriptions on the behavior edit tab. [davisagli]

  • IBasic behavior: set missing_value of description-field to u’’ . The description should never be None (live_search would not work any more). [jbaumann]

  • Fix issue where traversing to a nonexistent type name in the types control panel did not raise NotFound. [davisagli]

  • Make it possible to view the fields of non-editable schemata. [davisagli]

  • Tweaks to the tabbed_forms template used for the types control panel. [davisagli]

1.0a6 - 2009-10-12

  • Add plone.app.textfield as a dependency. We don’t use it directly in this package, but users of Dexterity should have it installed and available. [optilude]

  • Use some default icons for new types. [davisagli]

  • Show type icons in type listing if available. [davisagli]

  • Removed ‘container’ field from the types listing in the control panel (it wasn’t working). [davisagli]

  • Add message factories to titles and descriptions of metadata schema fields. Fixes http://code.google.com/p/dexterity/issues/detail?id=75. [optilude]

  • Patch listActionInfos() instead of listActions() in order to get the folder/add category into the actions list. This avoids a problem with the ‘actions.xml’ export handler exporting the folder/add category incorrectly. Fixes http://code.google.com/p/dexterity/issues/detail?id=78 [optilude]

1.0a5 - 2009-07-26

  • Explicitly include overrides.zcml from plone.app.z3cform. [optilude]

1.0a4 - 2009-07-12

  • Changed API methods and arguments to mixedCase to be more consistent with the rest of Zope. This is a non-backwards-compatible change. Our profuse apologies, but it’s now or never. :-/

    If you find that you get import errors or unknown keyword arguments in your code, please change names from foo_bar too fooBar, e.g. serialize_schema() becomes serializeSchema(). [optilude]

1.0a3 - 2009-06-07

  • Updated use of <plone:behavior /> directive to match plone.behavior 1.0b4. [optilude]

1.0a2 - 2009-06-01

  • Remove superfluous <includeOverrides /> in configure.zcml which would cause a problem when the package is loaded via z3c.autoinclude.plugin [optilude]

1.0a1 - 2009-05-27

  • Initial release

Project details


Release history Release notifications | RSS feed

This version

1.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plone.app.dexterity-1.0.zip (109.4 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page