<?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/maartenkling/RSS">
  <title>maartenkling</title>
  <link>http://blog.fourdigits.nl</link>

  <description>
    
       
       
  </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/writing-the-four-digits-plone-conference-proposal"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/sneak-preview-deco-and-a-new-4d-site"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/4d-plone-2011-and-beyond"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/advanced-sharing-permissions-and-workflows"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/may-evaluation-time-again"/>
        
        
            <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/trying-zodbupdate"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/building-construction-civil-engineering-moving-part-ii"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/changing-your-packagename-when-you-have-over-3000-objects-from-that-type"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/changing-your-plone-theme-skin-based-on-the-objects-portal_type-part-ii-skinswitcher"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/moving-and-building-four-digits"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/1-hour-plone-site-the-code-and-tinymce"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/using-sqlpasplugin-for-mysql-user-authenticating"/>
        
        
            <rdf:li rdf:resource="http://blog.fourdigits.nl/speaking-at-the-plone-conference-2008"/>
        
    </rdf:Seq>
  </items>

</channel>

    <item rdf:about="http://blog.fourdigits.nl/writing-the-four-digits-plone-conference-proposal">        <title>Writing the Four Digits Plone Conference Proposal</title>        <link>http://blog.fourdigits.nl/writing-the-four-digits-plone-conference-proposal</link>        <description>On Friday 30 december Four Digits submitted a proposal to host the anual Plone Conference 2012 in Arnhem! Here is a little sneak peek in the long preparation process to submitting our proposal.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>On Friday 30 december Four Digits submitted a proposal to host the anual Plone Conference 2012 in Arnhem! Here is a little sneak peek in the long preparation process to submitting our proposal.</p><h2>First steps to conference</h2>
