Your SlideShare is downloading. ×
A Dexterity Intro for Recovering Archetypes Addicts
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

A Dexterity Intro for Recovering Archetypes Addicts


Published on

This talk covers the basics of building content types with Dexterity, and how it compares to doing so with Archetypes; what sorts of tasks Dexterity is best suited for, and which ones it isn't ready …

This talk covers the basics of building content types with Dexterity, and how it compares to doing so with Archetypes; what sorts of tasks Dexterity is best suited for, and which ones it isn't ready for yet
* an update on the most recent improvements to Dexterity

Published in: Technology

1 Comment
No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. A Dexterity Intro for Recovering Archetypes Addicts David Glick Plone Symposium East, 2010
  • 2. What is a content type?
  • 3. ZODB stores objects
  • 4. Content type (or portal_type) categorizes objects Page Something Else
  • 5. Schema (what sort of data can be stored)
  • 6. Workflow (who can do things when)
  • 7. Custom view templates (what it looks like)
  • 8. Miscellaneous settings • Placeful restrictions • Comments • Searchability • Per-type portlet assignments • etc.
  • 9. History Lesson
  • 10. Content Management Framework (CMF) • Underlying framework for registering types, assigning workflow • CMFDefault contains sample types which used to be used by Plone • Not schema-based
  • 11. Archetypes • Schema-based form generation • Basis of Plone's current default content types (ATContentTypes) • Not going away anytime soon
  • 12. Dexterity Martin Aspeli
  • 13. Goals
  • 14. Make filesystem content type development sane
  • 15. Make through-the-web content type development possible
  • 16. Make it possible to switch back and forth between the 2
  • 17. Philosophy
  • 18. Reuse over reinvention
  • 19. Small over big Pro duc ts .Arc he ty pe s base classes metadata plone.behavior felds schema plone.directives.* plone.autoform widgets plo ne .de x te rity storage plone.supermodel z3c.form reference engine plone.schemaeditor
  • 20. Natural interaction over excessive generality understanding time
  • 21. Real code over generated code
  • 22. Zope 3 over Zope 2
  • 23. Automated testing over wishful thinking
  • 24. Example: Photo Gallery (example.dexgallery in the collective) • Photo Gallery content type • Photo content type • Tagging • Geolocation
  • 25. Rapid Development Archetypes Dexterity • ArchGenXML • collective.dexteritypaste • ZopeSkel $ bin/zopeskel dexterity • Though-the-web content type creation
  • 26. TTW type development
  • 27. Exporting a type • GenericSetup export for now; better UI coming :)
  • 28. Base class Archetypes Dexterity • BaseObject, usually via • plone.dexterity.content.Item or plone.dexterity.content.Container ATContentTypes • fewer mixins • many mixins • custom subclasses • typically need a custom typically unneeded subclass
  • 29. Schemas Archetypes Dexterity • unique schema format • Zope 3 schemas • define a schema, assign it • Can also be represented in to the content class's a unique XML schema 'schema' attribute format • Associated with a content type via the FTI in portal_types
  • 30. Filesystem roundtripping We b File s y s te m Zope 3 Schema Schema as Python interface Content Editing py Schema Editing xml xml External GenericSetup tools import/export XML schema in XML schema FTI on flesystem
  • 31. Schemas Archetypes Dexterity From content/ From content/ PhotoSchema = atapi.Schema(( class IPhoto(form.Schema): # (fields here) # (fields here) )) From profles/default/types/photo.xml: schemata.finalizeATCTSchema(PhotoSchema, moveDiscussion=False) <property name="schema"> class Photo(base.ATCTContent): IPhoto implements(IPhoto) </property> meta_type = "Photo" schema = PhotoSchema
  • 32. Accessing fields Archetypes Dexterity • obj.getField('fieldname') • obj.fieldname .get(obj) (values are simply stored • obj.getFieldname() as attributes) (magically generated • Use property descriptors if accessor on the content you need custom accessor/ class) mutator logic • __getattr__ makes sure to get default value from schema if there's no attribute stored yet
  • 33. Field security • Controlled access (from RestrictedPython) • Implemented using __allow_access_to_unprotected_subobjects__ Archetypes Dexterity • Read/write permissions • Read/write permissions can be specified per field can be specified per field in the schema in the schema
  • 34. Caption field (rich text) Archetypes Dexterity From content/ From content/ atapi.TextField('caption', from import RichText required = False, searchable = True, caption = RichText( storage = title = _(u'Caption'), atapi.AnnotationStorage(migrate=True), required = False, validators = ) ('isTidyHtmlWithCleanup',), default_content_type = 'text/html', default_output_type = 'text/x-html- safe', widget = atapi.RichWidget( label = _(u'Caption'), ), ),
  • 35. Photo field (image) Archetypes from import ImageField ImageField('image', required = True, storage = atapi.AnnotationStorage(migrate=True), languageIndependent = True, swallowResizeExceptions = zconf.swallowImageResizeExceptions.enable, pil_quality = zconf.pil_config.quality, pil_resize_algo = zconf.pil_config.resize_algo, max_size = zconf.ATNewsItem.max_image_dimension, validators = (('isNonEmptyFile', V_REQUIRED), ('checkNewsImageMaxSize', V_REQUIRED)), widget = atapi.ImageWidget( label = _(u'Photo'), show_content_type = False ), ), Dexterity from plone.namedfile.field import NamedBlobImage image = NamedBlobImage( title = _(u'Photo'), )
  • 36. Image scaling • Now supports arbitrary sizes, e.g. <img tal:defne="scale photo_obj/@ @ images" tal:replace="structure python:scale.scale('image', width=1200, height=300, direction='keep').tag()"/> • (supported for both Archetypes and Dexterity in Plone 4)
  • 37. Tags field (relations) Archetypes Dexterity From content/ From content/ atapi.ReferenceField( from z3c.relationfield.schema import 'tags', RelationList, RelationChoice storage=atapi.AnnotationStorage(), tags = RelationList( widget=atapi.ReferenceWidget( title = _(u'Tags'), label=_(u"Tags"), default = [], ), value_type=RelationChoice( required=False, title = _(u'Tag'), relationship='photo_tag', source = ObjPathSourceBinder( allowed_types=('Document',), navigation_tree_query = {'path': multiValued=True, {'query':'/'}}, ), portal_type = 'Document', ), ), required = False, )
  • 38. Content tree widget
  • 39. Indexing fields • similar for both • for Dexterity you may need to implement your own SearchableText indexer, e.g. from plone.indexer import indexer @indexer(IPhoto) def SearchableText(obj): return ' '.join([obj.Title(), obj.Description(), obj.caption.output])
  • 40. Custom views Archetypes Dexterity • default: base_view.cpt • default: view class in • add a skin layer template plone.dexterity.browser.view or browser view, register • add a skin layer template or in the FTI browser view, register in the FTI
  • 41. Grok-style configuration • Configuration via directives inline with code, instead of via ZCML declarations. e.g. from five import grok class View(grok.View): grok.context(IPhoto) grok.require('zope2.View') • Supported but not required
  • 42. Custom forms Archetypes Dexterity • difficult • full power of z3c.form (write custom forms that reference fields from the type's schema) • or, use grok directives on the schema to influence how fields appear in all forms (e.g., custom widget, etc.)
  • 43. Adding items Archetypes Dexterity • Autogenerated factory • z3c.form add form method • Default works in many • In Plone, portal_factory cases, but can be replaced prevents premature by setting add_view_expr creation and indexing in the FTI • No content is constructed until the form is submitted
  • 44. Extending content types Archetypes Dexterity • archetypes.schemaextender • “behaviors” • “schema extender” adapters • can provide additional can provide additional fields fields • “schema modifier” adapters • can mark the content item can make arbitrary changes with a particular interface to a schema • can be turned on/off through the web for each content type
  • 45. Behaviors s ubc la s s ing s c he m a be ha v io rs schema e x te ns io n ATFile schema model schema schema schema Deco thumbnail schema layout image ATFile Dexterity versioned File name from CustomATFile ATFile title geolocatable ratings
  • 46. Geolocation behavior
  • 47. Geolocation behavior • Adds a geolocation field • Provides an adapter to store the value of that field in an annotation • Marks the item with IGeolocatableMarker • Some adapters so that Products.Maps knows how to get a geolocation from an item with IGeolocatableMarker
  • 48. Registering a type Archetypes Dexterity • registerType() after class • Just GenericSetup definition magically (profiles/default/types/ generates Zope 2-style [Type_Id].xml) factory methods • boilerplate in finds types and completes registration • type configuration in GenericSetup profile references the factory method
  • 49. """Main product initializer from zope.i18nmessageid import MessageFactory """ _ = MessageFactory('example.dexgallery') from zope.i18nmessageid import MessageFactory from example.dexgallery.archetypes import config from Products.Archetypes import atapi from Products.CMFCore import utils # Define a message factory for when this product is internationalised. # This will be imported with the special name "_" in most modules. Strings # like _(u"message") will then be extracted by i18n tools for translation. archetypesMessageFactory = MessageFactory('example.dexgallery.archetypes') def initialize(context): """Initializer called when used as a Zope 2 product. This is referenced from configure.zcml. Regstrations as a "Zope 2 product" is necessary for GenericSetup profiles to work, for example. Here, we call the Archetypes machinery to register our content types with Zope and the CMF. """ # Retrieve the content types that have been registered with Archetypes # This happens when the content type is imported and the registerType() # call in the content type's module is invoked. Actually, this happens # during ZCML processing, but we do it here again to be explicit. Of # course, even if we import the module several times, it is only run # once. content_types, constructors, ftis = atapi.process_types( atapi.listTypes(config.PROJECTNAME), config.PROJECTNAME) # Now initialize all these content types. The initialization process takes # care of registering low-level Zope 2 factories, including the relevant # add-permission. These are listed in We use different # permissions for each content type to allow maximum flexibility of who # can add which content types, where. The roles are set up in rolemap.xml # in the GenericSetup profile. for atype, constructor in zip(content_types, constructors): utils.ContentInit('%s: %s' % (config.PROJECTNAME, atype.portal_type), content_types=(atype, ), permission=config.ADD_PERMISSIONS[atype.portal_type], extra_constructors=(constructor,), ).initialize(context)
  • 50. Status report / roadmap
  • 51. Core functionality
  • 52. Schema serialization
  • 53. Automatic form generation
  • 54. Portlet assignments
  • 55. Content rules
  • 56. Relations • Support for referencing Dexterity content from AT content is in progress
  • 57. Widgets • Not as rich as Archetypes yet, but better than formlib. We have autocomplete, browse-for-content, file/image upload.
  • 58. TTW schema editing
  • 59. Image & file support (via plone.namedfile)
  • 60. Text transform support (via
  • 61. WebDAV support
  • 62. Versioning & staging • In progress
  • 63. TTW behavior creation
  • 64. Automatic migration from Archetypes content
  • 65. Multi-lingual content • Some discussion, but no code yet.
  • 66. Link integrity checks
  • 67. Upcoming releases • First beta release was on Apr. 20 • But, being used in production • Future releases will support upgrades
  • 68. Compatibility • Plone 3 • Plone 4
  • 69. Performance
  • 70. Further information • Installation howto: -to/install • Dexterity manual: ual/developer-manual • Behaviors manual: ual/behaviors
  • 71. Example Code • example.dexterity • example.conference • example.dexgallery (in the collective)
  • 72. Thanks to everyone who has contributed to making Dexterity a reality!
  • 73. Getting involved • Google Code project: • Google Group: development