<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
         xmlns="http://purl.org/rss/1.0/">




    



<channel rdf:about="http://blog.fourdigits.nl/techblog/RSS">
  <title>Four Digits Tech Blog</title>
  <link>http://blog.fourdigits.nl</link>

  <description>
    
       This is the Tech Blog of Four Digits. On this Blog we will share our experiences, ideas and code of our projects at work and at home.

Since our main development platform is based on Python, Zope, Plone and Javascript most of the posts will be about these topics but other not related topics will be posted also.
       
  </description>

  
  
            <syn:updatePeriod>daily</syn:updatePeriod>
            <syn:updateFrequency>1</syn:updateFrequency>
            <syn:updateBase>2009-07-01T09:57:41Z</syn:updateBase>
        

  <image rdf:resource="http://blog.fourdigits.nl/logo.gif"/>

  <items>
    <rdf:Seq>
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/living-statues-sprint-2010-the-results"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/advanced-sharing-permissions-and-workflows"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/living-statues-sprint-logo-announced"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/may-evaluation-time-again"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/living-statues-sprint-2010"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/new-maintainer-for-macports-python24"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/donating-10-of-our-time"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/removing-a-persistent-local-utility-part-ii"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/theres-an-end-to-everything.-but-not-right-now"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/theres-an-end-to-everything"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/cathedral-sprint-2010-4d-has-arrived"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/listing-expired-plone-content"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/yeah-were-done-1"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/trying-zodbupdate"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/building-construction-civil-engineering-moving-part-ii"/>
        
    </rdf:Seq>
  </items>

</channel>

    <item rdf:about="http://blog.fourdigits.nl/living-statues-sprint-2010-the-results">        <title>Living Statues Sprint 2010: The Results</title>        <link>http://blog.fourdigits.nl/living-statues-sprint-2010-the-results</link>        <description>The Living Statues Sprint 2010 is over during which a lot of progress has been made. We had a great time working on Deco, Tiles and Block and closed a total of 41(!) tickets!</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>The Living Statues Sprint 2010 is over during which a lot of progress has been made. We had a great time working on Deco, Tiles and Block and closed a total of 41(!) tickets!</p><h2>Planning</h2>
