<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="Tiki CMS/Groupware via FeedCreator 1.7.2.1" -->
<?xml-stylesheet href="http://www.qdgc.org/tikiwiki/lib/rss/rss-style.css" type="text/css"?>
<?xml-stylesheet href="http://www.qdgc.org/tikiwiki/lib/rss/rss20.xsl" type="text/xsl"?>
<rss version="2.0">
    <channel>
        <title>Tiki RSS feed for the wiki pages</title>
        <description><![CDATA[Last modifications to the Wiki.]]></description>
        <link>http://www.qdgc.org/tikiwiki/tiki-wiki_rss.php?ver=2</link>
        <lastBuildDate>Mon, 06 Sep 2010 17:43:53 +0100</lastBuildDate>
        <generator>Tiki CMS/Groupware via FeedCreator 1.7.2.1</generator>
        <image>
            <url>http://www.qdgc.org/tikiwiki/img/tiki/Tiki_WCG.png</url>
            <title>QDGC</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php</link>
            <description><![CDATA[Feed provided by QDGC. Click to visit.]]></description>
        </image>
        <language>en-us</language>
        <item>
            <title>HomePage</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=HomePage</link>
            <description><![CDATA[<blockquote>- </li><li> <a class="wiki external"  href="http://www.mindland.com/countless_qdgc_demo/" rel="external nofollow">Tanzania example</a></blockquote><blockquote>- </li><li> <a title="qdgc_abundance_methods" href="tiki-index.php?page=qdgc_abundance_methods" class="wiki ">Abundance surveys and QDGC</a></blockquote>]]></description>
            <pubDate>Sun, 03 Jan 2010 00:44:31 +0100</pubDate>
        </item>
        <item>
            <title>qdgc_abundance_methods</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=qdgc_abundance_methods</link>
            <description><![CDATA[<blockquote>+ Coming...<br /></blockquote>]]></description>
            <pubDate>Sun, 03 Jan 2010 00:43:50 +0100</pubDate>
        </item>
        <item>
            <title>lonlat2qdgcconvertversions</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=lonlat2qdgcconvertversions</link>
            <description><![CDATA[<blockquote>- &lt;h1 class=&quot;showhide_heading&quot; id=&quot;<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>lonlat2qdgc_u</strong></del>pload_and_convert_service&quot;&gt;<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>lonlat2qdgc u</strong></del>pload and convert service&lt;/h1&gt;</blockquote><blockquote>+ &lt;h1 class=&quot;showhide_heading&quot; id=&quot;<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>U</strong></ins>pload_and_convert_service&quot;&gt;<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>U</strong></ins>pload and convert service&lt;/h1&gt;</blockquote><blockquote>- This page runs the most up to date version of the tool. Please tell us if you experience problems with the script.&lt;br /&gt;</blockquote><blockquote>+ This page runs the most up to date version of the<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong> lonlat2qdgc</strong></ins> tool. Please tell us if you experience problems with the script.&lt;br /&gt;</blockquote>]]></description>
            <pubDate>Wed, 30 Dec 2009 13:42:07 +0100</pubDate>
        </item>
        <item>
            <title>lonlat2qdgc_success</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=lonlat2qdgc_success</link>
            <description><![CDATA[<blockquote>- &lt;h2 class=&quot;showhide_heading&quot; id=&quot;<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>C</strong></del>o<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>nversion</strong></del>_success&quot;&gt;<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>Conversi</strong></del>o<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>n</strong></del> success&lt;/h2&gt;</blockquote><blockquote>+ &lt;h2 class=&quot;showhide_heading&quot; id=&quot;<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>Upl</strong></ins>o<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>ad</strong></ins>_success&quot;&gt;<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>Upl</strong></ins>o<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>ad</strong></ins> success&lt;/h2&gt;</blockquote><blockquote>- The conversion of your file will start within immediately. The conversion usually only takes seconds. The script currently converts around 4000 positions per second. You will soon receive an email with further information about the processing of your file when the conversion has been completed.&lt;br /&gt;</blockquote><blockquote>+ The conversion of your file will start within immediately. The conversion usually only takes seconds. The script currently converts around 4000 positions per second. You will soon receive an email with further information about the processing of your file when the conversion has been completed.<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong> Should there be any errors please refer to the attached information in the email. For support contact ragnvald(at)mindland.com</strong></ins>&lt;br /&gt;</blockquote>]]></description>
            <pubDate>Wed, 30 Dec 2009 00:12:19 +0100</pubDate>
        </item>
        <item>
            <title>lonlat2qdgc_versioninfo</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=lonlat2qdgc_versioninfo</link>
            <description><![CDATA[<blockquote>+ The script will be updated and we will try to document changes as we go.<br /></blockquote><blockquote>+ <br /></blockquote><blockquote>+ <ul><li>29.12.2009</blockquote><blockquote>+ <ul><li>Integrated upload and feedback with TikiWiki<a href="tiki-editpage.php?page=TikiWiki" title="Create page: TikiWiki" class="wiki wikinew">?</a>.</blockquote><blockquote>+ </li><li>Added some more structure to the user pages for the upload functionality.</blockquote><blockquote>+ </li></ul></li><li>13.12.2009</blockquote><blockquote>+ <ul><li>First version of the upload script posted online.</blockquote><blockquote>+ </li></ul></li></ul></blockquote><blockquote>+ <br /></blockquote>]]></description>
            <pubDate>Tue, 29 Dec 2009 16:14:41 +0100</pubDate>
        </item>
        <item>
            <title>lonlat2qdgc_background</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=lonlat2qdgc_background</link>
            <description><![CDATA[<blockquote>- Not ready yet...<br /></blockquote><blockquote>- <br /></blockquote><blockquote>- &lt;a class=&quot;wiki&quot;  href=&quot;http://www.qdgc.org/tikiwiki/tiki-read_article.php?articleId=4&quot;&gt;ht<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>t</strong></del>p://w<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>ww.</strong></del>qdgc.org/tikiwiki/tiki-<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>re</strong></del>ad_<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>art</strong></del>i<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>c</strong></del>le.php?<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>art</strong></del>i<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>c</strong></del>leId=<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>4</strong></del>&lt;/a&gt;&lt;br /&gt;</blockquote><blockquote>+ <ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>Read up on this in the lonlat2qdgc.exe help-page tool:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;</strong></ins>&lt;a class=&quot;wiki&quot;  href=&quot;http://www.qdgc.org/tikiwiki/tiki-read_article.php?articleId=4<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>&quot; rel=&quot;</strong></ins>&quot;&gt;<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>lonlat2qdgc.exe -</strong></ins>h<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...or download </strong></ins>t<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>he sam</strong></ins>p<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>le .dbf-file</strong></ins>:<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>&lt;br </strong></ins>/<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>&gt;&lt;br </strong></ins>/<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a class=&quot;</strong></ins>w<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>iki external&quot;  href=&quot;http://</strong></ins>qdgc.org/tikiwiki/tiki-<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>downlo</strong></ins>ad_<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>f</strong></ins>ile.php?<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>f</strong></ins>ileId=<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>156&quot; rel=&quot;external nofollow&quot;&gt;sample_lonlat2qdgc.dbf</strong></ins>&lt;/a<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /</strong></ins>&gt;&lt;br /&gt;</blockquote>]]></description>
            <pubDate>Tue, 29 Dec 2009 16:11:35 +0100</pubDate>
        </item>
        <item>
            <title>lonlat2qdgc_failure</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=lonlat2qdgc_failure</link>
            <description><![CDATA[<blockquote>+ <h2 class="showhide_heading" id="Conversion_failure">Conversion failure</h2></blockquote><blockquote>+ <br /></blockquote><blockquote>+ Something went wrong. Revise your form input and try again. Have a look at the sample .dbf file to make sure that it has the appropriate format.<br /></blockquote><blockquote>+ <br /></blockquote><blockquote>+ Your options now are:<br /></blockquote><blockquote>+ <br /></blockquote><blockquote>+ <ul><li> <a class="wiki external"  href="http://qdgc.org/tikiwiki/tiki-download_file.php?fileId=156" rel="external nofollow">Download the sample -dbf-file</a></blockquote><blockquote>+ </li><li> <a class="wiki external"  href="http://qdgc.org/tikiwiki/tiki-index.php?page=lonlat2qdgcconvertversions" rel="external nofollow">Upload one more file for conversion</a></blockquote><blockquote>+ </li><li> <a class="wiki"  href="tiki-index.php?page=homepage" rel="">www.qdgc.org main page</a></blockquote><blockquote>+ </li></ul></blockquote>]]></description>
            <pubDate>Mon, 28 Dec 2009 14:16:54 +0100</pubDate>
        </item>
        <item>
            <title>lonlat2qdgc_daemon</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=lonlat2qdgc_daemon</link>
            <description><![CDATA[<blockquote>+ <div class="plugincode"><div class="codecaption">lonlat2qdgc_daemon</div><pre class="codelisting" dir="ltr" style="overflow:auto;">  1 . #*******************************************************************</blockquote><blockquote>+   2 . # Longitude/Latitude to Quarter Degree Grid Cell standard conversion </blockquote><blockquote>+   3 . # utility. Daemon. </blockquote><blockquote>+   4 . #</blockquote><blockquote>+   5 . # The daemon polls a directory for a.dbf-file. It then transfers and</blockquote><blockquote>+   6 . # converts the relevant .dbf-file.</blockquote><blockquote>+   7 . #</blockquote><blockquote>+   8 . # Delivered as-is. If it works - fine for you. If it fails - too bad. </blockquote><blockquote>+   9 . # No guarantees are given  whatsoever. If you use this program for </blockquote><blockquote>+  10 . # illegal purposes - don't blame me.</blockquote><blockquote>+  11 . # </blockquote><blockquote>+  12 . # License type is Gnu GPL. Copy, distribute and change freely. Keep</blockquote><blockquote>+  13 . # the author in mind for crediting. Come to think of it, use this </blockquote><blockquote>+  14 . # reference:</blockquote><blockquote>+  15 . #</blockquote><blockquote>+  16 . # R. Larsen, T. Holmern, S. D. Prager, H. Maliti and E. Roskaft </blockquote><blockquote>+  17 . #     (2009) Using the extended quarter degree grid cell system </blockquote><blockquote>+  18 . #     to unify mapping and sharing of biodiversity data, African</blockquote><blockquote>+  19 . #     Journal of Ecology. Volume 47, Issue 3 , Pages 382 - 392</blockquote><blockquote>+  20 . #</blockquote><blockquote>+  21 . # Author Ragnvald Larsen, Dept of Biology, NTNU (www.bio.ntnu.no)</blockquote><blockquote>+  22 . # ragnvald(at)mindland.com</blockquote><blockquote>+  23 . #</blockquote><blockquote>+  24 . # Version 0.7 (13.12.2009)</blockquote><blockquote>+  25 . </blockquote><blockquote>+  26 . </blockquote><blockquote>+  27 . import os</blockquote><blockquote>+  28 . import shutil</blockquote><blockquote>+  29 . import tempfile</blockquote><blockquote>+  30 . import smtplib</blockquote><blockquote>+  31 . import string</blockquote><blockquote>+  32 . import time</blockquote><blockquote>+  33 . import datetime</blockquote><blockquote>+  34 . import math</blockquote><blockquote>+  35 . </blockquote><blockquote>+  36 . from random   import choice</blockquote><blockquote>+  37 . from dbfpy    import dbf</blockquote><blockquote>+  38 . </blockquote><blockquote>+  39 . </blockquote><blockquote>+  40 . </blockquote><blockquote>+  41 . </blockquote><blockquote>+  42 . #*******************************************************************</blockquote><blockquote>+  43 . # Numerical representation of lat-lon</blockquote><blockquote>+  44 . #</blockquote><blockquote>+  45 . # Input: Longitude, Latitude</blockquote><blockquote>+  46 . # 38.98754324/-9.87548764</blockquote><blockquote>+  47 . #</blockquote><blockquote>+  48 . # Output: Absolute referense to degree square</blockquote><blockquote>+  49 . # E038S09?</blockquote><blockquote>+  50 . #</blockquote><blockquote>+  51 . def get_lonlat(lon_value,lat_value):</blockquote><blockquote>+  52 . </blockquote><blockquote>+  53 .     #Put character in front of longitudal value</blockquote><blockquote>+  54 .     if lon_value &lt; 0:</blockquote><blockquote>+  55 .         square = 'W'</blockquote><blockquote>+  56 .     else:</blockquote><blockquote>+  57 .         square = 'E'</blockquote><blockquote>+  58 .             </blockquote><blockquote>+  59 .     </blockquote><blockquote>+  60 .     #Find absolute value for longitude</blockquote><blockquote>+  61 .     lon_string=str(int(abs(lon_value)))</blockquote><blockquote>+  62 . </blockquote><blockquote>+  63 . </blockquote><blockquote>+  64 .     #The longitudal value of the square is printed with three decimals</blockquote><blockquote>+  65 .     square = square + (lon_string).zfill(3)</blockquote><blockquote>+  66 . </blockquote><blockquote>+  67 .     </blockquote><blockquote>+  68 . </blockquote><blockquote>+  69 .     #Put character in front of latitudal value</blockquote><blockquote>+  70 .     if  lat_value &lt; 0 :</blockquote><blockquote>+  71 .         square = square + 'S'</blockquote><blockquote>+  72 .     else:</blockquote><blockquote>+  73 .         square = square + 'N'</blockquote><blockquote>+  74 . </blockquote><blockquote>+  75 . </blockquote><blockquote>+  76 .     #find absolute value for latitude</blockquote><blockquote>+  77 .     lat_string=str(int(abs(lat_value)))</blockquote><blockquote>+  78 . </blockquote><blockquote>+  79 .     #find int lat. Remember that latitudes absolute values never excceed 90</blockquote><blockquote>+  80 .     square = square + (lat_string).zfill(2)</blockquote><blockquote>+  81 .     </blockquote><blockquote>+  82 .     return square</blockquote><blockquote>+  83 .         </blockquote><blockquote>+  84 .         </blockquote><blockquote>+  85 . #*******************************************************************</blockquote><blockquote>+  86 . # RQDGC - recursive quarter degree grid cell</blockquote><blockquote>+  87 . #</blockquote><blockquote>+  88 . # Input: Latitude, Longitude, depth in powers of two, starting string</blockquote><blockquote>+  89 . # -9.87548764, 38.98754324, 5, &quot;&quot;</blockquote><blockquote>+  90 . #</blockquote><blockquote>+  91 . # Output: DDDBB</blockquote><blockquote>+  92 . #</blockquote><blockquote>+  93 . # Obs!: This function places origo in the cell in the upper left</blockquote><blockquote>+  94 . # in the southern hemisphere and in the lower left corner</blockquote><blockquote>+  95 . # in the norther hemisphere. Is this ok?</blockquote><blockquote>+  96 . def get_recursive_qdgc(lon_value,lat_value,depth,square):</blockquote><blockquote>+  97 . </blockquote><blockquote>+  98 .     #remove all but the decimals (eg: 30.54 -&gt; 0.54)</blockquote><blockquote>+  99 .     #this also takes care of values below zero</blockquote><blockquote>+ 100 .     if  lon_value &gt;1 :</blockquote><blockquote>+ 101 .         lon_value = lon_value - math.floor(lon_value)</blockquote><blockquote>+ 102 .     elif (lon_value&lt;-1):</blockquote><blockquote>+ 103 .         lon_value = lon_value + abs(math.ceil(lon_value))</blockquote><blockquote>+ 104 . </blockquote><blockquote>+ 105 .     #remove all but the decimals (eg: 30.54 -&gt; 0.54)</blockquote><blockquote>+ 106 .     #this also takes care of values below zero</blockquote><blockquote>+ 107 .     if  (lat_value &gt; 1):</blockquote><blockquote>+ 108 .         lat_value = lat_value - math.floor(lat_value)</blockquote><blockquote>+ 109 .     elif (lat_value&lt;-1):</blockquote><blockquote>+ 110 .         lat_value = lat_value + abs(math.ceil(lat_value))</blockquote><blockquote>+ 111 . </blockquote><blockquote>+ 112 . </blockquote><blockquote>+ 113 .     #check which of the 4 squares the value fals within</blockquote><blockquote>+ 114 .     #Q1 - - - - - - - - - - - - - - - - - - - - - - - - - -</blockquote><blockquote>+ 115 .     if ((lon_value&gt;=0) and (lat_value&gt;=0)):</blockquote><blockquote>+ 116 .     </blockquote><blockquote>+ 117 .         #upper left - A</blockquote><blockquote>+ 118 .         if ((lon_value &lt;0.5) and (lat_value&gt;=0.5)):</blockquote><blockquote>+ 119 .             square =  square + 'A'</blockquote><blockquote>+ 120 .     </blockquote><blockquote>+ 121 .             lon_value=lon_value*2</blockquote><blockquote>+ 122 .             lat_value=(lat_value-0.5)*2</blockquote><blockquote>+ 123 .         </blockquote><blockquote>+ 124 .         </blockquote><blockquote>+ 125 .         #upper right - B</blockquote><blockquote>+ 126 .         elif ((lon_value&gt;=0.5) and (lat_value&gt;=0.5)):</blockquote><blockquote>+ 127 .             square = square + 'B'</blockquote><blockquote>+ 128 .     </blockquote><blockquote>+ 129 .             lon_value=(lon_value-0.5)*2</blockquote><blockquote>+ 130 .             lat_value=(lat_value-0.5)*2</blockquote><blockquote>+ 131 . </blockquote><blockquote>+ 132 .             </blockquote><blockquote>+ 133 .         #lower left - C</blockquote><blockquote>+ 134 .         elif ((lon_value&lt;0.5) and (lat_value&lt;0.5)):</blockquote><blockquote>+ 135 .             square = square + 'C'</blockquote><blockquote>+ 136 .     </blockquote><blockquote>+ 137 .             #both values are doubled</blockquote><blockquote>+ 138 .             lat_value=lat_value*2</blockquote><blockquote>+ 139 .             lon_value=lon_value*2</blockquote><blockquote>+ 140 . </blockquote><blockquote>+ 141 .             </blockquote><blockquote>+ 142 .         #lower right - D</blockquote><blockquote>+ 143 .         elif ((lon_value&gt;=0.5) and (lat_value&lt;0.5)):</blockquote><blockquote>+ 144 .             square =  square + 'D'</blockquote><blockquote>+ 145 .     </blockquote><blockquote>+ 146 .             lon_value=(lon_value-0.5)*2</blockquote><blockquote>+ 147 .             lat_value=lat_value*2</blockquote><blockquote>+ 148 . </blockquote><blockquote>+ 149 .     </blockquote><blockquote>+ 150 .     # Q2 - - - - - - - - - - - - - - - - - - - - - - - - - -</blockquote><blockquote>+ 151 .     elif ((lon_value&gt;=0) and (lat_value&lt;=0)):</blockquote><blockquote>+ 152 .     </blockquote><blockquote>+ 153 .         # upper left - A</blockquote><blockquote>+ 154 .         if ((lon_value &lt;0.5) and (lat_value&gt;-0.5)):</blockquote><blockquote>+ 155 .             square = square + 'A'</blockquote><blockquote>+ 156 .     </blockquote><blockquote>+ 157 .             lon_value=lon_value*2</blockquote><blockquote>+ 158 .             lat_value=lat_value*2</blockquote><blockquote>+ 159 .             </blockquote><blockquote>+ 160 .         #upper right - B</blockquote><blockquote>+ 161 .         elif ((lon_value&gt;=0.5) and (lat_value&gt;-0.5)):</blockquote><blockquote>+ 162 .             square = square + 'B'</blockquote><blockquote>+ 163 .     </blockquote><blockquote>+ 164 .             lon_value=(lon_value-0.5)*2</blockquote><blockquote>+ 165 .             lat_value=lat_value*2</blockquote><blockquote>+ 166 . </blockquote><blockquote>+ 167 .         #lower left - C</blockquote><blockquote>+ 168 .         elif ((lon_value&lt;0.5) and (lat_value&lt;=-0.5)):</blockquote><blockquote>+ 169 .             square = square + 'C'</blockquote><blockquote>+ 170 .     </blockquote><blockquote>+ 171 .             lon_value=lon_value*2</blockquote><blockquote>+ 172 .             lat_value=(lat_value+0.5)*2</blockquote><blockquote>+ 173 .             </blockquote><blockquote>+ 174 .         #lower right - D</blockquote><blockquote>+ 175 .         elif ((lon_value&gt;=0.5) and (lat_value&lt;=-0.5)):</blockquote><blockquote>+ 176 .             square = square + 'D'</blockquote><blockquote>+ 177 .     </blockquote><blockquote>+ 178 .             lon_value=(lon_value-0.5)*2</blockquote><blockquote>+ 179 .             lat_value=(lat_value+0.5)*2</blockquote><blockquote>+ 180 .             </blockquote><blockquote>+ 181 .     </blockquote><blockquote>+ 182 .     # Q3 - - - - - - - - - - - - - - - - - - - - - - - - - -</blockquote><blockquote>+ 183 .     elif ((lon_value&lt;=0) and (lat_value&lt;=0)):</blockquote><blockquote>+ 184 .     </blockquote><blockquote>+ 185 .         #upper left - A</blockquote><blockquote>+ 186 .         if ((lon_value&lt;=-0.5) and (lat_value&gt;-0.5)):</blockquote><blockquote>+ 187 .             square = square + 'A'</blockquote><blockquote>+ 188 .     </blockquote><blockquote>+ 189 .             lon_value=(lon_value+0.5)*2</blockquote><blockquote>+ 190 .             lat_value=lat_value*2</blockquote><blockquote>+ 191 .             </blockquote><blockquote>+ 192 .         #upper right - B</blockquote><blockquote>+ 193 .         elif ((lon_value&gt;-0.5) and (lat_value&gt;-0.5)):</blockquote><blockquote>+ 194 .             square = square + 'B'</blockquote><blockquote>+ 195 .     </blockquote><blockquote>+ 196 .             lon_value=lon_value*2</blockquote><blockquote>+ 197 .             lat_value=lat_value*2</blockquote><blockquote>+ 198 .             </blockquote><blockquote>+ 199 .         #lower left - C</blockquote><blockquote>+ 200 .         elif ((lon_value&lt;=-0.5) and (lat_value&lt;=-0.5)):</blockquote><blockquote>+ 201 .             square = square + 'C'</blockquote><blockquote>+ 202 .     </blockquote><blockquote>+ 203 .             lon_value=(lon_value+0.5)*2</blockquote><blockquote>+ 204 .             lat_value=(lat_value+0.5)*2</blockquote><blockquote>+ 205 . </blockquote><blockquote>+ 206 .         #lower right - D</blockquote><blockquote>+ 207 .         elif ((lon_value&gt;-0.5) and (lat_value&lt;=-0.5)):</blockquote><blockquote>+ 208 .             square = square + 'D'</blockquote><blockquote>+ 209 .     </blockquote><blockquote>+ 210 .             lon_value=lon_value*2</blockquote><blockquote>+ 211 .             lat_value=(lat_value+0.5)*2</blockquote><blockquote>+ 212 .     </blockquote><blockquote>+ 213 .     </blockquote><blockquote>+ 214 .     # Q4 - - - - - - - - - - - - - - - - - - - - - - - - - -</blockquote><blockquote>+ 215 .     elif ((lon_value&lt;=0) and (lat_value&gt;=0)):</blockquote><blockquote>+ 216 .     </blockquote><blockquote>+ 217 .         #upper left - A</blockquote><blockquote>+ 218 .         if ((lon_value &lt;=-0.5) and (lat_value&gt;=0.5)):</blockquote><blockquote>+ 219 .             square = square + 'A'</blockquote><blockquote>+ 220 .     </blockquote><blockquote>+ 221 .             lon_value=(lon_value+0.5)*2</blockquote><blockquote>+ 222 .             lat_value=(lat_value-0.5)*2</blockquote><blockquote>+ 223 . </blockquote><blockquote>+ 224 .         #upper right - B</blockquote><blockquote>+ 225 .         elif ((lon_value&gt;-0.5) and (lat_value&gt;=0.5)):</blockquote><blockquote>+ 226 .             square = square + 'B'</blockquote><blockquote>+ 227 .     </blockquote><blockquote>+ 228 .             lon_value=lon_value*2</blockquote><blockquote>+ 229 .             lat_value=(lat_value-0.5)*2</blockquote><blockquote>+ 230 .             </blockquote><blockquote>+ 231 .         #lower left - C</blockquote><blockquote>+ 232 .         elif ((lon_value&lt;=-0.5) and (lat_value&lt;0.5)):</blockquote><blockquote>+ 233 .             square = square + 'C'</blockquote><blockquote>+ 234 .     </blockquote><blockquote>+ 235 .             lon_value=(lon_value+0.5)*2</blockquote><blockquote>+ 236 .             lat_value=(lat_value)*2</blockquote><blockquote>+ 237 . </blockquote><blockquote>+ 238 .         #lower right - D</blockquote><blockquote>+ 239 .         elif ((lon_value&gt;-0.5) and (lat_value&lt;0.5)):</blockquote><blockquote>+ 240 .             square = square + 'D'</blockquote><blockquote>+ 241 .     </blockquote><blockquote>+ 242 .             lon_value=lon_value*2</blockquote><blockquote>+ 243 .             lat_value=lat_value*2</blockquote><blockquote>+ 244 .     </blockquote><blockquote>+ 245 .     </blockquote><blockquote>+ 246 .  </blockquote><blockquote>+ 247 .     #find square sting length</blockquote><blockquote>+ 248 .     length = len(square)</blockquote><blockquote>+ 249 .     </blockquote><blockquote>+ 250 .     #as long as string length does not meed criteria for depth - continue calculation</blockquote><blockquote>+ 251 .     #as an argument the curent square value is sent to the function. This is added in</blockquote><blockquote>+ 252 .     #subsequent calculations, and eventually the number for the length of the string</blockquote><blockquote>+ 253 .     #equals the number of the depth variable. That's when the job is done.</blockquote><blockquote>+ 254 .     if (length &lt; depth):</blockquote><blockquote>+ 255 .         #Calculation is recursive - continue the good work</blockquote><blockquote>+ 256 .         square = get_recursive_qdgc(lon_value,lat_value,depth,square)</blockquote><blockquote>+ 257 .     </blockquote><blockquote>+ 258 .     #return value for square</blockquote><blockquote>+ 259 .     return square</blockquote><blockquote>+ 260 .         </blockquote><blockquote>+ 261 .         </blockquote><blockquote>+ 262 . #This is where the program is executed</blockquote><blockquote>+ 263 .         </blockquote><blockquote>+ 264 . def qdgc(lon_value,lat_value,qdgc_level):</blockquote><blockquote>+ 265 .     </blockquote><blockquote>+ 266 .     lonlatvalues = get_lonlat(lon_value,lat_value)</blockquote><blockquote>+ 267 .     </blockquote><blockquote>+ 268 .     qdgcvalues = get_recursive_qdgc(lon_value,lat_value,qdgc_level,&quot;&quot;)</blockquote><blockquote>+ 269 .         </blockquote><blockquote>+ 270 .     resultstring = lonlatvalues + qdgcvalues</blockquote><blockquote>+ 271 .     </blockquote><blockquote>+ 272 .     return resultstring</blockquote><blockquote>+ 273 . </blockquote><blockquote>+ 274 . </blockquote><blockquote>+ 275 . </blockquote><blockquote>+ 276 . </blockquote><blockquote>+ 277 . sender                = 'sendersemail@someplace.com'</blockquote><blockquote>+ 278 . </blockquote><blockquote>+ 279 . path_to_watch         = '/var/www/www_qdgc_org/lonlat2qdgc/incoming/'</blockquote><blockquote>+ 280 . </blockquote><blockquote>+ 281 . folder_destination    = '/var/www/www_qdgc_org/lonlat2qdgc/userdata/'</blockquote><blockquote>+ 282 . </blockquote><blockquote>+ 283 . path_web              = 'http://www.qdgc.org/lonlat2qdgc/userdata/'</blockquote><blockquote>+ 284 . </blockquote><blockquote>+ 285 . now                   = datetime.datetime.now()</blockquote><blockquote>+ 286 . </blockquote><blockquote>+ 287 . lonlat2qdgcversion    = 'lonlat2qdgc version 0.7 did this conversion.'</blockquote><blockquote>+ 288 . </blockquote><blockquote>+ 289 . formoreinformation    = 'More information about QDGC (Quarter Degree Grid Cells) is available here: http://www.qdgc.org '</blockquote><blockquote>+ 290 . </blockquote><blockquote>+ 291 . errorflag             = 0</blockquote><blockquote>+ 292 . </blockquote><blockquote>+ 293 . </blockquote><blockquote>+ 294 . def genRandomstring(length=8, chars=string.letters + string.digits):</blockquote><blockquote>+ 295 .     return ''.join([choice(chars) for i in range(length)])</blockquote><blockquote>+ 296 . </blockquote><blockquote>+ 297 . </blockquote><blockquote>+ 298 . </blockquote><blockquote>+ 299 . </blockquote><blockquote>+ 300 . #Folder to watch</blockquote><blockquote>+ 301 . before = dict ([(f, None) for f in os.listdir (path_to_watch)])</blockquote><blockquote>+ 302 . </blockquote><blockquote>+ 303 . while 1:</blockquote><blockquote>+ 304 .     </blockquote><blockquote>+ 305 .     time.sleep (15)</blockquote><blockquote>+ 306 .     </blockquote><blockquote>+ 307 .     the_logfile = ''</blockquote><blockquote>+ 308 .     </blockquote><blockquote>+ 309 .     currentfiles =dict ([(f, None) for f in os.listdir (path_to_watch)])</blockquote><blockquote>+ 310 . </blockquote><blockquote>+ 311 .     for onefile in currentfiles:</blockquote><blockquote>+ 312 .         </blockquote><blockquote>+ 313 .         basename, extension = os.path.spli#*******************************************************************</blockquote><blockquote>+ 314 . # Longitude/Latitude to Quarter Degree Grid Cell standard conversion </blockquote><blockquote>+ 315 . # utility. Daemon. </blockquote><blockquote>+ 316 . #</blockquote><blockquote>+ 317 . # The daemon polls a directory for a.dbf-file. It then transfers and</blockquote><blockquote>+ 318 . # converts the relevant .dbf-file.</blockquote><blockquote>+ 319 . #</blockquote><blockquote>+ 320 . # Delivered as-is. If it works - fine for you. If it fails - too bad. </blockquote><blockquote>+ 321 . # No guarantees are given  whatsoever. If you use this program for </blockquote><blockquote>+ 322 . # illegal purposes - don't blame me.</blockquote><blockquote>+ 323 . # </blockquote><blockquote>+ 324 . # License type is Gnu GPL. Copy, distribute and change freely. Keep</blockquote><blockquote>+ 325 . # the author in mind for crediting. Come to think of it, use this </blockquote><blockquote>+ 326 . # reference:</blockquote><blockquote>+ 327 . #</blockquote><blockquote>+ 328 . # R. Larsen, T. Holmern, S. D. Prager, H. Maliti and E. Roskaft </blockquote><blockquote>+ 329 . #     (2009) Using the extended quarter degree grid cell system </blockquote><blockquote>+ 330 . #     to unify mapping and sharing of biodiversity data, African</blockquote><blockquote>+ 331 . #     Journal of Ecology. Volume 47, Issue 3 , Pages 382 - 392</blockquote><blockquote>+ 332 . #</blockquote><blockquote>+ 333 . # Author Ragnvald Larsen, Dept of Biology, NTNU (www.bio.ntnu.no)</blockquote><blockquote>+ 334 . # ragnvald(at)mindland.com</blockquote><blockquote>+ 335 . #</blockquote><blockquote>+ 336 . # Version 0.7 (13.12.2009)</blockquote><blockquote>+ 337 . </blockquote><blockquote>+ 338 . </blockquote><blockquote>+ 339 . import os</blockquote><blockquote>+ 340 . import shutil</blockquote><blockquote>+ 341 . import tempfile</blockquote><blockquote>+ 342 . import smtplib</blockquote><blockquote>+ 343 . import string</blockquote><blockquote>+ 344 . import time</blockquote><blockquote>+ 345 . import datetime</blockquote><blockquote>+ 346 . import math</blockquote><blockquote>+ 347 . </blockquote><blockquote>+ 348 . from random   import choice</blockquote><blockquote>+ 349 . from dbfpy    import dbf</blockquote><blockquote>+ 350 . </blockquote><blockquote>+ 351 . </blockquote><blockquote>+ 352 . </blockquote><blockquote>+ 353 . </blockquote><blockquote>+ 354 . #*******************************************************************</blockquote><blockquote>+ 355 . # Numerical representation of lat-lon</blockquote><blockquote>+ 356 . #</blockquote><blockquote>+ 357 . # Input: Longitude, Latitude</blockquote><blockquote>+ 358 . # 38.98754324/-9.87548764</blockquote><blockquote>+ 359 . #</blockquote><blockquote>+ 360 . # Output: Absolute referense to degree square</blockquote><blockquote>+ 361 . # E038S09?</blockquote><blockquote>+ 362 . #</blockquote><blockquote>+ 363 . def get_lonlat(lon_value,lat_value):</blockquote><blockquote>+ 364 . </blockquote><blockquote>+ 365 .     #Put character in front of longitudal value</blockquote><blockquote>+ 366 .     if lon_value &lt; 0:</blockquote><blockquote>+ 367 .         square = 'W'</blockquote><blockquote>+ 368 .     else:</blockquote><blockquote>+ 369 .         square = 'E'</blockquote><blockquote>+ 370 .             </blockquote><blockquote>+ 371 .     </blockquote><blockquote>+ 372 .     #Find absolute value for longitude</blockquote><blockquote>+ 373 .     lon_string=str(int(abs(lon_value)))</blockquote><blockquote>+ 374 . </blockquote><blockquote>+ 375 . </blockquote><blockquote>+ 376 .     #The longitudal value of the square is printed with three decimals</blockquote><blockquote>+ 377 .     square = square + (lon_string).zfill(3)</blockquote><blockquote>+ 378 . </blockquote><blockquote>+ 379 .     </blockquote><blockquote>+ 380 . </blockquote><blockquote>+ 381 .     #Put character in front of latitudal value</blockquote><blockquote>+ 382 .     if  lat_value &lt; 0 :</blockquote><blockquote>+ 383 .         square = square + 'S'</blockquote><blockquote>+ 384 .     else:</blockquote><blockquote>+ 385 .         square = square + 'N'</blockquote><blockquote>+ 386 . </blockquote><blockquote>+ 387 . </blockquote><blockquote>+ 388 .     #find absolute value for latitude</blockquote><blockquote>+ 389 .     lat_string=str(int(abs(lat_value)))</blockquote><blockquote>+ 390 . </blockquote><blockquote>+ 391 .     #find int lat. Remember that latitudes absolute values never excceed 90</blockquote><blockquote>+ 392 .     square = square + (lat_string).zfill(2)</blockquote><blockquote>+ 393 .     </blockquote><blockquote>+ 394 .     return square</blockquote><blockquote>+ 395 .         </blockquote><blockquote>+ 396 .         </blockquote><blockquote>+ 397 . #*******************************************************************</blockquote><blockquote>+ 398 . # RQDGC - recursive quarter degree grid cell</blockquote><blockquote>+ 399 . #</blockquote><blockquote>+ 400 . # Input: Latitude, Longitude, depth in powers of two, starting string</blockquote><blockquote>+ 401 . # -9.87548764, 38.98754324, 5, &quot;&quot;</blockquote><blockquote>+ 402 . #</blockquote><blockquote>+ 403 . # Output: DDDBB</blockquote><blockquote>+ 404 . #</blockquote><blockquote>+ 405 . # Obs!: This function places origo in the cell in the upper left</blockquote><blockquote>+ 406 . # in the southern hemisphere and in the lower left corner</blockquote><blockquote>+ 407 . # in the norther hemisphere. Is this ok?</blockquote><blockquote>+ 408 . def get_recursive_qdgc(lon_value,lat_value,depth,square):</blockquote><blockquote>+ 409 . </blockquote><blockquote>+ 410 .     #remove all but the decimals (eg: 30.54 -&gt; 0.54)</blockquote><blockquote>+ 411 .     #this also takes care of values below zero</blockquote><blockquote>+ 412 .     if  lon_value &gt;1 :</blockquote><blockquote>+ 413 .         lon_value = lon_value - math.floor(lon_value)</blockquote><blockquote>+ 414 .     elif (lon_value&lt;-1):</blockquote><blockquote>+ 415 .         lon_value = lon_value + abs(math.ceil(lon_value))</blockquote><blockquote>+ 416 . </blockquote><blockquote>+ 417 .     #remove all but the decimals (eg: 30.54 -&gt; 0.54)</blockquote><blockquote>+ 418 .     #this also takes care of values below zero</blockquote><blockquote>+ 419 .     if  (lat_value &gt; 1):</blockquote><blockquote>+ 420 .         lat_value = lat_value - math.floor(lat_value)</blockquote><blockquote>+ 421 .     elif (lat_value&lt;-1):</blockquote><blockquote>+ 422 .         lat_value = lat_value + abs(math.ceil(lat_value))</blockquote><blockquote>+ 423 . </blockquote><blockquote>+ 424 . </blockquote><blockquote>+ 425 .     #check which of the 4 squares the value fals within</blockquote><blockquote>+ 426 .     #Q1 - - - - - - - - - - - - - - - - - - - - - - - - - -</blockquote><blockquote>+ 427 .     if ((lon_value&gt;=0) and (lat_value&gt;=0)):</blockquote><blockquote>+ 428 .     </blockquote><blockquote>+ 429 .         #upper left - A</blockquote><blockquote>+ 430 .         if ((lon_value &lt;0.5) and (lat_value&gt;=0.5)):</blockquote><blockquote>+ 431 .             square =  square + 'A'</blockquote><blockquote>+ 432 .     </blockquote><blockquote>+ 433 .             lon_value=lon_value*2</blockquote><blockquote>+ 434 .             lat_value=(lat_value-0.5)*2</blockquote><blockquote>+ 435 .         </blockquote><blockquote>+ 436 .         </blockquote><blockquote>+ 437 .         #upper right - B</blockquote><blockquote>+ 438 .         elif ((lon_value&gt;=0.5) and (lat_value&gt;=0.5)):</blockquote><blockquote>+ 439 .             square = square + 'B'</blockquote><blockquote>+ 440 .     </blockquote><blockquote>+ 441 .             lon_value=(lon_value-0.5)*2</blockquote><blockquote>+ 442 .             lat_value=(lat_value-0.5)*2</blockquote><blockquote>+ 443 . </blockquote><blockquote>+ 444 .             </blockquote><blockquote>+ 445 .         #lower left - C</blockquote><blockquote>+ 446 .         elif ((lon_value&lt;0.5) and (lat_value&lt;0.5)):</blockquote><blockquote>+ 447 .             square = square + 'C'</blockquote><blockquote>+ 448 .     </blockquote><blockquote>+ 449 .             #both values are doubled</blockquote><blockquote>+ 450 .             lat_value=lat_value*2</blockquote><blockquote>+ 451 .             lon_value=lon_value*2</blockquote><blockquote>+ 452 . </blockquote><blockquote>+ 453 .             </blockquote><blockquote>+ 454 .         #lower right - D</blockquote><blockquote>+ 455 .         elif ((lon_value&gt;=0.5) and (lat_value&lt;0.5)):</blockquote><blockquote>+ 456 .             square =  square + 'D'</blockquote><blockquote>+ 457 .     </blockquote><blockquote>+ 458 .             lon_value=(lon_value-0.5)*2</blockquote><blockquote>+ 459 .             lat_value=lat_value*2</blockquote><blockquote>+ 460 . </blockquote><blockquote>+ 461 .     </blockquote><blockquote>+ 462 .     # Q2 - - - - - - - - - - - - - - - - - - - - - - - - - -</blockquote><blockquote>+ 463 .     elif ((lon_value&gt;=0) and (lat_value&lt;=0)):</blockquote><blockquote>+ 464 .     </blockquote><blockquote>+ 465 .         # upper left - A</blockquote><blockquote>+ 466 .         if ((lon_value &lt;0.5) and (lat_value&gt;-0.5)):</blockquote><blockquote>+ 467 .             square = square + 'A'</blockquote><blockquote>+ 468 .     </blockquote><blockquote>+ 469 .             lon_value=lon_value*2</blockquote><blockquote>+ 470 .             lat_value=lat_value*2</blockquote><blockquote>+ 471 .             </blockquote><blockquote>+ 472 .         #upper right - B</blockquote><blockquote>+ 473 .         elif ((lon_value&gt;=0.5) and (lat_value&gt;-0.5)):</blockquote><blockquote>+ 474 .             square = square + 'B'</blockquote><blockquote>+ 475 .     </blockquote><blockquote>+ 476 .             lon_value=(lon_value-0.5)*2</blockquote><blockquote>+ 477 .             lat_value=lat_value*2</blockquote><blockquote>+ 478 . </blockquote><blockquote>+ 479 .         #lower left - C</blockquote><blockquote>+ 480 .         elif ((lon_value&lt;0.5) and (lat_value&lt;=-0.5)):</blockquote><blockquote>+ 481 .             square = square + 'C'</blockquote><blockquote>+ 482 .     </blockquote><blockquote>+ 483 .             lon_value=lon_value*2</blockquote><blockquote>+ 484 .             lat_value=(lat_value+0.5)*2</blockquote><blockquote>+ 485 .             </blockquote><blockquote>+ 486 .         #lower right - D</blockquote><blockquote>+ 487 .         elif ((lon_value&gt;=0.5) and (lat_value&lt;=-0.5)):</blockquote><blockquote>+ 488 .             square = square + 'D'</blockquote><blockquote>+ 489 .     </blockquote><blockquote>+ 490 .             lon_value=(lon_value-0.5)*2</blockquote><blockquote>+ 491 .             lat_value=(lat_value+0.5)*2</blockquote><blockquote>+ 492 .             </blockquote><blockquote>+ 493 .     </blockquote><blockquote>+ 494 .     # Q3 - - - - - - - - - - - - - - - - - - - - - - - - - -</blockquote><blockquote>+ 495 .     elif ((lon_value&lt;=0) and (lat_value&lt;=0)):</blockquote><blockquote>+ 496 .     </blockquote><blockquote>+ 497 .         #upper left - A</blockquote><blockquote>+ 498 .         if ((lon_value&lt;=-0.5) and (lat_value&gt;-0.5)):</blockquote><blockquote>+ 499 .             square = square + 'A'</blockquote><blockquote>+ 500 .     </blockquote><blockquote>+ 501 .             lon_value=(lon_value+0.5)*2</blockquote><blockquote>+ 502 .             lat_value=lat_value*2</blockquote><blockquote>+ 503 .             </blockquote><blockquote>+ 504 .         #upper right - B</blockquote><blockquote>+ 505 .         elif ((lon_value&gt;-0.5) and (lat_value&gt;-0.5)):</blockquote><blockquote>+ 506 .             square = square + 'B'</blockquote><blockquote>+ 507 .     </blockquote><blockquote>+ 508 .             lon_value=lon_value*2</blockquote><blockquote>+ 509 .             lat_value=lat_value*2</blockquote><blockquote>+ 510 .             </blockquote><blockquote>+ 511 .         #lower left - C</blockquote><blockquote>+ 512 .         elif ((lon_value&lt;=-0.5) and (lat_value&lt;=-0.5)):</blockquote><blockquote>+ 513 .             square = square + 'C'</blockquote><blockquote>+ 514 .     </blockquote><blockquote>+ 515 .             lon_value=(lon_value+0.5)*2</blockquote><blockquote>+ 516 .             lat_value=(lat_value+0.5)*2</blockquote><blockquote>+ 517 . </blockquote><blockquote>+ 518 .         #lower right - D</blockquote><blockquote>+ 519 .         elif ((lon_value&gt;-0.5) and (lat_value&lt;=-0.5)):</blockquote><blockquote>+ 520 .             square = square + 'D'</blockquote><blockquote>+ 521 .     </blockquote><blockquote>+ 522 .             lon_value=lon_value*2</blockquote><blockquote>+ 523 .             lat_value=(lat_value+0.5)*2</blockquote><blockquote>+ 524 .     </blockquote><blockquote>+ 525 .     </blockquote><blockquote>+ 526 .     # Q4 - - - - - - - - - - - - - - - - - - - - - - - - - -</blockquote><blockquote>+ 527 .     elif ((lon_value&lt;=0) and (lat_value&gt;=0)):</blockquote><blockquote>+ 528 .     </blockquote><blockquote>+ 529 .         #upper left - A</blockquote><blockquote>+ 530 .         if ((lon_value &lt;=-0.5) and (lat_value&gt;=0.5)):</blockquote><blockquote>+ 531 .             square = square + 'A'</blockquote><blockquote>+ 532 .     </blockquote><blockquote>+ 533 .             lon_value=(lon_value+0.5)*2</blockquote><blockquote>+ 534 .             lat_value=(lat_value-0.5)*2</blockquote><blockquote>+ 535 . </blockquote><blockquote>+ 536 .         #upper right - B</blockquote><blockquote>+ 537 .         elif ((lon_value&gt;-0.5) and (lat_value&gt;=0.5)):</blockquote><blockquote>+ 538 .             square = square + 'B'</blockquote><blockquote>+ 539 .     </blockquote><blockquote>+ 540 .             lon_value=lon_value*2</blockquote><blockquote>+ 541 .             lat_value=(lat_value-0.5)*2</blockquote><blockquote>+ 542 .             </blockquote><blockquote>+ 543 .         #lower left - C</blockquote><blockquote>+ 544 .         elif ((lon_value&lt;=-0.5) and (lat_value&lt;0.5)):</blockquote><blockquote>+ 545 .             square = square + 'C'</blockquote><blockquote>+ 546 .     </blockquote><blockquote>+ 547 .             lon_value=(lon_value+0.5)*2</blockquote><blockquote>+ 548 .             lat_value=(lat_value)*2</blockquote><blockquote>+ 549 . </blockquote><blockquote>+ 550 .         #lower right - D</blockquote><blockquote>+ 551 .         elif ((lon_value&gt;-0.5) and (lat_value&lt;0.5)):</blockquote><blockquote>+ 552 .             square = square + 'D'</blockquote><blockquote>+ 553 .     </blockquote><blockquote>+ 554 .             lon_value=lon_value*2</blockquote><blockquote>+ 555 .             lat_value=lat_value*2</blockquote><blockquote>+ 556 .     </blockquote><blockquote>+ 557 .     </blockquote><blockquote>+ 558 .  </blockquote><blockquote>+ 559 .     #find square sting length</blockquote><blockquote>+ 560 .     length = len(square)</blockquote><blockquote>+ 561 .     </blockquote><blockquote>+ 562 .     #as long as string length does not meed criteria for depth - continue calculation</blockquote><blockquote>+ 563 .     #as an argument the curent square value is sent to the function. This is added in</blockquote><blockquote>+ 564 .     #subsequent calculations, and eventually the number for the length of the string</blockquote><blockquote>+ 565 .     #equals the number of the depth variable. That's when the job is done.</blockquote><blockquote>+ 566 .     if (length &lt; depth):</blockquote><blockquote>+ 567 .         #Calculation is recursive - continue the good work</blockquote><blockquote>+ 568 .         square = get_recursive_qdgc(lon_value,lat_value,depth,square)</blockquote><blockquote>+ 569 .     </blockquote><blockquote>+ 570 .     #return value for square</blockquote><blockquote>+ 571 .     return square</blockquote><blockquote>+ 572 .         </blockquote><blockquote>+ 573 .         </blockquote><blockquote>+ 574 . #This is where the program is executed</blockquote><blockquote>+ 575 .         </blockquote><blockquote>+ 576 . def qdgc(lon_value,lat_value,qdgc_level):</blockquote><blockquote>+ 577 .     </blockquote><blockquote>+ 578 .     lonlatvalues = get_lonlat(lon_value,lat_value)</blockquote><blockquote>+ 579 .     </blockquote><blockquote>+ 580 .     qdgcvalues = get_recursive_qdgc(lon_value,lat_value,qdgc_level,&quot;&quot;)</blockquote><blockquote>+ 581 .         </blockquote><blockquote>+ 582 .     resultstring = lonlatvalues + qdgcvalues</blockquote><blockquote>+ 583 .     </blockquote><blockquote>+ 584 .     return resultstring</blockquote><blockquote>+ 585 . </blockquote><blockquote>+ 586 . </blockquote><blockquote>+ 587 . </blockquote><blockquote>+ 588 . </blockquote><blockquote>+ 589 . sender                = 'sendersemail@someplace.com'</blockquote><blockquote>+ 590 . </blockquote><blockquote>+ 591 . path_to_watch         = '/var/www/www_qdgc_org/lonlat2qdgc/incoming/'</blockquote><blockquote>+ 592 . </blockquote><blockquote>+ 593 . folder_destination    = '/var/www/www_qdgc_org/lonlat2qdgc/userdata/'</blockquote><blockquote>+ 594 . </blockquote><blockquote>+ 595 . path_web              = 'http://www.qdgc.org/lonlat2qdgc/userdata/'</blockquote><blockquote>+ 596 . </blockquote><blockquote>+ 597 . now                   = datetime.datetime.now()</blockquote><blockquote>+ 598 . </blockquote><blockquote>+ 599 . lonlat2qdgcversion    = 'lonlat2qdgc version 0.7 did this conversion.'</blockquote><blockquote>+ 600 . </blockquote><blockquote>+ 601 . formoreinformation    = 'More information about QDGC (Quarter Degree Grid Cells) is available here: http://www.qdgc.org '</blockquote><blockquote>+ 602 . </blockquote><blockquote>+ 603 . errorflag             = 0</blockquote><blockquote>+ 604 . </blockquote><blockquote>+ 605 . </blockquote><blockquote>+ 606 . def genRandomstring(length=8, chars=string.letters + string.digits):</blockquote><blockquote>+ 607 .     return ''.join([choice(chars) for i in range(length)])</blockquote><blockquote>+ 608 . </blockquote><blockquote>+ 609 . </blockquote><blockquote>+ 610 . </blockquote><blockquote>+ 611 . </blockquote><blockquote>+ 612 . #Folder to watch</blockquote><blockquote>+ 613 . before = dict ([(f, None) for f in os.listdir (path_to_watch)])</blockquote><blockquote>+ 614 . </blockquote><blockquote>+ 615 . while 1:</blockquote><blockquote>+ 616 .     </blockquote><blockquote>+ 617 .     time.sleep (15)</blockquote><blockquote>+ 618 .     </blockquote><blockquote>+ 619 .     the_logfile = ''</blockquote><blockquote>+ 620 .     </blockquote><blockquote>+ 621 .     currentfiles =dict ([(f, None) for f in os.listdir (path_to_watch)])</blockquote><blockquote>+ 622 . </blockquote><blockquote>+ 623 .     for onefile in currentfiles:</blockquote><blockquote>+ 624 .         </blockquote><blockquote>+ 625 .         basename, extension = os.path.splitext(onefile)  </blockquote><blockquote>+ 626 .     </blockquote><blockquote>+ 627 .         # If one of the files in the list of files is a .dbf-file</blockquote><blockquote>+ 628 .         # then the party starts.</blockquote><blockquote>+ 629 .         if extension=='.dbf': </blockquote><blockquote>+ 630 .         </blockquote><blockquote>+ 631 .             </blockquote><blockquote>+ 632 .             time_for_job = now.strftime(&quot;%Y-%m-%d %H:%M&quot;)</blockquote><blockquote>+ 633 .             </blockquote><blockquote>+ 634 .             # Create a string which will later serve as a random folder name</blockquote><blockquote>+ 635 .             randomfolder = genRandomstring(20,string.letters)</blockquote><blockquote>+ 636 .             </blockquote><blockquote>+ 637 .             # Make the random folder. This is referred to as the user folder</blockquote><blockquote>+ 638 .             os.mkdir(folder_destination+randomfolder)</blockquote><blockquote>+ 639 .             </blockquote><blockquote>+ 640 .             # Create the user in folder</blockquote><blockquote>+ 641 .             os.mkdir(folder_destination+randomfolder+'/in')</blockquote><blockquote>+ 642 .             folder_in  = (folder_destination + randomfolder + '/in/')</blockquote><blockquote>+ 643 .             </blockquote><blockquote>+ 644 .             # Create the user out folder</blockquote><blockquote>+ 645 .             os.mkdir(folder_destination+'/'+randomfolder+'/out')</blockquote><blockquote>+ 646 .             folder_out = (folder_destination + randomfolder + '/out/')</blockquote><blockquote>+ 647 .             </blockquote><blockquote>+ 648 .             </blockquote><blockquote>+ 649 .             # Copy the original file to the in and out-folders</blockquote><blockquote>+ 650 .             shutil.copy (path_to_watch+ onefile, folder_in + onefile)</blockquote><blockquote>+ 651 .             shutil.move (path_to_watch+ onefile, folder_out + onefile)</blockquote><blockquote>+ 652 .             </blockquote><blockquote>+ 653 .             </blockquote><blockquote>+ 654 .             #move info-file generated by the script. Job information resides in this one.</blockquote><blockquote>+ 655 .             shutil.move (path_to_watch+ basename+'.info', folder_out + basename+'.info')</blockquote><blockquote>+ 656 .             </blockquote><blockquote>+ 657 .             #print  '\n'+ 'Data file (%s.dbf) has been moved.' % (basename)</blockquote><blockquote>+ 658 .             #print  '\n'+ 'Task file (%s.info) has been moved.' % (basename)</blockquote><blockquote>+ 659 .             </blockquote><blockquote>+ 660 .             </blockquote><blockquote>+ 661 .             #read input_file_name.info</blockquote><blockquote>+ 662 .             file_info = open(folder_out + basename+'.info', &quot;r&quot;)</blockquote><blockquote>+ 663 .             </blockquote><blockquote>+ 664 .             # Handle user email</blockquote><blockquote>+ 665 .             the_logfile        = the_logfile + '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n'</blockquote><blockquote>+ 666 .             the_logfile        = the_logfile + '-\n'</blockquote><blockquote>+ 667 .             user_email         = file_info.readline().rstrip('\n')</blockquote><blockquote>+ 668 .             the_logfile        = the_logfile + '- Client email      : %s' % (user_email)</blockquote><blockquote>+ 669 .             the_logfile        = the_logfile + '\n'</blockquote><blockquote>+ 670 .             </blockquote><blockquote>+ 671 .             # Handle user qdgc level</blockquote><blockquote>+ 672 .             user_qdgc_level    = int(file_info.readline())</blockquote><blockquote>+ 673 .             the_logfile        = the_logfile + '- Client QDGC level : %s' % (user_qdgc_level)</blockquote><blockquote>+ 674 .             the_logfile        = the_logfile + '\n'</blockquote><blockquote>+ 675 .             </blockquote><blockquote>+ 676 .             # Handle user comment</blockquote><blockquote>+ 677 .             user_comment       = file_info.readline().rstrip('\n')</blockquote><blockquote>+ 678 .             the_logfile        = the_logfile + '- User Comments     : %s\n' % (user_comment)</blockquote><blockquote>+ 679 .             the_logfile        = the_logfile + '-\n'</blockquote><blockquote>+ 680 .             </blockquote><blockquote>+ 681 .             # Logfile document time            </blockquote><blockquote>+ 682 .             the_logfile        = the_logfile + '- Job was submitted : %s.\n' % time_for_job</blockquote><blockquote>+ 683 .             the_logfile        = the_logfile + '-\n'</blockquote><blockquote>+ 684 .             the_logfile        = the_logfile + '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n'</blockquote><blockquote>+ 685 .             </blockquote><blockquote>+ 686 .             #Close the info file</blockquote><blockquote>+ 687 .             file_info.close()</blockquote><blockquote>+ 688 .     </blockquote><blockquote>+ 689 .             </blockquote><blockquote>+ 690 .             db = dbf.Dbf(folder_out + onefile)</blockquote><blockquote>+ 691 .             </blockquote><blockquote>+ 692 .             # Convert file in folder out</blockquote><blockquote>+ 693 .             </blockquote><blockquote>+ 694 .             # Timer starts</blockquote><blockquote>+ 695 .             t1 = time.clock()            </blockquote><blockquote>+ 696 .             </blockquote><blockquote>+ 697 .             # set counter</blockquote><blockquote>+ 698 .             counter = 0</blockquote><blockquote>+ 699 .             </blockquote><blockquote>+ 700 .             for rec in db:</blockquote><blockquote>+ 701 .                 #Get values for longitude and latitude - given that their names are LON and LAT</blockquote><blockquote>+ 702 .                 if errorflag == 0:</blockquote><blockquote>+ 703 .                     try:</blockquote><blockquote>+ 704 .                         lon_to_calculate = rec[&quot;LON&quot;]</blockquote><blockquote>+ 705 .                     except:</blockquote><blockquote>+ 706 .                         errorflag=1</blockquote><blockquote>+ 707 .                         the_logfile = the_logfile +'\n'+'Reading the LON-column in the.dbf-file failed.' </blockquote><blockquote>+ 708 .                     </blockquote><blockquote>+ 709 .                     try:</blockquote><blockquote>+ 710 .                         lat_to_calculate = rec[&quot;LAT&quot;]</blockquote><blockquote>+ 711 .                     except:</blockquote><blockquote>+ 712 .                         errorflag=1</blockquote><blockquote>+ 713 .                         the_logfile = the_logfile +'\n'+'Reading the LAT-column in the.dbf-file failed.' </blockquote><blockquote>+ 714 .                     </blockquote><blockquote>+ 715 .                     #Set QDGC column (given that is the name) value with results of the functions above</blockquote><blockquote>+ 716 .                     try:</blockquote><blockquote>+ 717 .                         rec[&quot;QDGC&quot;] = qdgc(lon_to_calculate,lat_to_calculate,user_qdgc_level)</blockquote><blockquote>+ 718 .                     except:</blockquote><blockquote>+ 719 .                         errorflag=1</blockquote><blockquote>+ 720 .                         the_logfile = the_logfile +'\n'+'Writing the  QDGC-column in the.dbf-file failed.' </blockquote><blockquote>+ 721 .                 </blockquote><blockquote>+ 722 .                     counter = counter+1</blockquote><blockquote>+ 723 .                     </blockquote><blockquote>+ 724 .                     #Store the data</blockquote><blockquote>+ 725 .                     rec.store()</blockquote><blockquote>+ 726 .                     </blockquote><blockquote>+ 727 .                     #Empty the record and prepare for another round</blockquote><blockquote>+ 728 .                     del rec</blockquote><blockquote>+ 729 .             </blockquote><blockquote>+ 730 .             #Yeah... the DB-file should be closed. Polite thing to do.</blockquote><blockquote>+ 731 .             db.close()</blockquote><blockquote>+ 732 .             </blockquote><blockquote>+ 733 .             </blockquote><blockquote>+ 734 .             </blockquote><blockquote>+ 735 .             if errorflag == 0:</blockquote><blockquote>+ 736 .                 # Timer ends and then calculate the speed</blockquote><blockquote>+ 737 .                 t2                       = time.clock()</blockquote><blockquote>+ 738 .                 log_time                 = (t2-t1)</blockquote><blockquote>+ 739 .                 log_posts                = (counter)</blockquote><blockquote>+ 740 . 		if (log_time &lt;1 ):</blockquote><blockquote>+ 741 . 			log_conversionspersecond = 'many'</blockquote><blockquote>+ 742 . 		else:</blockquote><blockquote>+ 743 . 	                log_conversionspersecond = int(log_posts/log_time)</blockquote><blockquote>+ 744 .                 </blockquote><blockquote>+ 745 .                 the_logfile = the_logfile +'\n'+  'Conversion of %s posts done i %s seconds. This is %s conversions per second.\n\n' % (counter, log_time, log_conversionspersecond)</blockquote><blockquote>+ 746 .                 </blockquote><blockquote>+ 747 .                 # Prepare link address</blockquote><blockquote>+ 748 .                 user_link_outputfile = path_web + randomfolder  + '/out/' +  onefile</blockquote><blockquote>+ 749 .                 </blockquote><blockquote>+ 750 .                 user_link_logfile = path_web + randomfolder  + '/out/' + basename + '.log'</blockquote><blockquote>+ 751 .         </blockquote><blockquote>+ 752 .                 the_logfile = the_logfile +'\n'+'The link to your converted file is: %s\n' % user_link_outputfile</blockquote><blockquote>+ 753 .                 the_logfile = the_logfile +'\n'+'The link to a log file is: %s' % user_link_logfile</blockquote><blockquote>+ 754 . </blockquote><blockquote>+ 755 .             else:</blockquote><blockquote>+ 756 .                 the_logfile = the_logfile +'\n'+'The process failed. Check your .dbf-file and come back later. Feel free to contact us with suggestions on how to make this service better.'</blockquote><blockquote>+ 757 . </blockquote><blockquote>+ 758 .             # Send email with status and link to user            </blockquote><blockquote>+ 759 .             subject ='Conversion at %s' % time_for_job</blockquote><blockquote>+ 760 .             headers = &quot;From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n&quot; % (sender, [user_email], subject)</blockquote><blockquote>+ 761 .             message = headers+the_logfile</blockquote><blockquote>+ 762 .             </blockquote><blockquote>+ 763 .             server = smtplib.SMTP('smtp.somewhere.com')</blockquote><blockquote>+ 764 .             try:</blockquote><blockquote>+ 765 . </blockquote><blockquote>+ 766 . 		USER = 'youremail@test.com'</blockquote><blockquote>+ 767 . 		PWD = 'yourpassword'</blockquote><blockquote>+ 768 . 		server.ehlo()</blockquote><blockquote>+ 769 . 		server.starttls()</blockquote><blockquote>+ 770 . 		server.ehlo()</blockquote><blockquote>+ 771 . 		server.login(USER,PWD)</blockquote><blockquote>+ 772 . 		server.sendmail(USER, [user_email], message)</blockquote><blockquote>+ 773 . 		server.close()</blockquote><blockquote>+ 774 .                 print &quot;Successfully sent email&quot;</blockquote><blockquote>+ 775 .                 server.quit      </blockquote><blockquote>+ 776 .             except:</blockquote><blockquote>+ 777 .                 #damn!</blockquote><blockquote>+ 778 .                 the_logfile = the_logfile +'\n'+'The SMTP sendmail failed.' </blockquote><blockquote>+ 779 .     </blockquote><blockquote>+ 780 .             </blockquote><blockquote>+ 781 .             print the_logfile</blockquote><blockquote>+ 782 .             </blockquote><blockquote>+ 783 .             #Log user email, input file name and user comment in logfile</blockquote><blockquote>+ 784 .             #</blockquote><blockquote>+ 785 .             try:</blockquote><blockquote>+ 786 .                 # This will create a new file or **overwrite an existing file**.</blockquote><blockquote>+ 787 .                 f = open((folder_out + basename+'.log'), &quot;w&quot;)</blockquote><blockquote>+ 788 .                 try:</blockquote><blockquote>+ 789 .                     f.write(the_logfile) # Write a string to a file</blockquote><blockquote>+ 790 .                 </blockquote><blockquote>+ 791 .                 finally:</blockquote><blockquote>+ 792 .                     f.close()</blockquote><blockquote>+ 793 .             </blockquote><blockquote>+ 794 .             except IOError:</blockquote><blockquote>+ 795 .                 pass</blockquote><blockquote>+ 796 .     </blockquote><blockquote>+ 797 .             </blockquote><blockquote>+ 798 .             </blockquote><blockquote>+ 799 .             the_logfile = ''            </blockquote><blockquote>+ 800 .             </blockquote><blockquote>+ 801 .     currentfile = ''</blockquote><blockquote>+ 802 .     </blockquote><blockquote>+ 803 .     counter = 0</blockquote><blockquote>+ 804 . </blockquote><blockquote>+ 805 . (onefile)  </blockquote><blockquote>+ 806 .     </blockquote><blockquote>+ 807 .         # If one of the files in the list of files is a .dbf-file</blockquote><blockquote>+ 808 .         # then the party starts.</blockquote><blockquote>+ 809 .         if extension=='.dbf': </blockquote><blockquote>+ 810 .         </blockquote><blockquote>+ 811 .             </blockquote><blockquote>+ 812 .             time_for_job = now.strftime(&quot;%Y-%m-%d %H:%M&quot;)</blockquote><blockquote>+ 813 .             </blockquote><blockquote>+ 814 .             # Create a string which will later serve as a random folder name</blockquote><blockquote>+ 815 .             randomfolder = genRandomstring(20,string.letters)</blockquote><blockquote>+ 816 .             </blockquote><blockquote>+ 817 .             # Make the random folder. This is referred to as the user folder</blockquote><blockquote>+ 818 .             os.mkdir(folder_destination+randomfolder)</blockquote><blockquote>+ 819 .             </blockquote><blockquote>+ 820 .             # Create the user in folder</blockquote><blockquote>+ 821 .             os.mkdir(folder_destination+randomfolder+'/in')</blockquote><blockquote>+ 822 .             folder_in  = (folder_destination + randomfolder + '/in/')</blockquote><blockquote>+ 823 .             </blockquote><blockquote>+ 824 .             # Create the user out folder</blockquote><blockquote>+ 825 .             os.mkdir(folder_destination+'/'+randomfolder+'/out')</blockquote><blockquote>+ 826 .             folder_out = (folder_destination + randomfolder + '/out/')</blockquote><blockquote>+ 827 .             </blockquote><blockquote>+ 828 .             </blockquote><blockquote>+ 829 .             # Copy the original file to the in and out-folders</blockquote><blockquote>+ 830 .             shutil.copy (path_to_watch+ onefile, folder_in + onefile)</blockquote><blockquote>+ 831 .             shutil.move (path_to_watch+ onefile, folder_out + onefile)</blockquote><blockquote>+ 832 .             </blockquote><blockquote>+ 833 .             </blockquote><blockquote>+ 834 .             #move info-file generated by the script. Job information resides in this one.</blockquote><blockquote>+ 835 .             shutil.move (path_to_watch+ basename+'.info', folder_out + basename+'.info')</blockquote><blockquote>+ 836 .             </blockquote><blockquote>+ 837 .             #print  '\n'+ 'Data file (%s.dbf) has been moved.' % (basename)</blockquote><blockquote>+ 838 .             #print  '\n'+ 'Task file (%s.info) has been moved.' % (basename)</blockquote><blockquote>+ 839 .             </blockquote><blockquote>+ 840 .             </blockquote><blockquote>+ 841 .             #read input_file_name.info</blockquote><blockquote>+ 842 .             file_info = open(folder_out + basename+'.info', &quot;r&quot;)</blockquote><blockquote>+ 843 .             </blockquote><blockquote>+ 844 .             # Handle user email</blockquote><blockquote>+ 845 .             the_logfile        = the_logfile + '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n'</blockquote><blockquote>+ 846 .             the_logfile        = the_logfile + '-\n'</blockquote><blockquote>+ 847 .             user_email         = file_info.readline().rstrip('\n')</blockquote><blockquote>+ 848 .             the_logfile        = the_logfile + '- Client email      : %s' % (user_email)</blockquote><blockquote>+ 849 .             the_logfile        = the_logfile + '\n'</blockquote><blockquote>+ 850 .             </blockquote><blockquote>+ 851 .             # Handle user qdgc level</blockquote><blockquote>+ 852 .             user_qdgc_level    = int(file_info.readline())</blockquote><blockquote>+ 853 .             the_logfile        = the_logfile + '- Client QDGC level : %s' % (user_qdgc_level)</blockquote><blockquote>+ 854 .             the_logfile        = the_logfile + '\n'</blockquote><blockquote>+ 855 .             </blockquote><blockquote>+ 856 .             # Handle user comment</blockquote><blockquote>+ 857 .             user_comment       = file_info.readline().rstrip('\n')</blockquote><blockquote>+ 858 .             the_logfile        = the_logfile + '- User Comments     : %s\n' % (user_comment)</blockquote><blockquote>+ 859 .             the_logfile        = the_logfile + '-\n'</blockquote><blockquote>+ 860 .             </blockquote><blockquote>+ 861 .             # Logfile document time            </blockquote><blockquote>+ 862 .             the_logfile        = the_logfile + '- Job was submitted : %s.\n' % time_for_job</blockquote><blockquote>+ 863 .             the_logfile        = the_logfile + '-\n'</blockquote><blockquote>+ 864 .             the_logfile        = the_logfile + '- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n'</blockquote><blockquote>+ 865 .             </blockquote><blockquote>+ 866 .             #Close the info file</blockquote><blockquote>+ 867 .             file_info.close()</blockquote><blockquote>+ 868 .     </blockquote><blockquote>+ 869 .             </blockquote><blockquote>+ 870 .             db = dbf.Dbf(folder_out + onefile)</blockquote><blockquote>+ 871 .             </blockquote><blockquote>+ 872 .             # Convert file in folder out</blockquote><blockquote>+ 873 .             </blockquote><blockquote>+ 874 .             # Timer starts</blockquote><blockquote>+ 875 .             t1 = time.clock()            </blockquote><blockquote>+ 876 .             </blockquote><blockquote>+ 877 .             # set counter</blockquote><blockquote>+ 878 .             counter = 0</blockquote><blockquote>+ 879 .             </blockquote><blockquote>+ 880 .             for rec in db:</blockquote><blockquote>+ 881 .                 #Get values for longitude and latitude - given that their names are LON and LAT</blockquote><blockquote>+ 882 .                 if errorflag == 0:</blockquote><blockquote>+ 883 .                     try:</blockquote><blockquote>+ 884 .                         lon_to_calculate = rec[&quot;LON&quot;]</blockquote><blockquote>+ 885 .                     except:</blockquote><blockquote>+ 886 .                         errorflag=1</blockquote><blockquote>+ 887 .                         the_logfile = the_logfile +'\n'+'Reading the LON-column in the.dbf-file failed.' </blockquote><blockquote>+ 888 .                     </blockquote><blockquote>+ 889 .                     try:</blockquote><blockquote>+ 890 .                         lat_to_calculate = rec[&quot;LAT&quot;]</blockquote><blockquote>+ 891 .                     except:</blockquote><blockquote>+ 892 .                         errorflag=1</blockquote><blockquote>+ 893 .                         the_logfile = the_logfile +'\n'+'Reading the LAT-column in the.dbf-file failed.' </blockquote><blockquote>+ 894 .                     </blockquote><blockquote>+ 895 .                     #Set QDGC column (given that is the name) value with results of the functions above</blockquote><blockquote>+ 896 .                     try:</blockquote><blockquote>+ 897 .                         rec[&quot;QDGC&quot;] = qdgc(lon_to_calculate,lat_to_calculate,user_qdgc_level)</blockquote><blockquote>+ 898 .                     except:</blockquote><blockquote>+ 899 .                         errorflag=1</blockquote><blockquote>+ 900 .                         the_logfile = the_logfile +'\n'+'Writing the  QDGC-column in the.dbf-file failed.' </blockquote><blockquote>+ 901 .                 </blockquote><blockquote>+ 902 .                     counter = counter+1</blockquote><blockquote>+ 903 .                     </blockquote><blockquote>+ 904 .                     #Store the data</blockquote><blockquote>+ 905 .                     rec.store()</blockquote><blockquote>+ 906 .                     </blockquote><blockquote>+ 907 .                     #Empty the record and prepare for another round</blockquote><blockquote>+ 908 .                     del rec</blockquote><blockquote>+ 909 .             </blockquote><blockquote>+ 910 .             #Yeah... the DB-file should be closed. Polite thing to do.</blockquote><blockquote>+ 911 .             db.close()</blockquote><blockquote>+ 912 .             </blockquote><blockquote>+ 913 .             </blockquote><blockquote>+ 914 .             </blockquote><blockquote>+ 915 .             if errorflag == 0:</blockquote><blockquote>+ 916 .                 # Timer ends and then calculate the speed</blockquote><blockquote>+ 917 .                 t2                       = time.clock()</blockquote><blockquote>+ 918 .                 log_time                 = (t2-t1)</blockquote><blockquote>+ 919 .                 log_posts                = (counter)</blockquote><blockquote>+ 920 . 		if (log_time &lt;1 ):</blockquote><blockquote>+ 921 . 			log_conversionspersecond = 'many'</blockquote><blockquote>+ 922 . 		else:</blockquote><blockquote>+ 923 . 	                log_conversionspersecond = int(log_posts/log_time)</blockquote><blockquote>+ 924 .                 </blockquote><blockquote>+ 925 .                 the_logfile = the_logfile +'\n'+  'Conversion of %s posts done i %s seconds. This is %s conversions per second.\n\n' % (counter, log_time, log_conversionspersecond)</blockquote><blockquote>+ 926 .                 </blockquote><blockquote>+ 927 .                 # Prepare link address</blockquote><blockquote>+ 928 .                 user_link_outputfile = path_web + randomfolder  + '/out/' +  onefile</blockquote><blockquote>+ 929 .                 </blockquote><blockquote>+ 930 .                 user_link_logfile = path_web + randomfolder  + '/out/' + basename + '.log'</blockquote><blockquote>+ 931 .         </blockquote><blockquote>+ 932 .                 the_logfile = the_logfile +'\n'+'The link to your converted file is: %s\n' % user_link_outputfile</blockquote><blockquote>+ 933 .                 the_logfile = the_logfile +'\n'+'The link to a log file is: %s' % user_link_logfile</blockquote><blockquote>+ 934 . </blockquote><blockquote>+ 935 .             else:</blockquote><blockquote>+ 936 .                 the_logfile = the_logfile +'\n'+'The process failed. Check your .dbf-file and come back later. Feel free to contact us with suggestions on how to make this service better.'</blockquote><blockquote>+ 937 . </blockquote><blockquote>+ 938 .             # Send email with status and link to user            </blockquote><blockquote>+ 939 .             subject ='Conversion at %s' % time_for_job</blockquote><blockquote>+ 940 .             headers = &quot;From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n&quot; % (sender, [user_email], subject)</blockquote><blockquote>+ 941 .             message = headers+the_logfile</blockquote><blockquote>+ 942 .             </blockquote><blockquote>+ 943 .             server = smtplib.SMTP('smtp.somewhere.com')</blockquote><blockquote>+ 944 .             try:</blockquote><blockquote>+ 945 . </blockquote><blockquote>+ 946 . 		USER = 'youremail@test.com'</blockquote><blockquote>+ 947 . 		PWD = 'yourpassword'</blockquote><blockquote>+ 948 . 		server.ehlo()</blockquote><blockquote>+ 949 . 		server.starttls()</blockquote><blockquote>+ 950 . 		server.ehlo()</blockquote><blockquote>+ 951 . 		server.login(USER,PWD)</blockquote><blockquote>+ 952 . 		server.sendmail(USER, [user_email], message)</blockquote><blockquote>+ 953 . 		server.close()</blockquote><blockquote>+ 954 .                 print &quot;Successfully sent email&quot;</blockquote><blockquote>+ 955 .                 server.quit      </blockquote><blockquote>+ 956 .             except:</blockquote><blockquote>+ 957 .                 #damn!</blockquote><blockquote>+ 958 .                 the_logfile = the_logfile +'\n'+'The SMTP sendmail failed.' </blockquote><blockquote>+ 959 .     </blockquote><blockquote>+ 960 .             </blockquote><blockquote>+ 961 .             print the_logfile</blockquote><blockquote>+ 962 .             </blockquote><blockquote>+ 963 .             #Log user email, input file name and user comment in logfile</blockquote><blockquote>+ 964 .             #</blockquote><blockquote>+ 965 .             try:</blockquote><blockquote>+ 966 .                 # This will create a new file or **overwrite an existing file**.</blockquote><blockquote>+ 967 .                 f = open((folder_out + basename+'.log'), &quot;w&quot;)</blockquote><blockquote>+ 968 .                 try:</blockquote><blockquote>+ 969 .                     f.write(the_logfile) # Write a string to a file</blockquote><blockquote>+ 970 .                 </blockquote><blockquote>+ 971 .                 finally:</blockquote><blockquote>+ 972 .                     f.close()</blockquote><blockquote>+ 973 .             </blockquote><blockquote>+ 974 .             except IOError:</blockquote><blockquote>+ 975 .                 pass</blockquote><blockquote>+ 976 .     </blockquote><blockquote>+ 977 .             </blockquote><blockquote>+ 978 .             </blockquote><blockquote>+ 979 .             the_logfile = ''            </blockquote><blockquote>+ 980 .             </blockquote><blockquote>+ 981 .     currentfile = ''</blockquote><blockquote>+ 982 .     </blockquote><blockquote>+ 983 .     counter = 0</blockquote><blockquote>+ </pre></div><br /></blockquote>]]></description>
            <pubDate>Mon, 14 Dec 2009 20:40:36 +0100</pubDate>
        </item>
        <item>
            <title>lonlat2qdgc_helptext</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=lonlat2qdgc_helptext</link>
            <description><![CDATA[<blockquote>-     Countless Calculate DBF Conversion Utility <del class="diffchar deleted" style="color: red; text-decoration: none"><strong>-</strong></del> Version 0.<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>5</strong></del>&lt;br /&gt;</blockquote><blockquote>+     Countless Calculate DBF Conversion Utility<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>&lt;br /&gt;  </strong></ins>  Version 0.<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>6 - 01.12.2009</strong></ins>&lt;br /&gt;<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    &lt;br /&gt;CONTACT&lt;br /&gt;    Ragnvald Larsen: ragnvald@mindland.com&lt;br /&gt;    </strong></ins></blockquote><blockquote>-     lonlat2qdgc.exe&lt;br /&gt;</blockquote><blockquote>+     lonlat2qdgc.exe<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong> </strong></ins>&lt;br /&gt;<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    &lt;br /&gt;INSTALL&lt;br /&gt;    This is a compiled Python 2.5 program. To run it you are &lt;br /&gt;    advised to place the file lonlat2qdgc.exe in a separate&lt;br /&gt;    folder. C:\bin\lonlat2qdgc\ would be swell. Then open&lt;br /&gt;    the command line tool in windows and run the file&lt;br /&gt;    according to the SYNTAX below.&lt;br /&gt;    </strong></ins></blockquote><blockquote>-     The program accepts a .dbf file as input and modifies the</blockquote><blockquote>+     The program accepts a .dbf file as input and modifies the<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong> </strong></ins></blockquote><blockquote>- </blockquote><blockquote>+ <ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    </strong></ins></blockquote><blockquote>-     http://www.<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>min</strong></del>d<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>land.</strong></del>co<del class="diffchar deleted" style="color: red; text-decoration: none"><strong>m/countless/</strong></del>&lt;br /&gt;</blockquote><blockquote>+     http://www.<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>q</strong></ins>d<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>g</strong></ins>c<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>.</strong></ins>o<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>rg</strong></ins>&lt;br /&gt;<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    </strong></ins></blockquote><blockquote>- &lt;br /&gt;SYNTAX</blockquote><blockquote>+ <ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    </strong></ins>&lt;br /&gt;SYNTAX<ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    </strong></ins></blockquote><blockquote>- </blockquote><blockquote>+ <ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>        </strong></ins></blockquote><blockquote>- </blockquote><blockquote>+ <ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    </strong></ins></blockquote><blockquote>- </blockquote><blockquote>+ <ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    </strong></ins></blockquote><blockquote>- </blockquote><blockquote>+ <ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    </strong></ins></blockquote><blockquote>- </blockquote><blockquote>+ <ins class="diffchar inserted" style="color: green; text-decoration: none"><strong>    </strong></ins></blockquote>]]></description>
            <pubDate>Tue, 01 Dec 2009 15:22:20 +0100</pubDate>
        </item>
        <item>
            <title>SandBox</title>
            <link>http://www.qdgc.org/tikiwiki/tiki-index.php?page=SandBox</link>
            <description></description>
            <pubDate>Mon, 06 Jul 2009 11:58:55 +0100</pubDate>
        </item>
    </channel>
</rss>
