Prerequisites¶
Setting up a Dexterity project
Preparing a development environment¶
First, get a working Plone installation. If you don't already have one, the easiest way to do so is to use one of Plone's installers. Note that for development purposes, you may use a standalone (non-ZEO), non-root install.
Second, add our standard development tools. If you've used one of our
installers, developer tool configurations are in a separate file,
develop.cfg
. Once your site is running, you may activate the development
configuration by using the command:
bin/buildout -c develop.cfg
rather than simply running bin/buildout
. The develop.cfg config file
extends the existing buildout.cfg.
If you've created yor own buildout.cfg file rather than using one of the installers, you'll need to add an equivalent development configuration. The easiest way to do so is to pick up a copy from the Unified Installer's github repository.
The key tools that you'll need, both supplied by develop.cfg, are:
- A ZopeSkel configuration to supply a package skeleton builder; and
- A test runner.
Note
If you are using Plone earlier than 4.3, you'll need to add zopeskel.dexterity to the eggs list for the zopeskel part. This supplies the Dexterity skeleton.
Creating a package¶
Setting up a package to house your content types
Note
We're going to build a package named example.conference. You may find a completed version of it in the Collective repository.
Typically, our content types will live in a separate package to our theme and other customisations.
To create a new package, we can start with ZopeSkel and the dexterity
template.
Note
Nothing that we're doing actually requires ZopeSkel or the zopeskel.dexterity skeleton package. It's just a quick way of getting started.
We run the following from the src/
directory
$ ../bin/zopeskel dexterity example.conference
You may accept all the default suggestions. This will create a directory named
example.conference
inside ./src.
Now, take a look at the setup.py file in your new package. Edit the author, author_email and description fields as you wish. Note a couple of parts of the generated setup.py file:
install_requires=[
...
'plone.app.dexterity',
...
],
...
entry_points="""
# -*- Entry points: -*-
[z3c.autoinclude.plugin]
target = plone
""",
The addition of plone.app.dexterity to our install requirements assures that we'll have dexterity loaded. Our example code won't work without it. The specification of plone as a z3c.autoinclude.plugin entry point ensures that we won't need to separately specify our zcml in buildout.
Now, let's take a look at configure.zcml
in the examples/conference directory of our project. Again, we want to note a few parts:
<configure ...>
<includeDependencies package="." />
<browser:resourceDirectory
name="example.conference"
directory="resources"
/>
<genericsetup:registerProfile
name="default"
title="Example Dexterity Product"
directory="profiles/default"
description="Extension profile for Example Dexterity Product"
provides="Products.GenericSetup.interfaces.EXTENSION"
/>
</configure>
Here, with the includeDependencies
tag we automatically include the ZCML configuration for all
packages listed under install_requires
in setup.py
.
The alternative would be to manually add a line like
<include package="plone.app.dexterity" />
for each dependency.
The browser.resourceDirectory
command creates a directory for static resources that we want to make available through the web.
Finally, we register a GenericSetup profile to make the type installable, which we will build up over the next several sections.
When you've got your project tuned up, return to your buildout/instance directory and edit buildout.cfg to add example.conference
to your eggs list and src/example.conference
to your develop sources list:
.. code-block:: ini
- eggs =
- Plone ... example.conference
... develop =
... src/example.conference
Run bin/buildout -c develop.cfg
to add your new product to the
configuration. (Or, just bin/buildout if you don't have a separate develop.cfg.)
The buildout should now configure Plone, Dexterity and the example.conference package.
We are now ready to start adding types.