<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Howto</title>
  <subtitle>A Page that evolves over time, keeping up to date</subtitle>
  <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/taxonomy/term/2"/>
  <link rel="self" type="application/atom+xml" href="http://tumbleweed.org.za/taxonomy/term/2/atom/feed"/>
  <id>http://tumbleweed.org.za/taxonomy/term/2/atom/feed</id>
  <updated>2008-09-14T20:41:18+00:00</updated>
  <entry>
    <title>SugarCRM to Mozilla LDAP contact slurper</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/code/sugarcrm-mozilla-ldap-contact-slurper" />
    <id>http://tumbleweed.org.za/code/sugarcrm-mozilla-ldap-contact-slurper</id>
    <published>2008-01-29T13:50:03+00:00</published>
    <updated>2008-09-21T12:23:56+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="code" />
    <category term="Howto" />
    <category term="ldap" />
    <category term="python" />
    <category term="sugarcrm" />
    <summary type="html"><![CDATA[<p>Seeing as <a href="http://www.sugarforge.org/">SugarCRM</a> is now truly Open Source, I decided to support them buy using SugarCRM as a contact database for&nbsp;a&nbsp;client.</p>

<p>This script extracts contact data from Sugar, and imports it into an <span class="caps"><span class="caps">LDAP</span></span> tree, so that Thunderbird clients can use it as an&nbsp;address&nbsp;book.</p>

<p>It&#8217;s written for Sugar 5.0, and a suitable <span class="caps"><span class="caps">LDAP</span></span> installation with the <a href="http://wiki.mozilla.org/MailNews:Mozilla_LDAP_Address_Book_Schema">Mozilla&nbsp;Schema</a></p>

<p>A suitable <span class="caps"><span class="caps">VIEW</span></span> for printing out a contact directory would&nbsp;look&nbsp;like:</p>

<div class="geshifilter"><div class="mysql geshifilter-mysql" style="font-family:monospace;"><a href="http://search.mysql.com/search?site=refman-51&amp;q=CREATE&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">CREATE</span></span></span></a> <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps"><span class="caps">OR</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=REPLACE&amp;lr=lang_en"><span class="kw2"><span class="caps"><span class="caps">REPLACE</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=VIEW&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">VIEW</span></span></span></a> sugarab <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">AS</span></span></span></a><br />
<a href="http://search.mysql.com/search?site=refman-51&amp;q=SELECT&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">SELECT</span></span></span></a> c.id<span class="sy2">,</span> c.description<span class="sy2">,</span> salutation<span class="sy2">,</span> first_name<span class="sy2">,</span> last_name<span class="sy2">,</span> title<span class="sy2">,</span> department<span class="sy2">,</span><br />
do_not_call<span class="sy2">,</span> phone_home<span class="sy2">,</span> phone_mobile<span class="sy2">,</span> phone_work<span class="sy2">,</span> phone_other<span class="sy2">,</span> c.phone_fax<span class="sy2">,</span><br />
primary_address_street<span class="sy2">,</span> primary_address_city<span class="sy2">,</span> primary_address_state<span class="sy2">,</span><br />
primary_address_postalcode<span class="sy2">,</span> primary_address_country<span class="sy2">,</span> alt_address_street<span class="sy2">,</span><br />
alt_address_city<span class="sy2">,</span> alt_address_state<span class="sy2">,</span> alt_address_postalcode<span class="sy2">,</span> alt_address_country<span class="sy2">,</span><br />
assistant<span class="sy2">,</span> assistant_phone<span class="sy2">,</span> lead_source<span class="sy2">,</span> birthdate<span class="sy2">,</span><br />
a.name <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">AS</span></span></span></a> account_name<span class="sy2">,</span><br />
e1.email_address <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">AS</span></span></span></a> primary_email<span class="sy2">,</span> e2.email_address <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">AS</span></span></span></a> secondary_email<br />
<a href="http://search.mysql.com/search?site=refman-51&amp;q=FROM&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">FROM</span></span></span></a> contacts <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">AS</span></span></span></a> c<br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps"><span class="caps">LEFT</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">OUTER</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">JOIN</span></span></span></a> accounts_contacts <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">AS</span></span></span></a> j <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">ON</span></span></span></a> <span class="br0">&#40;</span>c.id <span class="sy1">=</span> j.contact_id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps"><span class="caps">AND</span></span></span></a> j.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps"><span class="caps">LEFT</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">OUTER</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">JOIN</span></span></span></a> accounts <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">AS</span></span></span></a> a <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">ON</span></span></span></a> <span class="br0">&#40;</span>j.account_id <span class="sy1">=</span> a.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps"><span class="caps">AND</span></span></span></a> a.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps"><span class="caps">LEFT</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">OUTER</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">JOIN</span></span></span></a> email_addr_bean_rel <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1">as</span></a> eb <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">ON</span></span></span></a> <span class="br0">&#40;</span>eb.bean_id <span class="sy1">=</span> c.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps"><span class="caps">AND</span></span></span></a> eb.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps"><span class="caps">LEFT</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">OUTER</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">JOIN</span></span></span></a> email_addresses <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1">as</span></a> e1 <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">ON</span></span></span></a> <span class="br0">&#40;</span>eb.email_address_id <span class="sy1">=</span> e1.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps"><span class="caps">AND</span></span></span></a> eb.primary_address <span class="sy1">=</span> <span class="nu0">1</span> <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps"><span class="caps">AND</span></span></span></a> e1.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps"><span class="caps">LEFT</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">OUTER</span></span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">JOIN</span></span></span></a> email_addresses <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1">as</span></a> e2 <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">ON</span></span></span></a> <span class="br0">&#40;</span>eb.email_address_id <span class="sy1">=</span> e2.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps"><span class="caps">AND</span></span></span></a> e1.id <span class="sy1">!=</span> e2.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps"><span class="caps">AND</span></span></span></a> e2.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://search.mysql.com/search?site=refman-51&amp;q=WHERE&amp;lr=lang_en"><span class="kw1"><span class="caps"><span class="caps">WHERE</span></span></span></a> c.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="sy2">;</span></div></div>
    ]]></summary>
    <content type="html"><![CDATA[<p>Seeing as <a href="http://www.sugarforge.org/">SugarCRM</a> is now truly Open Source, I decided to support them buy using SugarCRM as a contact database for a&nbsp;client.</p>

<p>This script extracts contact data from Sugar, and imports it into an <span class="caps">LDAP</span> tree, so that Thunderbird clients can use it as an address&nbsp;book.</p>

<p>It&#8217;s written for Sugar 5.0, and a suitable <span class="caps">LDAP</span> installation with the <a href="http://wiki.mozilla.org/MailNews:Mozilla_LDAP_Address_Book_Schema">Mozilla&nbsp;Schema</a></p>

<p>A suitable <span class="caps">VIEW</span> for printing out a contact directory would look&nbsp;like:</p>

<div class="geshifilter"><div class="mysql geshifilter-mysql" style="font-family:monospace;"><a href="http://search.mysql.com/search?site=refman-51&amp;q=CREATE&amp;lr=lang_en"><span class="kw1"><span class="caps">CREATE</span></span></a> <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps">OR</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=REPLACE&amp;lr=lang_en"><span class="kw2"><span class="caps">REPLACE</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=VIEW&amp;lr=lang_en"><span class="kw1"><span class="caps">VIEW</span></span></a> sugarab <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps">AS</span></span></a><br />
<a href="http://search.mysql.com/search?site=refman-51&amp;q=SELECT&amp;lr=lang_en"><span class="kw1"><span class="caps">SELECT</span></span></a> c.id<span class="sy2">,</span> c.description<span class="sy2">,</span> salutation<span class="sy2">,</span> first_name<span class="sy2">,</span> last_name<span class="sy2">,</span> title<span class="sy2">,</span> department<span class="sy2">,</span><br />
do_not_call<span class="sy2">,</span> phone_home<span class="sy2">,</span> phone_mobile<span class="sy2">,</span> phone_work<span class="sy2">,</span> phone_other<span class="sy2">,</span> c.phone_fax<span class="sy2">,</span><br />
primary_address_street<span class="sy2">,</span> primary_address_city<span class="sy2">,</span> primary_address_state<span class="sy2">,</span><br />
primary_address_postalcode<span class="sy2">,</span> primary_address_country<span class="sy2">,</span> alt_address_street<span class="sy2">,</span><br />
alt_address_city<span class="sy2">,</span> alt_address_state<span class="sy2">,</span> alt_address_postalcode<span class="sy2">,</span> alt_address_country<span class="sy2">,</span><br />
assistant<span class="sy2">,</span> assistant_phone<span class="sy2">,</span> lead_source<span class="sy2">,</span> birthdate<span class="sy2">,</span><br />
a.name <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps">AS</span></span></a> account_name<span class="sy2">,</span><br />
e1.email_address <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps">AS</span></span></a> primary_email<span class="sy2">,</span> e2.email_address <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps">AS</span></span></a> secondary_email<br />
<a href="http://search.mysql.com/search?site=refman-51&amp;q=FROM&amp;lr=lang_en"><span class="kw1"><span class="caps">FROM</span></span></a> contacts <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps">AS</span></span></a> c<br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps">LEFT</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps">OUTER</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps">JOIN</span></span></a> accounts_contacts <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps">AS</span></span></a> j <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps">ON</span></span></a> <span class="br0">&#40;</span>c.id <span class="sy1">=</span> j.contact_id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps">AND</span></span></a> j.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps">LEFT</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps">OUTER</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps">JOIN</span></span></a> accounts <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1"><span class="caps">AS</span></span></a> a <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps">ON</span></span></a> <span class="br0">&#40;</span>j.account_id <span class="sy1">=</span> a.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps">AND</span></span></a> a.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps">LEFT</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps">OUTER</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps">JOIN</span></span></a> email_addr_bean_rel <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1">as</span></a> eb <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps">ON</span></span></a> <span class="br0">&#40;</span>eb.bean_id <span class="sy1">=</span> c.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps">AND</span></span></a> eb.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps">LEFT</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps">OUTER</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps">JOIN</span></span></a> email_addresses <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1">as</span></a> e1 <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps">ON</span></span></a> <span class="br0">&#40;</span>eb.email_address_id <span class="sy1">=</span> e1.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps">AND</span></span></a> eb.primary_address <span class="sy1">=</span> <span class="nu0">1</span> <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps">AND</span></span></a> e1.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/string-functions.html"><span class="kw13"><span class="caps">LEFT</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=OUTER&amp;lr=lang_en"><span class="kw1"><span class="caps">OUTER</span></span></a> <a href="http://search.mysql.com/search?site=refman-51&amp;q=JOIN&amp;lr=lang_en"><span class="kw1"><span class="caps">JOIN</span></span></a> email_addresses <a href="http://search.mysql.com/search?site=refman-51&amp;q=AS&amp;lr=lang_en"><span class="kw1">as</span></a> e2 <a href="http://search.mysql.com/search?site=refman-51&amp;q=ON&amp;lr=lang_en"><span class="kw1"><span class="caps">ON</span></span></a> <span class="br0">&#40;</span>eb.email_address_id <span class="sy1">=</span> e2.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps">AND</span></span></a> e1.id <span class="sy1">!=</span> e2.id <a href="http://dev.mysql.com/doc/refman/5.1/en/non-typed-operators.html"><span class="kw10"><span class="caps">AND</span></span></a> e2.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="br0">&#41;</span><br />
<a href="http://search.mysql.com/search?site=refman-51&amp;q=WHERE&amp;lr=lang_en"><span class="kw1"><span class="caps">WHERE</span></span></a> c.deleted <span class="sy1">=</span> <span class="nu0">0</span><span class="sy2">;</span></div></div>
    ]]></content>
  </entry>
  <entry>
    <title>Wordpress -&gt; Drupal</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/code/wp-to-drupal" />
    <id>http://tumbleweed.org.za/code/wp-to-drupal</id>
    <published>2008-01-02T22:06:44+00:00</published>
    <updated>2008-01-03T18:15:33+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="code" />
    <category term="drupal" />
    <category term="Howto" />
    <category term="migrate" />
    <category term="php" />
    <category term="wordpress" />
    <summary type="html"><![CDATA[<p>This is my script for migrating from Wordpress to Drupal. I know that there is already a <a href="http://www.borber.com/en/projects/wp2drupal">migration script</a> out there, but I still wrote my own for a&nbsp;few&nbsp;reasons:</p>

<ul>
<li>My needs are simple, and I knew what&nbsp;I&nbsp;wanted.</li>
<li>I wanted to migrate comments and pingbacks if possible. This turned out to&nbsp;be&nbsp;easy.</li>
<li>I wanted to learn more about coding&nbsp;for&nbsp;Drupal.</li>
<li>I&#8217;d already started writing it when I saw&nbsp;Borek&#8217;s&nbsp;migrator.</li>
<li>I wanted to migrate straight to Drupal 5, not&nbsp;4&nbsp;first.</li>
</ul>

<p>So here&nbsp;it&nbsp;is.</p>

<p>Limitations&nbsp;and&nbsp;bugs:</p>

<ul>
<li>Attached files are copied by requesting them off the old server. But thumbnails aren&#8217;t&nbsp;migrated&nbsp;too.</li>
<li>Pages aren&#8217;t migrated. But I&#8217;m sure this would be a piece of cake&nbsp;to&nbsp;fix</li>
<li>I put dumped my wordpress tables into my drupal database (They are all prefixed with <span class="geshifilter"><code class="geshifilter-text">wp-</code></span>). This is messy, but while <a href="http://drupal.org/node/18429">Drupal&#8217;s multi-database system</a> is a cool and would be perfect, it&#8217;s unworkable when you are debugging. Errors seem to be hooked in drupal, and if you have a broken <span class="caps"><span class="caps">SQL</span></span> query (for example) the error handling code hooks Drupal themes, which aren&#8217;t findable in the alternate-db world you&nbsp;are&nbsp;visiting.</li>
<li>All blog posts are migrated to a single user on the&nbsp;other&nbsp;side.</li>
<li>I&#8217;m pretty sure that I didn&#8217;t solve the character encoding issues, just&nbsp;sidestepped&nbsp;them&#8230;</li>
<li>I didn&#8217;t look into Drupal&nbsp;6&nbsp;compatibility.</li>
</ul>
    ]]></summary>
    <content type="html"><![CDATA[<p>This is my script for migrating from Wordpress to Drupal. I know that there is already a <a href="http://www.borber.com/en/projects/wp2drupal">migration script</a> out there, but I still wrote my own for a few&nbsp;reasons:</p>

<ul>
<li>My needs are simple, and I knew what I&nbsp;wanted.</li>
<li>I wanted to migrate comments and pingbacks if possible. This turned out to be&nbsp;easy.</li>
<li>I wanted to learn more about coding for&nbsp;Drupal.</li>
<li>I&#8217;d already started writing it when I saw Borek&#8217;s&nbsp;migrator.</li>
<li>I wanted to migrate straight to Drupal 5, not 4&nbsp;first.</li>
</ul>

<p>So here it&nbsp;is.</p>

<p>Limitations and&nbsp;bugs:</p>

<ul>
<li>Attached files are copied by requesting them off the old server. But thumbnails aren&#8217;t migrated&nbsp;too.</li>
<li>Pages aren&#8217;t migrated. But I&#8217;m sure this would be a piece of cake to&nbsp;fix</li>
<li>I put dumped my wordpress tables into my drupal database (They are all prefixed with <code>wp-</code>). This is messy, but while <a href="http://drupal.org/node/18429">Drupal&#8217;s multi-database system</a> is a cool and would be perfect, it&#8217;s unworkable when you are debugging. Errors seem to be hooked in drupal, and if you have a broken <span class="caps">SQL</span> query (for example) the error handling code hooks Drupal themes, which aren&#8217;t findable in the alternate-db world you are&nbsp;visiting.</li>
<li>All blog posts are migrated to a single user on the other&nbsp;side.</li>
<li>I&#8217;m pretty sure that I didn&#8217;t solve the character encoding issues, just sidestepped&nbsp;them&#8230;</li>
<li>I didn&#8217;t look into Drupal 6&nbsp;compatibility.</li>
</ul>
    ]]></content>
  </entry>
  <entry>
    <title>Dark Gorge B</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/hiking/dark-gorge-b" />
    <id>http://tumbleweed.org.za/hiking/dark-gorge-b</id>
    <published>2007-12-31T16:10:00+00:00</published>
    <updated>2007-12-31T16:10:24+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="hiking" />
    <category term="Howto" />
    <category term="table-mountain" />
    <summary type="html"><![CDATA[<p>Time: 3-4hrs<br />
Last Hiked:&nbsp;Jan&nbsp;2006</p>

<p>Very steep and rather eroded. Beautiful forest in the ravine most of the&nbsp;way&nbsp;up.</p>

<p>Start at Newlands forestary Station, and take the path up to the base of&nbsp;Newlands&nbsp;Ravine.</p>

<p>Go right along the contour path until you reach the first river up (only about 50m away)
This is dark gorge. Follow the&nbsp;cairns&nbsp;up.</p>

<p>The only thing you have to worry about is not going up Dark Gully. When you reach the fork of the
valleys,&nbsp;stick&nbsp;left.</p>

<p><img src="/files/dark-gorge-map.jpg" alt="Dark Gorge Map" /></p>
    ]]></summary>
    <content type="html"><![CDATA[<p>Time: 3-4hrs<br />
Last Hiked: Jan&nbsp;2006</p>

<p>Very steep and rather eroded. Beautiful forest in the ravine most of the way&nbsp;up.</p>

<p>Start at Newlands forestary Station, and take the path up to the base of Newlands&nbsp;Ravine.</p>

<p>Go right along the contour path until you reach the first river up (only about 50m away)
This is dark gorge. Follow the cairns&nbsp;up.</p>

<p>The only thing you have to worry about is not going up Dark Gully. When you reach the fork of the
valleys, stick&nbsp;left.</p>

<p><img src="/files/dark-gorge-map.jpg" alt="Dark Gorge Map" /></p>
    ]]></content>
  </entry>
  <entry>
    <title>Window Gorge D</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/hiking/window-gorge-d" />
    <id>http://tumbleweed.org.za/hiking/window-gorge-d</id>
    <published>2007-12-31T15:26:47+00:00</published>
    <updated>2007-12-31T15:26:47+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="hiking" />
    <category term="Howto" />
    <category term="table-mountain" />
    <summary type="html"><![CDATA[<p>This Description comes from Tony Lourens - Table Mountain Classics,&nbsp;with&nbsp;ammendments.</p>

<p>Rope&nbsp;Recommended</p>

<p>Time: 5-6hrs<br />
Last Walked:&nbsp;Dec&nbsp;2005</p>

<p>This is rather an eroded and seldom used route, but has some magnificent pools
and good scrambles. It&#8217;s mostly shaded, so a hot day would be a good choice.
The scrambles aren&#8217;t hard but quite exposed, and have loose grips (because they
haven&#8217;t seen enough traffic to break all the loose&nbsp;grips&nbsp;off).</p>

<p>This isn&#8217;t an easy route if you don&#8217;t know it,&nbsp;and&nbsp;dangerous.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>This Description comes from Tony Lourens - Table Mountain Classics, with&nbsp;ammendments.</p>

<p>Rope&nbsp;Recommended</p>

<p>Time: 5-6hrs<br />
Last Walked: Dec&nbsp;2005</p>

<p>This is rather an eroded and seldom used route, but has some magnificent pools
and good scrambles. It&#8217;s mostly shaded, so a hot day would be a good choice.
The scrambles aren&#8217;t hard but quite exposed, and have loose grips (because they
haven&#8217;t seen enough traffic to break all the loose grips&nbsp;off).</p>

<p>This isn&#8217;t an easy route if you don&#8217;t know it, and&nbsp;dangerous.</p>

<p>Start at Kirstenbosch Old Main Gate, and take Smuts Track to the Countour Path.
Turn right and walk for about ten minutes to a little wooden bridge.
Immediately after this you will see an obvious bouldery ravine on your left.
This is Window Gorge. If you go too far you will come to the start of the
zig-zags on Fernwood Buttress, just a minute or two past the&nbsp;ravine.</p>

<p>Ascend the bouldery gorge for about ten minutes past some small pools, to a
point just before some waterfalls where you will see a small stone scree
pouring in from the right (huge cairn). Take the scree to a big subsidiary
gully (cairn). Do not follow the gully, but go up the steep slope to its left.
Continue up the slope, keeping in between the gully on your right and the gorge
proper on your left, to reach the high&nbsp;rockband.</p>

<p>Traverse to the left and descend an earthy chute to an obvious tree on the
corner (cairn). Step down and traverse over a drop to reach easy slopes leading
into the ravine&nbsp;bed.</p>

<p>Follow the ravine for about 15 to 20 minutes to a big waterfall. Break out
to the right up a broken slope (cairn) for about five minutes to another cairn.
At this point go up to the rockband, crossing a large boulder-field and
climb a step to a&nbsp;tree.</p>

<p>Traverse off to the left and go up to a ledge beneath steep rock. Here you
make another long traverse to the left which leads back into the ravine.
At the last tree before the traverse comes to a treacherous end, there is a
cairn and a stick pointing you up the rock-band.Continue up to a beautiful pool
beneath a large waterfall (620 m elev). This is the best swimming spot and
makes an ideal lunch&nbsp;break.</p>

<p>Scramble up and around the corner on your right (cairn), through some trees,
and up a break to a shoulder (cairn). From here traverse to the left until able
to climb the exposed step to a ledge. Traverse right to a big tree. Continue
traversing to the right to an obvious flake-type break going off to the left
(cairn). Climb this to a ledge (`D&#8217;), and walk to the left to two trees. From
this point you can see a magnificent rock pinnacle high up in the&nbsp;ravine.</p>

<p>Climb the easy break above, to trees on the right. Make an awkward step up,
and traverse left past a big tree into the ravine bed above the big&nbsp;waterfall.</p>

<p>Climb a long `C&#8217; grade pitch just to the right of the mossy water chute to
the top of the waterfall, passing a cairn to a clump of&nbsp;trees.</p>

<p>Continue up the ravine to what appears, at first glance, to be an
impassable, mossy waterfall. On closer inspection you will see a window at the
top formed by a jammed block (which gives the gorge its name). Climb up to and
through the window, enabling you to carry on up the ravine to the last little
waterfall, which is bypassed via the dirty wall immediately to the right.
Continue past two old rusty sign-posts to the top, and gain the main path which
is literally metres&nbsp;away.</p>

<p><img src="/files/window-gorge-face.jpg" alt="Window Gorge Face" />
<img src="/files/window-gorge-map.jpg" alt="Window Gorge Map" /></p>
    ]]></content>
  </entry>
  <entry>
    <title>Amatomu Drupal Module</title>
    <link rel="alternate" type="text/html" href="http://tumbleweed.org.za/code/amatomu" />
    <id>http://tumbleweed.org.za/code/amatomu</id>
    <published>2007-12-30T21:44:58+00:00</published>
    <updated>2008-09-14T20:41:18+00:00</updated>
    <author>
      <name>tumbleweed</name>
    </author>
    <category term="amatomu" />
    <category term="code" />
    <category term="drupal" />
    <category term="Howto" />
    <category term="php" />
    <summary type="html"><![CDATA[<p>I&#8217;ve written a simple <a href="http://drupal.org/" title="Drupal, the CMS this site uses">drupal</a> module for including the <a href="http://www.amatomu.com/">Amatomu</a>&nbsp;tracker.</p>

<p>It also supports the &#8220;What&#8217;s hot in South African blogs&#8221; tag-cloud, albeit via ugly javascript. I&#8217;m not a fan of all this javascript <span class="caps"><span class="caps">DHTML</span></span> nonsense, but maybe they can be talked into providing a better&nbsp;<span class="caps"><span class="caps">API</span></span>&#8230;</p>

<p>Todo list (Things amatomu does that I don&#8217;t care for, and thus&nbsp;haven&#8217;t&nbsp;coded):</p>

<ul>
<li>I&#8217;d like to extend this to include support for the <a href="http://www.amatomu.com/widgets.php">shmaak button</a>s.</li>
<li>The&nbsp;rank&nbsp;ribbon.</li>
</ul>

<p>Available <a href="http://drupal.org/project/amatomu">from Drupal.org</a>. Releases for Drupal 5 and 6&nbsp;are&nbsp;available.</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>I&#8217;ve written a simple <a href="http://drupal.org/" title="Drupal, the CMS this site uses">drupal</a> module for including the <a href="http://www.amatomu.com/">Amatomu</a>&nbsp;tracker.</p>

<p>It also supports the &#8220;What&#8217;s hot in South African blogs&#8221; tag-cloud, albeit via ugly javascript. I&#8217;m not a fan of all this javascript <span class="caps">DHTML</span> nonsense, but maybe they can be talked into providing a better&nbsp;<span class="caps">API</span>&#8230;</p>

<p>Todo list (Things amatomu does that I don&#8217;t care for, and thus haven&#8217;t&nbsp;coded):</p>

<ul>
<li>I&#8217;d like to extend this to include support for the <a href="http://www.amatomu.com/widgets.php">shmaak button</a>s.</li>
<li>The rank&nbsp;ribbon.</li>
</ul>

<p>Available <a href="http://drupal.org/project/amatomu">from Drupal.org</a>. Releases for Drupal 5 and 6 are&nbsp;available.</p>
    ]]></content>
  </entry>
</feed>
