<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[geeknam's blog]]></title>
  <link href="http://blog.namis.me/atom.xml" rel="self"/>
  <link href="http://blog.namis.me/"/>
  <updated>2012-06-27T03:16:31+10:00</updated>
  <id>http://blog.namis.me/</id>
  <author>
    <name><![CDATA[Ngo Minh Nam]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Fibonacci with caching]]></title>
    <link href="http://blog.namis.me/2012/05/29/fibonacci-with-caching/"/>
    <updated>2012-05-29T19:21:00+10:00</updated>
    <id>http://blog.namis.me/2012/05/29/fibonacci-with-caching</id>
    <content type="html"><![CDATA[<p>Here is my attempt to compare the performance of <code>fibonacci</code> with different ways of caching the results.
First implementation uses memoization decorator whereas the second one makes use of <code>defaultdict</code> for caching. You can read my previous blog <a href="http://blog.namis.me/2012/02/15/python-caching-using-defaultdict/">post</a> on caching with <code>defaultdict</code>.</p>

<figure class='code'><figcaption><span>Fibonacci 1</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">timeit</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">memoize</span><span class="p">(</span><span class="n">function</span><span class="p">):</span>
</span><span class='line'>    <span class="n">memo</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">args</span> <span class="ow">in</span> <span class="n">memo</span><span class="p">:</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">memo</span><span class="p">[</span><span class="n">args</span><span class="p">]</span>
</span><span class='line'>        <span class="k">else</span><span class="p">:</span>
</span><span class='line'>            <span class="n">rv</span> <span class="o">=</span> <span class="n">function</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
</span><span class='line'>            <span class="n">memo</span><span class="p">[</span><span class="n">args</span><span class="p">]</span> <span class="o">=</span> <span class="n">rv</span>
</span><span class='line'>            <span class="k">return</span> <span class="n">rv</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="n">wrapper</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nd">@memoize</span>
</span><span class='line'><span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">num</span><span class="p">):</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="mi">0</span>
</span><span class='line'>    <span class="k">elif</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="mi">1</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">fib</span><span class="p">(</span><span class="n">num</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">num</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">t</span> <span class="o">=</span> <span class="n">timeit</span><span class="o">.</span><span class="n">Timer</span><span class="p">(</span><span class="n">stmt</span><span class="o">=</span><span class="s">&quot;fib(150)&quot;</span><span class="p">,</span> <span class="n">setup</span><span class="o">=</span><span class="s">&quot;from __main__ import fib&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">print</span> <span class="n">t</span><span class="o">.</span><span class="n">timeit</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Approximate Result: 0.482068061829 seconds</span>
</span></code></pre></td></tr></table></div></figure>


<!-- more -->




<figure class='code'><figcaption><span>Fibonacci 2</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">timeit</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FibCache</span><span class="p">(</span><span class="n">defaultdict</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fn</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">fn</span> <span class="o">=</span> <span class="n">fn</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__missing__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">num</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="p">[</span><span class="n">num</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fn</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">num</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">cache</span><span class="p">):</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="mi">0</span>
</span><span class='line'>    <span class="k">elif</span> <span class="n">num</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="mi">1</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">cache</span><span class="p">[</span><span class="n">num</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">cache</span><span class="p">[</span><span class="n">num</span> <span class="o">-</span> <span class="mi">2</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">fib_cache</span> <span class="o">=</span> <span class="n">FibCache</span><span class="p">(</span><span class="n">fib</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">t</span> <span class="o">=</span> <span class="n">timeit</span><span class="o">.</span><span class="n">Timer</span><span class="p">(</span><span class="n">stmt</span><span class="o">=</span><span class="s">&quot;fib_cache[150]&quot;</span><span class="p">,</span> <span class="n">setup</span><span class="o">=</span><span class="s">&quot;from __main__ import fib_cache&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">print</span> <span class="n">t</span><span class="o">.</span><span class="n">timeit</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Approximate Result: 0.268569946289 seconds</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>Note</strong>: Default number of loops for timeit is 1000000</p>

<p>If you&#8217;re looking to hire a Python programmer, this would be a great programming question. Challenge all the candidates to write the fastest fibonacci function. Hire the one whose code is the fastest.</p>

<p>Feel free to suggest better/faster implementations if you know any, I&#8217;d be glad to add more to the collection.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Writing unit tests for Django middleware]]></title>
    <link href="http://blog.namis.me/2012/05/13/writing-unit-tests-for-django-middleware/"/>
    <updated>2012-05-13T02:21:00+10:00</updated>
    <id>http://blog.namis.me/2012/05/13/writing-unit-tests-for-django-middleware</id>
    <content type="html"><![CDATA[<p>Sometimes, it is a pain in the ass to write tests for Django apps (even though Django provides some pretty awesome testing tools out of box). One of the scenarios is testing middleware. Let&#8217;s take a look at this middleware.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">.cart</span> <span class="kn">import</span> <span class="n">Cart</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CartMiddleware</span><span class="p">:</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">process_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
</span><span class='line'>        <span class="sd">&#39;&#39;&#39;Load the current cart from the session, or create a new one&#39;&#39;&#39;</span>
</span><span class='line'>        <span class="n">cart</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">session</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;cart&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">cart</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
</span><span class='line'>            <span class="n">cart</span> <span class="o">=</span> <span class="n">Cart</span><span class="p">()</span>
</span><span class='line'>        <span class="k">else</span><span class="p">:</span>
</span><span class='line'>            <span class="n">cart</span> <span class="o">=</span> <span class="n">Cart</span><span class="p">(</span><span class="o">**</span><span class="n">cart</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="nb">setattr</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s">&#39;cart&#39;</span><span class="p">,</span> <span class="n">cart</span><span class="p">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">None</span>
</span></code></pre></td></tr></table></div></figure>


<!-- more -->


<p><strong>What the middleware does:</strong><br/>
- It gets attributes/values of the cart from the session<br/>
- It creates a cart with those unpacked arguments or creates a fresh cart and attaches this cart to the request object.</p>

<p><strong>Now, let&#8217;s analyze what needs to be tested:</strong><br/>
1. Assert that if the cart exists in the session, it should be set as an attribute of the request<br/>
2. Assert that if the cart doesn&#8217;t exist in the session, a new cart is created and attached to the request object<br/>
3. Assert that all attributes of the cart can be accessed after the cart is attached to the request object</p>

<p><strong>How about dependencies? What do we need in order to write this test?</strong><br/>
- CartMiddleware class (this can be easily imported)<br/>
- <code>request</code> object as an argument in process_request(). This one is hard to obtain, and since we are writing a unit test, let&#8217;s just mock it.</p>

<p>We are now ready to write the test</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">mock</span> <span class="kn">import</span> <span class="n">Mock</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">.cart</span> <span class="kn">import</span> <span class="n">CartMiddleware</span><span class="p">,</span> <span class="n">Cart</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">CartMiddlewareTest</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">cm</span> <span class="o">=</span> <span class="n">CartMiddleware</span><span class="p">()</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">request</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="p">{}</span>
</span></code></pre></td></tr></table></div></figure>


<p>This sets up an instance of CartMiddleware and mocks a request. I&#8217;m using Michael Foord&#8217;s <code>mock</code> library to assist me with this. Since we know <code>session</code> is a dictionary like object, we can mock it with an empty dictionary for now.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_process_request_without_cart</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cm</span><span class="o">.</span><span class="n">process_request</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">),</span> <span class="bp">None</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertIsInstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">cart</span><span class="p">,</span> <span class="n">Cart</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">test_process_request_with_cart</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;postcode&#39;</span><span class="p">:</span> <span class="s">&#39;3050&#39;</span><span class="p">}</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;cart&#39;</span><span class="p">:</span> <span class="n">data</span><span class="p">}</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cm</span><span class="o">.</span><span class="n">process_request</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">),</span> <span class="bp">None</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertIsInstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">cart</span><span class="p">,</span> <span class="n">Cart</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertEqual</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">cart</span><span class="o">.</span><span class="n">postcode</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="s">&#39;postcode&#39;</span><span class="p">])</span>
</span></code></pre></td></tr></table></div></figure>


<p><strong>The first test asserts that (without a cart in the session):</strong><br/>
- process_request returns None<br/>
- Cart object has been attached to request as an attribute</p>

<p><strong>The second test asserts that (with a cart in the session):</strong><br/>
- process_request returns None<br/>
- Dictionary containing cart attributes in <code>session</code> is unpacked and used to create a Cart object.<br/>
- The cart attribute (postcode in this case) can be accessed</p>

<p><strong>Conclusion</strong><br/>
As you could see, I didn&#8217;t have to use <code>django.test.client.Client</code> to create requests, responses or sessions. When writing unit tests, one shouldn&#8217;t care much about creating a precise dependency because, eventually what needs to be tested is the behaviour of the code and not the dependency itself. Therefore, it is more advisable to mock those dependencies in order to satisfy the conditions of the unit of code we test.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Burn your fixtures, use model factories]]></title>
    <link href="http://blog.namis.me/2012/04/21/burn-your-fixtures/"/>
    <updated>2012-04-21T16:46:00+10:00</updated>
    <id>http://blog.namis.me/2012/04/21/burn-your-fixtures</id>
    <content type="html"><![CDATA[<p>This blog post is inspired by one of the talks in PyCon US 2012 by <a href="http://twitter.com/carljm">Carl Meyer</a> named <a href="http://pyvideo.org/video/699/testing-and-django">Testing and Django</a> in which he discusssed the guidelines for writing good tests.</p>

<p>After watching the whole talk, I realised what I&#8217;ve been doing is all wrong. The fact that tests I write run within minutes shows how terrible my unit-test-fu is. Using fixtures was a really bad idea. Each test case I wrote would load some fixtures to setup necessary dependencies. Sometimes, this creates a problem when the model has been redesigned. The fixtures would have to be edited due to the change of the model otherwise they won&#8217;t be installed properly.</p>

<p>Instead of using fixtures, Carl introduced <code>model factories</code> which would create a model instance with default values. Of course, you will have a flexibility to change those default values to suit each of your test because naturally, when you test a behaviour of a class, you definitely need it to be in different conditions.</p>

<!-- more -->


<p>Here is an example of a model factory that was used in the talk:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">create_profile</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span class='line'>    <span class="n">defaults</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="s">&quot;likes_cheese&quot;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
</span><span class='line'>        <span class="s">&quot;age&quot;</span><span class="p">:</span> <span class="mi">32</span><span class="p">,</span>
</span><span class='line'>        <span class="s">&quot;address&quot;</span><span class="p">:</span> <span class="s">&quot;3815 Brookside Dr&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="s">&quot;user&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">defaults</span><span class="p">:</span>
</span><span class='line'>        <span class="n">defaults</span><span class="p">[</span><span class="s">&quot;user&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">create_user</span><span class="p">()</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">Profile</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="o">**</span><span class="n">defaults</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And this is how you could use it in the test:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">test_can_vote</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&quot;&quot;&quot;A user age 18+ can vote in the US.&quot;&quot;&quot;</span>
</span><span class='line'>    <span class="n">profile</span> <span class="o">=</span> <span class="n">create_profile</span><span class="p">(</span><span class="n">age</span><span class="o">=</span><span class="mi">18</span><span class="p">)</span>
</span><span class='line'>    <span class="bp">self</span><span class="o">.</span><span class="n">assertTrue</span><span class="p">(</span><span class="n">profile</span><span class="o">.</span><span class="n">can_vote</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>This approach solves the problem with maintaining the fixtures to suit your model design. If your model changes, the only thing you have to edit is the default values of the factory. Therefore <code>model factories</code> are way easier to maintain. If you need a large data set, you could easily write a for loop that wraps the model factory. So burn all your fixture right now !!!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Django custom email form field for Email Pie]]></title>
    <link href="http://blog.namis.me/2012/03/27/django-custom-email-form-field-for-email-pie/"/>
    <updated>2012-03-27T01:14:00+11:00</updated>
    <id>http://blog.namis.me/2012/03/27/django-custom-email-form-field-for-email-pie</id>
    <content type="html"><![CDATA[<p><span class='pullquote-right' data-pullquote='Email Pie is a wonderful little JSON API that gives you a simple way to validate email addresses. We&#8217;ll let you know if that email address is legit or not.'>
As you know Django&#8217;s <code>forms.EmailField()</code> is capable of validating email addresses but what if you wanted to validate the existence of a particular email address? I&#8217;ve found a pretty neat solution for that, it&#8217;s called <a href="http://emailpie.com/">Email Pie</a>.
Email Pie is a wonderful little JSON API that gives you a simple way to validate email addresses. We&#8217;ll let you know if that email address is legit or not.. You could either use the service hosted on emailpie.com or run your own instance (it&#8217;s open source). In this post, I&#8217;m going to show you how to write a custom form field that makes use of Email Pie.</p>

<!-- more -->


<p>Make sure you pip install <code>requests</code> and <code>simplejson</code> before proceeding. Now create a <code>fields.py</code> file with the following content:</p>

<figure class='code'><figcaption><span>fields.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">requests</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">simplejson</span>
</span><span class='line'>
</span><span class='line'><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ValidationError</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">EMAIL_PIE_HOST</span> <span class="o">=</span> <span class="s">&#39;http://emailpie.com&#39;</span>  <span class="c"># change this if you run your own instance</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">validate_email_pie</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span class='line'>    <span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;email&#39;</span><span class="p">:</span> <span class="n">value</span><span class="p">}</span>
</span><span class='line'>    <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;</span><span class="si">%s</span><span class="s">/v1/check&#39;</span> <span class="o">%</span> <span class="n">EMAIL_PIE_HOST</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span>
</span><span class='line'>    <span class="n">response</span> <span class="o">=</span> <span class="n">simplejson</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="ow">not</span> <span class="n">response</span><span class="p">[</span><span class="s">&#39;success&#39;</span><span class="p">]:</span>
</span><span class='line'>        <span class="k">raise</span> <span class="n">ValidationError</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="s">&#39;errors&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s">&#39;message&#39;</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">EmailPieField</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">EmailField</span><span class="p">):</span>
</span><span class='line'>    <span class="n">default_validators</span> <span class="o">=</span> <span class="p">[</span><span class="n">validate_email_pie</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>validate_email_pie</code> method makes GET request to Email Pie and gets back a response. The service checks for email format and mx records, it also catches misspellings (you can get it with <code>response['didyoumean']</code>). <code>validate_email_pie</code> raises <code>ValidationError</code> if the service detects an invalid email address. Now in your forms you can use <code>EmailPieField</code> like this:</p>

<figure class='code'><figcaption><span>forms.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">.fields</span> <span class="kn">import</span> <span class="n">EmailPieField</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">ContactForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span>
</span><span class='line'>    <span class="n">name</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">CharField</span><span class="p">()</span>
</span><span class='line'>    <span class="n">email</span> <span class="o">=</span> <span class="n">EmailPieField</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>For those interested, here are some tests for the field :)</p>

<figure class='code'><figcaption><span>tests.py</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.core.exceptions</span> <span class="kn">import</span> <span class="n">ValidationError</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">.fields</span> <span class="kn">import</span> <span class="n">EmailPieField</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">EmailPieFieldTest</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_invalid_email</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">email_field</span> <span class="o">=</span> <span class="n">EmailPieField</span><span class="p">()</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">ValidationError</span><span class="p">,</span> <span class="n">email_field</span><span class="o">.</span><span class="n">clean</span><span class="p">,</span> <span class="s">&#39;email@totest&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_invalid_mx</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">email_field</span> <span class="o">=</span> <span class="n">EmailPieField</span><span class="p">()</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertRaises</span><span class="p">(</span><span class="n">ValidationError</span><span class="p">,</span> <span class="n">email_field</span><span class="o">.</span><span class="n">clean</span><span class="p">,</span> <span class="s">&#39;email@totest.com&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_valid_email</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">email_field</span> <span class="o">=</span> <span class="n">EmailPieField</span><span class="p">()</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">assertEquals</span><span class="p">(</span><span class="n">email_field</span><span class="o">.</span><span class="n">clean</span><span class="p">(</span><span class="s">&#39;nam@namis.me&#39;</span><span class="p">),</span> <span class="s">&#39;nam@namis.me&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p></span></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Python class factory]]></title>
    <link href="http://blog.namis.me/2012/02/16/python-class-factory/"/>
    <updated>2012-02-16T12:05:00+11:00</updated>
    <id>http://blog.namis.me/2012/02/16/python-class-factory</id>
    <content type="html"><![CDATA[<p>Today&#8217;s post will be on factory design pattern in Python. You can read more about it in <a href="http://en.wikipedia.org/wiki/Factory_method_pattern">Wiki</a>.
This design pattern allows you to create objects without specifying the exact class of object that will be created. Let&#8217;s say, you want to create an object based on a provided string.</p>

<p>Here are some classes. Both of them are pets. We want to dynamically create a pet from one of those classes based on a string.</p>

<!-- more -->


<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">Pony</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">hp</span> <span class="o">=</span> <span class="mi">100</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">magic_power</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Attack opponent with super powers</span>
</span><span class='line'>        <span class="k">pass</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">heal</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Increase hp (health point)</span>
</span><span class='line'>        <span class="k">pass</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Snake</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># Blah blah same as Pony</span>
</span><span class='line'>    <span class="k">pass</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s write a factory method to make this happen:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">def</span> <span class="nf">create_class</span><span class="p">(</span><span class="n">pet_class_name</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># pet_class_name decides what class will be returned</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">pet_class_name</span> <span class="ow">is</span> <span class="s">&#39;pony&#39;</span><span class="p">:</span>
</span><span class='line'>        <span class="k">class</span> <span class="nc">InheritedClass</span><span class="p">(</span><span class="n">Pony</span><span class="p">):</span>
</span><span class='line'>            <span class="c"># You can add additional methods or attributes if needed</span>
</span><span class='line'>            <span class="k">pass</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">InheritedClass</span>
</span><span class='line'>    <span class="k">elif</span> <span class="n">pet_class_name</span> <span class="ow">is</span> <span class="s">&#39;snake&#39;</span><span class="p">:</span>
</span><span class='line'>        <span class="c"># Or you can return the exact class</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">Snake</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Create MyPet from a string</span>
</span><span class='line'><span class="n">MyPet</span> <span class="o">=</span> <span class="n">create_class</span><span class="p">(</span><span class="s">&#39;pony&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># MyPet is now a subclass of Pony</span>
</span><span class='line'><span class="c"># It inherits everything from Pony</span>
</span><span class='line'><span class="n">django</span> <span class="o">=</span> <span class="n">MyPet</span><span class="p">(</span><span class="s">&#39;django&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Kaboom !!!</span>
</span><span class='line'><span class="n">django</span><span class="o">.</span><span class="n">magic_power</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Python caching using defaultdict]]></title>
    <link href="http://blog.namis.me/2012/02/15/python-caching-using-defaultdict/"/>
    <updated>2012-02-15T10:46:00+11:00</updated>
    <id>http://blog.namis.me/2012/02/15/python-caching-using-defaultdict</id>
    <content type="html"><![CDATA[<p>Today, I&#8217;ve learnt about <code>defaultdict</code> container from my colleague, who uses it for caching. <code>defaultdict</code> container is part of <code>collections</code> module which provides high-performance container datatypes.
You can find more about it <a href="http://docs.python.org/library/collections.html#collections.defaultdict">here</a>. <strong>Note</strong>: New in version 2.5.</p>

<!-- more -->


<p>Let&#8217;s see the code without caching mechanism:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">csv</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">models</span> <span class="kn">import</span> <span class="n">Pony</span><span class="p">,</span> <span class="n">PonySwag</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Getting some data from csv file</span>
</span><span class='line'><span class="n">swags</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictReader</span><span class="p">(</span><span class="s">&#39;pony_swag.csv&#39;</span><span class="p">,</span> <span class="s">&#39;rU&#39;</span><span class="p">),</span> <span class="n">dialect</span><span class="o">=</span><span class="s">&#39;excel&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span> <span class="n">swag</span> <span class="ow">in</span> <span class="n">swags</span><span class="p">:</span>
</span><span class='line'>    <span class="c"># Get or create a pony</span>
</span><span class='line'>    <span class="n">pony</span> <span class="o">=</span> <span class="n">Pony</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span>
</span><span class='line'>        <span class="n">name</span><span class="o">=</span><span class="n">swag</span><span class="p">[</span><span class="s">&#39;pony_name&#39;</span><span class="p">]</span>
</span><span class='line'>    <span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Create pony swag which belongs to a pony</span>
</span><span class='line'>    <span class="n">PonySwag</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span>
</span><span class='line'>        <span class="n">name</span><span class="o">=</span><span class="n">swag</span><span class="p">[</span><span class="s">&#39;swag_name&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="n">power</span><span class="o">=</span><span class="n">swag</span><span class="p">[</span><span class="s">&#39;swag_power&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="n">pony</span><span class="o">=</span><span class="n">pony</span>
</span><span class='line'>    <span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>In this scenario, for every entry in csv, the code hits the database to get a pony (based on the name) to assign it to a corresponding swag. Now if we cache the created ponies, we would not have
to query the database anymore.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">csv</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">models</span> <span class="kn">import</span> <span class="n">Pony</span><span class="p">,</span> <span class="n">PonySwag</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">PoniesCache</span><span class="p">(</span><span class="n">defaultdict</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># If dict lookup fails this will be called</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__missing__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Insert a pony in cache dict and return it</span>
</span><span class='line'>        <span class="n">pony</span> <span class="o">=</span> <span class="n">Pony</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">key</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'>        <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">pony</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">pony</span>
</span><span class='line'>
</span><span class='line'><span class="n">ponies_cache</span> <span class="o">=</span> <span class="n">PoniesCache</span><span class="p">()</span>
</span><span class='line'><span class="c"># Getting some data from csv file</span>
</span><span class='line'><span class="n">swags</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictReader</span><span class="p">(</span><span class="s">&#39;pony_swag.csv&#39;</span><span class="p">,</span> <span class="s">&#39;rU&#39;</span><span class="p">),</span> <span class="n">dialect</span><span class="o">=</span><span class="s">&#39;excel&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span> <span class="n">swag</span> <span class="ow">in</span> <span class="n">swags</span><span class="p">:</span>
</span><span class='line'>    <span class="n">pony</span> <span class="o">=</span> <span class="n">ponies_cache</span><span class="p">[</span><span class="n">swag</span><span class="p">[</span><span class="s">&#39;pony_name&#39;</span><span class="p">]]</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Create pony swag which belongs to a pony</span>
</span><span class='line'>    <span class="n">PonySwag</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">get_or_create</span><span class="p">(</span>
</span><span class='line'>        <span class="n">name</span><span class="o">=</span><span class="n">swag</span><span class="p">[</span><span class="s">&#39;swag_name&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="n">power</span><span class="o">=</span><span class="n">swag</span><span class="p">[</span><span class="s">&#39;swag_power&#39;</span><span class="p">],</span>
</span><span class='line'>        <span class="n">pony</span><span class="o">=</span><span class="n">pony</span>
</span><span class='line'>    <span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you might have read, <code>defaultdict</code> is a subclass of <code>dict</code> and it overrides a method called <code>__missing__</code>.<br/>
<code>__missing__</code> is called by the <code>__getitem__()</code> method of the dict class when the requested key is not found (when <code>swag['pony_name']</code> value is not found in ponies_cache).
In our case, we override <code>__missing__</code> to create a pony and store it in cache (if it doesn&#8217;t exist yet) and return it. This results in a pony being inserted in the dictionary with a key <code>swag['pony_name']</code>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Python strptime is not thread-safe]]></title>
    <link href="http://blog.namis.me/2012/02/14/python-strptime-is-not-thread-safe/"/>
    <updated>2012-02-14T15:30:00+11:00</updated>
    <id>http://blog.namis.me/2012/02/14/python-strptime-is-not-thread-safe</id>
    <content type="html"><![CDATA[<p>When using Python to automate your work, threading is one thing you need to know of. I&#8217;ve got into a problem with threading when parsing time. To be exact: <code>datetime.datetime.strptime()</code> function was not thread-safe. Luckily, I found a solution on <a href="http://stackoverflow.com/questions/4625149/fixed-strptime-exception-with-thread-lock-but-slows-down-the-program">StackOverflow</a>.</p>

<!-- more -->


<p>This is how the problem occurred:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">threading</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">parse_time</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># Parse time with strptime()</span>
</span><span class='line'>    <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">value</span><span class="p">],</span> <span class="s">&quot;%Y-%m-</span><span class="si">%d</span><span class="s"> %H:%M:%S.</span><span class="si">%f</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">parse_time</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
</span><span class='line'><span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>Fixing it was pretty straightforward. Just make a dummy call on strptime() before creating a thread:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="s">&quot;2011-04-05 18:40:58.525996&quot;</span><span class="p">,</span> <span class="s">&quot;%Y-%m-</span><span class="si">%d</span><span class="s"> %H:%M:%S.</span><span class="si">%f</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">t</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">format_time</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="p">(</span><span class="n">some_values</span><span class="p">))</span>
</span><span class='line'><span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Regenerating Google's ClientLogin AuthToken in Django]]></title>
    <link href="http://blog.namis.me/2012/02/14/regenerating-googles-clientlogin-authtoken-in-django/"/>
    <updated>2012-02-14T12:47:00+11:00</updated>
    <id>http://blog.namis.me/2012/02/14/regenerating-googles-clientlogin-authtoken-in-django</id>
    <content type="html"><![CDATA[<p>If your application makes use of Google API, you will most likely have to deal with AuthToken expiry (unless you use oAuth). As far as I know, AuthToken generated with ClientLogin authorization expires after 2 weeks. Therefore, it&#8217;s good to have a solution to auto regenerate it. First of all, create a model that stores the token and the last updated day.</p>

<!-- more -->




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">AuthToken</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span><span class='line'>    <span class="n">token</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">TextField</span><span class="p">()</span>
</span><span class='line'>    <span class="n">last_updated</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">DateTimeField</span><span class="p">(</span><span class="n">auto_now_add</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">token_update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Check if the token&#39;s lifespan is more than n days (n=1 in this case)</span>
</span><span class='line'>        <span class="c"># You can adjust n value to whatever you want</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">if</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">last_updated</span> <span class="o">&gt;</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
</span><span class='line'>            <span class="k">return</span> <span class="bp">True</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">False</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now let&#8217;s write a function that regenerates AuthToken and saves it back to database.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">models</span> <span class="kn">import</span> <span class="n">AuthToken</span>
</span><span class='line'>
</span><span class='line'><span class="n">CLIENT_LOGIN_URL</span> <span class="o">=</span> <span class="s">&#39;https://www.google.com/accounts/ClientLogin&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">regenerate_authtoken</span><span class="p">():</span>
</span><span class='line'>    <span class="n">auth_token</span> <span class="o">=</span> <span class="n">AuthToken</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">auth_token</span><span class="o">.</span><span class="n">token_update</span><span class="p">():</span>
</span><span class='line'>        <span class="n">data</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">urlencode</span><span class="p">(</span>
</span><span class='line'>            <span class="p">{</span>
</span><span class='line'>                <span class="s">&#39;Email&#39;</span><span class="p">:</span> <span class="s">&#39;youremail@gmail.com&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s">&#39;Passwd&#39;</span><span class="p">:</span> <span class="s">&#39;yourpassword&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s">&#39;service&#39;</span><span class="p">:</span> <span class="s">&#39;service_name&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s">&#39;accountType&#39;</span><span class="p">:</span> <span class="s">&#39;GOOGLE&#39;</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>        <span class="n">req</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="n">CLIENT_LOGIN_URL</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>        <span class="n">resp</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">req</span><span class="p">)</span>
</span><span class='line'>        <span class="n">resp_body</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">resp_dict</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span>
</span><span class='line'>            <span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;=&#39;</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">resp_body</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span> <span class="k">if</span> <span class="n">x</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>        <span class="n">auth_token</span><span class="o">.</span><span class="n">token</span> <span class="o">=</span> <span class="n">resp_dict</span><span class="p">[</span><span class="s">&#39;Auth&#39;</span><span class="p">]</span>
</span><span class='line'>        <span class="n">auth_token</span><span class="o">.</span><span class="n">save</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>With this approach you would have to call <code>regenerate_authtoken()</code> every time you make API requests. Let me know if you have a better solution.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[More on Django FormView]]></title>
    <link href="http://blog.namis.me/2012/02/13/more-on-django-formview/"/>
    <updated>2012-02-13T21:49:00+11:00</updated>
    <id>http://blog.namis.me/2012/02/13/more-on-django-formview</id>
    <content type="html"><![CDATA[<p><span class='pullquote-right' data-pullquote='Django’s generic views were developed to take away the monotony of repeating certain patterns again and again'>
I&#8217;ve been trying to limit myself to use class based generic views as much as possible. Django’s generic views were developed to take away the monotony of repeating certain patterns again and again. Some generics views are properly documented (like ListView and DetailView), however I wanted to make use of FormView to process my forms. Unfortunately, there were no FormView examples provided. So here it is.</p>

<!-- more -->




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django.views</span> <span class="kn">import</span> <span class="n">generic</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">EmailPreferenceView</span><span class="p">(</span><span class="n">generic</span><span class="o">.</span><span class="n">FormView</span><span class="p">):</span>
</span><span class='line'>    <span class="n">form_class</span> <span class="o">=</span> <span class="n">EmailPreferenceForm</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># You can access url variables from kwargs</span>
</span><span class='line'>        <span class="c"># url: /email_preferences/geeknam &gt; kwargs[&#39;username&#39;] = &#39;geeknam&#39;</span>
</span><span class='line'>        <span class="c"># Assign to self.subscriber to be used later</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">subscriber</span> <span class="o">=</span> <span class="n">get_subscriber</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;username&#39;</span><span class="p">])</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Process view when the form gets POSTed</span>
</span><span class='line'>        <span class="k">pass</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get_initial</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Populate ticks in BooleanFields</span>
</span><span class='line'>        <span class="n">initial</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">subscriber</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
</span><span class='line'>            <span class="n">initial</span><span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">value_id</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">initial</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get_form</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form_class</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Initialize the form with initial values and the subscriber object</span>
</span><span class='line'>        <span class="c"># to be used in EmailPreferenceForm for populating fields</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">form_class</span><span class="p">(</span>
</span><span class='line'>            <span class="n">initial</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">get_initial</span><span class="p">(),</span>
</span><span class='line'>            <span class="n">subscriber</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">subscriber</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get_success_url</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Redirect to previous url</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">META</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;HTTP_REFERER&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">form_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form</span><span class="p">):</span>
</span><span class='line'>        <span class="n">messages</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span class='line'>            <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">,</span>
</span><span class='line'>            <span class="s">&quot;You have successfully changed your email notifications&quot;</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">EmailPreferenceView</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">form_valid</span><span class="p">(</span><span class="n">form</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">form_invalid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">form</span><span class="p">):</span>
</span><span class='line'>        <span class="n">messages</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span><span class='line'>            <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">,</span>
</span><span class='line'>            <span class="s">&quot;Your submission has not been saved. Try again.&quot;</span>
</span><span class='line'>        <span class="p">)</span>
</span><span class='line'>        <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">EmailPreferenceView</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">form_invalid</span><span class="p">(</span><span class="n">form</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">email_preferences</span> <span class="o">=</span> <span class="n">EmailPreferenceView</span><span class="o">.</span><span class="n">as_view</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p></span></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Django dynamic unsubscribe forms]]></title>
    <link href="http://blog.namis.me/2012/02/13/django-dynamic-unsubscribe-forms/"/>
    <updated>2012-02-13T15:40:00+11:00</updated>
    <id>http://blog.namis.me/2012/02/13/django-dynamic-unsubscribe-forms</id>
    <content type="html"><![CDATA[<p>The normal usecase of Django forms is to have predefined fields in forms like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">EmailPreferenceForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span>
</span><span class='line'>    <span class="n">daily_digest</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">(</span><span class="n">required</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
</span><span class='line'>    <span class="n">weekly_news</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">(</span><span class="n">required</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
</span><span class='line'>    <span class="n">monthly_summary</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">(</span><span class="n">required</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>What if we wanted to add more fields to the form like <code>weekly_digest</code> and so on? Well, of course you would have to add a new field to the form and maybe handle extra work in your views. Let&#8217;s make this more dynamic.</p>

<!-- more -->


<p>Let&#8217;s create Event model which will store all events. Entries from this model will be generated into fields in the form later:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django.db</span> <span class="kn">import</span> <span class="n">models</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Event</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">title</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
</span><span class='line'>        <span class="n">max_length</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
</span><span class='line'>        <span class="n">help_text</span><span class="o">=</span><span class="s">&#39;e.g: Weekly News&#39;</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>    <span class="n">title_id</span> <span class="o">=</span> <span class="n">models</span><span class="o">.</span><span class="n">CharField</span><span class="p">(</span>
</span><span class='line'>        <span class="n">max_length</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
</span><span class='line'>        <span class="n">blank</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
</span><span class='line'>        <span class="n">editable</span><span class="o">=</span><span class="bp">False</span>
</span><span class='line'>    <span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span class='line'>        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">title_id</span><span class="p">:</span>
</span><span class='line'>            <span class="c"># Generate title_id based on title</span>
</span><span class='line'>            <span class="c"># Weekly News &gt; weekly_news</span>
</span><span class='line'>            <span class="bp">self</span><span class="o">.</span><span class="n">title_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">,</span> <span class="s">&#39;_&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&quot;&#39;&quot;</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>And now the form that will generate fields based on all entries in Event model</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django</span> <span class="kn">import</span> <span class="n">forms</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">models</span> <span class="kn">import</span> <span class="n">Event</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">EmailPreferenceForm</span><span class="p">(</span><span class="n">forms</span><span class="o">.</span><span class="n">Form</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># Auto generate fields based on title_id in Event</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span class='line'>        <span class="nb">super</span><span class="p">(</span><span class="n">EmailPreferenceForm</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span class='line'>        <span class="n">fields</span> <span class="o">=</span> <span class="n">Event</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
</span><span class='line'>            <span class="bp">self</span><span class="o">.</span><span class="n">fields</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">title_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">forms</span><span class="o">.</span><span class="n">BooleanField</span><span class="p">(</span><span class="n">required</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Let&#8217;s say you have a Subscriber model that has many Events. This piece of code will initialize the checkboxes based on subscribers&#8217; preferences.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">forms</span> <span class="kn">import</span> <span class="n">EmailPreferenceForm</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">email_preferences</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s">&#39;POST&#39;</span><span class="p">:</span>
</span><span class='line'>        <span class="n">email_preferences</span> <span class="o">=</span> <span class="n">EmailPreferenceForm</span><span class="p">(</span><span class="n">request</span><span class="o">.</span><span class="n">POST</span><span class="p">)</span>
</span><span class='line'>        <span class="c"># Process the form</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="c"># Initialize the preferences. This will make the boxes checked.</span>
</span><span class='line'>        <span class="n">initial</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">e</span> <span class="ow">in</span> <span class="n">subscriber</span><span class="o">.</span><span class="n">events</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
</span><span class='line'>            <span class="n">initial</span><span class="p">[</span><span class="n">e</span><span class="o">.</span><span class="n">title_id</span><span class="p">]</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>        <span class="n">email_preferences</span> <span class="o">=</span> <span class="n">EmailPreferenceForm</span><span class="p">(</span><span class="n">initial</span><span class="o">=</span><span class="n">initial</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c"># Context and HTTPResponses here</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Loading fixtures in Django tests]]></title>
    <link href="http://blog.namis.me/2012/02/13/loading-fixtures-in-django-tests/"/>
    <updated>2012-02-13T14:22:00+11:00</updated>
    <id>http://blog.namis.me/2012/02/13/loading-fixtures-in-django-tests</id>
    <content type="html"><![CDATA[<p>When writing tests in Django apps, I have an urge to reuse code in setUp() across all tests (most of my apps use the same setUp). So I come up with a GlobalSetup class that other tests should inherit from (it&#8217;s located at the project level). However, this approach creates a problem with loading fixtures. According to Django <a href="https://docs.djangoproject.com/en/dev/topics/testing/">docs</a>: <!-- more --></p>

<blockquote><p>Once you&#8217;ve created a fixture and placed it in a fixtures directory in one of your INSTALLED_APPS, you can use it in your unit tests by specifying a fixtures class attribute on your django.test.TestCase subclass</p></blockquote>


<p>And you would normally do this to load the fixtures:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">PoniesTest</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
</span><span class='line'>    <span class="n">fixtures</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;ponies&#39;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_ponies</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">call_some_test_code</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>How should we load the fixtures now, when the test file is not at the apps level?
Instead of creating fixures folder and placing fixtures in them (in every app), a better and neater way to handle this would be to put all fixtures in one folder at the project level and load them. You can do this with <code>call_command</code> as following:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">django.test</span> <span class="kn">import</span> <span class="n">TestCase</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">django.core.management</span> <span class="kn">import</span> <span class="n">call_command</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">GlobalSetup</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="c"># Create some ponies and snakes here</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="c"># Load fixtures</span>
</span><span class='line'>        <span class="n">call_command</span><span class="p">(</span><span class="s">&#39;loaddata&#39;</span><span class="p">,</span> <span class="s">&#39;tests/ponies&#39;</span><span class="p">,</span> <span class="n">verbosity</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Invoking this <code>call_command</code> is equivalent to running <code>manage.py loaddata /path/to/fixtures</code>
The test in each app can now inherit GlocalSetup and reuse setUp():</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">from</span> <span class="nn">project.tests</span> <span class="kn">import</span> <span class="n">GlobalSetup</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">PoniesTest</span><span class="p">(</span><span class="n">GlobalSetup</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">setUp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="nb">super</span><span class="p">(</span><span class="n">PoniesTest</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">setUp</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">test_ponies</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="n">call_some_test_code</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>


<p>You could also limit each test to load different fixtures by passing a list of fixtures name <code>['ponies', 'snakes']</code> to setUp().
Hope this will help you to DRY up your tests.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[First post from Octopress]]></title>
    <link href="http://blog.namis.me/2012/02/11/first-post-from-octopress/"/>
    <updated>2012-02-11T21:42:00+11:00</updated>
    <id>http://blog.namis.me/2012/02/11/first-post-from-octopress</id>
    <content type="html"><![CDATA[<p>Hey there! This is my new blog powered by <a href="http://octopress.org/">Octropress</a> and hosted on Github.
Octopress was exactly what I was looking for in a blog engine
(Yes, code snippets should be built out of the box in a blog).
I&#8217;ve had Blogger previously but ever since I switched it to the new theme, all my github gists
were not able to display. So I abandoned it. I might migrate the posts from Blogger here, however I&#8217;ll mainly
focus on writing about Python and Django in this one. That&#8217;s about it, stay tuned for the next post. :wq</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fabric deployment]]></title>
    <link href="http://blog.namis.me/2011/11/12/fabric-deployment/"/>
    <updated>2011-11-12T13:28:00+11:00</updated>
    <id>http://blog.namis.me/2011/11/12/fabric-deployment</id>
    <content type="html"><![CDATA[<p>Having played with Capistrano before, I suddenly had an urge to find its Pythonic alternative. After few google searches, I stumbled upon Fabric. It&#8217;s basically a &#8220;python library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks&#8221;. Spent few minutes trying to write functions to deploy Django applications to my Linux server and I have to say, Fabric&#8217;s API is really easy to use, very customizable (it&#8217;s as easy as wrapping up your shell commands in a python function) and more importantly it has Django integration which I&#8217;m gonna need the most. Having said all these, here&#8217;s the video demo I recorded while messing around with Fabric, enjoy:</p>

<p>P/S: django-nose, nosegrowl2 and tdaemon were used in order to show notification of testing results (just FYI)</p>

<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/xtmb-5WPWQs/0.jpg" height="266" width="320"><param name="movie" value="http://www.youtube.com/v/xtmb-5WPWQs?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" />
<param name="bgcolor" value="#FFFFFF" />
<embed width="620" height="420"  src="http://www.youtube.com/v/xtmb-5WPWQs?version=3&f=user_uploads&c=google-webdrive-0&app=youtube_gdata" type="application/x-shockwave-flash"></embed></object>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fatal error: Call to undefined function _make_cat_compat()]]></title>
    <link href="http://blog.namis.me/2011/11/05/fatal-error-call-to-undefined-function-make-cat-compat/"/>
    <updated>2011-11-05T13:23:00+11:00</updated>
    <id>http://blog.namis.me/2011/11/05/fatal-error-call-to-undefined-function-make-cat-compat</id>
    <content type="html"><![CDATA[<p>If you have the following error after uploading your WordPress, and re-uploading <code>category-template.php</code> didn&#8217;t work, you could try pasting this function at the of the file.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'>
</span><span class='line'><span class="k">function</span> <span class="nf">_make_cat_compat</span><span class="p">(</span> <span class="o">&amp;</span><span class="nv">$category</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span> <span class="nb">is_object</span><span class="p">(</span> <span class="nv">$category</span> <span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nv">$category</span><span class="o">-&gt;</span><span class="na">cat_ID</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="o">-&gt;</span><span class="na">term_id</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$category</span><span class="o">-&gt;</span><span class="na">category_count</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="o">-&gt;</span><span class="na">count</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$category</span><span class="o">-&gt;</span><span class="na">category_description</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="o">-&gt;</span><span class="na">description</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$category</span><span class="o">-&gt;</span><span class="na">cat_name</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="o">-&gt;</span><span class="na">name</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$category</span><span class="o">-&gt;</span><span class="na">category_nicename</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="o">-&gt;</span><span class="na">slug</span><span class="p">;</span>
</span><span class='line'>        <span class="nv">$category</span><span class="o">-&gt;</span><span class="na">category_parent</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="o">-&gt;</span><span class="na">parent</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">elseif</span> <span class="p">(</span> <span class="nb">is_array</span><span class="p">(</span> <span class="nv">$category</span> <span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="nb">isset</span><span class="p">(</span> <span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;term_id&#39;</span><span class="p">]</span> <span class="p">)</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;cat_ID&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;term_id&#39;</span><span class="p">];</span>
</span><span class='line'>        <span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;category_count&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;count&#39;</span><span class="p">];</span>
</span><span class='line'>        <span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;category_description&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;description&#39;</span><span class="p">];</span>
</span><span class='line'>        <span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;cat_name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;name&#39;</span><span class="p">];</span>
</span><span class='line'>        <span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;category_nicename&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;slug&#39;</span><span class="p">];</span>
</span><span class='line'>        <span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;category_parent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">&amp;</span><span class="nv">$category</span><span class="p">[</span><span class="s1">&#39;parent&#39;</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cp">?&gt;</span><span class="x"></span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Aliases for Google Storage]]></title>
    <link href="http://blog.namis.me/2011/06/11/aliases-for-google-storage/"/>
    <updated>2011-06-11T13:13:00+10:00</updated>
    <id>http://blog.namis.me/2011/06/11/aliases-for-google-storage</id>
    <content type="html"><![CDATA[<p>I&#8217;ve just registered an account on Google Storage last month and I totally love it as. I particularly like gsutil since I&#8217;m most of my time on Terminal. Here are two aliases I use with gsutil in my <code>.bash_profile</code>. Of course, remember to replace your bucket name</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="k">function </span>gsup<span class="o">(){</span>
</span><span class='line'>    gsutil cp <span class="s2">&quot;$@&quot;</span> gs://bucketname.com
</span><span class='line'><span class="o">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">function </span>gsdown<span class="o">(){</span>
</span><span class='line'>    gsutil cp gs://bucketname.com/<span class="s2">&quot;$@&quot;</span> ~/Desktop
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using PHP to parse git history]]></title>
    <link href="http://blog.namis.me/2011/05/08/using-php-to-parse-git-history/"/>
    <updated>2011-05-08T13:19:00+10:00</updated>
    <id>http://blog.namis.me/2011/05/08/using-php-to-parse-git-history</id>
    <content type="html"><![CDATA[<p>Here is how you can store git command output in a good manner after which you will be able to easily retrieve necessary information. This snippet belongs to the project I&#8217;m currently working on.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="cp">&lt;?php</span>
</span><span class='line'><span class="c1">// Author: Ngo Minh Nam</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$dir</span> <span class="o">=</span> <span class="s2">&quot;/path/to/your/repo/&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nv">$output</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'><span class="nb">chdir</span><span class="p">(</span><span class="nv">$dir</span><span class="p">);</span>
</span><span class='line'><span class="nb">exec</span><span class="p">(</span><span class="s2">&quot;git log&quot;</span><span class="p">,</span><span class="nv">$output</span><span class="p">);</span>
</span><span class='line'><span class="nv">$history</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'><span class="k">foreach</span><span class="p">(</span><span class="nv">$output</span> <span class="k">as</span> <span class="nv">$line</span><span class="p">){</span>
</span><span class='line'>    <span class="k">if</span><span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$line</span><span class="p">,</span> <span class="s1">&#39;commit&#39;</span><span class="p">)</span><span class="o">===</span><span class="mi">0</span><span class="p">){</span>
</span><span class='line'>        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$commit</span><span class="p">)){</span>
</span><span class='line'>            <span class="nb">array_push</span><span class="p">(</span><span class="nv">$history</span><span class="p">,</span> <span class="nv">$commit</span><span class="p">);</span>
</span><span class='line'>            <span class="nb">unset</span><span class="p">(</span><span class="nv">$commit</span><span class="p">);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>        <span class="nv">$commit</span><span class="p">[</span><span class="s1">&#39;hash&#39;</span><span class="p">]</span>   <span class="o">=</span> <span class="nb">substr</span><span class="p">(</span><span class="nv">$line</span><span class="p">,</span> <span class="nb">strlen</span><span class="p">(</span><span class="s1">&#39;commit&#39;</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$line</span><span class="p">,</span> <span class="s1">&#39;Author&#39;</span><span class="p">)</span><span class="o">===</span><span class="mi">0</span><span class="p">){</span>
</span><span class='line'>        <span class="nv">$commit</span><span class="p">[</span><span class="s1">&#39;author&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">substr</span><span class="p">(</span><span class="nv">$line</span><span class="p">,</span> <span class="nb">strlen</span><span class="p">(</span><span class="s1">&#39;Author:&#39;</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$line</span><span class="p">,</span> <span class="s1">&#39;Date&#39;</span><span class="p">)</span><span class="o">===</span><span class="mi">0</span><span class="p">){</span>
</span><span class='line'>        <span class="nv">$commit</span><span class="p">[</span><span class="s1">&#39;date&#39;</span><span class="p">]</span>   <span class="o">=</span> <span class="nb">substr</span><span class="p">(</span><span class="nv">$line</span><span class="p">,</span> <span class="nb">strlen</span><span class="p">(</span><span class="s1">&#39;Date:&#39;</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span><span class="p">{</span>
</span><span class='line'>        <span class="nv">$commit</span><span class="p">[</span><span class="s1">&#39;message&#39;</span><span class="p">]</span>  <span class="o">.=</span> <span class="nv">$line</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nb">print_r</span><span class="p">(</span><span class="nv">$history</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="cp">?&gt;</span><span class="x"></span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GAE XMPPHandler]]></title>
    <link href="http://blog.namis.me/2010/12/25/gae-xmpphandler/"/>
    <updated>2010-12-25T15:57:00+11:00</updated>
    <id>http://blog.namis.me/2010/12/25/gae-xmpphandler</id>
    <content type="html"><![CDATA[<p>Finally got time to continue developing Push Contacts. I&#8217;ve gotten a nerve-wrecking problem while developing with C2DM
applications. When the app supposed to get the push message, it didn&#8217;t respond to it. Looking at the logs I encountered
an error stack related to GTalk (with TalkProvider tag). Decided to google the problem and the solution was to sign out
of GTalk on the phone.</p>

<!-- more -->


<p>Ok now a tip related to Google App Engine development. I just added a new feature to Push Contacts which is allowing
users to reply to the latest SMS received. I had to retrieve the email of the user the bot is chatting with to find
which phone number to send the SMS to. Took a look at guru.appspot.com source code and decided to use
<code>xmpp_handlers.CommandHandler</code>. Used this method <code>text_message(self, message)</code> and message.sender supposed to return the
sender of a message but instead it returned an IM formatted string. Here is how you can retrieve the email.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="k">class</span> <span class="nc">XMPPHandler</span><span class="p">(</span><span class="n">xmpp_handlers</span><span class="o">.</span><span class="n">CommandHandler</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">text_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
</span><span class='line'>        <span class="n">idx</span>  <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">sender</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">user</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">sender</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="n">idx</span><span class="p">]</span>
</span><span class='line'>        <span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fix screwed up keyboard layout on Ubuntu 9.04]]></title>
    <link href="http://blog.namis.me/2010/12/05/fix-screwed-up-keyboard-layout-on-ubuntu-9-dot-04/"/>
    <updated>2010-12-05T13:34:00+11:00</updated>
    <id>http://blog.namis.me/2010/12/05/fix-screwed-up-keyboard-layout-on-ubuntu-9-dot-04</id>
    <content type="html"><![CDATA[<p>Got Gnome desktop installed on TonidoPlug but when trying to vnc to it I realised the keyboard layout is messed up. This is how you fix it:</p>

<ol>
<li>Kill existing vnc session: <code>vncserver -kill :1</code> (1 here is the pid)</li>
<li>Edit with: <code>nano /root/.vnc/xstartup</code></li>
<li>Add this line: <code>export XKL_XMODMAP_DISABLE=1</code></li>
<li>Restart vncserver</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[TonidoPlug]]></title>
    <link href="http://blog.namis.me/2010/11/28/tonidoplug/"/>
    <updated>2010-11-28T15:19:00+11:00</updated>
    <id>http://blog.namis.me/2010/11/28/tonidoplug</id>
    <content type="html"><![CDATA[<p>Yes, <a href="http://tonidoplug.com" title="TonidoPlug">TonidoPlug</a> is a new toy that I&#8217;ve gotten last week. It is a basically a plug computer that can act likea home server. The hardware specs are the same as SheevaPlug with 1.2GHz ARM and 512MB RAM and 512MB Flash. The best thing
about it is the energy consumption ranging from 5-10 Watts.</p>

<!-- more -->


<p>So what&#8217;s the difference between TonidoPlug and SheevaPlug? The main and the most noticeable difference is the built-in
software that TonidoPlug provides which makes it really easy to get started with. It&#8217;s seriously just plug-and-play and
you will get all kinds of stuffs you need: torrent (yes torrenting 24/7 is leet), music player (that allows streaming),
sharing files and photos, mounting drives.</p>

<p>But the problem with this is the limitation of applications you can install. What if you want to run an rsync server or
install a LAMP stack? Luckily there is an open source project called PlugApps that allows users to have more
flexibility. Some kind souls have compiled Arch Linux and port it to work on a SheevaPlug hardware. They named it
Plugbox. SheevaPlug naturally runs on Ubuntu 9.04 but apparently Ubuntu has dropped support for ARM that&#8217;s why Arch
Linux would be a perfect suit.</p>

<p>I&#8217;m currently trying to run Plugbox from my external hard drive that has 2 partitions but TonidoPlug doesn&#8217;t seem to
boot from it. I&#8217;m gonna dive deeper into this. Will update the blog once I get it to work.</p>

<p><strong>Edited</strong><br/>
Ok, like finally I got TonidoPlug booting from external hard drive but it still runs on Tonido (Ubuntu 9.04). There&#8217;s
no way I can make it boot from  external hard drive with PlugBox. The problem was with reboot command, I had to make a
cold boot (plug and unplug the power source) in order for the plug to boot into my Samsung G3. I&#8217;ve recently installed awesome
stuff like:</p>

<ul>
<li>webmin (for sysadmin)</li>
<li>gitosis (for git repos)</li>
<li>mt-daapd (iTunes Server)</li>
<li>ettercap (to monitor my home network)</li>
<li>lsyncd (to synchronize files)</li>
<li>nginx (for reverse proxy and web server)</li>
<li>django (web apps running with gunicorn and postgres)</li>
<li>transmission (torrent server)</li>
<li>vncserver</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Simple web service with Google App Engine]]></title>
    <link href="http://blog.namis.me/2010/06/13/simple-web-service-with-google-app-engine/"/>
    <updated>2010-06-13T13:44:00+10:00</updated>
    <id>http://blog.namis.me/2010/06/13/simple-web-service-with-google-app-engine</id>
    <content type="html"><![CDATA[<p>It&#8217;s been a while since I last posted an entry. Nothing much has changed in my life. The two-week holiday has just passed by in a blink of an eye. Has been busy with Android assignment, Cypher IGs camp and Pycon Singapore 2010. Now after Pycon, I&#8217;m pretty much convinced about the power of simplicity of Python. Knowing Google App Engine (GAE) quite a while ago, I decided to use GAE to help me out in my assignment (yes, yes, Google to the rescue) by writing a simple GAE web service which stores/retrieves feedbacks in form of JSON. The following tutorial is simple enough for beginners to follow.</p>

<!-- more -->




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">urllib</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">json</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">google.appengine.api</span> <span class="kn">import</span> <span class="n">mail</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">google.appengine.ext</span> <span class="kn">import</span> <span class="n">webapp</span><span class="p">,</span> <span class="n">db</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">google.appengine.ext.webapp</span> <span class="kn">import</span> <span class="n">util</span>
</span><span class='line'><span class="kn">from</span> <span class="nn">google.appengine.ext.webapp.util</span> <span class="kn">import</span> <span class="n">run_wsgi_app</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Feedback</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
</span><span class='line'>    <span class="n">user</span>     <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">StringProperty</span><span class="p">()</span>
</span><span class='line'>    <span class="n">heritage</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">StringProperty</span><span class="p">()</span>
</span><span class='line'>    <span class="n">comment</span>  <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">StringProperty</span><span class="p">(</span><span class="n">multiline</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span><span class='line'>    <span class="n">star</span>     <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">IntegerProperty</span><span class="p">()</span>
</span><span class='line'>    <span class="n">date</span>     <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">DateTimeProperty</span><span class="p">(</span><span class="n">auto_now_add</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">#Convert feedback object into a dictionary</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">toDict</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="k">return</span> <span class="p">{</span><span class="s">&#39;user&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">,</span><span class="s">&#39;heritage&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">heritage</span><span class="p">,</span>
</span><span class='line'>                    <span class="s">&#39;comment&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span><span class="p">,</span><span class="s">&#39;star&#39;</span><span class="p">:</span>  <span class="bp">self</span><span class="o">.</span><span class="n">star</span><span class="p">,</span><span class="s">&#39;date&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">date</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FeedbackGetter</span><span class="p">(</span><span class="n">webapp</span><span class="o">.</span><span class="n">RequestHandler</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">heritage</span><span class="p">):</span>
</span><span class='line'>    <span class="c">#Retrieve feedbacks of a particular heritage requested</span>
</span><span class='line'>        <span class="n">heritage</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">unquote</span><span class="p">(</span><span class="n">heritage</span><span class="p">)</span>
</span><span class='line'>        <span class="n">feedbacks</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">GqlQuery</span><span class="p">(</span><span class="s">&quot;SELECT * FROM Feedback WHERE heritage = :1&quot;</span><span class="p">,</span> <span class="n">heritage</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">feedDict</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">feedback</span> <span class="ow">in</span> <span class="n">feedbacks</span><span class="p">:</span>
</span><span class='line'>            <span class="n">feedDict</span><span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">feedback</span><span class="o">.</span><span class="n">key</span><span class="p">())]</span> <span class="o">=</span> <span class="n">feedback</span><span class="o">.</span><span class="n">toDict</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">feedDict</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FeedbackStore</span><span class="p">(</span><span class="n">webapp</span><span class="o">.</span><span class="n">RequestHandler</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>    <span class="c">#Storing feedback in datastore</span>
</span><span class='line'>        <span class="n">feedback</span> <span class="o">=</span> <span class="n">Feedback</span><span class="p">()</span>
</span><span class='line'>        <span class="n">feedback</span><span class="o">.</span><span class="n">user</span>     <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;email&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">feedback</span><span class="o">.</span><span class="n">heritage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;heritage&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">feedback</span><span class="o">.</span><span class="n">comment</span>  <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;comment&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">feedback</span><span class="o">.</span><span class="n">star</span>     <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;star&#39;</span><span class="p">))</span>
</span><span class='line'>        <span class="n">feedback</span><span class="o">.</span><span class="n">put</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="c">#Sending confirmation email to the user</span>
</span><span class='line'>        <span class="n">myemail</span>         <span class="o">=</span> <span class="n">mail</span><span class="o">.</span><span class="n">EmailMessage</span><span class="p">()</span>
</span><span class='line'>        <span class="n">myemail</span><span class="o">.</span><span class="n">sender</span>  <span class="o">=</span> <span class="s">&quot;World Heritage Site &lt;noreply@androidnam.appspotmail.com&gt;&quot;</span>
</span><span class='line'>        <span class="n">myemail</span><span class="o">.</span><span class="n">to</span>      <span class="o">=</span> <span class="n">feedback</span><span class="o">.</span><span class="n">user</span>
</span><span class='line'>        <span class="n">myemail</span><span class="o">.</span><span class="n">subject</span> <span class="o">=</span> <span class="s">&quot;Feedback on &quot;</span> <span class="o">+</span> <span class="n">feedback</span><span class="o">.</span><span class="n">heritage</span>
</span><span class='line'>        <span class="n">myemail</span><span class="o">.</span><span class="n">body</span>    <span class="o">=</span> <span class="s">&#39;&#39;&#39;</span>
</span><span class='line'><span class="s">        Thank you for submitting your feedback, </span><span class="se">\n</span><span class="s"></span>
</span><span class='line'><span class="s">        Heritage: </span><span class="si">%s</span><span class="s"> </span><span class="se">\n</span><span class="s"></span>
</span><span class='line'><span class="s">        Comment: </span><span class="si">%s</span><span class="s"> </span><span class="se">\n</span><span class="s"></span>
</span><span class='line'><span class="s">        Rating: </span><span class="si">%s</span><span class="s"> </span>
</span><span class='line'><span class="s">        &#39;&#39;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">feedback</span><span class="o">.</span><span class="n">heritage</span><span class="p">,</span> <span class="n">feedback</span><span class="o">.</span><span class="n">comment</span><span class="p">,</span> <span class="n">feedback</span><span class="o">.</span><span class="n">star</span><span class="p">)</span>
</span><span class='line'>        <span class="n">myemail</span><span class="o">.</span><span class="n">send</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">redirect</span><span class="p">(</span><span class="s">&#39;/get/&#39;</span><span class="o">+</span><span class="n">feedback</span><span class="o">.</span><span class="n">heritage</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">FeedbackForm</span><span class="p">(</span><span class="n">webapp</span><span class="o">.</span><span class="n">RequestHandler</span><span class="p">):</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span class='line'>        <span class="bp">self</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;&quot;&quot;</span>
</span><span class='line'><span class="s">        &lt;html&gt;</span>
</span><span class='line'><span class="s">          &lt;body&gt;</span>
</span><span class='line'><span class="s">            &lt;form action=&quot;/store&quot; method=&quot;post&quot;&gt;</span>
</span><span class='line'><span class="s">              Heritage:&lt;div&gt;&lt;input name=&quot;heritage&quot; /&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="s">              Email:&lt;div&gt;&lt;input name=&quot;email&quot; /&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="s">              Comment:&lt;div&gt;&lt;input name=&quot;comment&quot; /&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="s">              Star:&lt;div&gt;&lt;input name=&quot;star&quot; /&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="s">              &lt;div&gt;&lt;input type=&quot;submit&quot; value=&quot;Submit&quot;&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="s">            &lt;/form&gt;</span>
</span><span class='line'><span class="s">          &lt;/body&gt;</span>
</span><span class='line'><span class="s">        &lt;/html&gt;</span>
</span><span class='line'><span class="s">        &quot;&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">application</span> <span class="o">=</span> <span class="n">webapp</span><span class="o">.</span><span class="n">WSGIApplication</span><span class="p">([(</span><span class="s">r&#39;/get/(.*)&#39;</span><span class="p">,</span> <span class="n">FeedbackGetter</span><span class="p">),</span>
</span><span class='line'>                      <span class="p">(</span><span class="s">&#39;/store&#39;</span><span class="p">,</span> <span class="n">FeedbackStore</span><span class="p">),</span>
</span><span class='line'>                      <span class="p">(</span><span class="s">&#39;/feedback&#39;</span><span class="p">,</span> <span class="n">FeedbackForm</span><span class="p">)],</span>
</span><span class='line'>                                      <span class="n">debug</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
</span><span class='line'>    <span class="n">run_wsgi_app</span><span class="p">(</span><span class="n">application</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span>
</span><span class='line'>    <span class="n">main</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
</feed>
