<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8279024142115321791</id><updated>2012-02-17T07:14:08.888+05:30</updated><category term='KalaPy'/><category term='python'/><category term='DAL'/><category term='openerp'/><title type='text'>Amit Mendapara</title><subtitle type='html'>&lt;pre&gt;&amp;gt;&amp;gt;&amp;gt; import this&lt;/pre&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-3696590841138740622</id><published>2010-12-11T13:48:00.001+05:30</published><updated>2010-12-11T13:48:40.948+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>KalaPy 0.4.2 Released...</title><content type='html'>&lt;p&gt;Hello everyone,&lt;/p&gt;&lt;p&gt;So finally, I am back on &lt;a href="http://www.kalapy.org/" target="_blank"&gt;KalaPy&lt;/a&gt;&amp;nbsp;and&amp;nbsp;announcing the release of&amp;nbsp;&lt;a class="reference external" href="http://www.kalapy.org/downloads.html"&gt;KalaPy 0.4.2&lt;/a&gt;&amp;nbsp;.This is a bugfix release and doesn&amp;rsquo;t provide any new feature.&lt;/p&gt;&lt;p&gt;Bugs fixings:&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;Fixed database session store.&lt;/li&gt;&lt;li&gt;Imporved database engine loading.&lt;/li&gt;&lt;li&gt;Improved error handling.&lt;/li&gt;&lt;li&gt;Fixed session middleware (attribute error).&lt;/li&gt;&lt;li&gt;Fixed package.add_rule (register view func only if given).&lt;/li&gt;&lt;li&gt;Connect signals only if database is configured.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Links:&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;&lt;a class="reference external" href="http://www.kalapy.org/"&gt;KalaPy Website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://github.com/cristatus/kalapy"&gt;GitHub Home&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://www.kalapy.org/demo.html"&gt;KalaPy Demo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Regards&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-3696590841138740622?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/3696590841138740622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=3696590841138740622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3696590841138740622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3696590841138740622'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/12/kalapy-042-released.html' title='KalaPy 0.4.2 Released...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-2228615741879560588</id><published>2010-11-08T16:22:00.004+05:30</published><updated>2011-08-25T19:31:01.475+05:30</updated><title type='text'>Amazing BSNL 3G!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span style="color: black;"&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/span&gt;: Support for these devices are now officially available in many recently released Linux distros.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/span&gt;: Support for these devices have been fully integrated. Use &lt;a href="https://launchpad.net/~cristatus/+archive/nm-ppa" target="_blank"&gt;this PPA&lt;/a&gt;&amp;nbsp;(ubuntu maverick only)&amp;nbsp;to install/update the requied packages.&lt;br /&gt;&lt;br /&gt;Recently, I bought a &lt;a href="http://www.bsnl.co.in/service/3G/3G_files/3g.htm"&gt;3G datacard from BSNL&lt;/a&gt; after a promising demo given by a BSNL representative. I was causious because of my previous experience with their &lt;em&gt;EVDO&lt;/em&gt; service which never satisfied the promised speed (upto 3.1 mbps). This one (the 3G service) is really good even though it's still under initial stage of deployment. Most of the time, I am getting about &lt;em&gt;2mbps&lt;/em&gt; download speed and &lt;em&gt;1.5mbps&lt;/em&gt; upload speed. This is one of the most affordable Internet service offer in India with this speed (unlimited usage for just 1500 INR).&lt;br /&gt;&lt;br /&gt;Here I am sharing my experience because, the device I bought&amp;nbsp;(Teracom LW273 7.2mbps)&amp;nbsp;doesn't work out of the box with Ubuntu. Of course, they provide a Linux application but it's only 32bit package and doesn't work well under 64bit version of Ubuntu. Also, I prefer the official &lt;strong&gt;&lt;em&gt;NetworkManager&lt;/em&gt;&lt;/strong&gt; to connect to the Internet instead of such a&amp;nbsp;crappy&amp;nbsp;closed source application.&lt;br /&gt;&lt;br /&gt;Here is how I managed to use the device with NetworkManager:&lt;br /&gt;&lt;br /&gt;First install &lt;strong&gt;usb_modeswith &lt;/strong&gt;package if it is not installed.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ sudo apt-get install usb_modeswitch&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;Using &lt;strong&gt;lsusb&lt;/strong&gt;&amp;nbsp;I found that the device has three configurations. The default one is to mount the device as a cddrive so that you can install the provided application and next two configurations are to mount the device as modem. So first I tried switching the device mode from cdrom to modem with following command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ sudo usb_modeswitch -v 230d -p 0001 -u 3&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;Here &lt;strong&gt;230d &lt;/strong&gt;is vendor id and &lt;strong&gt;0001&lt;/strong&gt; is the product id of the device and as we are switching to modem mode with configuration number &lt;strong&gt;3 &lt;/strong&gt;is given.&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;After issuing this command the device was switched to modem mode and then&amp;nbsp;I was able to configure the &lt;strong&gt;&lt;em&gt;NetworkManager&lt;/em&gt;&lt;/strong&gt; with &lt;em&gt;APN&lt;/em&gt; as &lt;em&gt;&lt;strong&gt;bsnlnet&lt;/strong&gt;&amp;nbsp;&lt;/em&gt;to connect to the internet.&lt;br /&gt;&lt;br /&gt;In order to make this process automatic we need to create a udev rule and a device specific configuration for the usb_modeswith. Here's how I did this:&lt;br /&gt;&lt;br /&gt;1. Create udev rule.&lt;br /&gt;&lt;br /&gt;Open the &lt;em&gt;/lib/udev/rules.d/40-usb_modeswitch.rules &lt;/em&gt;and search for a line with:&lt;br /&gt;&lt;pre&gt;LABEL="modeswitch_rules_begin"&lt;/pre&gt;Right after that line, add a new line with following contents:&lt;br /&gt;&lt;pre&gt;ATTRS{idVendor}=="230d", ATTRS{idProduct}=="0001", RUN+="usb_modeswitch '%b/%k'"&lt;/pre&gt;&lt;br /&gt;2. Create usb_modeswitch configuration&lt;br /&gt;&lt;br /&gt;Create a new configuration &lt;em&gt;/etc/usb_modeswitch.d/230d:0001 &lt;/em&gt;and put the following contents in that file.&lt;br /&gt;&lt;pre&gt;########################################################&lt;br /&gt;# BSNL Teracom&lt;br /&gt;&lt;br /&gt;DefaultVendor= 0x230d&lt;br /&gt;DefaultProduct=0x0001&lt;br /&gt;&lt;br /&gt;Configuration=3&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;That's it. Just remove the device and replug it. Now you should see the device is being mounted as modem instead of cdrom.&lt;br /&gt;&lt;br /&gt;Have a fun with BSNL 3g!&lt;br /&gt;&lt;br /&gt;Oh yes, here is my latest speedtest result:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.speedtest.net/result/1021682629.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" src="http://www.speedtest.net/result/1021682629.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-2228615741879560588?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/2228615741879560588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=2228615741879560588' title='58 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2228615741879560588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2228615741879560588'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/11/amazing-bsnl-3g.html' title='Amazing BSNL 3G!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>58</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-8998431236956098659</id><published>2010-09-18T20:52:00.004+05:30</published><updated>2010-09-18T21:00:20.007+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python virtualenv with easy!</title><content type='html'>&lt;p&gt;Hi all,&lt;/p&gt;&lt;p&gt;This time not related to &lt;a class="reference external" href="http://www.kalapy.org/"&gt;KalaPy&lt;/a&gt; but something that will help you dealing withPython &lt;a class="reference external" href="http://pypi.python.org/pypi/virtualenv/"&gt;virtualenv&lt;/a&gt; easily. See &lt;a class="reference external" href="http://virtualenv.openplans.org/"&gt;virtualenv docs&lt;/a&gt; for more information.&lt;/p&gt;&lt;p&gt;I have created &lt;a class="reference external" href="http://github.com/cristatus/stuffs/blob/master/pyenv"&gt;a shell script to manage virtualenv&lt;/a&gt;.The pyenv script can be used to create new virtualenv, activate it, removing existing virtualenv etc.  Let meexplain how to use it:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Create new virtualenv named &amp;#8216;my&amp;#8217;:&lt;/strong&gt;&lt;/p&gt;&lt;div class="highlight-text"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;$ pyenv -c my&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The virtualenv will be created in &lt;cite&gt;$HOME/.pyenv/my&lt;/cite&gt; directory.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Activate a virtualenv named &amp;#8216;my&amp;#8217;:&lt;/strong&gt;&lt;/p&gt;&lt;div class="highlight-text"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;$ . pyenv -a my&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Note that, you should use &amp;#8216;.&amp;#8217; as source in order to make changes in current shell environment.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;De-activate current virtualenv:&lt;/strong&gt;&lt;/p&gt;&lt;div class="highlight-text"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;$ . pyenv -d&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Delete an existing virtualenv:&lt;/strong&gt;&lt;/p&gt;&lt;div class="highlight-text"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;$ pyenv -D my&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Create a new virtualenv with alternative python interpreter:&lt;/strong&gt;&lt;/p&gt;&lt;div class="highlight-text"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;$ pyenv -c py25 -P /usr/bin/python25&lt;br /&gt;$ pyenv -c apy -P /opt/ActivePython-2.6/bin/python&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The script will create virtualenv with &lt;a class="reference external" href="http://pypi.python.org/pypi/distribute/"&gt;distribute&lt;/a&gt; package for better &lt;cite&gt;easy_install&lt;/cite&gt; support. It also provides &lt;cite&gt;pip&lt;/cite&gt; command to manage python packages.&lt;/p&gt;&lt;p&gt;Have fun...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-8998431236956098659?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/8998431236956098659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=8998431236956098659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/8998431236956098659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/8998431236956098659'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/09/python-virtualenv-with-easy.html' title='Python virtualenv with easy!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-2810003796552002143</id><published>2010-08-13T11:46:00.000+05:30</published><updated>2010-09-18T20:08:09.404+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>KalaPy 0.4.1 Released...</title><content type='html'>&lt;p&gt;Hello everyone,&lt;/p&gt;&lt;p&gt;&lt;a class="reference external" href="http://www.kalapy.org/downloads.html"&gt;KalaPy 0.4.1&lt;/a&gt; has been released.This is a bugfix release and doesn&amp;#8217;t provide any new feature.&lt;/p&gt;&lt;p&gt;Bugs fixings:&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;Added docs on deployement options.&lt;/li&gt;&lt;li&gt;Fixed terminal output issue on win32.&lt;/li&gt;&lt;li&gt;Fixed package name resolution issue.&lt;/li&gt;&lt;li&gt;Fixed MySQL engine (table with InnoDB engine).&lt;/li&gt;&lt;li&gt;Fixed logging (missing reference).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Links:&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;&lt;a class="reference external" href="http://www.kalapy.org/"&gt;KalaPy Website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://github.com/cristatus/kalapy"&gt;GitHub Home&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://www.kalapy.org/demo.html"&gt;KalaPy Demo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Regards&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-2810003796552002143?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/2810003796552002143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=2810003796552002143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2810003796552002143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2810003796552002143'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/08/kalapy-041-released.html' title='KalaPy 0.4.1 Released...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-1418648955025824483</id><published>2010-08-06T11:07:00.000+05:30</published><updated>2010-08-06T11:07:42.494+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>KalaPy 0.4 Released...</title><content type='html'>Hello everyone,&lt;br /&gt;&lt;br /&gt;I am pleased to announce the release of &lt;a class="reference external" href="http://www.kalapy.org/downloads.html"&gt;KalaPy 0.4&lt;/a&gt;.As said &lt;a class="reference external" href="http://amit-mendapara.blogspot.com/2010/08/kalapy-04-is-coming.html"&gt;previously&lt;/a&gt;,this release comes with lots new features and improvements...&lt;br /&gt;&lt;br /&gt;New features:&lt;br /&gt;&lt;ul class="simple"&gt;&lt;li&gt;Implemented &lt;a class="reference external" href="http://www.kalapy.org/docs/package.html"&gt;addon package&lt;/a&gt; feature.&lt;/li&gt;&lt;li&gt;Added &lt;cite&gt;wiki_extended&lt;/cite&gt; example package.&lt;/li&gt;&lt;li&gt;Added settings.STATIC_LINKS to override static dirs &amp;amp; links&lt;/li&gt;&lt;li&gt;Integrated ipython support (shell command).&lt;/li&gt;&lt;li&gt;Translate Jinja2 templates with easy (see &lt;a class="reference external" href="http://www.kalapy.org/docs/i18n.html#translating-templates"&gt;docs&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Implemented logging support.&lt;/li&gt;&lt;/ul&gt;Refactoring:&lt;br /&gt;&lt;ul class="simple"&gt;&lt;li&gt;The web module is splited into several smaller modules.&lt;/li&gt;&lt;li&gt;Application class is no longer Package subclass&lt;/li&gt;&lt;li&gt;ModelCache and Loader have been merged into an object Pool&lt;/li&gt;&lt;li&gt;Reimplemented context locals&lt;/li&gt;&lt;li&gt;Improved admin commands (help, colorize output, error handling)&lt;/li&gt;&lt;li&gt;Lots of new tests&lt;/li&gt;&lt;li&gt;Improved documentation&lt;/li&gt;&lt;/ul&gt;Bugs fixings:&lt;br /&gt;&lt;ul class="simple"&gt;&lt;li&gt;Fixed early sending of signal &lt;cite&gt;request-finished&lt;/cite&gt;.&lt;/li&gt;&lt;li&gt;Improved signals api.&lt;/li&gt;&lt;li&gt;Fixed GAE issue (sys.path reset, while using &lt;cite&gt;gae runserver&lt;/cite&gt;).&lt;/li&gt;&lt;li&gt;Fixed a regression (db.String validation).&lt;/li&gt;&lt;/ul&gt;Links:&lt;br /&gt;&lt;ul class="simple"&gt;&lt;li&gt;&lt;a class="reference external" href="http://www.kalapy.org/"&gt;KalaPy Website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://github.com/cristatus/kalapy"&gt;GitHub Home&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://kalapy-demo.appspot.com/"&gt;KalaPy Demo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-1418648955025824483?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/1418648955025824483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=1418648955025824483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1418648955025824483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1418648955025824483'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/08/kalapy-04-released.html' title='KalaPy 0.4 Released...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-3153313406619548988</id><published>2010-08-03T17:22:00.001+05:30</published><updated>2010-08-03T17:49:52.951+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>KalaPy 0.4 is coming!</title><content type='html'>&lt;p&gt;Hello again,&lt;/p&gt;&lt;p&gt;After almost a month, &lt;a class="reference external" href="http://www.kalapy.org/"&gt;KalaPy&lt;/a&gt; is ready for next release 0.4 within next fewdays. There are lots of improvements but the most important feature in this releaseis the packaging system. A package can be an application package (e.g. wiki) oran addon package that extends an existing package (e.g. wiki_extended).&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;Now every package has it&amp;#8217;s own &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/tt&gt; module to provide somepackage specific configuration settings.&lt;/li&gt;&lt;li&gt;A package can be an addon package. In that case, the resources provided bythe package would be served as resources of the extending package.&lt;/li&gt;&lt;li&gt;An example addon package named &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;wiki_extended&lt;/span&gt;&lt;/tt&gt; has been created in included&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;example&lt;/span&gt;&lt;/tt&gt; project.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Here you can see the screenshots of the original &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;wiki&lt;/span&gt;&lt;/tt&gt; application package andafter activating &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;wiki_extended&lt;/span&gt;&lt;/tt&gt; package.&lt;/p&gt;&lt;p&gt;The original one:&lt;/p&gt;&lt;a class="reference external image-reference" href="http://img268.imageshack.us/img268/6648/001qfy.png"&gt;&lt;img alt="http://img268.imageshack.us/img268/6648/001qfy.png" src="http://img268.imageshack.us/img268/6648/001qfy.png" style="width: 50%;" /&gt;&lt;/a&gt;&lt;p&gt;The extended one:&lt;/p&gt;&lt;a class="reference external image-reference" href="http://img18.imageshack.us/img18/6180/002jk.png"&gt;&lt;img alt="http://img18.imageshack.us/img18/6180/002jk.png" src="http://img18.imageshack.us/img18/6180/002jk.png" style="width: 50%;" /&gt;&lt;/a&gt;&lt;p&gt;You can see, with the addon package you can override css/javascript as well astemplates of any package. The view functions and models provided by the packagewould also be considered as resources of the original package.&lt;/p&gt;&lt;p&gt;Besides that, following features have been implemented:&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;Allows to override static links with the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;settings.STATIC_LINKS&lt;/span&gt;&lt;/tt&gt;configuration, and links to &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/favicon.ico&lt;/span&gt;&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/robots.txt&lt;/span&gt;&lt;/tt&gt; have beenprovided this way.&lt;/li&gt;&lt;li&gt;Logging support with rotating log file handler.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There are also some internal changes and bug fixings. A full changes log will beprovided at the release time.&lt;/p&gt;&lt;p&gt;Links:&lt;/p&gt;&lt;ul class="simple"&gt;&lt;li&gt;&lt;a class="reference external" href="http://www.kalapy.org/"&gt;KalaPy Website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://github.com/cristatus/kalapy"&gt;GitHub Home&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="reference external" href="http://kalapy-demo.appspot.com/"&gt;KalaPy Demo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Regards&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-3153313406619548988?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/3153313406619548988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=3153313406619548988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3153313406619548988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3153313406619548988'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/08/kalapy-04-is-coming.html' title='KalaPy 0.4 is coming!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-4694800383754780658</id><published>2010-07-09T19:57:00.001+05:30</published><updated>2010-07-09T20:11:24.112+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>KalaPy 0.3 released...</title><content type='html'>Hello Everyone,&lt;br /&gt;&lt;br /&gt;I am pleased to announce the release of KalaPy 0.3. This version comes with lots of improvements and support for MySQL and Google App Engine.&lt;br /&gt;&lt;br /&gt;Changes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/cristatus/kalapy/raw/master/CHANGES"&gt;http://github.com/cristatus/kalapy/raw/master/CHANGES&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kalapy.org/"&gt;http://www.kalapy.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/cristatus/kalapy"&gt;http://github.com/cristatus/kalapy&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kalapy-demo.appspot.com/"&gt;http://kalapy-demo.appspot.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/kalapy"&gt;http://groups.google.com/group/kalapy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Regards&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-4694800383754780658?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/4694800383754780658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=4694800383754780658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4694800383754780658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4694800383754780658'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/07/kalapy-03-released.html' title='KalaPy 0.3 released...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-5136145170537946933</id><published>2010-07-02T13:01:00.001+05:30</published><updated>2010-07-02T13:04:52.106+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAL'/><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>MySQL support in KalaPy!</title><content type='html'>Hello Everyone,&lt;br /&gt;&lt;br /&gt;MySQL support has been implemented. So now &lt;a href="http://www.kalapy.org/"&gt;KalaPy&lt;/a&gt; supports &lt;i&gt;PostgreSQL&lt;/i&gt;, &lt;i&gt;MySQL&lt;/i&gt;, &lt;i&gt;SQLite3&lt;/i&gt; and &lt;i&gt;&lt;a href="http://amit-mendapara.blogspot.com/2010/06/google-appengine-support-in-kalapy.html"&gt;GAE&lt;/a&gt;&lt;/i&gt; backends.&lt;br /&gt;&lt;br /&gt;Besides that the &lt;i&gt;&lt;a href="http://amit-mendapara.blogspot.com/2010/06/google-appengine-support-in-kalapy.html"&gt;GAE&lt;/a&gt;&lt;/i&gt; backend support is improved and now fully functional with one exception; it doesn't support transaction. Though, transaction is partially supported if only a single model is involved and there is no unique field defined in the model using &lt;code&gt;db.run_in_transation&lt;/code&gt; function.&lt;br /&gt;&lt;br /&gt;Another change in &lt;i&gt;DAL API&lt;/i&gt; is the way of defining validators and unique contraints. Previourly, we have some helper functions to do that but now those functions have been removed and uses standard&amp;nbsp;descriptive&amp;nbsp;way to define validators and unique contraints.&lt;br /&gt;&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="n"&gt;__unique__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'name too short'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;The &lt;code&gt;__unique__&lt;/code&gt; attribute lists single or combined unique constraints. Single field unique constraint can also be defined with &lt;code&gt;unique=True&lt;/code&gt; parameter while defining a field.&lt;br /&gt;&lt;br /&gt;A method name with &lt;code&gt;validate_&lt;/code&gt; as prefix and &lt;code&gt;field name&lt;/code&gt; as the rest will be attached as validator to that field.&lt;br /&gt;&lt;br /&gt;I am in the process of releasing v0.3 and expecting it during next week. Now, I am focusing on improving documentation. I welcome you to help me improving the documentation.&lt;br /&gt;&lt;br /&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-5136145170537946933?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/5136145170537946933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=5136145170537946933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/5136145170537946933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/5136145170537946933'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/07/mysql-support-in-kalapy.html' title='MySQL support in KalaPy!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-749249204721886749</id><published>2010-06-25T15:30:00.001+05:30</published><updated>2010-06-25T15:32:33.447+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAL'/><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>Google AppEngine support in KalaPy!</title><content type='html'>Hello Everyone,&lt;br /&gt;&lt;br /&gt;I have just implemented Google AppEngine support in &lt;a href="http://www.kalapy.org/" target="_blank"&gt;KalaPy&lt;/a&gt;. You can see a &lt;a href="http://kalapy-demo.appspot.com/" target="_blank"&gt;KalaPy example running on AppEngine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As I mentioned earlier in my &lt;a href="http://amit-mendapara.blogspot.com/2010/06/proposed-api-change-dal.html"&gt;previous post&lt;/a&gt;,the &lt;a href="http://www.kalapy.org/docs/index.html" target="_blank"&gt;DAL API&lt;/a&gt; has been changed to deal with GAE related issues. Let me make some corrections regarding these changes.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;NOT IN&lt;/code&gt; operator has been removed (this can be done with multiple &lt;code&gt;!=&lt;/code&gt; filters). The &lt;code&gt;OR&lt;/code&gt; operation should beperformed with &lt;code&gt;Q&lt;/code&gt; like this:&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kalapy.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;&lt;br /&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;q1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'name =='&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'some'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'name =='&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'someone'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;q2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'name =='&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'some'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; \&lt;br /&gt;               &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'lang =='&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'fr_FR'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;The &lt;code&gt;q1&lt;/code&gt; is equivalent to:&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="ss"&gt;"hello_user"&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="ss"&gt;"name"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'some'&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="ss"&gt;"name"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'someone'&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;And the &lt;code&gt;q2&lt;/code&gt; is equivalent to:&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="ss"&gt;"hello_user"&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="ss"&gt;"name"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'some'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="ss"&gt;"lang"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'fr_FR'&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;There are still some issues with GAE backend implementation, especially:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Referential integrity&lt;/em&gt; is not implemented yet&lt;/li&gt;&lt;li&gt;&lt;em&gt;Unique constraint&lt;/em&gt; is not implemented yet&lt;/li&gt;&lt;li&gt;&lt;em&gt;OneToOne field&lt;/em&gt; will not work as expected&lt;/li&gt;&lt;li&gt;&lt;em&gt;Decimal field&lt;/em&gt; is not supported at the moment&lt;/li&gt;&lt;li&gt;&lt;em&gt;Transaction&lt;/em&gt; is not supported&lt;/li&gt;&lt;/ul&gt;The issues will be resolved before releasing KalaPy 0.3 which I am planingto release during the first week of the coming July.&lt;br /&gt;&lt;br /&gt;Beside that, I have also implemented an admin command to deal with GAE relatedtasks like create &lt;code&gt;app.yaml&lt;/code&gt;, launching dev appserver, updating the applicationon appengine etc.&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;$ cd /path/to/your-kalapy-project&lt;br /&gt;$ ./admin.py gae --help&lt;br /&gt;admin.py gae &amp;lt;action&amp;gt; [options] [args]&lt;br /&gt;&lt;br /&gt;Perform google appengine specific tasks.&lt;br /&gt;&lt;br /&gt;Use the 'appcfg.py' and 'dev_appserver.py' (included in appengine sdk)&lt;br /&gt;for other appengine specific tasks.&lt;br /&gt;&lt;br /&gt;options:&lt;br /&gt;&lt;br /&gt;  -a --address hostname for the appserver&lt;br /&gt;  -p --port    port number for the appserver&lt;br /&gt;  -i --install install libs (extra libs as arguments)&lt;br /&gt;  -v --verbose enable verbose output&lt;br /&gt;  -h --help    display help and exit&lt;br /&gt;&lt;br /&gt;available actions:&lt;br /&gt;&lt;br /&gt;  prepare    prepare this project for google appengine.&lt;br /&gt;  rollback   launch 'appcfg.py rollback'&lt;br /&gt;  runserver  launch 'dev_appserver.py runserver'&lt;br /&gt;  update     launch 'appcfg.py update'&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;You can install required python modules with &lt;code&gt;./admin.py gae prepare -i [module1 [module1 [...]]&lt;/code&gt;command. For example, with KalaPy example application (change &lt;code&gt;settings.DATABASE_ENGINE = "gae"&lt;/code&gt;):&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;$ cd /path/to/kalapy/example&lt;br /&gt;$ ./admin.py gae prepare -i docutils roman&lt;br /&gt;$ ./admin.py gae runserver&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Get the latest sources from the &lt;a href="http://github.com/cristatus/kalapy" target="_blank"&gt;github&lt;/a&gt; and help me improving the project.Visit the &lt;a href="http://www.kalapy.org/"&gt;official project website&lt;/a&gt; for latest updates.&lt;br /&gt;&lt;br /&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-749249204721886749?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/749249204721886749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=749249204721886749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/749249204721886749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/749249204721886749'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/06/google-appengine-support-in-kalapy.html' title='Google AppEngine support in KalaPy!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-5063819483114309231</id><published>2010-06-20T16:00:00.001+05:30</published><updated>2010-06-20T16:02:33.681+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAL'/><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>Proposed API Change (DAL)</title><content type='html'>Hi All,&lt;br&gt;&lt;br&gt;The &lt;a href=""&gt;Query&lt;/a&gt; interface of the DAL API is going to be changed in next version to make it compatible with Google App Engine as GAE doesn't support &lt;code&gt;OR&lt;/code&gt; operator. However,the &lt;code&gt;IN&lt;/code&gt; operator can provide limited &lt;code&gt;OR&lt;/code&gt; support.&lt;br&gt;&lt;br&gt;Also the &lt;code&gt;Query.filter&lt;/code&gt; would be changed to follow GAE's &lt;code&gt;Query.filter&lt;/code&gt;signature. The &lt;code&gt;OR&lt;/code&gt; and &lt;code&gt;NOT IN&lt;/code&gt; operators are not supported in GAE, but the DAL API would implement support for these operators.&lt;br&gt;&lt;br&gt;So, the following syntax:&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name = :name and age &amp;gt;= :age&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;some&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;will be replace with:&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name =&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;some&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;age &amp;gt;=&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Support of &lt;i&gt;OR&lt;/i&gt; operator will implemented as &lt;i&gt;||&lt;/i&gt; operator, like:&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kalapy.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name =&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;some&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;age &amp;gt;=&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;The operator &lt;code&gt;NOT IN&lt;/code&gt; would be expanded to (only GAE):&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name not in&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;some&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;thing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;else&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="c"&gt;# to&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name !=&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;some&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; \&lt;br /&gt;           &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name !=&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;thing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; \&lt;br /&gt;           &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name !=&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;else&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Currently, &lt;i&gt;PostgreSQL&lt;/i&gt; and &lt;i&gt;SQLite3&lt;/i&gt; backend engines are implemented. Developmentis in progress to add support for Google App Engine and OpenERP.&lt;br&gt;&lt;br&gt;Stay Tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-5063819483114309231?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/5063819483114309231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=5063819483114309231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/5063819483114309231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/5063819483114309231'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/06/proposed-api-change-dal.html' title='Proposed API Change (DAL)'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-6869942277329372829</id><published>2010-06-15T20:56:00.001+05:30</published><updated>2010-06-20T16:26:48.753+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>KalaPy - A Web Framework</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Hi all,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;The Rapido project has been renamed to KalaPy. A new version 0.2 has been released with new package name and an official project website has been launched.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;For those who don't know, &lt;i&gt;KalaPy&lt;/i&gt; is a new web application framework for &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; designed after modularity in mind, provides it's own &lt;a href="http://www.kalapy.org/docs/api/db.html"&gt;Database Abstraction Layer&lt;/a&gt;, WSGI compatible web components based on &lt;a href="http://werkzeug.pocoo.org/"&gt;Werkzeug&lt;/a&gt;, templating using &lt;a href="http://jinja.pocoo.org/2/"&gt;Jinja2&lt;/a&gt; and full internationalisation based on &lt;a href="http://babel.edgewall.org/"&gt;Babel&lt;/a&gt; and &lt;a href="http://pytz.sourceforge.net/"&gt;pytz&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;b&gt;Links:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kalapy.org/"&gt;http://www.kalapy.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kalapy.org/docs/index.html"&gt;http://www.kalapy.org/docs/index.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/kalapy"&gt;http://groups.google.com/group/kalapy&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;Regards&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;--&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;Amit Mendapara&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-6869942277329372829?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/6869942277329372829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=6869942277329372829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/6869942277329372829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/6869942277329372829'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/06/kalapy-web-framework.html' title='KalaPy - A Web Framework'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-4336835516690718292</id><published>2010-06-15T11:04:00.000+05:30</published><updated>2010-06-20T16:26:48.754+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>The Rapido project is renamed!</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;So finally, I have renamed the Rapido project to KalaPy. Thanks you all for your interest and voting &amp;nbsp;for new name. See the &lt;a href="http://amit-mendapara.blogspot.com/2010/06/name-rapido-project.html"&gt;poll result here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The name &lt;i&gt;KalaPy&lt;/i&gt; is derived from &lt;i&gt;Sanskrit&lt;/i&gt; term &lt;i&gt;Kalapi,&lt;/i&gt;&amp;nbsp;means a peacock, a beautiful bird. The name should be pronounced exactly like the original word&amp;nbsp;&lt;i&gt;Kalapi.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The project source repository is relocated to&amp;nbsp;&lt;a href="http://github.com/cristatus/kalapy"&gt;http://github.com/cristatus/kalapy&lt;/a&gt;. The PyPI package is located here&amp;nbsp;&lt;a href="http://pypi.python.org/pypi/KalaPy/"&gt;http://pypi.python.org/pypi/KalaPy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I am in the process of creating a dedicated website for the project, till then, follow the &lt;a href="http://cristatus.github.com/kalapy"&gt;documentation at github&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-4336835516690718292?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/4336835516690718292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=4336835516690718292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4336835516690718292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4336835516690718292'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/06/rapido-project-is-renamed.html' title='The Rapido project is renamed!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-4080388011427855191</id><published>2010-06-14T10:44:00.001+05:30</published><updated>2010-06-20T16:26:48.754+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>Poll Result!</title><content type='html'>&lt;div&gt;Hi all,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Here is the result of &lt;a href="http://amit-mendapara.blogspot.com/2010/06/name-rapido-project.html"&gt;the poll&lt;/a&gt; requesting you to suggest a new name for the Rapido project.&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 12px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 12px;"&gt;&lt;table id="table#0" style="border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; empty-cells: show; font-size: 1em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; width: 171px;"&gt;&lt;tbody style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Rapido&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;1&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;7%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Keka&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;2&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;14%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Kalapi&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;1&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;7%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;KalaPy&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;7&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;50%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Pavo&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;1&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;7%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Peacock&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;1&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;7%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Other&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;2&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;14%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 12px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 12px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-size: medium;"&gt;The poll will be closed in a day. I am going to launch the official project website once we decide on the name. Thank you all for the interest.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 12px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-size: 12px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-size: medium;"&gt;Regards&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-4080388011427855191?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/4080388011427855191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=4080388011427855191' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4080388011427855191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4080388011427855191'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/06/poll-result.html' title='Poll Result!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-3741540518330883121</id><published>2010-06-07T21:49:00.004+05:30</published><updated>2010-06-20T16:26:48.754+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>Name the Rapido Project!</title><content type='html'>&lt;b&gt;Update:&lt;/b&gt;&amp;nbsp;the poll is closed now, see the result bellow&lt;br /&gt;&lt;br /&gt;Most of you might be aware about my new open source project which I started with a code name &lt;i&gt;&lt;a href="http://cristatus.github.com/rapido/"&gt;Rapido&lt;/a&gt;&lt;/i&gt;&amp;nbsp;and released the preview version under the same name on &lt;a href="http://github.com/cristatus/rapido"&gt;github&lt;/a&gt;. But soon I realized that the term &lt;i&gt;Rapido&lt;/i&gt;&amp;nbsp;is already being used by some internet companies, so I decided to rename the project.&lt;br /&gt;&lt;br /&gt;Here are few names being suggested. Interestingly when I was thinking about a name, I never get any other hints then one related to a bird &lt;a href="http://en.wikipedia.org/wiki/Peafowl"&gt;peacock&lt;/a&gt;. I think, this is because of some unforgettable memories of my childhood when I was always mesmerized by this beautiful bird...&lt;br /&gt;&lt;br /&gt;Feel free to suggest your own preferred name too!&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Poll Result&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;td class="ss-chart-img-container" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: top; width: 360px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: arial, sans-serif; font-size: 12px; font-weight: normal;"&gt;&lt;table id="table#0" style="border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; empty-cells: show; font-size: 1em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; width: 171px;"&gt;&lt;tbody style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Rapido&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;1&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;6%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Keka&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;2&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;13%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Kalapi&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;1&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;6%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;KalaPy&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;8&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;50%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Pavo&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;1&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;6%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Peacock&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;2&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;13%&lt;/td&gt;&lt;/tr&gt;&lt;tr style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;td class="ss-table-label" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; vertical-align: top; white-space: nowrap;"&gt;Other&lt;/td&gt;&lt;td class="" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;/td&gt;&lt;td class="ss-table-number" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;2&lt;/td&gt;&lt;td class="ss-table-percentage" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0.5em; padding-left: 1.38em; padding-right: 0px; padding-top: 0px; text-align: right; vertical-align: top;"&gt;13%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="ss-cb-pct-expl" id="checkboxMessage#0" style="-webkit-box-sizing: border-box; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; border-collapse: separate; font-size: medium;"&gt;Regards&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td class="ss-chart-table-container" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 2em; padding-right: 0px; padding-top: 0px; vertical-align: top;"&gt;&lt;div class="ss-cb-pct-expl" id="checkboxMessage#0" style="-webkit-box-sizing: border-box; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #666666; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-3741540518330883121?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/3741540518330883121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=3741540518330883121' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3741540518330883121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3741540518330883121'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/06/name-rapido-project.html' title='Name the Rapido Project!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-2285985243299057214</id><published>2010-06-03T23:22:00.002+05:30</published><updated>2010-06-20T16:26:48.755+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='KalaPy'/><title type='text'>It's Rapido!</title><content type='html'>Hello everyone,&lt;br /&gt;&lt;br /&gt;So finally, it is released. The project was code named &lt;b&gt;&lt;i&gt;Rapido &lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;and released with the same name. You can grab the code from &lt;a href="http://github.com/cristatus/rapido"&gt;github&lt;/a&gt;. Please feel free to feedback me with your thoughts/suggestions&amp;nbsp;about how to improve it and what you are expecting in future.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;Here is the documentation&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;a href="http://packages.python.org/Rapido/"&gt;http://packages.python.org/Rapido&lt;/a&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-2285985243299057214?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/2285985243299057214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=2285985243299057214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2285985243299057214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2285985243299057214'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/06/its-rapido.html' title='It&apos;s Rapido!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-1233958222709879555</id><published>2010-05-17T18:26:00.016+05:30</published><updated>2010-06-20T16:28:35.095+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAL'/><title type='text'>Glimpse of Web Components...</title><content type='html'>Hello everyone,&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UPDATE: &lt;/b&gt;I have decided to do something similar to &lt;a href="http://flask.pocoo.com/" target="_blank"&gt;Flask&lt;/a&gt; so later, if possible, we can base the web components on top of Flask.&lt;br /&gt;&lt;br /&gt;After a&amp;nbsp;careful&amp;nbsp;study of several WSGI tools, I concluded to used &lt;a href="http://werkzeug.pocoo.org/" target="_blank"&gt;Werkzeug&lt;/a&gt; as the base of the web components of the proposed framework and I already implemented initial set of web components so that I can start working on &lt;i&gt;BigTable&lt;/i&gt; implementation.&lt;br /&gt;&lt;br /&gt;Why &lt;i&gt;Werkzeug&lt;/i&gt;? Well, it's fully WSGI compliant pure python implementation with no thirdparty dependencies and provides some really nice features like auto-reload, a powerful routing api and an amazing interactive debugger, and most&amp;nbsp;importantly&amp;nbsp;works with &lt;code&gt;Google AppEngine&lt;/code&gt; too.&lt;br /&gt;&lt;br /&gt;Visit &lt;a href="http://werkzeug.pocoo.org/" target="_blank"&gt;Werkzeug&lt;/a&gt; for more information.    Finally, &lt;a href="http://jinja.pocoo.org/" target="_blank"&gt;Jinja2&lt;/a&gt;&amp;nbsp;would be the&amp;nbsp;templating engine.&lt;br /&gt;&lt;br /&gt;Okay, so let I show you how the main web request handlers, would look like.&lt;br /&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/find/&amp;lt;limit&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/find/&amp;lt;limit&amp;gt;/&amp;lt;offset&amp;gt;'&lt;/limit&gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="sd"&gt;"""Search for resources within the given limits&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    Following requests will be routed to this method&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    GET /find/user/40/0&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    GET /find/user/40/41&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    GET /find/user/40/81&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    GET /find/user/100&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/get'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/get/&amp;lt;key&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="sd"&gt;"""Get a resource identified by given key.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    Following requests will be routed to this method&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    GET /get/user&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    GET /get/user/1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br /&gt;        &lt;span class="s"&gt;'template.html'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;late&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ables&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/save/&amp;lt;model&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/save/&amp;lt;model&amp;gt;/&amp;lt;key&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="sd"&gt;"""Save the post/put data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    Following requests will be routed to this method&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    POST /save/user&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    POST /save/user/1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    The data can be accessed from &lt;code&gt;self.response.form&lt;/code&gt; attribute&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br /&gt;                &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/save'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/delete'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="sd"&gt;"""Delete a resource identified with given key&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    Following requests will be routed to this method&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="sd"&gt;    POST /delete/user/1&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&lt;br /&gt;    &lt;span class="sd"&gt;"""Index page&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="nd"&gt;@web.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;    &lt;span class="sd"&gt;"""All other requests would be dispatched to this method&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;    """&lt;/span&gt;&lt;br /&gt;    &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;The &lt;code&gt;request&lt;/code&gt; is exported via the &lt;code&gt;web&lt;/code&gt; namespace which is bound to current request context and can only accessed if request is started. There are few more but wait till I release the code...&lt;br /&gt;&lt;br /&gt;That's it. Everything else will be handled by the framework including handling of static contents, template rendering, creating wsgi application etc.&lt;br /&gt;&lt;br /&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-1233958222709879555?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/1233958222709879555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=1233958222709879555' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1233958222709879555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1233958222709879555'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/05/glimpse-of-web-components.html' title='Glimpse of Web Components...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-1801740614909510259</id><published>2010-05-13T20:47:00.003+05:30</published><updated>2010-05-13T21:19:01.597+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAL'/><title type='text'>Glimpse of DAL (Database Abstraction Layer) API...</title><content type='html'>Hello everyone,&lt;br /&gt;&lt;br /&gt;I have finished initial set of DAL api and implemented two backend engines for &lt;code&gt;sqlite3&lt;/code&gt; and &lt;code&gt;PostgreSQL&lt;/code&gt; and both the engines have successfully passed the unit tests. Next, I am going to implement BigTable backend engine. It's going to be really interesting as I have seen a possibility to have backend engines for &lt;code&gt;OpenERP&lt;/code&gt; and &lt;code&gt;Tryton&lt;/code&gt;. I will provide more information later on this but first let I introduce how the API looks like:&lt;br /&gt;&lt;br /&gt;Please go through my previous posts on this topic if you haven't read them yet.&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;User&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lang = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;9&lt;/b&gt;&lt;/span&gt;, selection=[(&lt;span style="color: #0086d2;"&gt;'en_EN'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'English'&lt;/span&gt;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;span style="color: #0086d2;"&gt;'fr_FR'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'French'&lt;/span&gt;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;span style="color: #0086d2;"&gt;'de_DE'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'German;)])&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dob = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Date()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;email = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True, unique=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;phone = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;20&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff0007;"&gt;&lt;b&gt;@&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff0086;"&gt;&lt;b&gt;db&lt;/b&gt;&lt;/span&gt;&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #ff0086;"&gt;&lt;b&gt;validate&lt;/b&gt;&lt;/span&gt;(email)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;chk_email&lt;/b&gt;&lt;/span&gt;(self, value):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;not&lt;/b&gt;&lt;/span&gt;&amp;nbsp;re&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;match(&lt;span style="color: #0086d2;"&gt;'...'&lt;/span&gt;, value):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;raise&lt;/b&gt;&lt;/span&gt;&amp;nbsp;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ValidationError(&lt;span style="color: #0086d2;"&gt;'Invalid email address'&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;As you know this is how a model class can be constructed. All database related API to be used by applications is exposed via &lt;i&gt;db&lt;/i&gt; namespace. Here is the list of the exposed API:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Query&lt;br /&gt;&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Field&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Text&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Boolean&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Integer&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Float&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Decimal&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Date&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Time&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;DateTime&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Binary&lt;br /&gt;&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ManyToOne&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;OneToOne&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;OneToMany&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ManyToMany&lt;br /&gt;&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;FieldError&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ValidationError&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;DatabaseError&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;IntegrityError&lt;br /&gt;&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;get_model&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;get_models&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;validate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# a decorator to assign a validator method to a field&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;unique&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# a model class helper to define combined unique constraints&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;meta&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# a model class decorator to change meta information like model name&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;span style="color: #ff0007;"&gt;&lt;b&gt;@&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff0086;"&gt;&lt;b&gt;db&lt;/b&gt;&lt;/span&gt;&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #ff0086;"&gt;&lt;b&gt;meta&lt;/b&gt;&lt;/span&gt;(name=&lt;span style="color: #0086d2;"&gt;'base.user'&lt;/span&gt;)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;User&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;transaction&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;enter_transaction&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;transaction&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;leave_transaction&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;transaction&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;commit&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;transaction&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;rollback&lt;br /&gt;db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;transaction&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;run_in_transaction&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Here is the Model class api:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# properties&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;is_saved&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;is_dirty&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# methods&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;__init__(**kw)&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;save()&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;delete()&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;get(key)&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;all()&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;select(*names)&lt;br /&gt;Model&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;fields()&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Here, &lt;i&gt;Model.all()&lt;/i&gt; returns an instance of Query, and &lt;i&gt;Model.select(*names)&lt;/i&gt; returns list of tuple of the values for the matched records. For example:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;User&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;select(&lt;span style="color: #0086d2;"&gt;'name'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'lang'&lt;/span&gt;)&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;filter(&lt;span style="color: #0086d2;"&gt;'lang == :lang'&lt;/span&gt;, lang=&lt;span style="color: #0086d2;"&gt;'fr_FR'&lt;/span&gt;)&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;order(&lt;span style="color: #0086d2;"&gt;'-name'&lt;/span&gt;)&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;fetch(-&lt;span style="color: #0086f7;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Will return a list of tuple (name_value, lang_value) of the matched records. It is similar to:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;SELECT&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"name"&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;"lang"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;FROM&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"base_user"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;WHERE&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"lang"&lt;/span&gt;&amp;nbsp;= &lt;span style="color: #0086d2;"&gt;"fr_FR"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;ORDER&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;BY&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"name"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;DESC&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;The &lt;i&gt;Field&lt;/i&gt; class exposed following methods:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# methods&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;__init__(&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;...&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;validate(value)&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;empty(value)&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;default_value()&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;python_to_database(value)&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;database_to_python(value)&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# properties&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;name&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;data_type&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;default&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;is_required&lt;br /&gt;Field&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;is_unique&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;You can see the &lt;i&gt;Field&lt;/i&gt; api is self explanatory and much similar to the most of the existing ORM library. Now let's see the &lt;i&gt;Query&lt;/i&gt; class.&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;Query&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;__init__(model)&lt;br /&gt;Query&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;filter(query, **params)&lt;br /&gt;Query&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;order(spec)&lt;br /&gt;Query&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;count()&lt;br /&gt;Query&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;fetch(limit, offset=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;Query&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;delete()&lt;br /&gt;Query&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;update(**kw)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;If you are familiar with &lt;code&gt;Django&lt;/code&gt; or &lt;code&gt;Google App Engine&lt;/code&gt; this is similar to the query object available in those frameworks and works almost similar. Let's see an example:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;q = Query(User) &lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# or q = User.all()&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;first_ten = q&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;order(&lt;span style="color: #0086d2;"&gt;'-name'&lt;/span&gt;)&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;fetch(&lt;span style="color: #0086f7;"&gt;&lt;b&gt;10&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;q = q&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;filter(&lt;span style="color: #0086d2;"&gt;'name in :names'&lt;/span&gt;, names=[&lt;span style="color: #0086d2;"&gt;'some'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'one'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'else'&lt;/span&gt;])&lt;br /&gt;all_matched = q&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;fetch(-&lt;span style="color: #0086f7;"&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;q&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;update(lang=&lt;span style="color: #0086d2;"&gt;'fr_FR'&lt;/span&gt;)&lt;br /&gt;q&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;delete()&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;The last two method calls resembles:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;UPDATE&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"base_use"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;SET&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"lang"&lt;/span&gt;&amp;nbsp;= &lt;span style="color: #0086d2;"&gt;"fr_FR"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;WHERE&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"name"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;IN&lt;/b&gt;&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0086d2;"&gt;"some"&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;"one"&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;"else"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;-- and&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;DELETE&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;FROM&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"base_user"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;WHERE&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"name"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;IN&lt;/b&gt;&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0086d2;"&gt;"some"&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;"one"&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;"else"&lt;/span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;So these are the most common api exposed to the user to be used in applications&lt;br /&gt;&lt;br /&gt;The API for backend engines are kept hidden from outside world in a subpackage &lt;i&gt;db.engines&lt;/i&gt; which must be imported manually if one wishes to use that api. A backend engine should be implemented using an interface class defined as &lt;i&gt;IDatabase&lt;/i&gt; and the engine should expose the implementation as &lt;i&gt;Database&lt;/i&gt;. Besides that an engine should also expose engine specific &lt;i&gt;DatabaseError&lt;/i&gt; and &lt;i&gt;IntegriryError&lt;/i&gt; classes.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;IDatabase&lt;/code&gt; defines following interface:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="font-family: monospace;"&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;__init__(&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;...&lt;/span&gt;&lt;/span&gt;)&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;connect()&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;close()&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;commit()&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;rollback()&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;cursor()&lt;br /&gt;&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;get_data_type(field)&lt;br /&gt;&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;exists_table(name)&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;create_table(model)&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;alter_table(model, name=None)&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;drop_table(name)&lt;br /&gt;&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;update_records(*objs)&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;delete_records(*objs_or_keys)&lt;br /&gt;&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;select_from(query, params)&lt;br /&gt;IDatabase&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;select_count(query, params)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;You can see the interface is very simple but few more interface methods are expected in future to support enhanced query syntax.&lt;br /&gt;&lt;br /&gt;Besides the DAL api I have also implemented test cases and few helper classes and functions to easy writing new test cases. The framework is also going to provide Django style command line admin tools to do common administrative tasks. See all theses things in the first alpha release expected be made public in the first week of the next month. Stay tuned...&lt;br /&gt;&lt;br /&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-1801740614909510259?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/1801740614909510259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=1801740614909510259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1801740614909510259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1801740614909510259'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/05/glimpse-of-dal-database-abstraction.html' title='Glimpse of DAL (Database Abstraction Layer) API...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-5332567799906349669</id><published>2010-05-04T15:52:00.006+05:30</published><updated>2010-05-08T01:31:09.263+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAL'/><title type='text'>More on DAL...</title><content type='html'>Hello again,&lt;br /&gt;&lt;br /&gt;I have just implemented few more interesting features to &lt;a href="http://amit-mendapara.blogspot.com/2010/04/database-abstraction-layer-dal.html" target="_blank"&gt;DAL (Database Abstraction Layer)&lt;/a&gt;. The relational fields and the way to interact with them. The DAL now supports &lt;code&gt;ManyToOne&lt;/code&gt;, &lt;code&gt;OneToOne&lt;/code&gt;, &lt;code&gt;OneToMany&lt;/code&gt; and &lt;code&gt;ManyToMany&lt;/code&gt; relationships. Let me explain with few examples:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;User&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dob = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Date()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;groups = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ManyToMany(&lt;span style="color: #0086d2;"&gt;'Group'&lt;/span&gt;, reverse_name=&lt;span style="color: #0086d2;"&gt;'members'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;Group&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;Address&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;street1 = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;street2 = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;city = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;zip = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;20&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;state = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;country = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;, selection=get_country_names)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ManyToOne(User)&lt;/div&gt;Here the &lt;code&gt;User&lt;/code&gt; has a many-to-many relationship with &lt;code&gt;Group&lt;/code&gt; represented by &lt;code&gt;groups&lt;/code&gt; field. Defining an M2M relationship using &lt;code&gt;db.ManyToMany&lt;/code&gt; with &lt;code&gt;reverse_name&lt;/code&gt; attribute, the target model will automatically get a &lt;code&gt;ManyToMany&lt;/code&gt; field with that name pointing to the respective model. In this case &lt;code&gt;Group&lt;/code&gt; will get an M2M field &lt;code&gt;members&lt;/code&gt; pointing to &lt;code&gt;User&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Similarly, &lt;code&gt;Address&lt;/code&gt; model has one &lt;code&gt;ManyToOne&lt;/code&gt; field named &lt;code&gt;user&lt;/code&gt; pointing to model User. In result, the &lt;code&gt;User&lt;/code&gt; model will automatically get a &lt;code&gt;OneToMany&lt;/code&gt; field pointing to &lt;code&gt;Address&lt;/code&gt; with name &lt;code&gt;address_set&lt;/code&gt;. M2O field also excepts &lt;code&gt;reverse_name&lt;/code&gt; attribute if you want to use another name.&lt;br /&gt;&lt;br /&gt;Now, let's check few more cases&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;Car&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;model = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;engine = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;OneToOne(&lt;span style="color: #0086d2;"&gt;'Engine'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parts = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;OneToMany(&lt;span style="color: #0086d2;"&gt;'Part'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;Engine&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;Part&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;/div&gt;Here &lt;code&gt;Car&lt;/code&gt; &amp;amp; &lt;code&gt;Engine&lt;/code&gt; has one-to-one relationship represented by the field&amp;nbsp;&lt;code&gt;engine&lt;/code&gt;. A reverse lookup field&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;car&lt;/span&gt;&amp;nbsp;will be automatically created in&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;Engine&lt;/span&gt;. Also, &lt;code&gt;Car&lt;/code&gt; has one O2M field &lt;code&gt;parts&lt;/code&gt; pointing to &lt;code&gt;Part&lt;/code&gt;, so &lt;code&gt;Part&lt;/code&gt; will automatically get an M2O field named &lt;code&gt;car&lt;/code&gt; pointing to &lt;code&gt;Car&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Now let's see how it can be used:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; margin: 10px 0; padding: 10px 4px;"&gt;u = User(name=&lt;span style="color: #0086d2;"&gt;"some"&lt;/span&gt;)&lt;br /&gt;u&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;address_set&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;add(Address(street1=&lt;span style="color: #0086d2;"&gt;"st1"&lt;/span&gt;))&lt;br /&gt;u&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;save()&lt;/div&gt;Similarly, you can add records to M2M field. There is not need to save the records but later the parent instance will take care of saving all unsaved related instances.&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; margin: 10px 0; padding: 10px 4px;"&gt;g1 = Group(name=&lt;span style="color: #0086d2;"&gt;'user'&lt;/span&gt;)&lt;br /&gt;g2 = Group(name=&lt;span style="color: #0086d2;"&gt;'admin'&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;u&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;groups&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;add(g1, g2)&lt;br /&gt;u&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;save()&lt;/div&gt;Here&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;g1&lt;/span&gt;,&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;g2&lt;/span&gt;&amp;nbsp;are not saved and added to&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace;"&gt;u.groups&lt;/span&gt;, these unsaved instances will be saved by &lt;span class="Apple-style-span" style="font-family: monospace;"&gt;u.save&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The related model instances are not directly accessible via field variables of type &lt;code&gt;OneToMany&lt;/code&gt; and &lt;code&gt;ManyToMany&lt;/code&gt; but one should use any of the provided methods to those fields. Like:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# get query object of all addresses and fetch first 10 records&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;u&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;address_set&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;all()&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;fetch(&lt;span style="color: #0086f7;"&gt;&lt;b&gt;10&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# remove an address&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;u&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;address_set&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;remove(a)&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# clear all addresses&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;u&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;address_set&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;clear()&lt;/div&gt;On the other hand, &lt;code&gt;ManyToOne&lt;/code&gt; and &lt;code&gt;OneToOne&lt;/code&gt; fields directly points to the related instance.&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; margin: 10px 0; padding: 10px 4px;"&gt;c = Car(name=&lt;span style="color: #0086d2;"&gt;'Nano'&lt;/span&gt;)&lt;br /&gt;e = Engine(name=&lt;span style="color: #0086d2;"&gt;'Micro'&lt;/span&gt;)&lt;br /&gt;c&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;engine = e&lt;br /&gt;&lt;br /&gt;c&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;save()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;c&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;engine&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;name&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;e&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;car&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;name&lt;/div&gt;Notice that we haven't saved &lt;code&gt;e&lt;/code&gt; but just &lt;code&gt;c&lt;/code&gt;. Yes, the DAL API will take care of saving all the related objects if they are modified.&lt;br /&gt;&lt;br /&gt;Besides that support for unique constraints have been improved, see:&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; margin: 10px 0; padding: 10px 4px;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&amp;nbsp;xyz &lt;span style="color: #fb660a;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&amp;nbsp;db&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&amp;nbsp;xyz&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;db &lt;span style="color: #fb660a;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&amp;nbsp;has_unique&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;Some&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;has_unique(a, [b, c])&lt;/div&gt;Here we have added two unique constraints to model &lt;code&gt;Some&lt;/code&gt;. One for &lt;code&gt;a&lt;/code&gt; and a combined unique constraint for &lt;code&gt;b&lt;/code&gt; and &lt;code&gt;c&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;That's it for now, more details as the work progresses so keep watch on my blog.&lt;br /&gt;&lt;br /&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-5332567799906349669?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/5332567799906349669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=5332567799906349669' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/5332567799906349669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/5332567799906349669'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/05/more-on-dal.html' title='More on DAL...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-5405345332140932141</id><published>2010-04-30T12:35:00.007+05:30</published><updated>2010-05-04T16:32:35.412+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='DAL'/><title type='text'>The Database Abstraction Layer (DAL)</title><content type='html'>Hello everyone,&lt;br /&gt;&lt;br /&gt;This is the third and last article I promised in the answers to my friends who are curious to know about what I am doing right now. I am not going to repeat introductory text again and simply jumping on what the &lt;i&gt;Database Abstraction Layer (DAL)&lt;/i&gt; after all and how it would work.&lt;br /&gt;&lt;br /&gt;The framework is being implemented keeping scalability in mind as well as support for wide range of deployment options including clouds. Other goals are &lt;i&gt;keep it simple, do it your self, keep the thirdparty dependencies minimal&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;So the first obvious thing that comes in mind is the database support ranging from &lt;i&gt;RDBMS&lt;/i&gt; to highly scalable&lt;i&gt; NoSQL DBMS &lt;/i&gt;to &lt;i&gt;OODBMS&lt;/i&gt;. We have our reasons to choose one or another DBMS, be it cost, performance or something else. We all know how difficult it is to change the options once we deploy the application. Yes there are ORM available that can solve this issue but most of them only supports RDBMS. I am not going to explain pros and cons of theses available ORM but will provide you some glimpse on how the proposed DAL would work and easy your way. It's up to you to evaluate it against existing solutions.&lt;br /&gt;&lt;br /&gt;Let I first show you how the DAL API looks like:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; padding: 10px 4px;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;from&lt;/b&gt;&lt;/span&gt;&amp;nbsp;xyz &lt;span style="color: #fb660a;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt;&amp;nbsp;db&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;User&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dob = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Date(requied=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;email = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True, unique=True)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff0007;"&gt;&lt;b&gt;@&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff0086;"&gt;&lt;b&gt;db&lt;/b&gt;&lt;/span&gt;&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #ff0086;"&gt;&lt;b&gt;validate&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: #0086d2;"&gt;'dob'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #fb660a;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;check_dob&lt;/b&gt;&lt;/span&gt;(self, value):&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # if calculated age is less then 18 raise ValidationError&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;Article&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;publish_date = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Date(default_now=True, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Text(required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ManyToOne(&lt;span style="color: #0086d2;"&gt;'User'&lt;/span&gt;, required=True)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;Comment&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; title = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;100&lt;/b&gt;&lt;/span&gt;, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment_date = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Date(default_now=True, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Text(required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;article = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ManyToOne(&lt;span style="color: #0086d2;"&gt;'Article'&lt;/span&gt;, required=True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;ManyToOne(&lt;span style="color: #0086d2;"&gt;'User'&lt;/span&gt;, required=True)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #ff0007;"&gt;&lt;b&gt;@&lt;/b&gt;&lt;/span&gt;&lt;span style="color: #ff0086;"&gt;&lt;b&gt;db&lt;/b&gt;&lt;/span&gt;&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #ff0086;"&gt;&lt;b&gt;validate&lt;/b&gt;&lt;/span&gt;(&lt;span style="color: #0086d2;"&gt;'text'&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;check_comment&lt;/b&gt;&lt;/span&gt;(self, value):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# check value for blog compliance&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Sounds familiar, isn't it? The first import statement says `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;import from xyz&lt;/span&gt;`. Yes I still haven't decided on the name.&lt;br /&gt;&lt;br /&gt;Next, you must define your schema as python classes derived from db.Model. The DAL is there to enforce the schema in the case of underlying backend DBMS doesn't support schema, like BigTable and some other schemaless DBMS while giving that task to the DBMS is it supports schema.&lt;br /&gt;&lt;br /&gt;Database tables declared as subclasses of `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;Model&lt;/span&gt;` defines table properties as class members of type `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;Field&lt;/span&gt;` (&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;db.String, db.Date, db.Text&lt;/span&gt; are all kind of &lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;db.Field&lt;/span&gt;). So if you want to publish an article with title, body and date, you would do it as shown above.&lt;br /&gt;&lt;br /&gt;Some DBMS doesn't support constraints so validation is left as the responsibility of programmer. The DAL will take care of `&lt;i&gt;required&lt;/i&gt;` and/or `&lt;i&gt;unique&lt;/i&gt;` constraints as well as `&lt;i&gt;referential integrity&lt;/i&gt;` if the DBMS doesn't support it.&lt;br /&gt;&lt;br /&gt;Till now it just looks similar to `django` models but wait let I show you one more interesting feature of the proposed Model API, inheritance.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; padding: 10px 4px;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;A&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;B&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;(A, B):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;/div&gt;&lt;br /&gt;This is not supported. To keep the DAL simple, multiple inheritance (of &lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;Model&lt;/span&gt;) is not supported. This is allowed in `django` though. Let's see how inheritance works with DAL.&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; padding: 10px 4px;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;A&lt;/b&gt;&lt;/span&gt;(db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;Model):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;a = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;do_something&lt;/b&gt;&lt;/span&gt;(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;pass&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;B&lt;/b&gt;&lt;/span&gt;(A):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;C&lt;/b&gt;&lt;/span&gt;(B):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;do_somethinf&lt;/b&gt;&lt;/span&gt;(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; super(C, self)&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;do_something()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# do something else&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;D&lt;/b&gt;&lt;/span&gt;(A):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;do_something&lt;/b&gt;&lt;/span&gt;(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;supper(D, self)&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;do_something()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background-color: #0f140f;"&gt;&lt;span style="color: #00d2ff;"&gt;&lt;i&gt;# do something here&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Here, B is derived from A, C from B and D from A but wait, this is not the case. The DAL is implemented in such a way that no matter which model you inherit from, it always inherits from the last defined derived class of the first defined parent. That is, the hierarchy would be:&lt;br /&gt;&lt;br /&gt;A -&amp;gt; B -&amp;gt; C -&amp;gt; D instead of A -&amp;gt; B -&amp;gt; C and A -&amp;gt; D&lt;br /&gt;&lt;br /&gt;Another interesting feature is, no matter which class you use to instantiate a model, you will have an object of the latest defined class in the hierarchy. Why this is so? Let I explain:&lt;br /&gt;&lt;br /&gt;Suppose your application is using the above defined `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;User&lt;/span&gt;` model class like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; padding: 10px 4px;"&gt;user = User(**kwargs)&lt;br /&gt;user&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;do_something()&lt;br /&gt;user&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;save()&lt;/div&gt;&lt;br /&gt;Where `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;kwargs&lt;/span&gt;` is a `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;dict&lt;/span&gt;` of form variables coming from an http post request.&lt;br /&gt;&lt;br /&gt;Now if you think that `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;User&lt;/span&gt;` should have one more property `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;lang&lt;/span&gt;` but you don't want to change your running system by modifying the source code, you simply create a subclass of `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;User&lt;/span&gt;` and all the methods/members defined in that subclass will be available to the application.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; padding: 10px 4px;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;UserEx&lt;/b&gt;&lt;/span&gt;(User):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lang = db&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;String(size=&lt;span style="color: #0086f7;"&gt;&lt;b&gt;6&lt;/b&gt;&lt;/span&gt;, selection=[(&lt;span style="color: #0086d2;"&gt;'en_EN'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'English'&lt;/span&gt;),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;span style="color: #0086d2;"&gt;'fr_FR'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'French'&lt;/span&gt;), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;span style="color: #0086d2;"&gt;'de_DE'&lt;/span&gt;, &lt;span style="color: #0086d2;"&gt;'German'&lt;/span&gt;)])&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;def&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #ee0000;"&gt;&lt;b&gt;do_something&lt;/b&gt;&lt;/span&gt;(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super(UserEx, self)&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;do_something()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;So now if the html form has `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;lang&lt;/span&gt;` field, the above code will work without any change and still saving `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;lang&lt;/span&gt;` value. You can also change the behavior of the base class by overriding methods. This will allow you to implement highly modular applications with the proposed DAL API.&lt;br /&gt;&lt;br /&gt;This is somewhat similar to `&lt;i&gt;openerp&lt;/i&gt;` osv objects. If you familiar with `&lt;i&gt;openerp&lt;/i&gt;` then you should be aware of how easy it is to extend existing data model by simply creating and osv class with `&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;_inherits&lt;/span&gt;`, but as far as I know, the behavior of `&lt;i&gt;openerp&lt;/i&gt;` orm is not fully object oriented as shown here.&lt;br /&gt;&lt;br /&gt;Another problem of supporting almost all kind of database is query language support. RDBMS supports SQL while NoSQL DMBS might have their own query language. The DAL doesn't support SQL at all but sill it provides a way to filter the records. Let's see:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; padding: 10px 4px;"&gt;query = User&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;all()&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;filter(&lt;span style="color: #0086d2;"&gt;'name = :name and dob &amp;lt;= :dob'&lt;/span&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name=&lt;span style="color: #0086d2;"&gt;'some'&lt;/span&gt;, dob=&lt;span style="color: #0086d2;"&gt;'01-01-1992'&lt;/span&gt;)&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;order(&lt;span style="color: #0086d2;"&gt;'-dob'&lt;/span&gt;)&lt;br /&gt;users = query&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;fetch(&lt;span style="color: #0086f7;"&gt;&lt;b&gt;10&lt;/b&gt;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/span&gt;&amp;nbsp;user &lt;span style="color: #fb660a;"&gt;&lt;b&gt;in&lt;/b&gt;&lt;/span&gt;&amp;nbsp;users:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/span&gt;&amp;nbsp;user&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;name, user&lt;span style="background-color: #111111;"&gt;&lt;span style="color: white;"&gt;.&lt;/span&gt;&lt;/span&gt;dob&lt;/div&gt;&lt;br /&gt;The above query is equivalant to: &lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #111111; color: white; font-family: monospace; padding: 10px 4px;"&gt;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;SELECT&lt;/b&gt;&lt;/span&gt;&amp;nbsp;* &lt;b&gt;&lt;span style="color: #fd8900;"&gt;FROM&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"user"&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #fd8900;"&gt;WHERE&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"name"&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;LIKE&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;'%some%'&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fb660a;"&gt;&lt;b&gt;AND&lt;/b&gt;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"dob"&lt;/span&gt;&amp;nbsp;&amp;lt;= &lt;span style="color: #0086d2;"&gt;'01-01-1992'&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #fd8900;"&gt;ORDER&lt;/span&gt;&amp;nbsp;&lt;span style="color: #fd8900;"&gt;BY&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;span style="color: #0086d2;"&gt;"dob"&lt;/span&gt; &lt;b&gt;&lt;span style="color: #fd8900;"&gt;DESC&lt;/span&gt;&lt;/b&gt;&amp;nbsp;LIMIT &lt;span style="color: #0086f7;"&gt;&lt;b&gt;10&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;The syntax is again similar to `&lt;i&gt;google appengine&lt;/i&gt;` ORM with same restrictions. You can only perform search on single table, you can't use literal in query string but use named parameters which are bound to the provided parameters.&lt;br /&gt;&lt;br /&gt;So this is how the DAL API would be, I will explain it with more information later. I am enabling anonymous comments for this post to see what you think about it. I will be happy to see your useful suggestions and ideas.&lt;br /&gt;&lt;br /&gt;I will give more information on the DAL and the other components of the framework as it continues to reach to the first prototype stage. Stay tuned...&lt;br /&gt;&lt;br /&gt;Regards&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-5405345332140932141?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/5405345332140932141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=5405345332140932141' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/5405345332140932141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/5405345332140932141'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/04/database-abstraction-layer-dal.html' title='The Database Abstraction Layer (DAL)'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-3661335924646325436</id><published>2010-04-20T16:58:00.002+05:30</published><updated>2010-04-20T17:45:16.313+05:30</updated><title type='text'>Next big thing!</title><content type='html'>&lt;div class="content"&gt;&lt;br /&gt;Hi,&lt;br /&gt;&lt;br /&gt;This is the second post in the series of three articles I promised &lt;a href="http://amit-mendapara.blogspot.com/2010/04/its-alive-again.html"&gt;last time&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So let I inform you that I am working on a very interesting project and it will be released under an opensource license when first prototype is ready with a simple usecase.&lt;br /&gt;&lt;br /&gt;So let first I tell you about how I come to the decision to start such a project before telling you anything more about it.&lt;br /&gt;&lt;br /&gt;I had no other work when I left my previous job so I catch this opportunity to check several technologies like &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;, &lt;a href="http://www.djangoproject.com/"&gt;django&lt;/a&gt;, &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt; and various schema less database solutions like &lt;a href="http://labs.google.com/papers/bigtable.html"&gt;BigTable&lt;/a&gt; and &lt;a href="http://aws.amazon.com/simpledb/"&gt;SimpleDB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As I was previously working with the great &lt;a href="http://openobject.org/"&gt;openobject framework&lt;/a&gt;, I suddenly started thinking about the possibility of having an application framework that can be deployed on variety of platform but should be as powerful as &lt;i&gt;openobject&lt;/i&gt; and &lt;i&gt;django&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Obviously, &lt;i&gt;openobject&lt;/i&gt; is designed specifically for &lt;i&gt;PostgreSQL&lt;/i&gt;, an open source RDBMS, it is not easy to deploy &lt;i&gt;openobject applications&lt;/i&gt; on such a highly scalable platforms like &lt;i&gt;google apps&lt;/i&gt; or &lt;i&gt;amazon ec2&lt;/i&gt; effectively.&lt;br /&gt;&lt;br /&gt;Also &lt;i&gt;django&lt;/i&gt; data model is designed keeping RDMBS in mind. Though &lt;i&gt;django&lt;/i&gt; project is working on a very interesting feature for their ORM, &lt;i&gt;connection routing&lt;/i&gt;, where you can configure your &lt;i&gt;django&lt;/i&gt; application to use replicas of your database as &lt;i&gt;a writable master&lt;/i&gt; and &lt;i&gt;several readonly slaves&lt;/i&gt;. This will allow you to scale your application datastore without much efforts and improve fault tolerance and responsiveness of the application.&lt;br /&gt;&lt;br /&gt;As far as scalability is concerned, there is nothing wrong with RDBMS if you have good infrastructure and workforce to maintain it. But I am sure you can understand how much effort it requires to maintain such systems.&lt;br /&gt;&lt;br /&gt;The proposed application framework will allow you to implement highly scalable web applications that can be deployed on variety of platforms with any kind of database system, be it an RDBMS or NoSQL databases like &lt;i&gt;BigTable&lt;/i&gt; or &lt;i&gt;SimpleDB&lt;/i&gt; and even with OODBMS like &lt;i&gt;zodb&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;The framework is being designed after &lt;i&gt;django&lt;/i&gt; and &lt;i&gt;openobject&lt;/i&gt; patterns. It is not a clone nor a hybrid of these frameworks but being developed from scratch. The core of the framework is it's DAL (data abstraction layer) API similar to &lt;i&gt;django&lt;/i&gt; ORM in look and feel but works somewhat similar to the &lt;i&gt;ORM&lt;/i&gt; of the &lt;i&gt;openobject&lt;/i&gt; framework.&lt;br /&gt;&lt;br /&gt;An application (called &lt;i&gt;project&lt;/i&gt; in &lt;i&gt;django&lt;/i&gt; context) of this proposed framework consists of one or more modules (called &lt;i&gt;apps&lt;/i&gt; in &lt;i&gt;django&lt;/i&gt; context). Each module defines &lt;i&gt;models&lt;/i&gt;, &lt;i&gt;logic&lt;/i&gt; and &lt;i&gt;views&lt;/i&gt; and the framework will take care of exposing the resources to the web in the form of web services or HTML based web interface. And all this with very little efforts as you do with &lt;i&gt;openobject&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;The next post will be on the DAL API. Be in touch...&lt;br /&gt;&lt;br /&gt;Regards&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-3661335924646325436?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/3661335924646325436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=3661335924646325436' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3661335924646325436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3661335924646325436'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/04/next-big-thing.html' title='Next big thing!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-7987818729111183364</id><published>2010-04-17T13:42:00.003+05:30</published><updated>2010-04-17T18:00:28.591+05:30</updated><title type='text'>It's alive again...</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;After a long silence my blog is alive again. Actually, I am not much talkative person nor good at all with writing skills. Please ignore the mistakes I do and correct me if possible.&lt;br /&gt;&lt;br /&gt;This is the first of the three posts I am planing to write within next few weeks about what I am currently working on. The first one is about the response to my friends who wondered when I left my previous job and asking me the reasons and what could be my next destination.&lt;br /&gt;&lt;br /&gt;I was a main engineer and team leader of a small development team of the web client project, part of &lt;a target="_black" href="http://openobject.com"&gt;openobject&lt;/a&gt;, an open source application framework. I really enjoyed nearly three years working there on such a wonderful project. It was really hard to decide to leave especially at the crucial stage of the project but I had no other choice. To be honest, it's all personal reasons.&lt;br /&gt;&lt;br /&gt;When I left, I was not clear about what I should do next, whether to join another company or going back to my previous freelancing style work. Still I am not clear, but during these few weeks I am doing some research and come to a decision to start something interesting, and this is what I am going to explain by the next two posts. So be in touch...&lt;br /&gt;&lt;br /&gt;Again, I would like to thank all of my colleagues for the all well wishes and love.&lt;br /&gt; &lt;br /&gt;Thank you all&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-7987818729111183364?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/7987818729111183364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=7987818729111183364' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/7987818729111183364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/7987818729111183364'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/04/its-alive-again.html' title='It&apos;s alive again...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-2599692215441416442</id><published>2010-03-29T12:50:00.000+05:30</published><updated>2010-03-29T12:52:21.181+05:30</updated><title type='text'>Thank you!</title><content type='html'>Hello friends,&lt;br /&gt;&lt;br /&gt;I am very very thankful to you all for the grand farewell, your gratitude and love. The respect you have given is unforgettable and unbelievable...&lt;br /&gt;&lt;br /&gt;Thank you all again...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-2599692215441416442?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/2599692215441416442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=2599692215441416442' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2599692215441416442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2599692215441416442'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2010/03/thank-you.html' title='Thank you!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-7338646341505745157</id><published>2008-10-10T20:32:00.014+05:30</published><updated>2010-04-17T14:50:30.289+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>Path to 5.0 - The View Editor!!!</title><content type='html'>Welcome again,&lt;br /&gt;&lt;br /&gt;So as promised, this is the second post to give you some glimpse of one the most exciting new feature of upcoming version 5.0 of the web client, the View Editor. Which lets you change the view of any resource easily.&lt;br /&gt;&lt;br /&gt;Let's see the view designer in action...&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/AdK3aQA" type="application/x-shockwave-flash" width="320" height="240" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;You can see, how easy it is to customize objects and their views. The changes made with the view editor will be saved for all users.&lt;br /&gt;&lt;br /&gt;Additionally, in this upcoming major release, you will see some RAD tools included with the web client like &lt;span style="font-style: italic;"&gt;Object Designer&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Workflow Designer&lt;/span&gt;. With these tools, you can customize the &lt;span style="font-style: italic;"&gt;OpenERP&lt;/span&gt; without writing a single line of code (more on this later)...ter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-7338646341505745157?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/7338646341505745157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=7338646341505745157' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/7338646341505745157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/7338646341505745157'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/10/path-to-50-view-editor.html' title='Path to 5.0 - The View Editor!!!'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-1639683994822618251</id><published>2008-09-26T12:32:00.014+05:30</published><updated>2008-12-11T19:47:04.781+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>Path to 5.0</title><content type='html'>Hello Everyone,&lt;br /&gt;&lt;br /&gt;It has been long since I have talked on any new features of the OpenERP Web Client (formerly eTiny). We are working hard to make the &lt;a href="http://openerp.com/"&gt;OpenERP&lt;/a&gt; one of the most advanced OpenSource ERP ever made, and as a result we are going to publish the next major version 5.0 of the &lt;a href="http://openerp.com/"&gt;OpenERP&lt;/a&gt; loaded with tones of new features within next two months. As you all know, various components of &lt;a href="http://openerp.com/"&gt;OpenERP&lt;/a&gt; is now hosted on the OpenSource development portal &lt;a href="https://launchpad.net/openobject"&gt;Launchpad.net&lt;/a&gt; as OpenObject framework to work closer with the community and partners.&lt;br /&gt;&lt;br /&gt;Being an active member of the OpenERP community, some of you might have ideas on what's going on with the OpenERP. I will publish few blogs on new features to keep you informed. So this one is the first of them. Today, I will tell you about how to test the bleeding-edge version of OpenERP (the trunk version).&lt;br /&gt;&lt;br /&gt;Here are few quick steps (Ubuntu Linux). Please go through the &lt;a href="http://openerp.com/forum"&gt;forum&lt;/a&gt; and the &lt;a href="http://openerp.com/wiki/index.php/Manual_Installation:Installation_Manual"&gt;wiki&lt;/a&gt; for detailed help:&lt;br /&gt;&lt;pre&gt;$ sudo apt-get install postgresql&lt;br /&gt;$ sudo apt-get install python-xml&lt;br /&gt;$ sudo apt-get install python-lxml&lt;br /&gt;$ sudo apt-get install python-libxml2&lt;br /&gt;$ sudo apt-get install python-libxslt1&lt;br /&gt;$ sudo apt-get install python-psycopg2&lt;br /&gt;$ sudo apt-get install python-imaging&lt;br /&gt;$ sudo apt-get install python-pyparsing&lt;br /&gt;$ sudo apt-get install python-reportlab&lt;br /&gt;$ sudo apt-get install python-matplotlib&lt;br /&gt;$ sudo apt-get install python-pyopenssl&lt;br /&gt;$ sudo apt-get install python-pychart&lt;br /&gt;$ sudo apt-get install python-pydot&lt;br /&gt;$ sudo apt-get install python-tz&lt;br /&gt;$ sudo apt-get install graphviz&lt;br /&gt;$ sudo apt-get install ghostscript&lt;br /&gt;&lt;br /&gt;$ sudo apt-get install python-gtk2&lt;br /&gt;$ sudo apt-get install python-glade2&lt;br /&gt;$ sudo apt-get install python-hippocanvas&lt;br /&gt;$ sudo apt-get install python-egenix-mxdatetime&lt;br /&gt;&lt;br /&gt;$ mkdir openerp-trunk&lt;br /&gt;$ cd openerp-trunk&lt;br /&gt;$ bzr branch lp:openobject-server server&lt;br /&gt;$ bzr branch lp:openobject-addons addons&lt;br /&gt;$ bzr branch lp:openobject-client client&lt;br /&gt;$ bzr branch lp:openobject-client-web web&lt;br /&gt;&lt;/pre&gt;The web client requires &lt;a href="http://turbogears.com/"&gt;TurboGears 1.0.3.2&lt;/a&gt; or later, if your distribution provides packages for this version you can install TG with apt-get, but we recommend to use the latest stable version of TurboGears 1.0.x series. See &lt;a href="http://docs.turbogears.org/1.0/InstallNix"&gt;http://docs.turbogears.org/1.0/InstallNix&lt;/a&gt; for more information.&lt;br /&gt;&lt;pre&gt;$ sudo apt-get install python-setuptools&lt;br /&gt;$ sudo easy_install TurboGears==1.0.7&lt;br /&gt;&lt;/pre&gt;Check whether TurboGears is installed properly or not:&lt;br /&gt;&lt;pre&gt;$ tg-admin info&lt;br /&gt;&lt;/pre&gt;It will show you information about various components of TurboGears and it's dependencies.&lt;br /&gt;&lt;br /&gt;Before you start OpenERP server, create a role in PostgreSQL without any password with the same name as the Linux user who is going to run the openerp-server:&lt;br /&gt;&lt;pre&gt;$ sudo su postgres -c "createuser -d -S -R terp"&lt;br /&gt;&lt;/pre&gt;Now start the OpenERP server:&lt;br /&gt;&lt;pre&gt;$ cd openerp-trunk/server/bin&lt;br /&gt;$ sudo su terp -c "./openerp-server.py --addons-path=../../addons"&lt;br /&gt;&lt;/pre&gt;You will see a message saying `INFO:web-services:the server is running, waiting for connections...`&lt;br /&gt;&lt;br /&gt;Now start the OpenERP web client:&lt;br /&gt;&lt;pre&gt;$ cd openerp-trunk/web&lt;br /&gt;$ ./start-openerp-web.py&lt;br /&gt;&lt;/pre&gt;You will see a message saying `INFO HTTP: Serving HTTP on http://0.0.0.0:8080/`&lt;br /&gt;&lt;br /&gt;That's it!!!&lt;br /&gt;&lt;br /&gt;You are ready to test the bleeding-edge version of OpenERP Server and the Web Client. As part of the community, we welcome inputs from you by means of bug reports, suggestions and translations to improve the OpenObject projects. Go though the Launchpad project site for more information...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-1639683994822618251?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/1639683994822618251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=1639683994822618251' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1639683994822618251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1639683994822618251'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/09/path-to-50.html' title='Path to 5.0'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-4134380263906639876</id><published>2008-08-20T15:29:00.003+05:30</published><updated>2008-09-24T18:01:53.456+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>Custom addons path (advice for developers)</title><content type='html'>As said in my &lt;a href="http://amit-mendapara.blogspot.com/2008/08/custom-addons-path.html"&gt;previous post&lt;/a&gt;, now it's possible to place &lt;span style="font-style: italic;"&gt;addons&lt;/span&gt; outside the &lt;span style="font-style: italic;"&gt;bin&lt;/span&gt; directory. To achieve this I have implemented few helper function in &lt;span style="font-style: italic;"&gt;addons&lt;/span&gt; module to get the actual path of the module or other resources (files especially).&lt;br /&gt;&lt;br /&gt;For example, if you want to locate &lt;span style="font-style: italic;"&gt;your_addon/report/some.xslt&lt;/span&gt; irrespective of where the addons is located, you should use &lt;span style="font-style: italic;"&gt;addons.get_module_resource&lt;/span&gt; function instead of hard coding the filepath.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import addons&lt;br /&gt;myfile = addons.get_module_resource('your_addon', 'report/some.xslt')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;One more important change in &lt;span style="font-style: italic;"&gt;tools.file_open&lt;/span&gt;, though transparent is worth to check. Here is the docstring of the modified method...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def file_open(name, mode="r", subdir='addons', pathinfo=False):&lt;br /&gt;    """Open a file from the Tiny ERP root, using a subdir folder.&lt;br /&gt;&lt;br /&gt;    &gt;&gt;&gt; file_open('hr/report/timesheer.xsl')&lt;br /&gt;    &gt;&gt;&gt; file_open('addons/hr/report/timesheet.xsl')&lt;br /&gt;    &gt;&gt;&gt; file_open('../../base/report/rml_template.xsl', subdir='addons/hr/report', pathinfo=True)&lt;br /&gt;&lt;br /&gt;    @param name: name of the file&lt;br /&gt;    @param mode: file open mode&lt;br /&gt;    @param subdir: subdirectory&lt;br /&gt;    @param pathinfo: if True returns tupple (fileobject, filepath)&lt;br /&gt;&lt;br /&gt;    @return: fileobject if pathinfo is False else (fileobject, filepath)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Please change you modules accordingly to make them compatible with the new custom addons path...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-4134380263906639876?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/4134380263906639876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=4134380263906639876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4134380263906639876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4134380263906639876'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/08/custom-addons-path-advice-for.html' title='Custom addons path (advice for developers)'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-8288392016719479473</id><published>2008-08-05T16:31:00.003+05:30</published><updated>2008-09-24T18:01:53.456+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>Custom addons path...</title><content type='html'>With the latest trunk, there is no need to put &lt;span style="font-style: italic;"&gt;addons&lt;/span&gt; under the &lt;span style="font-style: italic;"&gt;bin&lt;/span&gt; directory. Now you can put addons in separate directory. You can start &lt;span style="font-style: italic;"&gt;OpenERP&lt;/span&gt; server like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ ./tinyerp-server.py --addons-path=/path/to/addons&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The &lt;span style="font-style: italic;"&gt;bin/addons&lt;/span&gt; will be considered as default addons directory which can be overridden by the &lt;span style="font-style: italic;"&gt;/path/to/addons&lt;/span&gt;. That is, if an addon exists in &lt;span style="font-style: italic;"&gt;bin/addons&lt;/span&gt; as well as in &lt;span style="font-style: italic;"&gt;/path/to/addons&lt;/span&gt; (custom path) the later will be given preference over the one found in &lt;span style="font-style: italic;"&gt;bin/addons&lt;/span&gt; (default path).&lt;br /&gt;&lt;br /&gt;See the &lt;a href="http://stephane-wirtel-at-tiny.blogspot.com/2008/08/how-to-get-trunk-version-from-launchpad.html"&gt;Stephane Wirtel's blog&lt;/a&gt; on how to get the latest version of the server from the Launchpad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-8288392016719479473?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/8288392016719479473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=8288392016719479473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/8288392016719479473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/8288392016719479473'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/08/custom-addons-path.html' title='Custom addons path...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-4323740988022035333</id><published>2008-07-30T15:53:00.009+05:30</published><updated>2008-09-24T18:01:53.456+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>What's going on?</title><content type='html'>Hello everyone,&lt;br /&gt;&lt;br /&gt;Since the release of the first stable version (v1.0) lots of new things have been added to the &lt;span style="font-style: italic;"&gt;OpenERP Web Client&lt;/span&gt; (formerly &lt;span style="font-style: italic;"&gt;eTiny&lt;/span&gt;). You might already have observed those if you have tried the &lt;span style="font-style: italic;"&gt;development&lt;/span&gt; version of the &lt;span style="font-style: italic;"&gt;OpenERP Web Client&lt;/span&gt;. There are lots to say about the new features, but the most noticeable are:&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;span style="font-weight: bold;"&gt;1. Buttons in ListGrid (similar to forms)&lt;/span&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;Now you can place a button in Tree view (ListGrid) similarly what you can do with Forms.&lt;br /&gt;&lt;pre&gt;&amp;lt;tree&amp;gt;&lt;br /&gt;   &amp;lt;field name="name" .../&amp;gt;&lt;br /&gt;   ...&lt;br /&gt;   &amp;lt;button name="cancel" .../&amp;gt;&lt;br /&gt;&amp;lt;/tree&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;big&gt;&lt;span style="font-weight: bold;"&gt;2. Localized datetime/number format&lt;/span&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;The long awaited localized datetime/number format has been implemented.&lt;br /&gt;&lt;br /&gt;&lt;table style="text-align: left; width: 534px; height: 86px;" border="0" cellpadding="2" cellspacing="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="width: 110px; text-align: right; font-weight: bold; background-color: rgb(204, 204, 204);"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td style="font-weight: bold; width: 150px; background-color: rgb(204, 204, 204);"&gt;en_EN&lt;/td&gt;&lt;td style="font-weight: bold; width: 150px; background-color: rgb(204, 204, 204);"&gt;fr_FR&lt;/td&gt;&lt;td style="font-weight: bold; width: 150px; background-color: rgb(204, 204, 204);"&gt;es_ES&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="width: 110px; text-align: right; background-color: rgb(204, 204, 204);"&gt;Date&lt;/td&gt;&lt;td style="width: 150px; background-color: rgb(234, 234, 234);"&gt;30-07-2008&lt;/td&gt;&lt;td style="width: 150px; background-color: rgb(234, 234, 234);"&gt;30/07/2008&lt;/td&gt;&lt;td style="width: 150px; background-color: rgb(234, 234, 234);"&gt;30/07/2008&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="width: 110px; text-align: right; background-color: rgb(204, 204, 204);"&gt;Number&lt;/td&gt;&lt;td style="width: 150px; background-color: rgb(234, 234, 234);"&gt;3,000.00&lt;/td&gt;&lt;td style="width: 150px; background-color: rgb(234, 234, 234);"&gt;3 000,00&lt;/td&gt;&lt;td style="width: 150px; background-color: rgb(234, 234, 234);"&gt;3.000,00 &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;big&gt;3. View Editor&lt;/big&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A simple yet powerful view editor allows users to change/design views. See the &lt;a style="font-style: italic;" href="http://openobject.com/Demonstration.php?title=Customize%20Screen&amp;amp;demo=Customization"&gt;view editor&lt;/a&gt; in action.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;big&gt;4. Object Designer&lt;/big&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With &lt;span style="font-style: italic;"&gt;Object Designer&lt;/span&gt;, one can create custom &lt;span style="font-style: italic;"&gt;OpenERP&lt;/span&gt; objects or can change existing ones. See the &lt;a style="font-style: italic;" href="http://openobject.com/Demonstration.php?title=Design%20Objects&amp;amp;demo=DesignObjects"&gt;object designer&lt;/a&gt; in action.&lt;br /&gt;&lt;br /&gt;&lt;big&gt;&lt;span style="font-weight: bold;"&gt;5. Workflow Editor&lt;/span&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;One can change/create workflows visually with this powerful tool. See the &lt;a style="font-style: italic;" href="http://openobject.com/Demonstration.php?title=Workflow%20Management&amp;amp;demo=Workflow"&gt;workflow editor&lt;/a&gt; in action...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;big&gt;6. Dashboards&lt;/big&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Customizable dashboards per user. User can change the dashboard either using the &lt;span style="font-style: italic;"&gt;view editor &lt;/span&gt;or arranging the &lt;span style="font-style: italic;"&gt;dashlets&lt;/span&gt; with &lt;span style="font-style: italic;"&gt;drag &amp;amp; drop&lt;/span&gt;...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;big&gt;7. A new `attrs` attribute similar to `states`&lt;/big&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The new &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;attrs&lt;/span&gt; &lt;/span&gt;attribute can be used to dynamically change other attributes of view components based on the values of other fields. It's somewhat similar to &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;states&lt;/span&gt; &lt;/span&gt;attribute, but is clientside only.&lt;br /&gt;&lt;pre&gt;&amp;lt;form string="Some Form"&amp;gt;&lt;br /&gt;   &amp;lt;notebook&amp;gt;&lt;br /&gt;       &amp;lt;page string="Main"&amp;gt;&lt;br /&gt;     &amp;lt;field name="name" attrs="{'required': [('state','=','draft')],&lt;br /&gt;                                        'readonly': [('state','=','open')]}"/&amp;gt;&lt;br /&gt;           &amp;lt;field name="active" .../&amp;gt;&lt;br /&gt;     &amp;lt;field name="state" ...&amp;gt;&lt;br /&gt;           &amp;lt;group attrs="{'invisible': [('active', '=',0),&lt;br /&gt;                                        ('state','=','draft')]}"&amp;gt;&lt;br /&gt;               ...&lt;br /&gt;           &amp;lt;/group&amp;gt;&lt;br /&gt;       &amp;lt;/page&amp;gt;&lt;br /&gt;   &amp;lt;/notebook&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/pre&gt;The &lt;span style="font-style: italic; font-weight: bold;"&gt;required&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;and &lt;span style="font-style: italic; font-weight: bold;"&gt;readonly&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;attributes of the field &lt;span style="font-style: italic;"&gt;name&lt;/span&gt; then depends on the value of fields &lt;span style="font-style: italic;"&gt;active&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;state&lt;/span&gt;. Similarly, the visibility of the &lt;span style="font-style: italic;"&gt;group&lt;/span&gt; depends on &lt;span style="font-style: italic;"&gt;active&lt;/span&gt; field.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Visibility&lt;/span&gt; will only be supported on &lt;span style="font-style: italic;"&gt;buttons, groups and pages&lt;/span&gt; to maintain form layout in OpenERP Web Client. &lt;span style="font-style: italic;"&gt;Readonly/Required&lt;/span&gt; attributes will be supported for &lt;span style="font-style: italic;"&gt;simple widgets&lt;/span&gt; only and not &lt;span style="font-style: italic;"&gt;complex ones&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;big&gt;8. Flash Charts&lt;/big&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Charts/Graphs have been replace with the beautiful flash charts using &lt;a href="http://teethgrinder.co.uk/open-flash-chart/"&gt;Open Flash Charts&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;big&gt;9. Speed Improvements&lt;/big&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lot's of improvements here.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rendering speed of very big forms has been 4 times faster now&lt;span style="font-style: italic;"&gt;&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Switch O2M using Ajax (no page reload)&lt;/li&gt;&lt;li&gt;Client side validation for required fields (no page reload)&lt;/li&gt;&lt;li&gt;Editable ListGrid (full Ajax)&lt;/li&gt;&lt;/ul&gt;And lots more...&lt;br /&gt;&lt;br /&gt;As you all know, we are in process of releasing the next stable version of OpenERP (aka 4.4). We are going to change the version number of Web Client to reflect the corresponding server version. That is, the next version of the Web Client will be v4.4.&lt;br /&gt;&lt;br /&gt;I am eager to see your suggestions/views/ideas to improve it's usability and eargonomy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-4323740988022035333?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/4323740988022035333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=4323740988022035333' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4323740988022035333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4323740988022035333'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/07/whats-going-on.html' title='What&apos;s going on?'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-1113398444370029523</id><published>2008-06-26T12:52:00.003+05:30</published><updated>2008-09-24T18:01:53.456+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>eTiny 1.0.1 released...</title><content type='html'>We are happy to announce the first bug fix release (v1.0.1) of the stable version 1.0 of eTiny. The web client of OpenERP, the Enterprise Management Software.&lt;br /&gt;&lt;br /&gt;OpenERP is one of the most advanced Open Source ERP, known for it's simplicity and adaptability. eTiny brings the most powerful ERP to the web mode, giving you more performance, flexibility, simplicity and even more accesibility.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;ChangeLog:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fixed navigation problem (now remembers the offset of O2M widgets)&lt;/li&gt;&lt;li&gt;Safari 3.0 issue (possible bug in Safari)&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;    Safari submits selection fields even if name attribute is missing.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Better calendar view&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Rendering issues (FF3)&lt;/li&gt;&lt;li&gt;    Tangoish colors&lt;/li&gt;&lt;li&gt;    Item sorting problem in month view&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Fixed onchange method for many2one.&lt;/li&gt;&lt;li&gt;Fixed (#767), fails to load the translation catalog if installed as egg.&lt;/li&gt;&lt;li&gt;Fixed o2m view record problem (bug #757)&lt;/li&gt;&lt;li&gt;Fixed #696, 'View Log' on User creates error&lt;/li&gt;&lt;li&gt;fixed sidebar link translation problem&lt;/li&gt;&lt;li&gt;Fixed `Reference widget`, now it's an extended `M2O` (using same JS).&lt;/li&gt;&lt;li&gt;Form view parser now checks for duplicate fields.&lt;/li&gt;&lt;li&gt;Fixed `editable list view` in popup (unable to get values of parent fields)&lt;/li&gt;&lt;li&gt;Visibility of Manage button in configuration.&lt;/li&gt;&lt;li&gt;Fixed one2many (default_get_context)&lt;/li&gt;&lt;li&gt;Improved Cache system&lt;/li&gt;&lt;li&gt;Cache for i18n catalog to speedup the `gettext` operations.&lt;/li&gt;&lt;li&gt;Fixed Import/Export bugs (649, 650)&lt;/li&gt;&lt;li&gt;Fixed Calendar view (handle server errors)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Links:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://tinyerp.org/wiki/index.php/InstallationManual"&gt;Installation Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://tinyerp.com/download/stable/Changelog-etiny"&gt;ChangeLog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://openerp.com/"&gt;OpenERP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://axelor.com/"&gt;Axelor&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;For more information, visit &lt;a target="_blank" href="http://openerp.com/"&gt;http://openerp.com&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-1113398444370029523?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/1113398444370029523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=1113398444370029523' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1113398444370029523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/1113398444370029523'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/06/etiny-101-released.html' title='eTiny 1.0.1 released...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-2254324395447251522</id><published>2008-02-25T11:34:00.003+05:30</published><updated>2008-09-24T18:01:53.457+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>eTiny 1.0 (stable) released...</title><content type='html'>We are glad to announce the release of the first stable version 1.0 of eTiny. The web client of Tiny ERP, the Enterprise Management Software.&lt;br /&gt;&lt;br /&gt;Tiny ERP is one of the most advanced Open Source ERP, known for it's simplicity and adaptability. eTiny brings the most powerful ERP to the web mode, giving you more performance, flexibility, simplicity and even more accesibility.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Highlights:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;High Performance&lt;/li&gt;&lt;li&gt;Easy deployment&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Clean &amp;amp; Ergonomic&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Ajax enabled&lt;/li&gt;&lt;li&gt;New Calendar View mode&lt;/li&gt;&lt;li&gt;Complete French translation&lt;/li&gt;&lt;li&gt;Open Source (GPL)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Browser Compatibility:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Firefox 1.5/2.0&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Internet Explorer 6.0/7.0&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Safari 3.0&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Opera 9.0&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Links:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a target="_blank" href="http://tinyerp.org/wiki/index.php/InstallationManual"&gt;Installation Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://tinyerp.com/download/stable/Changelog-etiny"&gt;ChangeLog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://tinyerp.com/"&gt;Tiny ERP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a target="_blank" href="http://axelor.com/"&gt;Axelor&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;For more information, visit &lt;a target="_blank" href="http://tinyerp.com/"&gt;http://tinyerp.com&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-2254324395447251522?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/2254324395447251522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=2254324395447251522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2254324395447251522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/2254324395447251522'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/02/etiny-10-stable-released.html' title='eTiny 1.0 (stable) released...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-3587856029559397070</id><published>2008-02-22T13:27:00.006+05:30</published><updated>2008-09-24T18:01:53.457+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>eTiny 1.0 Screenshots</title><content type='html'>&lt;div style="text-align: center;"&gt;Login Screen&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_52yHaty9bAg/R76BJ1VUikI/AAAAAAAAAFs/PT-zasBXwTQ/s1600-h/login.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_52yHaty9bAg/R76BJ1VUikI/AAAAAAAAAFs/PT-zasBXwTQ/s400/login.png" alt="" id="BLOGGER_PHOTO_ID_5169711428203219522" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Dashboard&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_52yHaty9bAg/R76BKlVUilI/AAAAAAAAAF0/slGaityBG0s/s1600-h/dashboard.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_52yHaty9bAg/R76BKlVUilI/AAAAAAAAAF0/slGaityBG0s/s400/dashboard.png" alt="" id="BLOGGER_PHOTO_ID_5169711441088121426" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Main Menu&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_52yHaty9bAg/R76BKlVUimI/AAAAAAAAAF8/0sn-B86oa8E/s1600-h/menu.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_52yHaty9bAg/R76BKlVUimI/AAAAAAAAAF8/0sn-B86oa8E/s400/menu.png" alt="" id="BLOGGER_PHOTO_ID_5169711441088121442" border="0"&gt;&lt;/a&gt;&lt;br /&gt;All Sales Orders&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_52yHaty9bAg/R76BK1VUinI/AAAAAAAAAGE/KEOR-_G01jw/s1600-h/sales-all.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_52yHaty9bAg/R76BK1VUinI/AAAAAAAAAGE/KEOR-_G01jw/s400/sales-all.png" alt="" id="BLOGGER_PHOTO_ID_5169711445383088754" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Sales Order Form&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_52yHaty9bAg/R76BLFVUioI/AAAAAAAAAGM/u0RBXc7HPMg/s1600-h/sales.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_52yHaty9bAg/R76BLFVUioI/AAAAAAAAAGM/u0RBXc7HPMg/s400/sales.png" alt="" id="BLOGGER_PHOTO_ID_5169711449678056066" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Cases Form&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_52yHaty9bAg/R76BelVUipI/AAAAAAAAAGU/up29MXahBEE/s1600-h/cases.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_52yHaty9bAg/R76BelVUipI/AAAAAAAAAGU/up29MXahBEE/s400/cases.png" alt="" id="BLOGGER_PHOTO_ID_5169711784685505170" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Project Tasks (Calendar View) - Month Mode&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_52yHaty9bAg/R76BfVVUiqI/AAAAAAAAAGc/9IFcUObKitQ/s1600-h/cal-month.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_52yHaty9bAg/R76BfVVUiqI/AAAAAAAAAGc/9IFcUObKitQ/s400/cal-month.png" alt="" id="BLOGGER_PHOTO_ID_5169711797570407074" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Project Tasks (Calendar View) - Week Mode&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_52yHaty9bAg/R76BflVUirI/AAAAAAAAAGk/rmM5WuyFsN4/s1600-h/cal-week.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_52yHaty9bAg/R76BflVUirI/AAAAAAAAAGk/rmM5WuyFsN4/s400/cal-week.png" alt="" id="BLOGGER_PHOTO_ID_5169711801865374386" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Project Tasks (Calendar View) - Day Mode&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_52yHaty9bAg/R76Bf1VUisI/AAAAAAAAAGs/PRT4tewuCT0/s1600-h/cal-day.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_52yHaty9bAg/R76Bf1VUisI/AAAAAAAAAGs/PRT4tewuCT0/s400/cal-day.png" alt="" id="BLOGGER_PHOTO_ID_5169711806160341698" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Validation&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_52yHaty9bAg/R76cs1VUitI/AAAAAAAAAG0/HJj25VK-nO0/s1600-h/validation.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_52yHaty9bAg/R76cs1VUitI/AAAAAAAAAG0/HJj25VK-nO0/s400/validation.png" alt="" id="BLOGGER_PHOTO_ID_5169741716312591058" border="0"&gt;&lt;/a&gt;&lt;br /&gt;Editable ListGrid&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_52yHaty9bAg/R76ct1VUiuI/AAAAAAAAAG8/8L8Fr56Maas/s1600-h/editable-list.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_52yHaty9bAg/R76ct1VUiuI/AAAAAAAAAG8/8L8Fr56Maas/s400/editable-list.png" alt="" id="BLOGGER_PHOTO_ID_5169741733492460258" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-3587856029559397070?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/3587856029559397070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=3587856029559397070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3587856029559397070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/3587856029559397070'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/02/etiny-10-screenshots.html' title='eTiny 1.0 Screenshots'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_52yHaty9bAg/R76BJ1VUikI/AAAAAAAAAFs/PT-zasBXwTQ/s72-c/login.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-4869958449539802067</id><published>2008-01-05T14:11:00.001+05:30</published><updated>2008-09-24T18:01:53.457+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>Forms &amp; eTiny</title><content type='html'>&lt;span style="font-family: sans-serif; font-size: 12px"&gt;If you have used &lt;span style="font-style: italic;"&gt;eTiny&lt;/span&gt;, you might have observed that some views don't render well with eTiny while it just looks perfact with the traditional &lt;span style="font-style: italic;"&gt;GTK+ client&lt;/span&gt;.&lt;br&gt;&lt;br&gt;Today, I will describe how to design &lt;span style="font-style: italic;"&gt;Tiny ERP&lt;/span&gt; form that renders perfact with &lt;span style="font-style: italic;"&gt;eTiny&lt;/span&gt;. For detailed information on view specification, please explore the developers guild on the &lt;a href="http://tinyerp.org/wiki"&gt;Wiki&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Here is an example form view:&lt;br&gt;&lt;pre&gt;&amp;lt;form col="4" string="Form Title"&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;field name="field1" .../&amp;gt;&lt;br&gt;    &amp;lt;field name="field2" .../&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;/newline&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;separator string="Object State" colspan="4"/&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;field name="field3" .../&amp;gt;&lt;br&gt;    &amp;lt;button name="open_button" states="draft,cancel .../&amp;gt;&lt;br&gt;    &amp;lt;button name="cancel_button" stats="draft,open" .../&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;&lt;br /&gt;With &lt;span style="font-style: italic;"&gt;GTK+ Client&lt;/span&gt;, the resulting form should look like:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_52yHaty9bAg/R39Fk8t21SI/AAAAAAAAAEQ/hgljJa5c2Q0/s1600-h/gtk_form1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_52yHaty9bAg/R39Fk8t21SI/AAAAAAAAAEQ/hgljJa5c2Q0/s320/gtk_form1.png" alt="" id="BLOGGER_PHOTO_ID_5151912999811208482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;But with the web client, you might see bad looking result like.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_52yHaty9bAg/R39FlMt21UI/AAAAAAAAAEg/-Gk4RvaWkJ0/s1600-h/etiny_form1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_52yHaty9bAg/R39FlMt21UI/AAAAAAAAAEg/-Gk4RvaWkJ0/s320/etiny_form1.png" alt="" id="BLOGGER_PHOTO_ID_5151913004106175810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;The problem is due the placement of&amp;nbsp;&lt;span style="font-style: italic;"&gt;open_button&lt;/span&gt; in &lt;span style="font-style: italic;"&gt;column 3&lt;/span&gt;, which is actually used by previous row to place label for&amp;nbsp;&lt;span style="font-style: italic;"&gt;field2&lt;/span&gt;. As eTiny tries to allocate &lt;span style="font-weight: bold; font-style: italic;"&gt;minimum&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;possible width to &lt;span style="font-weight: bold; font-style: italic;"&gt;labels&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;and &lt;span style="font-weight: bold; font-style: italic;"&gt;maximum&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;possible to &lt;span style="font-weight: bold; font-style: italic;"&gt;widgets&lt;/span&gt;&lt;span style="font-style: italic;"&gt;,&lt;/span&gt; &lt;span style="font-style: italic;"&gt;column 3&lt;/span&gt; will get maximum possible value due to the placement of &lt;span style="font-weight: bold; font-style: italic;"&gt;button&lt;/span&gt; widget.&lt;br&gt;&lt;br&gt;To overcome with the issue, I suggest you to modify your view as:&lt;br&gt;&lt;pre&gt;&amp;lt;form col="4" string="Form Title"&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;field name="field1" .../&amp;gt;&lt;br&gt;    &amp;lt;field name="field2" .../&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;/newline&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;separator string="Object State"/&amp;gt;&lt;br&gt;    &lt;br&gt;    &amp;lt;field name="field3" .../&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;group col="2" colspan="2"&amp;gt;&lt;br&gt;        &amp;lt;button name="open_button" states="draft,cancel .../&amp;gt;&lt;br&gt;        &amp;lt;button name="cancel_button" stats="draft,open" .../&amp;gt;&lt;br&gt;    &amp;lt;/group&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;&lt;br /&gt;Now your view will be rendered perfectly with both the clients...&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;GTK+&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_52yHaty9bAg/R39Fk8t21TI/AAAAAAAAAEY/2IsmIWrBYhw/s1600-h/gtk_form2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_52yHaty9bAg/R39Fk8t21TI/AAAAAAAAAEY/2IsmIWrBYhw/s320/gtk_form2.png" alt="" id="BLOGGER_PHOTO_ID_5151912999811208498" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;eTiny&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_52yHaty9bAg/R39FlMt21VI/AAAAAAAAAEo/nEWI7bxcj1k/s1600-h/etiny_form2.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_52yHaty9bAg/R39FlMt21VI/AAAAAAAAAEo/nEWI7bxcj1k/s320/etiny_form2.png" alt="" id="BLOGGER_PHOTO_ID_5151913004106175826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;In short, you should use &lt;span style="font-weight: bold; font-style: italic;"&gt;group&lt;/span&gt; whenever you put &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;buttons&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt; in your view. And don't put any&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;widget&lt;/span&gt; with &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;colspan=1 &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;in the column which is supposed to be used by &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;labels&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;/span&gt;.&lt;br&gt;&lt;br&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-4869958449539802067?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/4869958449539802067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=4869958449539802067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4869958449539802067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/4869958449539802067'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2008/01/forms-etiny.html' title='Forms &amp; eTiny'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_52yHaty9bAg/R39Fk8t21SI/AAAAAAAAAEQ/hgljJa5c2Q0/s72-c/gtk_form1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-642801540877077997</id><published>2007-12-27T16:17:00.000+05:30</published><updated>2008-09-24T18:01:53.457+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>eTiny 1.0rc2 is released...</title><content type='html'>&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;We are happy to announce the next release candidate version of &lt;span style="font-style: italic;"&gt;eTiny&lt;/span&gt; with lots of improvements and bug fixings...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;New Features:&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;Image Widget (type=binary widget=image)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;M2M for editable listview&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;Duplicate Record&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;O2M with pagination support (list mode)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;FloatTime widget&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;ContextMenu (CTRL+MOUSE R) for all fields&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-family:verdana,arial,sans;font-size:small;"  &gt;Changes:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;Sidebar Links (Reports/Wizard) now opens in new window&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;View Cache for production environment only&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;Improved Form Layout&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;and bug fixings...&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;Visit &lt;a href="http://tinyerp.com/"&gt;http://tinyerp.com&lt;/a&gt; for more information...&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:verdana,arial,sans;font-size:small;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-642801540877077997?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/642801540877077997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=642801540877077997' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/642801540877077997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/642801540877077997'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2007/12/etiny-10rc2-is-released.html' title='eTiny 1.0rc2 is released...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8279024142115321791.post-9092365012476788473</id><published>2007-11-06T03:39:00.000+05:30</published><updated>2008-09-24T18:01:53.457+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>eTiny 1.0rc1 is released...</title><content type='html'>&lt;span style=";font-family:Verdana,Arial,sans-serif;font-size:small;"  &gt;We are glad to announce the first release candidate version of &lt;span style="font-style: italic;"&gt;eTiny - Web Client of Tiny ERP, the Enterprise Management Software&lt;/span&gt; jointly developed by &lt;a href="http://tiny.be/"&gt;Tiny&lt;/a&gt; and &lt;a href="http://axelor.com/"&gt;Axelor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Features:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;High Performance&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;Light weight&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;Easy deployment&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;Clean &amp;amp; Ergonomic&lt;br /&gt;  &lt;/li&gt;&lt;li&gt;Ajax enabled&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Browser Compatibility:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Firefox 1.5/2.0&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Internet Explorer 6.0/7.0&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Safari 3.0&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Opera 9.0&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Performance:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Maintains cache of views to improve performance. We have achieved very high performance even on an old P4 system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Calendar View:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;eTiny&lt;/span&gt; supports new &lt;span style="font-style: italic;"&gt;Calendar View&lt;/span&gt;, which let you manage your time based data easily.&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=";font-family:Verdana,Arial,sans-serif;font-size:small;"  &gt;Move/Resize &lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;calendar items&lt;/span&gt;&lt;/span&gt; with &lt;span style="font-style: italic;"&gt;Drag &amp;amp; Drop&lt;/span&gt;.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Verdana,Arial,sans-serif;font-size:small;"  &gt;Quickly add/edit/delete items.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Verdana,Arial,sans-serif;font-size:small;"  &gt;You can view your data in &lt;span style="font-style: italic;"&gt;day&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;week &lt;/span&gt;or &lt;span style="font-style: italic;"&gt;month&lt;/span&gt; mode.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:Verdana,Arial,sans-serif;font-size:small;"  &gt;Filter data using &lt;span style="font-style: italic;"&gt;search filter&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;legends&lt;/span&gt;...&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style=";font-family:Verdana,Arial,sans-serif;font-size:small;"  &gt;&lt;span style="font-weight: bold;"&gt;Editable List View:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;New editable list view allows you to quickly add/edit records without switching to form view. Additionally list views are now sortable, you can sort any column by clicking on the  header area.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:Verdana,Arial,sans-serif;font-size:small;"  &gt;and much more...&lt;br /&gt;&lt;br /&gt;Visit &lt;a href="http://www.tinyerp.com/"&gt;http://www.tinyerp.com&lt;/a&gt;&lt;/span&gt;&lt;span style=";font-family:Verdana,Arial,sans-serif;font-size:small;"  &gt; for more information.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8279024142115321791-9092365012476788473?l=amit-mendapara.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amit-mendapara.blogspot.com/feeds/9092365012476788473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8279024142115321791&amp;postID=9092365012476788473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/9092365012476788473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8279024142115321791/posts/default/9092365012476788473'/><link rel='alternate' type='text/html' href='http://amit-mendapara.blogspot.com/2007/10/etiny-10rc1-is-released.html' title='&lt;i&gt;eTiny 1.0rc1&lt;/i&gt; is released...'/><author><name>Amit Mendapara</name><uri>http://www.blogger.com/profile/06967351485902950398</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