<p>From wednesday until sunday we worked on Deco, Tiles and Blocks. We created a lot of tickets in Trac in advance to get an overview of what should be done. The complete list can be found on <a class="external-link" href="https://dev.plone.org/plone/report/41">plone.org</a>. All the tickets were converted to post-it's.</p>
<p style="text-align: center;"><img alt="Plan board" class="image-inline" src="board.jpg/image_preview" /></p>
<h2>The team</h2>
<p>A total amount of 20 people worked in teams on the separate tickets in different areas including design, javascript, front-end and back-end. Twice a day we did a stand-up, one after lunch and one at the end of the day, to see what progress has been made and what tasks still needed to be done.</p>
<p style="text-align: center;"><img alt="stand up" class="image-inline" src="meeting.jpg/image_preview" /></p>
<h2>Completed tasks</h2>
<p>A short summary of some of the tasks which have been done:</p>
<ul>
<li>Create functional field tiles, which are a mapping of content type fields</li>
<li>Create a default layout which is used by all views using blocks (the current setup doesn't need the main template anymore!)</li>
<li>Create a new design for the Deco UI toolbar</li>
<li>Convert all the settings to use the new functionality of plone.app.registry</li>
<li>Improve testcoverage of plone.app.standardtiles (now at around 80%-90%)</li>
<li>Create a global undo manager</li>
<li>Create an automated testsetup using Hudson</li>
<li>Convert all the current viewlets/portlets to tiles, including related items, language selector, lock info, keywords, documentbyline, workflow history, rss, login, calendar and many more</li>
<li>Create the attachment tile</li>
<li>Create content listing tile</li>
<li>Create comments tile</li>
<li>Javascript JSLint and coverage</li>
</ul>
<h2>Final result</h2>
<p>The goal for the end of the sprint was to create a fully functional website using Deco, Tiles and Blocks. At the end of the sprint on sunday at 22:00 the website <a class="external-link" href="http://decobrewery.com">http://decobrewery.com</a> went live being the first ever website using Deco, Tiles and Blocks!</p>
<p style="text-align: center;"><img alt="Deco Brewery" class="image-inline" src="site.png/image_preview" /></p>
<h2>Video's</h2>
<p>I have created video's of some of the new functionality which has been created:</p>
<h3>News</h3>
<p style="text-align: center;"><a class="external-link" href="http://robgietema.blip.tv/file/4076556/" target="_blank"><img alt="Deco UI: News" class="image-inline" src="news.png/image_preview" /></a></p>
<h3>Custom contenttype</h3>
<p style="text-align: center;"><a class="external-link" href="http://blip.tv/file/4077835" target="_blank"><img alt="Deco UI: Contenttype" class="image-inline" src="contenttype.png/image_preview" /></a></p>
<h3>Content listings</h3>
<p style="text-align: center;"><a class="external-link" href="http://robgietema.blip.tv/file/4077793/" target="_blank"><img alt="Deco UI: Content Listing" class="image-inline" src="contentlisting.png/image_preview" /></a></p>
<h3>Content and media</h3>
<p style="text-align: center;"><a class="external-link" href="http://blip.tv/file/4077904"><img alt="Deco UI: Content and media" class="image-inline" src="media.png/image_preview" /></a></p>
<h2>Pictures</h2>
<p>We have created a <a class="external-link" href="http://www.flickr.com/photos/42607275@N04/sets/72157624820431268/">flickr set</a> of the pictures which have been created during the sprint.</p>
<p>I would like to thank everyone who participated in the sprint and hope to see you all next year at the Living Statues Sprint 2011!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Rob Gietema</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-09-03T08:44:12Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/advanced-sharing-permissions-and-workflows">        <title>Iterate, Sharing, Permissions and Workflows</title>        <link>http://blog.fourdigits.nl/advanced-sharing-permissions-and-workflows</link>        <description>Sharing is caring! In this use-case I will describe all actions done to get my workflow working.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Sharing is caring! In this use-case I will describe all actions done to get my workflow working.</p><p>In my case there are two roles: processowner and author. The processowner has the rights to iterate and checkout a bookpage. He or she then is able to share this item to someone who will get the author role. The author has the rights to set the workflow to 'written' when he is done. The processowner will checkin the page and it will return to the 'concept' state again.</p>
<p>There is a contenttype called bookpage, which is just a normal document including some additional fields.</p>
<p> </p>
<h2>The workflow</h2>
<p>Below is a schema of the setup I need to create for my bookpage contenttype.</p>
<table class="plain">
<tbody>
<tr>
<td><img alt="workflow" class="image-inline" src="workflow" /></td>
</tr>
</tbody>
</table>
<h2></h2>
<h2>Iterate</h2>
<p>First thing to do is to setup the iterate part. We need to add our 'bookpage' to versionable types. This can be done by editing the setuphandler.py and adding the following code.</p>
<pre><p>from Products.CMFEditions.setuphandlers import DEFAULT_POLICIES<br />TYPES_TO_VERSION = ['bookpage']</p><br />def installVersionedTypes(context):<br />    if isNotClientProfile(context):<br />        return<br />    site = context.getSite()<br />    logger.info('adding default versionable_types to website...')<br />    portal_repository = getToolByName(site, 'portal_repository')<br />    versionable_types = list(portal_repository.getVersionableContentTypes())<br />    for type_id in TYPES_TO_VERSION:<br />        if type_id not in versionable_types:<br />            versionable_types.append(type_id)<br />                for policy_id in DEFAULT_POLICIES:<br />                    portal_repository.addPolicyForContentType(type_id, policy_id)<br />                    portal_repository.setVersionableContentTypes(versionable_types)<br /><br />def importVarious(context):<br />    """Miscellanous steps import handle"""<br />    portal = context.getSite()<br />    installVersionedTypes(portal)</pre>
<p>We also need to tell diff_tool to add our contenttype so history and iterate will work.</p>
<p><i>diff_tool.xml</i></p>
<pre>&lt;?xml version="1.0"?&gt;<br />&lt;object&gt;<br /> &lt;difftypes&gt;<br /> &lt;type portal_type="bookpage"&gt;<br />     &lt;field name="any" difftype="Compound Diff for AT types"/&gt;<br /> &lt;/type&gt;<br /> &lt;/difftypes&gt;<br />&lt;/object&gt;</pre>
<h2></h2>
<h2></h2>
<h2></h2>
<h2>Workflow</h2>
<p>One of the easiest ways to create a new workflow for my bookpage is to copy an existing workflow using the ZMI and rename it to whatever you want it to be. In our case we call it 'book_workflow'.</p>
<p><i>workflows.xml</i></p>
<pre>&lt;?xml version="1.0"?&gt;<br />&lt;object name="portal_workflow" meta_type="Plone Workflow Tool"&gt;<br /> &lt;property<br /> name="title"&gt;Contains workflow definitions for your portal&lt;/property&gt;<br /> &lt;object name="book_workflow" meta_type="Workflow"/&gt;<br /> &lt;bindings&gt;<br /> &lt;type type_id="Book"&gt;<br /> &lt;bound-workflow workflow_id="book_workflow"/&gt;<br /> &lt;/type&gt;<br /> &lt;/bindings&gt;<br />&lt;/object&gt;</pre>
<p><i>definition.xml</i></p>
<pre>&lt;?xml version="1.0"?&gt;<br />&lt;dc-workflow workflow_id="book_workflow"<br /> title="Book Workflow"<br /> description=""<br /> state_variable="review_state"<br /> initial_state="concept"&gt;<br /> &lt;permission&gt;Access contents information&lt;/permission&gt;<br /> &lt;permission&gt;List folder contents&lt;/permission&gt;<br /> &lt;permission&gt;Modify portal content&lt;/permission&gt;<br /> &lt;permission&gt;View&lt;/permission&gt;<br /> &lt;state state_id="concept" title="Concept"&gt;<br />  &lt;exit-transition transition_id="provide_written"/&gt;<br />  &lt;exit-transition transition_id="provide_for_publication"/&gt;<br />  &lt;permission-map name="Access contents information"<br />   acquired="False"&gt;<br /><br />   &lt;permission-role&gt;Contributor&lt;/permission-role&gt;<br />   &lt;permission-role&gt;Editor&lt;/permission-role&gt;<br />   &lt;permission-role&gt;Manager&lt;/permission-role&gt;<br />   &lt;permission-role&gt;Owner&lt;/permission-role&gt;<br />   &lt;permission-role&gt;Author&lt;/permission-role&gt;<br />   &lt;permission-role&gt;Processowner&lt;/permission-role&gt;<br />  &lt;/permission-map&gt;<br /> <br /> &lt; ......... more states here ....... &gt;<br /> <br /> &lt;transition transition_id="provide_for_publication"<br />  title="Provide for publication"<br />  new_state="readyforpublication" trigger="USER"<br />  before_script="" after_script=""&gt;<br />  &lt;action url="%(content_url)s/content_status_modify?workflow_action=provide_for_publication"<br />  category="workflow"&gt;Provide for publication&lt;/action&gt;<br />  &lt;guard&gt;<br />   &lt;guard-permission&gt;Modify portal content&lt;/guard-permission&gt;<br />   &lt;guard-role&gt;Processowner&lt;/guard-role&gt;<br />   &lt;guard-role&gt;Manager&lt;/guard-role&gt;<br />  &lt;/guard&gt;<br /> &lt;/transition&gt;<br /> <br /> &lt; ......... more transitions here ....... &gt;<br /> <br />&lt;/dc-workflow&gt;</pre>
<p>Restrict transition on multiple roles so only the Manager and Processowner can do 'Provide fo publication'</p>
<pre> &lt;guard-role&gt;Processowner&lt;/guard-role&gt;<br /> &lt;guard-role&gt;Manager&lt;/guard-role&gt;</pre>
<p>We do the same thing for Author and Manager on the Transition 'Provide written' so only the author can set the state 'written'.</p>
<p>Note: in the ZMI we can do the same thing. We need to use a semicolon as the seperaror.</p>
<table class="plain">
<tbody>
<tr>
<td>
<p><img alt="separetroles.png" class="image-inline" src="separetroles.png" /></p>
</td>
</tr>
</tbody>
</table>
<h2></h2>
<h2></h2>
<h2></h2>
<h2>Permissions and Sharing</h2>
<p>The processowners needs the rights to share the author role to someone, so we need to setup a permission 'Delegate Author Role'.</p>
<p><i>permissions.py</i></p>
<pre>from Products.CMFCore.permissions import setDefaultRoles<br />from AccessControl import ModuleSecurityInfo<br />security = ModuleSecurityInfo("client.contenttypes.permissions")<br /><br />security.declarePublic("DelegateAuthorRole")<br />DelegateAuthorRole = "Sharing page: Delegate Author role"<br />setDefaultRoles(DelegateAuthorRole, ('Manager',))</pre>
<p><i>sharing.py</i></p>
<pre>from zope.interface import implements<br />from plone.app.workflow.interfaces import ISharingPageRole<br />from client.contenttypes import permissions<br /><br />class AuthorRole(object):<br />    implements(ISharingPageRole)<br />    title = _(u"title_author", default=u"Author")<br />    required_permission = permissions.DelegateAuthorRole</pre>
<p><i>permissions.zcml</i></p>
<pre>&lt;configure xmlns="http://namespaces.zope.org/zope"<br /> i18n_domain="client.contenttypes"&gt;<br /> &lt;!-- Our custom permissions --&gt;<br /> &lt;permission<br />   id="client.contenttypes.DelegateAuthorRole"<br />   title="Sharing page: Delegate Author role"<br /> /&gt;<br />&lt;/configure&gt;</pre>
<p>Tell include in configure.zcml we have done above.</p>
<p><i>configure.zcml</i></p>
<pre>&lt;include file="permissions.zcml" /&gt;<br />&lt;utility name="Author" factory=".sharing.AuthorRole"/&gt;</pre>
<h2></h2>
<h2></h2>
<h2></h2>
<h2></h2>
<h2>Rolemap</h2>
<p>Setup the security settings for Processowner. He needs to get 'Delegate Author role' and 'Delegate roles' for showing the sharing tab. We can also set the rights for the author role using rolemap.xml.</p>
<p><i>rolemap.xml</i></p>
<pre>&lt;?xml version="1.0"?&gt;<br />&lt;rolemap&gt;<br /> &lt;roles&gt;<br />  &lt;role name="Author"/&gt;<br />  &lt;role name="Processowner"/&gt;<br /> &lt;/roles&gt;<br /> &lt;permission name="Sharing page: Delegate Author role"<br />  acquire="True"&gt;<br />  &lt;role name="Manager"/&gt;<br />  &lt;role name="Processowner"/&gt;<br /> &lt;/permission&gt;<br />&lt;permission name="Sharing page: Delegate roles"<br /> acquire="True"&gt;<br />   &lt;role name="Processowner"/&gt;<br /> &lt;/permission&gt;<br />&lt;/rolemap&gt;</pre>
<h2></h2>
<h2></h2>
<h2></h2>
<h2></h2>
<h2>Exportsettings</h2>
<p>Best thing to do is export you workflow and security settings using the ZMI. Go to the portal_setup tool where you can export all kinds of XML.<br />Export 'Workflow Tool', 'Placeful Workflow policies' and 'Role / Permission Map' and put them in your contenttype profiles directory.</p>
<p>Directory stucture from client.contenttypes:</p>
<table class="plain">
<tbody>
<tr>
<td><img alt="dirstructure.png" class="image-inline" src="dirstructure.png" /></td>
</tr>
</tbody>
</table>
<h2></h2>
<h2></h2>
<h2>Result</h2>
<p>We are now able to share the role Author at the sharing page in Plone.</p>
<table class="plain">
<tbody>
<tr>
<td>
<p><img alt="Add Author Role SharingTab" class="image-inline" src="Picture6.png" /></p>
<p class="discreet">Dutch version</p>
</td>
</tr>
</tbody>
</table>
<p>The author has the rights to edit the page and change the workflow, this is done by setting the rights at the rolemap.xml</p>
<p> </p>
<h2>More information</h2>
<ul>
<li><a class="external-link" href="http://plone.org/documentation/manual/developer-manual/archetypes/appendix-practicals/enabling-versioning-on-your-custom-content-types">http://plone.org/documentation/manual/developer-manual/archetypes/appendix-practicals/enabling-versioning-on-your-custom-content-types</a></li>
<li><a class="external-link" href="http://plone.org/documentation/kb/add-new-roles-to-the-sharing-page">http://plone.org/documentation/kb/add-new-roles-to-the-sharing-page</a></li>
</ul>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-08-13T14:15:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/living-statues-sprint-logo-announced">        <title>Living Statues Sprint logo announced</title>        <link>http://blog.fourdigits.nl/living-statues-sprint-logo-announced</link>        <description>We are proud to announce the Living Statues Sprint has it's logo now!</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>We are proud to announce the Living Statues Sprint has it's logo now!</p><h2>Logo</h2>
<p>After a few discussions and proposals we are proud to announce we have a official logo for the Living Statues sprint! I would like to thank <a class="external-link" href="http://www.daanveldhuizen.com/">Daan Veldhuizen</a> of ByDesign for his great work on the logo. We will create t-shirts with this logo for the people at the sprint. Hope you like it!</p>
<h2>Hotel and sleeping</h2>
<p>Arnhem has some nice hotels located near our office. We recommend booking one of the rooms. <br />If these expenses are reason for you not to join us, please let us now, because we are thinking of creating a few sleeping facilities in our office. Please <a class="mail-link" href="mailto:livingstatuessprint@fourdigits.nl">let us now</a> if want to use this facilities.</p>
<h2 style="color: #3d607c !important; font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Lucida, Helvetica, Arial, sans-serif; margin-top: 0.75em; margin-right: 0px; margin-bottom: 0.25em; margin-left: 0px; font-size: 18px; border-bottom-width: 0px; border-bottom-style: initial; border-bottom-color: initial; font-weight: normal;">Contact</h2>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.5em; text-align: left;">If you would like to come, please let us know. Contact us about the sprint at: <a href="mailto:livingstatuessprint@fourdigits.nl?subject=I would like to come to the sprint!" style="color: #f47f32 !important; background-color: transparent; text-decoration: none; border-bottom-color: #cccccc; border-bottom-style: solid; border: 0px initial initial;">livingstatuessprint@fourdigits.nl</a></p>
<p><span style="line-height: normal; color: #3d607c; font-size: 18px;">More info</span></p>
<p>More info about this sprint can be found at <a class="external-link" href="http://www.coactivate.org/projects/living-statues-sprint-2010/project-home">coactivate</a>, <a class="external-link" href="http://plone.org/events/community/living-statues-sprint-2010">plone.org</a> or on <a class="external-link" href="living-statues-sprint-2010">our blog</a>.</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Ralph Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-08-05T13:13:18Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/may-evaluation-time-again">        <title>May: Evaluation Time again</title>        <link>http://blog.fourdigits.nl/may-evaluation-time-again</link>        <description>For the third time in a row we fully evaluated Four Digits as a company including all employees of Four Digits. This time in a big villa in Faro, Portugal.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>For the third time in a row we fully evaluated Four Digits as a company including all employees of Four Digits. This time in a big villa in Faro, Portugal.</p><p>Where is Four Digits standing now, how is everyone individually doing, are we missing things, what was (really) good and what was (really) bad? Some of the many questions we asked ourselves in more than 30 different discussion items, which were on the agenda.</p>
<h2 style="text-align: left;"><img alt="image2.jpg" class="image-right" src="image2.jpg/image_mini" /></h2>
<h2>Setting</h2>
<p>This time we went to the beautiful Algarve at Portugal,where we rented a very nice villa in a small village, including an own pool and a big BBQ! Algarve is know for having a good sunshine up to 30 degrees in May. So everything was set fora good relaxing atmosphere for talking and thinking for five whole days.</p>
<h2 style="text-align: left;"></h2>
<h2 style="text-align: left;">Evaluation</h2>
<p>One thing learned in the past three years, talking about things which are known, still helps to get everyone in the same direction. Also a good thing to see is when we where talking about Plone, we were talking about all the good stuff happening to our company while using Plone.</p>
<h3>SWOT</h3>
<p>We also did a SWOT analysis of Four Digits in a brainstorm session, which is a structural method to discuss all the different aspects of the company.</p>
<h3>Personal 360 Feedback</h3>
<p><img alt="Picture7.png" class="image-left" src="Picture7.png/image_mini" /></p>
<p>Before the meeting we filled in 78 personal questions about each other. This was done using the 360º  feedback way, 360º feedback measures competences generated from yourself and co-workers. Sometimes an evaluation took more than 3.5 hours per person... This way we all got a good personal insight.</p>
<h3>Customers</h3>
<p>Our customers got the chance to evaluate us using a survey tool setup for them at our support system. This report was used to look at Four Digits from a customers view.</p>
<h2></h2>
<h3>Suppliers and Partners</h3>
<p>We also evaluated all out suppliers and partners from the last year. This was done by filling out 20 questions per supplier/partner and having discussions about alternatives or improvements.</p>
<h2>Next year(s)</h2>
<p>Our main focus is set on Plone for many years now, and we will be keeping it that way! The 10% manifesto and organizing the World Statue Sprint are just a few things, more will come!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-05-28T18:20:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/living-statues-sprint-2010">        <title>Living Statues Sprint 2010</title>        <link>http://blog.fourdigits.nl/living-statues-sprint-2010</link>        <description>Four Digits is proud to announce the Living Statues Sprint 2010, August 25 to 29 at the Four Digits Office in Arnhem, The Netherlands.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Four Digits is proud to announce the Living Statues Sprint 2010, August 25 to 29 at the Four Digits Office in Arnhem, The Netherlands.</p><h2>Topics</h2>
<p>This sprint will focus on tasks for the upcoming 4.x and 5.x releases. Potential topics include Deco, Blocks and Collections. Suggestions are more than welcome.</p>
<h2>Location</h2>
<p>The sprint will be held at the Four Digits Office, located in the city centre of Arnhem. We have room for about 30 sprinters. There are a lot of hotels close to the office. If you need any help finding a suitable hotel let us know and we'll gladly assist you.</p>
<h3>Living Statues</h3>
<p><img alt="Living Statues" height="200" src="http://www.worldstatues.nl//fotos/2009-LarsFotografie-WorldStatues/data/images/20090830_world_statues-027.jpg" style="float: right; border: solid 1px black; margin: 0.5em 0 0.5em 0.5em;" width="200" />The sprint will be held during the World Championship for Living Statues, which will take place on August 30th (sunday). The very best national and international living statues will be performing from 13.00 until 17.00 hrs. At the same time, the amateurs will compete for the National Championship. This will take place in the city center of Arnhem at walking distance of the Four Digits office.</p>
<p>At 17.30 the paradewill start. On the square in front of Church Eusebius, all the living statues will give their best for one last time. After that, the nerve-racking award ceremony will start. For the professionals and amateurs there are 4 diplomas in the categories 'content', 'craftsmanship',  'aesthetical sensation' and 'entertainment'. The best amateur will be awarded with the National title. The best professional will be awarded with the Grand Prix d'Arnhem and may be addressed as the World Champion Living Statues for a year.</p>
<h3>About Arnhem</h3>
<p><img alt="Arnhem" src="http://farm1.static.flickr.com/27/42323055_c3b1c25303_m.jpg" style="float: left; border: solid 1px black; margin: 0.5em 0.5em 0.5em 0;" />Arnhem has been one of the most attractive shopping areas in the Netherlands for years, boasting a range of large chain stores and little clothes shops. Arnhem has something for everyone, a number of well-known labels and designers such as G-sus, Humanoid, Viktor &amp; Rolf and People of the Labyrinths have turned Arnhem into an attractive town for those with a passion for fashion.</p>
<p>Restored to their former glory and joined underneath one of the shopping streets, the 40 medieval cellars show you what underground Arnhem used to look like. The history of the town is reflected in the town centre itself as well as in 100-year-old Sonsbeek park, where you can take a rest in the heart of the town! The Church of Eusebius dominates the skyline. This late Gothic ogive basilica boasts a unique glass lift, rising to 73 metres and offering you a view of the attractive shopping centre. On your way up you will also see the biggest carillon in Europe!</p>
<p>The town also boasts a wide and varied range of museums - including ones on art, water, wine and history - as well as major attractions such as Burgers' Zoo and the Dutch Open Air Museum. Your day, evening or weekend in Arnhem should not end until you have been to Korenmarkt, the bustling entertainment centre. So whether you like shopping or going out, walking or cycling, visiting attractions or simply prefer more energetic pursuits, Arnhem is the place to be for an unforgettable stay!</p>
<h2>Travel</h2>
<h3>By train</h3>
<p>The Four Digits Office is located within walking distance of the Central Railway Station of Arnhem. Both national and international (ICE from Germany) trains will stop at this station.</p>
<h3>By plane</h3>
<p>The closest airport is Weeze (Dusseldorf), Germany. A direct busservice will take you from Weeze airport to Arnhem Central Station. An other option is to fly to Amsterdam or Eindhoven and take the train from there (1.5 hour train journey).</p>
<h2>Contact</h2>
<p>If you would like to come, please let us know. Contact us about the sprint at: <a class="mail-link" href="mailto:livingstatuessprint@fourdigits.nl?subject=I would like to come to the sprint!">livingstatuessprint@fourdigits.nl</a></p>
<p><i>Image courtesy </i><a class="external-link" href="http://www.worldstatues.nl/index.php?mact=Album,m4,default,1&amp;m4albumid=18&amp;m4returnid=132&amp;page=132"><i>Lars Smook</i></a><i> and </i><a class="external-link" href="http://www.flickr.com/photos/frodo/42323055/in/set-927411/"><i>Frodo Jansen</i></a><i>.</i></p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Rob Gietema</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-05-14T12:30:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/new-maintainer-for-macports-python24">        <title>New maintainer for MacPorts' python24</title>        <link>http://blog.fourdigits.nl/new-maintainer-for-macports-python24</link>        <description>Roel Bruggink has stepped up as the maintainer for MacPort's python24 port.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Roel Bruggink has stepped up as the maintainer for MacPort's python24 port.</p><h2>Python24 + Snow Leopard != fun</h2>
<p>When Snow Leopard was released, I noticed that our favorite program Mac Ports' python24 didn't exactly worked as I expected. Thanks to fschultze, I had a <a class="external-link" href="http://svn.plone.org/svn/collective/buildout/python/">working alternative</a>. But, I would like to keep stuff like python24 in macports.</p>
<h2>Complaining is wrong</h2>
<p>I could keep on complaining about it, but that's not the right mindset. I use this software for free, so I like to give back to the community by stepping up as the macports python24 maintainer as of <a class="external-link" href="http://trac.macports.org/changeset/67311">revision 67311</a>.</p>
<h2>What will I do</h2>
<p>My main priority is to get python24 working and keep it that way. I will keep MacPorts in sync with the latest releases, after it's tested :) I will not try to fix everything myself, so the port will be <a class="external-link" href="http://guide.macports.org/#project.update-policies.nonmaintainer">openmaintainer</a>. That basically means that 'small' (len undefined) patches may be committed by anyone who has MacPorts commit access.</p>
<h2>Found a bug, or need a fix?</h2>
<p>Please do <a class="external-link" href="http://trac.macports.org/newticket?port=python24&amp;cc=roel@fourdigits.nl">use tickets</a> to communicate your problems (and solutions), and please explain why it is a problem. If there is no 'why', I will close the ticket and will not accept the 'solution'.</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Roel Bruggink</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-05-05T09:45:22Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/donating-10-of-our-time">        <title>Donating 10% of our time!</title>        <link>http://blog.fourdigits.nl/donating-10-of-our-time</link>        <description>As of now every Four Digits employee should devote 10% of his or her time to improve Plone!</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>As of now every Four Digits employee should devote 10% of his or her time to improve Plone!</p><p>Looking back at the last couple of years we have been contributing a lot to the Open Source Community in general and Plone in specific. This includes Plone core-developement, add-on products development, dutch translations, visiting and giving talks at conferences and symposia. These contributions are made both during and after work hours. Up until now we encouraged coworkers to contribute but everybody could decide him/herself if he/she wanted to do so, nothing formal was agreed.</p>
<p>Following <a class="external-link" href="http://www.google.com">Google</a> and <a class="external-link" href="http://www.jarn.com">Jarn</a> who have similar agreements, every Four Digits employee should now devote 10% of his or her time to improve Plone! We believe by doing this we can make Plone even better and hope other companies will also consider similar agreements with their employees.</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Rob Gietema</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-05-03T13:40:52Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/removing-a-persistent-local-utility-part-ii">        <title> Removing a persistent local utility part II</title>        <link>http://blog.fourdigits.nl/removing-a-persistent-local-utility-part-ii</link>        <description>Installing products, testing them and uninstalling them afterwards is a common thing to do in Plone. However, removing the product (egg) from your buildout could lead in having some persistent objects in your ZODB which are broken. But how to remove them?</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Installing products, testing them and uninstalling them afterwards is a common thing to do in Plone. However, removing the product (egg) from your buildout could lead in having some persistent objects in your ZODB which are broken. But how to remove them?</p><h2>The problem</h2>
<p>When you remove a product, Zope does not know any more what the pickled objects in the ZODB are. Sometimes you do not notice any problems until you want to install a new product or want to change some setting in the plone control panel. Strange error appear like :</p>
<pre>Module Products.GenericSetup.tool, line 1181, in _runImportStepsFromContext<br /> Module Products.GenericSetup.tool, line 1092, in _doRunImportStep<br /> - __traceback_info__: toolset<br /> Module Products.GenericSetup.tool, line 130, in importToolset<br />TypeError: 'NoneType' object is not callable</pre>
<p>or you see messages in your Zope log like :</p>
<pre>WARNING OFS.Uninstalled Could not import class &lt;myclass&gt; from module &lt;mymodule&gt;</pre>
<p>Sometimes you get a <i>ComponentLookupError</i> by visiting the Plone site, even when you use the ZMI. Or some other strange error occurs (I've seen many different errors unfortunately).</p>
<p>Normally you can<a class="internal-link" href="removing-a-persistent-local-utility"> remove a local utility by using the unregisterUtility method</a>, but at this moment you don't have the product installed, so importing interfaces etc is not an option. Reinstalling is not what you want, so what to do now?</p>
<h2>What to do</h2>
<p>The first thing to do is to find out which product was responsible for the broken persistent components so know where and what to look for. You probably remember which product you uninstalled, otherwise you can find some hints in the zope access log file. Look in the profile and zcml of the product what is registered using a generic setup profile. We use <i>collective.myproduct</i> for the rest of this blogpost.</p>
<p>Create a new zope instance with your broken Data.fs and start a debugging prompt with b<i>in/instance debug</i> so you can start investigating the ZODB.</p>
<p class="discreet">Tip :You can use the .__dict__ property or the dir() method to inspect objects in the ZODB.</p>
<p><b>Disclaimer : Do not ever, ever do this in production environments unless you know what you are doing. One mistake can break your Plone website totally.</b></p>
<h2>Sitemanager</h2>
<p>In the zope component architecture, local utilities are stored in a local site manager. With Plone 3 and 4, you have a Sitemanager on your portal object. First thing to do is to get this Sitemanager.</p>
<pre>sm = app.myportal.getSiteManager()</pre>
<p>The sitemanager holds three types of local components : adapters, subscribers and providers.  (At least, that is what I found out). We should get them so we can see if our broken component is there somehow :</p>
<pre>adapters = sm.utilities._adapters<br />subscribers = sm.utilities._subscribers<br />provided = sm.utilities._provided</pre>
<p>Let's list (a part) of the current registered adapters :</p>
<pre>&gt;&gt;&gt; for x in adapters[0].keys():<br />...     print x<br />... <br />&lt;InterfaceClass plone.browserlayer.interfaces.ILocalBrowserLayerType&gt;<br />&lt;InterfaceClass zope.app.cache.interfaces.ram.IRAMCache&gt;<br />&lt;class 'collective.myproduct.interfaces.IMyProductConfig'&gt;<br />&lt;InterfaceClass Products.PortalTransforms.interfaces.IPortalTransformsTool&gt;<br />&lt;InterfaceClass plone.app.i18n.locales.interfaces.IContentLanguages&gt;<br />...</pre>
<p>In the list we can see that there is an adapter registered, and you can also see that the class differs from the others, because it's a broken object. You can verify that it's broken by printing the title of this object.</p>
<pre>for x in adapters[0].keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />        print "%s" % x.title<br />This object from the unknown product is broken!</pre>
<p>So we found our broken object so we should delete it :</p>
<pre>for x in adapters[0].keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />        print "deleting %s" % x<br />        del adapters[0][x]<br />sm.utilities._adapters = adapters</pre>
<p>After the reassignment the <a class="external-link" href="http://www.zope.org/Documentation/Articles/ZODB1">ZODB machinery does not detect that there is a change</a>, so we should commit this change :</p>
<pre>from transaction import commit<br />commit()<br />app._p_jar.sync()</pre>
<p>The same story goes for the subscribers and providers, so here is all the code together :</p>
<pre>sm = app.myportal.getSiteManager()<br />adapters = sm.utilities._adapters<br />for x in adapters[0].keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />    print "deleting %s" % x<br />    del adapters[0][x]<br />sm.utilities._adapters = adapters<br /><br />subscribers = sm.utilities._subscribers<br />for x in subscribers[0].keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />    print "deleting %s" % x<br />    del subscribers[0][x]<br />sm.utilities._subscribers = subscribers<br /><br />provided = sm.utilities._provided<br />for x in provided.keys():<br />    if x.__module__.find("collective.myproduct") != -1:<br />    print "deleting %s" % x<br />    del provided[x]<br />sm.utilities._provided = provided<br /><br />from transaction import commit<br />commit()<br />app._p_jar.sync()</pre>
<p>Now we got rid of our persistent components we don't want anymore, but some problems can still occur when (re)installing products using the Portal Quickinstaller or the Portal Setup tool.</p>
<h2>Portal Setup</h2>
<p>If you still have problems (re)installing products after you removed the broken local persistent components, you probably have to clean the Portal setup tool.You probably see something like this in the error log :</p>
<pre>TypeError: 'NoneType' object is not callable</pre>
<p>Check your product if it registers a tool using a <i>toolset.xml</i> file, like this :</p>
<pre>&lt;?xml version="1.0"?&gt;<br />&lt;tool-setup&gt;<br /> &lt;required tool_id="portal_myproduct" /&gt;<br />&lt;/tool-setup&gt;</pre>
<p>Fire up your debugger and get the portal_setup tool. It keeps its own registry for all registered tools which you can get using the <i>getToolsetRegistry</i> method :</p>
<pre>setup_tool = app.myportal.portal_setup<br />toolset = setup_tool.getToolsetRegistry()</pre>
<p style="text-align: left;">Check if a tool exists with the tool_id, which has been registered using  <i><br />&lt;required tool_id="portal_myproduct" /&gt;</i> and remove it :</p>
<pre>if 'portal_myproduct' in toolset._required.keys():<br />    del toolset._required['portal_myproduct']<br />    setup_tool._toolset_registry = toolset<br /><br />from transaction import commit<br />commit()<br />app._p_jar.sync()</pre>
<p style="text-align: left;">I'm pretty sure this is not the way to go, as I occasionally still see the OFS.Uninstalled warning, so I hope someone who reads this says <i>"This is not the way to go, you should do this".</i></p>
<p style="text-align: left;">Quit your debugging session and start your instance with <i>bin/instance fg. </i>Browse to the portal_setup tool using the ZMI and go to the "manage" tab. (<i>http://localhost/myportal/portal_setup/manage_stepRegistry</i>). There you can delete any invalid import steps if they are still there.</p>
<p>Now you should be able to install products again, and have your Plone site up and running without problems.</p>
<h2>Nice post, but this kind of ugly hacking shouldn't be necessary!</h2>
<p>And I agree totally on this. So a note to all product developers is : <a class="external-link" href="http://plone.org/documentation/kb/genericsetup/creating-an-uninstall-profile">Please write uninstall profiles!</a> You can also remove persistent utilities in your uninstall profile like <a class="internal-link" href="removing-a-persistent-local-utility">Roel described in a previous blogpost</a>. And I' sure there is some development on this part with Generic Setup.</p>
<h2>Feedback</h2>
<p>Everything I described in this post I found out by trial and error, as there is little documentation on these issues. And if it's there: I would like to know! And if you have better, nicer or other ways of doing all these things : Also let me know! Thank you in advance.</p>
<h2></h2>
<h2></h2>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Jacobs</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-04-23T15:55:05Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/theres-an-end-to-everything.-but-not-right-now">        <title>There's an end to everything. But not right now :)</title>        <link>http://blog.fourdigits.nl/theres-an-end-to-everything.-but-not-right-now</link>        <description>Four Digits and Plone are here to stay.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Four Digits and Plone are here to stay.</p><p>April fools is a great day. It's even greater when you pull of a prank later in the day. Somehow people let down their guard, and so we begin :) The best pranks are those that no one expects, and that no one really wants to hear :)</p>
<p>Of course we do continue to work on -and with- Plone, the product and the community, because we think Plone is the best for us and our clients.</p>
<p> </p>
<p class="callout"><span class="visualHighlight">Let this be clear: <a class="internal-link" href="theres-an-end-to-everything">this</a> was an April fools joke!</span></p>
<p> </p>
<p>Thanks for participating, and see you on the next conference, sprint or meeting!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Roel Bruggink</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-04-02T07:27:05Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/theres-an-end-to-everything">        <title>There's an end to everything.</title>        <link>http://blog.fourdigits.nl/theres-an-end-to-everything</link>        <description>Four Digits is moving away from Plone.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Four Digits is moving away from Plone.</p><p class="callout">This was an April fools joke. Please also read the <a class="internal-link" href="theres-an-end-to-everything.-but-not-right-now">follow up</a>.</p>
<p>It has been a difficult week for us. We've been talking for hours. What should we do? Is this the right thing to do? More questions then answers, but at least we now know what to do.</p>
<p>For the last couple of years, life has been a blast! We've met wonderful, intelligent people. We've gotten to know a wonderful, intelligent product - Plone of course!</p>
<p>We really like the whole Plone community, and we really did enjoy coding on the new Plone collections, integrating TinyMCE and building Deco. But we also see a lot of difficulties on the horizon. We no longer can afford to invest in Plone the community, nor in Plone the product.</p>
<p>So, this is farewell... I hope you will keep on rocking the Plone boat and get more and larger contracts. The best to you all! We would like to keep the legend alive, so we want you to join us in one final night of abundant drinking and get up tomorrow and code like the monkeys we are.</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Roel Bruggink</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-04-01T19:15:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/cathedral-sprint-2010-4d-has-arrived">        <title>Cathedral Sprint 2010: 4D has arrived!</title>        <link>http://blog.fourdigits.nl/cathedral-sprint-2010-4d-has-arrived</link>        <description>Sprinting on Plone from 15th until the 19th of March</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Sprinting on Plone from 15th until the 19th of March</p><p>About 30 people from around the world have joined to work on improvements for the upcoming Plone 4 release at the Cathedral Sprint in Köln, Germany. Six people from Four Digits have joined on Monday morning to work on several PLIPS. The event is sponsored and hosted by <a class="external-link" href="http://www.gfu.net/">GFU Cyrus AG </a> at nice location including good food! After the first two days a lot of work already is done. We have seen some nice things and made good progress.<img alt="IMG_0694.JPG" class="image-right" src="IMG_0694.JPG/image_thumb" /></p>
<p>Things being worked on right now:</p>
<ul>
<li>Collections: <a class="external-link" href="http://dev.plone.org/plone/ticket/9295">http://dev.plone.org/plone/ticket/9295</a></li>
<li>Content export/import: <a class="external-link" href="http://dev.plone.org/plone/ticket/9328">http://dev.plone.org/plone/ticket/9328</a></li>
<li>Calendaring: <a class="external-link" href="http://dev.plone.org/plone/ticket/9302">http://dev.plone.org/plone/ticket/9302</a></li>
<li>Commenting: <a class="external-link" href="http://dev.plone.org/plone/ticket/9288">http://dev.plone.org/plone/ticket/9288</a></li>
<li>Search results UI: <a class="external-link" href="http://dev.plone.org/plone/ticket/9352">http://dev.plone.org/plone/ticket/9352</a></li>
<li>Dutch and german translations for Plone 4</li>
<li>Performance improvements</li>
</ul>
<p><img alt="plone cathedral sprint" class="image-inline" src="IMG_0031.JPG/image_preview" /></p>
<p>Useful links:</p>
<ul>
<li><a class="external-link" href="http://plone.org/events/sprints/whatis">http://plone.org/events/sprints/whatis</a></li>
<li><a class="external-link" href="http://www.coactivate.org/projects/cathedral-sprint-2010/project-home">http://www.coactivate.org/projects/cathedral-sprint-2010/project-home</a></li>
<li><a class="external-link" href="http://plone.org/documentation/glossary/plip">http://plone.org/documentation/glossary/plip</a></li>
</ul>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-03-17T12:50:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/listing-expired-plone-content">        <title>Listing expired Plone content </title>        <link>http://blog.fourdigits.nl/listing-expired-plone-content</link>        <description>Using a catalog query to get to expired content. Easy, right?</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Using a catalog query to get to expired content. Easy, right?</p><p>After searching the whole internet again, it's time to make some documentation for myself and the world :)</p>
<p>My problem: list all news items, including the expired ones.</p>
<p class="callout">Warning: Listing expired content may result in showing content that you don't want to.</p>
<p>By default a catalog search does not return expired content. To get expired content you must use: show_all=1 and show_inactive=1</p>
<pre>self.context.portal_catalog.queryCatalog(query, show_all=1, show_inactive=1)</pre>
<p>To get all the expired items until today, you can use the folowing query:</p>
<pre>from DateTime.DateTime import DateTime
now = DateTime()
query['expires'] = {'query': now, 'range': 'min', }
self.context.portal_catalog.queryCatalog(query, show_all=1, show_inactive=1)
</pre>
<p>If you do not set an expired date on a item, it is at '2449/12/31'. This means that if you want to get all the items (expired as well as not yet expired), you need to search between a date in the past (like 2000/01/01) and a date in the future (like 2500/01/01).</p>
<p>Also you need to use min:max range. Again, using show_all and show_inactive.</p>
<pre>query['expires'] = {
    'query': (DateTime('2000/01/01'), DateTime('2500/01/01')),
    'range': 'min:max',
}
self.context.portal_catalog.queryCatalog(query, show_all=1, show_inactive=1)</pre>
<p>For more info, take a look at <a href="http://plonemanual.twinapex.fi/content/listing.html#listing-the-folder-items-using-portal-catalog">'Listing the folder items using portal_catalog'</a> in the Plone Developer Manual</p>
<p>Special thanks to Moo--!</p>
<p> </p>
<p>A quick reminder on logging in Debug mode:</p>
<pre>from Products.CMFPlone.utils import log
log('print log information in fg')</pre>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-03-12T15:36:47Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/yeah-were-done-1">        <title>Yeah! We're Done!</title>        <link>http://blog.fourdigits.nl/yeah-were-done-1</link>        <description>After five weeks of building, cleaning, moving, cleaning, painting, moving and cleaning we're finally done. Under a huge layer of dust we found our office, and after removing this layer the result was amazing.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>After five weeks of building, cleaning, moving, cleaning, painting, moving and cleaning we're finally done. Under a huge layer of dust we found our office, and after removing this layer the result was amazing.</p><p class="callout">Not only we've got ourself a brand new kitchen, we also have a massive bar!</p>
<p>Since we moved in here, we talked about our wish and the possibility to create a bar.  Every friday after work we evaluate the week and make plans for the next one. We invite friends and business partners to come over and join us. Sometimes we're done at seven, sometimes it results in a great night out!</p>
<p>From now on we can serve drinks from behind our bar, we can sit at our bar and lean at it while making new plans.</p>
<p><img alt="the Bar" class="image-inline" height="410" src="IMG_0664.JPG/image_preview" width="549" /></p>
<p>One of our new plans is to organize a big Plone Sprint in our office. We now have enough room for about twenty people to work on the wonderful product Plone and enough space at the bar to drink something afterwards.</p>
<p>There's only one problem left: What should be our next goal? Any suggestions?</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Martijn Schenk</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-03-06T14:45:11Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/trying-zodbupdate">        <title>Trying zodbupdate</title>        <link>http://blog.fourdigits.nl/trying-zodbupdate</link>        <description>After writing my last blog post Ross Patterson pointed me to zodbupdate. Why not give it a try and see how it works?</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>After writing my last blog post Ross Patterson pointed me to zodbupdate. Why not give it a try and see how it works?</p><p style="text-align: justify;">For this test lets create a instance having a broken contenttype. I set up a new buildout and fourdigits.testzodbupdate product having an interface, a portlet and a contenttype. Installed it, created objects and a portlet. Removed the product from my buildout, started my instance again and the instance is saying it has some broken objects. So far so good.</p>
<p>Time to add zodbupdate. Adding the zodbupdate package to my buildout was slightly different from what the documentation was telling. I had to add the extra-paths = ${zope2:location}/lib/python to get it working.</p>
<p class="discreet">My buildout</p>
<pre>[buildout]<br />parts += zodbupdate<br /><br />[zodbupdate]<br />recipe = zc.recipe.egg<br />eggs =     <br />    ${instance:eggs}<br />extra-paths =<br />    ${zope2:location}/lib/python</pre>
<p>Running zodbupdate is quit easy</p>
<pre>/opt/test/bin/zodbupdate -f /opt/test/var/filestorage/Data.fs -i</pre>
<p class="discreet">-f FILE, --file=FILE  load FileStorage<br />-i, --ignore-missing  update database even if classes are missing</p>
<p>Use the -i command so the update is fully done and you see all the errors.</p>
<p>My results:</p>
<pre>Missing factory: fourdigits.testzodbupdate.content.interfaces.ITest<br />Missing factory: fourdigits.testzodbupdate.browser.testportlet.Assignment<br />Missing factory: fourdigits.testzodbupdate.contenttypes.content.testtype.testtypeclass</pre>
<p>Time to create my new package, this one is called fourdigits.newtestproduct (very original). I created the same contenttype, portlet and interface again but all with slightly different names, to see how everything works.</p>
<p>Started my instance again to see if my new product is working fine, and look if im still having broken objects, again so far so good.</p>
<p>Time to setup rename rules for zodbupdate. First change the setup.py and add [zodbupdate] like below.</p>
<pre>entry_points="""<br /> # -*- entry_points -*-<br /> [zodbupdate]<br /> renames=fourdigits.newtestproduct:rename_dict</pre>
<p class="discreet">Note: this is done in my new product called fourdigits.newtestproduct. you need to set the same name after renames=</p>
<p>Now edit the __init__.py in /fourdigits.newtestproduct/fourdigits/newtestproduct/. This is the __init__ where your probably doing: def initialize(context): etc.</p>
<p>Put the rename_dict at the very top of the file:</p>
<pre>rename_dict = {<br /> 'fourdigits.testzodbupdate.content.testtype testtypeclass': \<br />     'fourdigits.newtestproduct.content.newtype newclass',<br /> 'fourdigits.testzodbupdate.content.interfaces ITest': \<br />     'fourdigits.newtestproduct.content.interfaces INewtest',<br /> 'fourdigits.testzodbupdate.browser.testportlet Assignment': \<br />     'fourdigits.newtestproduct.browser.newtestportlet Assignment',<br /> }</pre>
<p>What you see here is, I have made 3 rules. First: give the <i>old</i> location and classname (use a space in between). Secondly: set the <i>new</i> location and again classname. This should be done for your contenttype, interface and portlet.</p>
<p>Important note here. We now have set up our rename rules. To let zodbupdate know they exist, you must run buildout again!</p>
<pre>./bin/buildout -vN</pre>
<p>Zodbupdate will create a list of all products found in your instance and reads the setup.py for [zodbupdate]</p>
<p>Now it is time to run zodbupdate again:</p>
<pre>/opt/test/bin/zodbupdate -f /opt/test/var/filestorage/Data.fs -i</pre>
<p>The result:</p>
<p>Loaded 3 rules from fourdigits.newtestproduct:renames<br />Committing changes.</p>
<p>And all is done. My first impression after starting the instance again, was that all my products where working fine again!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-01-22T10:47:15Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/building-construction-civil-engineering-moving-part-ii">        <title>Building, Construction, Civil engineering, Moving: part II</title>        <link>http://blog.fourdigits.nl/building-construction-civil-engineering-moving-part-ii</link>        <description>In April 2009 we got the keys to our new Four Digits Office. Now its time to expand (again)!</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>In April 2009 we got the keys to our new Four Digits Office. Now its time to expand (again)!</p><p><img alt="constructiontools" class="image-right" src="2010010613.25.22.jpg/image_mini" style="float: right; " /></p>
<p>About 3 months ago we heard the rumour that our neighbours where moving out, a perfect chance to expand our office to the ground floor!</p>
<p style="text-align: left;">As of the 4th of January 2010 we are the proud owners of the ground and 1st floor of willemsplein 44!</p>
<p style="text-align: left;">Time to pick up all the construction tools again and design everything to our needs.</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><img alt="newoffice" class="image-left" src="2010010613.24.54.jpg/image_mini" /></p>
<p>We will be having two befriended companies in the ground floor:</p>
<p><a class="external-link" href="http://www.goedideemedia.nl">Goed Idee Media</a> specializes in small business content management. Have you ever made a Plone site where you had cut out more than leave behind? These guys made a system that delivers just the basics of content and user management with an easy way to add specialized plugins.</p>
<p><a class="external-link" href="http://www.catharsisdesign.nl">Catharsis Design</a> is Patrick Kreling, graphic designer and web designer with a broad network. His focus is on the development of corporate identities, website design and create complex user friendly interfaces. He also gives educational workshops for Computer Communications Academy (ICA) of Hogeschool Arnhem Nijmegen.</p>
<p> </p>
<p class="discreet" style="text-align: center; "><img alt="fourdigitsfront" class="image-inline" src="2010010614.24.28.jpg/image_mini" /></p>
<p class="discreet" style="text-align: center;">Just two floors left before expanding horizontally! :-D</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2010-01-06T14:42:39Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>




</rdf:RDF>
