Christopher Warner Studies and thoughts, usually in coherent fashion.

14Jan/090

Deliverance

So a quick post on Deliverance and Plone. Deliverance is basically a theme proxy which allows designers to concentrate solely on markup (xhtml,html,css) etc and that's it. There would be no coding or templating involved at all. If you are a programmer, here is a good overview of it covered at Ploneconf 2008

It's been around for almost two years now, and as usual there is no documentation and only people like me and you know about it. Posted if you have designers who don't want to learn zpt (Zope Page Templates), or for that matter if you don't have time, are on contract, outsource your design etc as outlined in the video.

To give an example of ZPT:

   77 
   78 <span tal:define="global mstring modules/string" >
   79 <span tal:define="global bdate context/birth_date" >
   80   <dl tal:condition="context/real_name | nothing">
   81     <dt>Real Name:</dt>
   82     <dd tal:content="string:${context/real_name}" />
   83   </dl>
   84   <dl tal:condition="context/nationality | nothing">
   85     <dt>Nationality:</dt>
   86     <dd tal:content="string:${context/nationality}" />
   87   </dl>
   88   <dl tal:condition="context/birth_date | nothing">
   89     <dt>Birthday:</dt>
   90     <span tal:define="birth context/birth_date; birth_format python:DateTime(birth)">
   91     <dd tal:content="python:birth_format.strftime('%B %d, %Y')" />
   92     </span>
   93   </dl>
   94   <dl tal:condition="context/place_of_birth | nothing">
   95     <dt>Born in:</dt>
   96     <dd tal:content="string:${context/place_of_birth}" />
   97   </dl>
   98   <dl tal:condition="context/lives_now | nothing">
   99     <dt>Lives now:</dt>
  100     <dd tal:content="string:${context/lives_now}" />
  101   </dl>
  102   <dl tal:condition="context/agencies | nothing">
  103     <dt>Agencies:</dt>
  104     <span tal:define="v_agencies context/agencies">
  105     <dd tal:content="python:str(mstring.join(v_agencies, ', ')).rstrip(', ')" />
  106     </span>
  107   </dl>
  108   <dl tal:condition="context/model_known_custom | nothing" >
  109     <dt>Known for:</dt>
  110     <span tal:define="v_known context/model_known_custom;
  111              prefix string:My ;
  112              suffix python:str(prefix + mstring.join(v_known, ', My ')).rstrip(',');
  113             finalsuffix string:${suffix}">
  114     <dd tal:content="string:${finalsuffix}" />
  115     </span>
  116   </dl>
  117   <dl tal:condition="context/Modelstatus | nothing">
  118     <dt>Status:</dt>
  119     <span tal:define="v_status context/getModelstatus">
  120     <dd tal:content="python:str(mstring.join(v_status, ', ')).rstrip(', ')" />
  121     </span>
  122   </dl>
  123   <dl tal:condition="context/getMuses | nothing">
  124     <dt>Muse for:</dt>
  125     <dd tal:repeat="muses context/getMuses"
  126       tal:content="muses/muse"></dd>
  127   </dl>
  128   <dl tal:condition="context/getDated | nothing">
  129     <dt>Dated:</dt>
  130     <dd tal:repeat="dated context/getDated" tal:content="dated/model_dated" />
  131   </dl>
  132   <dl tal:condition="context/getFriends | nothing">
  133     <dt>Friends with:</dt>
  134     <dd tal:repeat="friends context/getRefs">
  135     <a href="http://modellink" target="new"
  136       tal:attributes="href python:friends.reference_url()"
  137       tal:content="python:friends.Title()">modeltitle</a>
  138     </dd>
  139   </dl>
  140   <dl tal:condition="context/getTurned | nothing">
  141     <dt>Model turned&#8230;</dt>
  142     <dd tal:repeat="turned context/getTurned"
  143         tal:content="structure string:<span class=&quot;title&quot;>${turned/model_turned}</span> (<span class=&quot;info&quot;>${turned/model_turned_text})</span>"></dd>
  144   </dl>
  145   <dl tal:condition="context/getMarried | nothing">
  146     <dt>Married:</dt>
  147     <dd tal:repeat="married context/getMarried" tal:content="married/model_married" />
  148   </dl>
  149   <dl tal:condition="context/interests | nothing">
  150     <dt>Interests:</dt>
  151     <dd tal:content="string:${context/interests}" /> 

Easy for me and you; not easy for a designer; really I think the idea of templates at this point should be a programmer held domain or at least left to advanced designers who would then have a preference and ZPT might not be it.  So Deliverance is to deliver us from all of that by allowing designers to concentrate on markup and pulling content from where ever they want. Whether it be a mysql database, static file, plone, grok, django or where ever and placing it in the theme. In regards to Benchmarking it would only be slow if you don't have a cache proxy and it had to continually grab content from several different places. In those cases this wouldn't really matter because you'd be using one system and one system alone anyway. If you put the theme proxy behind, varnish? Voila! Problem solved in nearly all cases.

Anyway, I was just reminded about this this morning. Someday i'm sure someone will do a decent walkthrough of it. You know, documentation.. 

Last year I got an early copy of the book "Do you matter? How great design will make people love your company" by Robert Brunner. It was an funny and interesting read, and I totally forgot about it. Safari was to send out the final copy but fumbled my order because my credit card expired. Did they send out a notice? That would make sense, so, they decided against it. Which meant I didn't know they had any problems shipping out the book until I came across the pdf of the rough cut on my desktop and realized. Wait a second?! I don't have the book on the floor of my office at home (my book shelf). The hard cover looks chocked with more stuff so i'm going to re-read it and see if there was anything major added. It's a fun recommended read in how design can make or break a product.