• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Moving an old-style product to Plone 3
 

Moving an old-style product to Plone 3

on

  • 3,706 views

Using a real-world example, this presentation guides attendees to the process of transforming an old-style product into a fresh, extensible add-on for Plone 3. It will cover the basics to make an old ...

Using a real-world example, this presentation guides attendees to the process of transforming an old-style product into a fresh, extensible add-on for Plone 3. It will cover the basics to make an old product work on Plone 3 and also advanced topics on how to make it more robust and extensible, using new development approaches.

Statistics

Views

Total Views
3,706
Views on SlideShare
3,639
Embed Views
67

Actions

Likes
2
Downloads
39
Comments
1

6 Embeds 67

http://plone.org 25
http://tzicatl.blogspot.com 19
http://www.slideshare.net 14
http://www.pilotsystems.net 4
http://www.linkedin.com 3
http://tzicatl.blogspot.mx 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Moving an old-style product to Plone 3 Moving an old-style product to Plone 3 Presentation Transcript

    • Moving an old-style product to Plone 3 Plone Conference 2008 - Washington D.C. Ricardo Alves rsa@eurotux.com October 27, 2008 Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Contents Contents 1 About the Example 2 Get it to work 3 Benefit from Plone 3 Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • About the Example TuxLiveFM Product Add-on for Plone 2.5 Archetypes-based content types Mixin classes New portlet Skin layers Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • About the Example TuxLiveFM – Structure Products/ TuxLiveFM/ Extensions/ Install.py __init__.py config.py content/ show.py episode.py series.py __init__.py skins/ tuxfmlive/ portlet_lastepisode.pt radioshow_view.pt radioepisode_view.pt tuxlivefm.css.dtml search_episodes.pt license.txt readme.txt version.txt Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Get it to work Fix broken code due to API changes (CMFCorePermissions, ...) Use GenericSetup for product installation Migrate portlets Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Product Installation Define a profile using GenericSetup TuxLiveFM/configure.zcml <configure xmlns=quot;http://namespaces.zope.org/zopequot; xmlns:genericsetup=quot;http://namespaces.zope.org/genericsetupquot; i18n_domain=quot;TuxLiveFMquot;> <genericsetup:registerProfile name=quot;tuxlivefmquot; title=quot;TuxLiveFMquot; directory=quot;profiles/defaultquot; description=quot;TuxLiveFM product.quot; provides=quot;Products.GenericSetup.interfaces.EXTENSIONquot; /> </configure> Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Product Installation - Types TuxLiveFM/Extensions/Install.py ... # install types classes = listTypes(PROJECT_NAME) installTypes(self, out, classes, PROJECT_NAME) ... Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Product Installation - Types profiles/default/types.xml <?xml version=quot;1.0quot;?> <object name=quot;portal_typesquot; meta_type=quot;Plone Types Toolquot;> <object name=quot;RadioShowquot; meta_type=quot;Factory-based Type Information with dynamic viewsquot;/> <object name=quot;RadioEpisodequot; meta_type=quot;Factory-based Type Information with dynamic viewsquot;/> </object> Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Product Installation - Types profiles/default/types/RadioShow.xml <?xml version=quot;1.0quot;?> <object name=quot;RadioShowquot; meta_type=quot;Factory-based Type Information with dynamic viewsquot; i18n:domain=quot;plonequot; xmlns:i18n=quot;http://xml.zope.org/namespaces/i18nquot;> <property name=quot;titlequot; i18n:translate=quot;quot;>Radio Show</property> <property name=quot;descriptionquot; i18n:translate=quot;quot;>Describes a Radio Show.</property> <property name=quot;content_iconquot;>document_icon.gif</property> <property name=quot;content_meta_typequot;>RadioShow</property> <property name=quot;productquot;>tuxfm</property> <property name=quot;factoryquot;>addRadioShow</property> <property name=quot;immediate_viewquot;>base_view</property> <property name=quot;global_allowquot;>True</property> <property name=quot;filter_content_typesquot;>True</property> <property name=quot;allowed_content_typesquot;> ... Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Product Installation - Skins TuxLiveFM/Extensions/Install.py ... # install skins install_subskin(self, out, GLOBALS) ... Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Product Installation - Skins profiles/default/skins.xml <?xml version=quot;1.0quot;?> <object name=quot;portal_skinsquot; allow_any=quot;Falsequot; cookie_persistence=quot;Falsequot; default_skin=quot;TuxLiveFMquot;> <object name=quot;tuxlivefm_templatesquot; meta_type=quot;Filesystem Directory Viewquot; directory=quot;Products.TuxLiveFm:skins/tuxlivefm_templatesquot;/> <skin-path name=quot;TuxLiveFMquot; based-on=quot;Plone Defaultquot;> <layer name=quot;tuxlivefm_templatesquot; insert-after=quot;customquot;/> </skin-path> </object> Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Product Installation - CSS TuxLiveFM/Extensions/Install.py ... # register stylesheets css_tool = getToolByName(self, ’portal_css’) stylesheets = css_tool.getResources() stylesheet_ids = [x.getId() for x in stylesheets] if ’tuxlivefm.css’ not in stylesheet_ids: css_tool.registerStylesheet( ’tuxlivefm.css’, expression=’’, media=’screen’, rel=’stylesheet’, rendering=’import’) ... Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Product Installation - CSS profiles/default/cssregistry.xml <?xml version=quot;1.0quot;?> <object name=quot;portal_cssquot;> <stylesheet title=quot;quot; cacheable=quot;Truequot; compression=quot;safequot; cookable=quot;Truequot; enabled=quot;1quot; expression=quot;quot; id=quot;tuxlivefm.cssquot; media=quot;screenquot; rel=quot;stylesheetquot; rendering=quot;importquot;/> </object> Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Get it to work Migrate portlets Convert legacy portlets, or Create classic portlet <assignment manager=quot;plone.rightcolumnquot; category=quot;content_typequot; key=quot;RadioShowquot; type=quot;portlets.Classicquot;> <property name=quot;templatequot;>portlet_lastepisode</property> <property name=quot;macroquot;>portlet</property> </assignment> Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Benefit from Plone 3 New Components for specialized behavior Define interfaces class IRadioSeries(Interface): def lastEpisodeURL(self): quot;quot;quot; Returns the URL of the last episode available. quot;quot;quot; def searchEpisodes(self, **kwargs): quot;quot;quot; Perform search in the available episodes. quot;quot;quot; Replace mixin class with an adapter <adapter factory=quot;.content.series.RadioSeriesquot; for=quot;.interfaces.IRadioShowquot; provides=quot;.interfaces.IRadioSeriesquot; /> Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Benefit from Plone 3 Use browser views Add browser view EpisodeSearchView Move related methods to the view class. class SearchEpisodesView(BrowserView): def searchEpisodes(self, **kwargs): series = IRadioSeries(self.context) return series.searchEpisodes(**kwargs) Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Benefit from Plone 3 Deprecate old code Use zope.deprecation for modules to be removed Deprecation period of one or two feature releases import zope.deprecation zope.deprecation.deprecated(’ShowSeriesMixin’, quot;Products.TuxLiveFM.content.series.ShowSeriesMixin has quot; quot;been deprecated and will be removed in version 0.3.quot;) Move deprecated templates to another layer. Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Benefit from Plone 3 Use Zope 3 Interfaces with Archetypes Define Zope 3 schema interface for content types from zope import schema ... class IRadioShow(Interface): body = schema.Text(title=_(u’Body’)) ... Use ATFieldProperty as a bridge from fields to Python properties from Products.Archetypes import public as atapi ... body = atapi.ATFieldProperty(’body’) ... Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Benefit from Plone 3 TuxLiveFM – Structure Products/ TuxLiveFM/ __init__.py config.py interfaces.py browser/ search_episodes.py search_episodes.pt profiles/ default/ types/ types.xml skins.xml cssregistry.xml portlets.xml actionicons.xml content/ show.py episode.py series.py skins/ tuxfmlive/ radioshow_view.pt radioepisode_view.pt tuxlivefm.css.dtml portlet_lastepisode.pt tuxfmlive_deprecated/ search_episodes.pt license.txt readme.txt version.txt Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Benefit from Plone 3 Eggify the Product Use paster to create the package structure: paster create -t plone Products.TuxLiveFM/ Products/ TuxLiveFM/ ... docs Products.TuxLiveFM.egg-info/ setup.cfg README.txt setup.py Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Benefit from Plone 3 References Plone Upgrade Guide – http://plone.org/documentation/manual/ upgrade-guide/version/2.5-3.0/products TuxLiveFM in the collective (soon) Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3
    • Questions Questions Questions? Ricardo Alves rsa@eurotux.com Moving an old-style product to Plone 3