<p>In the weeks before the Plone conference 2011 in San Francisco we had a very short discussion "Are we going to submit a proposal for next year?". The answer was very clear "Yes we will, if we get a venue!".</p>
<p>Yadi and myself where appointed to research possible conference locations and create a shortlist. As we visited several conference locations in Arnhem before, the short list was easy: "<a class="external-link" href="http://www.burgerszoo.nl/">Burgers ZOO</a>", "<a class="external-link" href="http://papendal.nl">Papendal</a>", "<a class="external-link" href="http://gelredome.nl">Gelredome</a>" and our favorite: "<a class="external-link" href="http://www.mssa.nl/">Musis Sacrum</a>".</p>
<p>Calling the Gelredome and hearing: "Yes, it is possible to hire the stadium, we got over 10 rooms available and it will be possible to setup a part of the soccer field and make a stand to seat 6000 people" made me smile, concerts are held there for over 35.000 people.</p>
<p>On the 12th of October the first real visit was made to Musis Sacrum, to orientate and discuss  possibilities.</p>
<p style="text-align: center;"><img alt="posiblelocationfound.png" class="image-inline" src="posiblelocationfound.png" /></p>
<p style="text-align: left;">When visiting we where blown away, the possibilities where endless. Big inhouse party location, restaurant and bar facilities and best of all, serveral conference halls big enough to organize four parallel tracks and have a separate hang-out facility all in the same location.</p>
<p style="text-align: left;">Nine days later the good news arrived from the location, the seven days needed for the conference where available and we could have the entire building for ourselves!</p>
<p style="text-align: center;"><img alt="ScreenShot20120105at1.18.20PM.png" class="image-inline" src="ScreenShot20120105at1.18.20PM.png" /></p>
<p style="text-align: left;">The seven days are needed to locate the three days of conference, two day sprinting and two day training at the same location.</p>
<h2>Writing the proposal</h2>
<p>In the last couple of years there where several very good submissions made by different sized companies and individuals. There are numerous excellent proposal examples and blog posts. The chapter setup for the conference proposal was easy, doing the research about Arnhem and the requirements was harder then expected, there was so much to do :). In about five weeks time te proposal was written, rewritten and styled. A sneak peak of the "Team", "Venue", "Arnhem" and "Marketing" sections of the proposal is listed below.</p>
<h2>The team</h2>
<p>In the process of writing and organizing we set up a team, in this team everybody is responsible for different kinds of tasks. This way we are able to focus on the talk program and do marketing at the same time. As we view organizing the conference is serious business, a team will be able to organize it best.</p>
<h2>Venue</h2>
<p style="text-align: left;">‘Musis Sacrum’ is located in the city centre of Arnhem and is within walking distance from the train station, bus station and a lot of hotels. Musis Sacrum has a large concert hall with 870 seats, a conference hall with 500 seats and various halls for events such as conferences, congresses, dinners, parties, presentations or meetings. It also houses it’s own grand café Mahler.</p>
<p style="text-align: center;"><img alt="MusisSacrumHoofdingangb.JPG" class="image-inline" src="MusisSacrumHoofdingangb.JPG/image_preview" /></p>
<p>The venue is big enough to hold 500 people without making it feel too crowded, but not too big to get lost. We have sole access to the entire venue for the seven days of the conference.</p>
<h2>Arnhem</h2>
<p>Arnhem has been one of the most attractive shopping areas in the Netherlands for years, boasting a range of large chain stores and small clothes shops. <span style="text-align: left;">There are numerous restaurants and cafe’s in Arnhem from fine dining to fast food and buffetstyle eateries. Through the city there are numerous of bars, restaurants and clubs.</span></p>
<p style="text-align: center;"><img alt="Arnhem" class="image-inline" src="4283071898_0a6c032eff_o.jpg/image_preview" /></p>
<h2 style="text-align: left;">Marketing</h2>
<p>We plan to invest heavily into marketing the Plone Conference. One of the organizers will be responsible for marketing only; The location provides several spots for printed or audio visual sponsor media. This can be at the outside of the building, at the registration desks and in all the conference rooms. Marketing will promote Plone and all people/sponsors making it possible. We will make big banners showing the Plone Conference 2012 logo, the sponsors and the venue.</p>
<h2>Switch Conference dates in the dying seconds</h2>
<p>In the last days of writing the proposal, Mojo Concerts announced three yearly recurring concerts in the biggest pop-theater of the Netherlands, the Gelredome, Arnhem, exactly on the dates we had arranged with the venue. The hotels in Arnhem raised their prices and <span style="line-height: 18px;">availability </span>dropped down in just a few days... O my god, this concert attracts many people having lots of spending money.</p>
<p>In the dying seconds before the proposal was done it was needed to call all available hotels and recalculate availability, a date change was needed! Luckily for us the venue was able to move the conference one week! And now we have already made optional reservations at all hotels in city center to ensure availability and to get the best conference-prices!</p>
<h2>Submitting</h2>
<p>Finaly the moment was there, 30 December the last Friday before the deadline, after hard work the complete proposal was finished having a clear budget and all chapters covered. This is it.</p>
<h2 style="font-size: 18px;">Two proposals: Paris or Arnhem!</h2>
<p>On 4th of Januari Mark Corum announced there where <a class="external-link" href="http://plone.org/news/plone-conf-2012-gets-two-proposals">the Plone Foundation Gets Two Proposals to Host Plone Conference 2012</a>. So we are up against the French!</p>
<p>May the best conference proposal win! I think we got the plan, the location, the city having everything within walking distance and one of the best teams to make a great conference! Fingers crossed!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2012-01-05T16:30:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/sneak-preview-deco-and-a-new-4d-site">        <title>Sneak Preview: Deco and a new 4D site!</title>        <link>http://blog.fourdigits.nl/sneak-preview-deco-and-a-new-4d-site</link>        <description>Work in progress!</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Work in progress!</p><p>A little sneak preview how the new Four Digits site is being edited in Deco using CMS UI.</p>
<p>
<object data="http://www.youtube.com/v/Zklzr_k-0rw" height="350" style="width: 525px; height: 350px;" type="application/x-shockwave-flash" width="525">
<param name="src" value="http://www.youtube.com/v/Zklzr_k-0rw">
</object>
</p>
<p>The new site (almost ready to launch) is built using the latest <a class="external-link" href="http://svn.plone.org/svn/plone/plone.app.deco/buildouts/dev/buildout.cfg">Deco buildout</a> and CMS UI version.</p>
<p>There are some custom Dexterity contenttypes and some new tiles, one of them is <a class="external-link" href="http://svn.plone.org/svn/collective/fourdigits.twittertile/">fourdigits.twitter tile</a>. This utilizes the<a class="external-link" href="http://pypi.python.org/pypi/fourdigits.portlet.twitter/"> fourdigits.portlet.twitter</a> by <a class="internal-link" href="ralphjacobs">Ralph Jacobs</a>.</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2011-08-16T13:39:33Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/4d-plone-2011-and-beyond">        <title>4D, Plone, 2011 and beyond</title>        <link>http://blog.fourdigits.nl/4d-plone-2011-and-beyond</link>        <description>A new year, new people, a great Plone version and the first Plone 4 sites popping up.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>A new year, new people, a great Plone version and the first Plone 4 sites popping up.</p><p><strong>Plone 4</strong></p>
<p>As of the first of September 2010, the new Plone 4.0 was released. We where already looking at the possibilities and using the beta for some new solutions. In the beginning of November our first official Plone 4 site was launched and is still performing at its best! At this point we are launching all new sites in Plone 4 and I don't think we will ever look back. I cant wait until the 4.1 release and all the even more evolved features are available for ourselves and the users using Plone.</p>
<p>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type" />
</p>
<p style="text-align: center;"><img alt="plone4diazo" class="image-inline" src="Screenshot20110120at3.12.09PM.png/image_preview" /></p>
<p><strong>Diazo formaly known as XDV</strong></p>
<p>My personal knowledge is limited (I'm able to read the ruleset and append it when needed) as it comes to Diazo and all the possibilities for Diazo. What I do know is that it is a nice way to spread the working activities around multiple parties. Getting complete HTML for company X and only having to worry about creating the best Plone solutions is great. Even better is less touching IE6/7/8 as the HTML is written by someone else, and not always my problem any more! Less IE in 2011 will make everyone a little bit happier ;-)</p>
<p> </p>
<p><strong>2011 and beyond</strong></p>
<p>In my opinion this year will be a combination of creating great Plone 4 solutions and using the best of available knowledge around! The company is growing again as new people will start this March and make it possible to create even more great stuff!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2011-01-20T15:15:26Z</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/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/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/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>
    <item rdf:about="http://blog.fourdigits.nl/changing-your-packagename-when-you-have-over-3000-objects-from-that-type">        <title>Changing your packagename</title>        <link>http://blog.fourdigits.nl/changing-your-packagename-when-you-have-over-3000-objects-from-that-type</link>        <description>One day you think lets clean up my code and rename all my products to something useful</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>One day you think lets clean up my code and rename all my products to something useful</p><p>Use Plone for several years and you will always find some product you made years ago and still frequently use today.</p>
<p>Now I recently had such a product, it was called <i>Products.MyClientAdres.</i> The name was reffering to some client but had nothing to do with it anymore. It was used in a completley different site but still used the same old svn location and package name.</p>
<h2>My new package</h2>
<p>When decided to change the name, I just blindly copied the product, renamed all the MyClientAdres things to my new package name '<i>fourdigits.organisations</i>' and put everything in my buildout.</p>
<p>The result was very easy to predict, all my objects where broken after deleting the old product from the instance. They where all looking for Products.MyClientAdres.content.organisations but that was gone.</p>
<h3>Convert the objects</h3>
<p>To get my products back alive we need to change the <i>__class__</i> of every object we made with the old product. First thing to keep in mind, keep both you old and new product installed in your instance because you cannot call a broken object!</p>
<p>Make a script to convert all the <i>__class__</i> to you new class. Get the new class name from you package, here its called <i>Adressenbank</i> and <i>Organisatie</i>.</p>
<pre>from fourdigits.organisations.content.Adressenbank import Adressenbank<br />from fourdigits.organisations.content.Organisatie import Organisatie</pre>
<p>Convert the old <i>adressenbank</i> folder to the new Adressenbank contenttype from my new package.</p>
<pre>adressenbank = getSite().unrestrictedTraverse('adressenbank')<br />tmp = Adressenbank(self.context)<br />adressenbank.__class__ =  tmp.__class__</pre>
<p>Convert the +3000 organisations still in the folder above.</p>
<pre><br />ct = getToolByName(self, 'portal_catalog')<br />query = {}<br />query['object_provides'] = 'Products.MyClientAdres.content.interfaces.IOrganisatie'<br />results = ct(query)<br />tmp = Organisatie(self.context)<br /><br />for result in results:<br />    obj = result.getObject()<br />    obj.__class__ =  tmp.__class__<br /><br />transaction.commit()<br /><br /></pre>
<p>Rebuild the catalog by hand after your finished running the script.</p>
<p>Restart you instance and use quickingstaller to uninstalled your old product. Restart again and smile, all your object are working using your new product.</p>
<p>~</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-12-17T08:04:51Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/changing-your-plone-theme-skin-based-on-the-objects-portal_type-part-ii-skinswitcher">        <title>Changing your Plone theme/skin based on the object's portal_type: Part II</title>        <link>http://blog.fourdigits.nl/changing-your-plone-theme-skin-based-on-the-objects-portal_type-part-ii-skinswitcher</link>        <description></description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p></p><p>In the beginning of August 2009, <a class="internal-link" href="roelbruggink">Roel</a> and me started working on a new assignment: Making a site for a volunteers oganisation called <a class="external-link" href="http://humanitas.nl">Humanitas</a>.</p>
<h2>Humanitas</h2>
<p>The Humanitas Association stands for a society in which people feel active and responsible for themselves, but also take responsibility for living together. The association lends the less fortunate a helping hand, so they can move on on their own. Humanitas supports about 35.000 people in over 500 projects with over 10.000 volunteers.</p>
<h2>Organisation structure</h2>
<p>The structure of the organisation is leveled in four levels, from top to bottom:</p>
<ul>
<li>Headquarters</li>
<li>Districts</li>
<li>Department</li>
<li>Local Project</li>
</ul>
<p>We had to make the site for the department of Eindhoven and all there local projects. They wanted to use all the information from there projects in the department ( and later in their district ).</p>
<p>Plone layout:</p>
<pre>Humanitas-nl <br />           -&gt;<br />             District South<br />                          -&gt; Department Eindhoven<br />                                                -&gt; Project Home-Start<br />                                                -&gt; Project Doorstart<br />                                                -&gt; Project X..<br />                          -&gt; Department X<br />                                                -&gt; Project X</pre>
<p>Everything is in the same Plone site so we can use all content in all levels. Creating collections and getting all the news in the District site will show all news items form Departments and Projects, etc.</p>
<h2>Webmaster powers</h2>
<p>The webmaster has the power to create new Project sites, giving them different colors and logos images so they all look slightly different, but feel the same. There is no need for him to get any help for us to create new (project) sites. We are currently expanding this to the district level, so the webmaster can create new departments, from where on he can create more local projects.</p>
<h2>Multiple projects/departments using same layout but different look.</h2>
<p>All the projects and departments have the same layout, so we built a normal plone theme. We created a custom content-type for the projects including 3 color fields using: <a class="external-link" href="http://pypi.python.org/pypi/Products.SmartColorWidget/1.1.0">Products.SmartColorWidget</a></p>
<p>The edit screen for a project and changing the colors for every project:</p>
<table class="plain">
<tbody>
<tr>
<td>
<p><img alt="Color change" class="image-inline" src="Picture12.png/image_mini" /></p>
<p>http://maatjescontact.humanitaseindhoven.nl/</p>
</td>
<td>
<p> </p>
<p><img alt="Color change 3" class="image-inline" src="Picture13.png/image_mini" /></p>
<p> </p>
<p>http://home-start.humanitaseindhoven.nl/</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>The py file for calling the projects.css file:</p>
<pre>def __call__(self, *args, **kw):<br /> """Return a dtml file when calling the view (more easy thx to Gillux)"""<br /> Project_props = self.getProjectCssProperties()<br /> csscontent = template(context,<br />     project_properties = Project_props, <br />     portal_url = self.getPortalUrl(), <br /> )<br /> return  CSSPacker('safe').pack(csscontent)<br /><br />def getPloneCssProperties(self) :<br /> context = aq_inner(self.context)<br /> dict_properties = {}<br /> bp = context.base_properties<br /> bpdict = bp.propdict()<br /> for k,v in bpdict.items() :<br />   if bp.hasProperty(k):<br />     dict_properties[k] = bp.getProperty(k)<br /><br /> return dict_properties</pre>
<p>Part of the project.css DTML file</p>
<pre>/* &lt;dtml-with project_properties mapping&gt; */<br /><br />/* colors */<br />&lt;dtml-if hoofdnavigatieachtergrondkleur&gt;<br /> .documentFirstHeading {<br /> color: &amp;dtml-hoofdnavigatieachtergrondkleur;;<br /> }<br /> .projecttitle {<br /> color: &amp;dtml-hoofdnavigatieachtergrondkleur;;<br /> }<br />&lt;dtml-else&gt;<br /> .documentFirstHeading {<br /> color: #fff;<br /> }<br />&lt;/dtml-if&gt;<br /><br />/* &lt;/dtml-with&gt; */</pre>
<p>Also see <a class="internal-link" href="changing-your-plone-theme-skin-based-on-the-objects-portal_type">part 1</a> for some more information.</p>
<h2>Results</h2>
<p>The department website is live and currently has 10 projects, all having a different color schema.<br /><span>You can see it for yourself at:</span> <a href="http://humanitaseindhoven.nl">www.humanitaseindhoven.nl</a></p>
<p>The department Eindhoven is showing all the projects and news from there own department and projects below.</p>
<p>I gave a litte live demo on the <a href="dutch-plone-usersday-2009">Dutch Plone User day</a> and the <a href="http://www.ploneconf2009.org/">Plone Conference 2009</a> where I named it <span><a href="http://blip.tv/file/2636019">skin switcher</a>.</span></p>
<p><span><br /></span></p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-11-25T11:09:13Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/moving-and-building-four-digits">        <title>Building, Construction, Civil engineering, Moving</title>        <link>http://blog.fourdigits.nl/moving-and-building-four-digits</link>        <description>Four Digits for all your construction and building plans...</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Four Digits for all your construction and building plans...</p><h2>Building, CIVIL engineering and Moving Four Digits Office</h2>
<p>It is time to move from our good old office into a brand new one!</p>
<p><img alt="moving 4d, gluebusters" class="image-inline" src="IMG_0085.JPG/image_preview" /></p>
<p>Since April the 1st we recieved the keys to our new office. Lucky for us there was LOTS and LOTS of work to do in the new office located on <a class="external-link" href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=nl&amp;geocode=&amp;q=Willemsplein+44,+Arnhem+6811+Arnhem,+Gelderland,+Nederland&amp;sll=51.983393,5.908231&amp;sspn=0.006238,0.016522&amp;dirflg=w&amp;ie=UTF8&amp;t=h&amp;z=16&amp;iwloc=A">Willemsplein 44 (Arnhem). </a>It was time to put on our 'work clothes' and start with it!</p>
<p><a class="external-link" href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=nl&amp;geocode=&amp;q=Willemsplein+44,+Arnhem+6811+Arnhem,+Gelderland,+Nederland&amp;sll=51.983393,5.908231&amp;sspn=0.006238,0.016522&amp;dirflg=w&amp;ie=UTF8&amp;t=h&amp;z=16&amp;iwloc=A"><img alt="moving 4d 2" class="image-inline" src="IMG_0086.JPG/image_preview" /></a></p>
<p>We all worked hard and long evenings to get the walls cleaned and painted. We are still not there, but getting closer. After the <a class="external-link" href="http://plone.org/events/regional/european-symposium-2009/">sorrento symposium</a> we will move into a 2.5 times bigger office including airconditioning \o/.<br /><br />Here is a photo taken from the street/square:</p>
<p><img alt="office" class="image-inline" src="office.gif/image_large" /></p>
<h2>Construction and Moving the Four digits website</h2>
<p>It was also time to update the Four Digits website again. It was running on Plone 3.0.6 and now its on 3.2.2, including all pages in English using <a class="external-link" href="http://plone.org/products/linguaplone">LinguaPlone</a>.</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2009-04-27T14:15:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/1-hour-plone-site-the-code-and-tinymce">        <title>1 Hour Plone site the code and TinyMCE</title>        <link>http://blog.fourdigits.nl/1-hour-plone-site-the-code-and-tinymce</link>        <description>Here is all the code from my presentation "How to build a Plone site in 1 hour!"
It was great to attend to the conference this year!


</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Here is all the code from my presentation "How to build a Plone site in 1 hour!"
It was great to attend to the conference this year!


</p><h2>1 Hour Plone Site</h2>
<p>Here is all the code of my presentation "How to build a Plone site in 1 hour!"<br />It was great to attend the conference this year!</p>
<p>You can find my complete presentation at: <a class="external-link" href="http://www.fourdigits.nl/ploneconference2008/"><span class="external-link">http://www.fourdigits.nl/ploneconference2008/</span></a></p>
<p>The buildout: <a class="internal-link" href="buildout.cfg" title="buildout.cfg">buildout.cfg</a></p>
<p>My content type created in ArgoUML: <a class="internal-link" href="coolpack.zargo" title="coolpack.zargo">CoolPack.zargo </a></p>
<pre>./ArchGenXML.py coolpack.zargo -o coolpack</pre>
<p>The generated coolpack: <a class="internal-link" href="coolpack" title="coolpack">coolpack</a></p>
<pre>paster create -t plone3_theme coolregion.plonetheme</pre>
<p>The created theme, including portlet, viewlet, folderview and some styling: <a class="internal-link" href="coolregion.plonetheme" title="coolregion.plonetheme">coolregion.plonetheme</a></p>
<h2>TinyMCE</h2>
<p>The TinyMCE lightning-talk given by Rob can be found here:</p>
<p><a class="external-link" href="ploneconference2008lightningtalk/">http://www.fourdigits.nl/ploneconference2008lightningtalk/</a></p>
<p>Download TinyMCE:</p>
<p><a class="external-link" href="http://plone.org/products/tinymce">http://plone.org/products/tinymce</a></p>
<p>TinyMCE is also on PyPI, just add Products.TinyMCE to your buildout</p>
<p>If you have any questions please contact us!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2008-10-14T15:00:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/using-sqlpasplugin-for-mysql-user-authenticating">        <title>Using SQLPASPlugin for mysql user authenticating</title>        <link>http://blog.fourdigits.nl/using-sqlpasplugin-for-mysql-user-authenticating</link>        <description>Using a existing mysql db including over 3000 usernames and passwords to login into Plone and using a table view for there properties.</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>Using a existing mysql db including over 3000 usernames and passwords to login into Plone and using a table view for there properties.</p><p>I was randomly searching the Internet for some nice new articles about Plone when I stumbled into <a class="external-link" href="http://plone.org/products/sqlpasplugin">SQLPASPlugin</a>. After some reading I start to give it a try on a project that we where working on.</p>
<p>The project had a database including over 3000 users who could login at a administration tool built with  Zope 2. The current Mysql database was connected to Zope using <a class="external-link" href="http://sourceforge.net/projects/exuserfolder/">ExUserFolder</a>. This worked fine for Zope, however, we are porting the application to Plone now so we needed another solution.</p>
<p>I created a new plone instance and configured my buildout to include SQLPASPlugin and MySQLDA to connect to Mysql. The <i>buildout.cfg</i> part looks something like this :</p>
<pre>parts =<br />    ...<br />    zmysqlda<br />    ...<br />[productdistros]<br />recipe = plone.recipe.distros<br />urls =<br />    http://plone.org/products/sqlpasplugin/releases/1.0/SQLPASPlugin-1.0.tar.gz<br />    ...<br />[zmysqlda]<br />recipe = cns.recipe.zmysqlda<br />target = ${productdistros:location}<br />...</pre>
<p>In my case,  the Mysql bindings are already installed on my system. If there are not installed you need the MySQL-python package :<a class="external-link" href="http://pypi.python.org/pypi/MySQL-python/1.2.2">http://pypi.python.org/pypi/MySQL-python/1.2.2</a></p>
<p>After installation it's time to run <i>buildout</i> (./bin/builout) again and start Plone (./bin/instance fg). I created a Plone site and went to the <i>portal_quickinstaller</i>. Here I found SQLPASPlugin, and installed it.</p>
<p>In the root of my Plone site I created a Z MySQL Database connection, which connected to the Mysql server on my local machine witch includes the database with the user tables.</p>
<p>Time to take a look at the SQLPASPlugin configuration screen (SQL Authentication), found in the control panel of Plone. I configured the table, username, and password column.</p>
<p>For me this worked perfectly because all my users where in the table <i>passwd </i>( created for exuserfolder a long time ago ) having a <i>username</i> and <i>password </i>column. If you don't have a database yet follow the link at the bottom for an SQL script.</p>
<p><img alt="sqlauthentication" class="image-inline image-inline" src="sqlauthentication.jpg/image_preview" /></p>
<p class="discreet">The SQL Authentication control panel</p>
<p>Now i went to the ZMI of my Plone site and had a look at the <i>acl_user</i> folder. There where three new items there, named <i>source_users</i>, <i>source_roles</i> and <i>source_properties</i>. Because all the users already have roles defined in the current zope application I mapped these roles using the following screen :</p>
<p><img alt="rolesview" class="image-inline" src="rolesview/image_large" /></p>
<p class="discreet">The roles view in the ZMI</p>
<p>That was easy, mapping the<i> roles </i>table to my <i>passwd</i> table, the<i> rols_col_username</i> column to my <i>username </i>column and the <i>roles_col_rolename</i> column to my <i>roles </i>column.</p>
<p>It was time to take a look at the <i>source_properties</i> tab :</p>
<p><img alt="source_properties" class="image-inline" src="source-properties/image_large" /></p>
<p class="discreet">Filled in source_properties</p>
<p>Here I discovered that it was possible to map property fields to columns in my database.</p>
<p>My <i>passwd </i>table did not had a fullname or email field, they were stored in different tables. So I created a view :</p>
<pre>CREATE VIEW propertiesview as SELECT username,'' as password, email, telefoon  as phone, concat(name,' ',prefix,' ',lastname) as fullname from usertable;</pre>
<p>This way I could map all the fields that I needed (not all shown here, but you can select more if you need) as properties for my users and even put some fields together to create the fullname field. All the fields in the view could be mapped  by filling them in by col_mapping as:</p>
<pre>selected_field / property_name_in_plone (for example : In the image above as fullname/fullname)</pre>
<p>However, after configuring this all, my properties didn't show up, so it was time to take a look at the plugin registry of acl_users. There was a link named '<i>Properties Plugins</i>', I clicked it and found out it was looking for properties using the <i>mutable_properties</i> plugin fist, so i moved my <i>source_properties</i> plugin to the top.</p>
<p><img alt="changeorder" class="image-inline" src="changeorder/image_large" /></p>
<p class="discreet">The properties plugin view</p>
<p>Now it was time to try it all and perform a login. To bad, it failed because ExUserFolder crypted all my passwords in a different way as the standard options available in SQLPasPlugin. So for now we made a little change to the PlainEncrypter in <i>encrypt.py</i> (line 79) of SQLPASPlugin.</p>
<pre>def validate(self, reference, attempt):<br />    """Validate attempt against reference."""<br />    pwd = crypt.crypt(attempt, reference[:2])<br />    return reference == crypt.crypt(attempt,reference[:2])</pre>
<p>Now my plain password posted in the login_form are crypted the way ExUserFolder did it, so the comparison will succeed now.</p>
<p>Now I could login using the usernames and passwords from my existing MySQL database and I also found out that my fullname and email address are shown correct now! ( made some <b>dance</b> moves here! \o/ )</p>
<p><b>If you have used ExUserFolder in the past check out this code for the crypt function:</b></p>
<p><a class="internal-link" href="encrypt" title="encrypt">tarbal</a> ( encrypt.py , encrypt.zcml )</p>
<p><b>References:</b></p>
<ul>
<li><a class="external-link" href="http://plone.org/documentation/how-to/how-to-setup-sqlpasplugin-to-authenticate-against-a-postgresql-database">How To Setup SQLPASPlugin to Authenticate Against A PostgreSQL Database</a></li>
<li><a class="external-link" href="http://plone.org/documentation/how-to/how-to-setup-sqlpasplugin-to-authenticate-against-a-postgresql-database">SQLPasPlugin</a></li>
<li><a class="external-link" href="http://pypi.python.org/pypi/MySQL-python/1.2.2">Mysql package for python</a></li>
<li><a class="external-link" href="http://www.zope.org/Products/DA/ZMySQLDA/view">Z<span class="highlightedSearchTerm">MySQL</span>DA</a></li>
</ul>
<p><b>Database example:</b></p>
<ul>
<li><a class="external-link" href="http://www.macusers.com.jm/articles/files/sqlpas_db.sql/view">http://www.macusers.com.jm/articles/files/sqlpas_db.sql/view</a></li>
</ul>
<p><b>Good to know:</b></p>
<p>If you want to change password encryption:</p>
<p>By default, SQLPASPlugin currently stored passwords as plain text. You may configure it to use MD5 or SHA encryption algorithms.</p>
<ul>
<li>In the root of your Plone site in the ZMI, go to the acl_users folder (note: the acl_users folder at the root of your plone site, NOT your Zope root). </li>
<li> Go to the source_users folder. </li>
<li> Select the properties tab. </li>
<li> In default_encryption enter sha or md5 or crypt! </li>
</ul>
<p><b>IMPORTANT: A VERY STUPID THING TO KNOW!</b></p>
<ul>
<li> Z SQL Methods are limiting resultsets to a maximum of 1000 results default. (<b>ARG</b>!) </li>
<li> In my case I lost over 2k users in the user overview and it took me (not for the fist time) over an hour to figure out why! </li>
<li> Solution: Go to your <i>ZMI, acl_users -&gt; source_users -&gt; sqlLoadAllUsers -&gt; Advanced</i> and set maximum rows to retrieve to 0 (no limit) </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>2008-09-10T13:25:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>
    <item rdf:about="http://blog.fourdigits.nl/speaking-at-the-plone-conference-2008">        <title>Speaking at the Plone Conference 2008</title>        <link>http://blog.fourdigits.nl/speaking-at-the-plone-conference-2008</link>        <description>From PSD to a complete Plone site! running a buildout, configuring buildout.cfg, using paster, making content-types (ArgoUML), creating custom portlets, viewlets, a folder view and using add-on products!</description>    <content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <![CDATA[<p>From PSD to a complete Plone site! running a buildout, configuring buildout.cfg, using paster, making content-types (ArgoUML), creating custom portlets, viewlets, a folder view and using add-on products!</p><p>My (Maarten Kling)  <a class="external-link" href="http://plone.org/news/plone-conference-2008-sessions-announced">talk</a> "How to build a Plone site in 1 hour" has been accepted for the <a class="external-link" href="http://plone.org/events/conferences/2008-washington-dc">Plone Conference 2008</a> in Washington DC.</p>
<p align="center" class="callout">From PSD to a complete Plone site! running a buildout, configuring buildout.cfg, using paster, making content-types (ArgoUML), creating custom portlets, viewlets, a folder view and using add-on products!</p>
<p>My plan is to talk about creating a complete Plone site, from start to finish. I will show all the basic stuff that is needed to create and customize your site. I will create a Plone setup using buildout, create a theme using paster, create two contenttypes using ArgoUML and create a viewlet and a portlet which make use for the contenttypes.</p>
<p>Hope to see you all at the conference!</p>]]>
</content:encoded>       <dc:publisher>Four Digits</dc:publisher>        <dc:creator>Maarten Kling</dc:creator>       <dc:rights>(C) Four Digits</dc:rights>                <dc:date>2008-08-12T10:50:00Z</dc:date>        <dc:type>Blog Post</dc:type>    </item>




</rdf:RDF>

