<?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-2396375578166507166</id><updated>2012-02-17T00:47:31.551+01:00</updated><category term='alpha'/><category term='5.0.0'/><category term='launchpad'/><category term='translation'/><category term='openerp'/><title type='text'>Christophe Simonis @ Tiny</title><subtitle type='html'>About my work at Tiny SPRL, the editor of OpenERP</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://christophe-simonis-at-tiny.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://christophe-simonis-at-tiny.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Christophe Simonis</name><uri>http://www.blogger.com/profile/07257677913888827668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/004/3c1/326c3ea.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2396375578166507166.post-2622595133861262000</id><published>2008-11-04T00:00:00.006+01:00</published><updated>2008-11-04T01:02:47.802+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='5.0.0'/><category scheme='http://www.blogger.com/atom/ns#' term='alpha'/><title type='text'>OpenERP 5.0.0-alpha is out...</title><content type='html'>Hi, folks !&lt;br /&gt;&lt;br /&gt;The alpha version of the OpenERP 5.0.0 is &lt;a href="http://openerp.com/downloads.html"&gt;now available for download&lt;/a&gt; !!&lt;br /&gt;&lt;br /&gt;If you found bugs, please &lt;a href="https://bugs.launchpad.net/openobject/+filebug"&gt;fill a bug report on launchpad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Even this version is full of cool new features, there are a few to finish for the final version:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Better calendar view in the GTK client&lt;/li&gt;&lt;li&gt;Process review and improvement&lt;/li&gt;&lt;li&gt;Editable gantt charts&lt;/li&gt;&lt;li&gt;Bugfix in localisation of reports&lt;/li&gt;&lt;li&gt;Integration with the official documentations (books)&lt;/li&gt;&lt;li&gt;Auto-installer for OpenERP-Web-Client&lt;/li&gt;&lt;li&gt;Some small improvements that will be described later (keep an eye on &lt;a href="http://openerp.com/planet/"&gt;the OpenERP planet&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Please post your comment on the OpenERP forum: &lt;a href="http://openerp.com/forum/post26162.html#26162"&gt;http://openerp.com/forum/post26162.html#26162&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396375578166507166-2622595133861262000?l=christophe-simonis-at-tiny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/2622595133861262000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/2622595133861262000'/><link rel='alternate' type='text/html' href='http://christophe-simonis-at-tiny.blogspot.com/2008/11/openerp-500-alpha-is-out.html' title='OpenERP 5.0.0-alpha is out...'/><author><name>Christophe Simonis</name><uri>http://www.blogger.com/profile/07257677913888827668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/004/3c1/326c3ea.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-2396375578166507166.post-2297358678545839957</id><published>2008-09-25T10:18:00.005+02:00</published><updated>2008-09-25T15:25:29.937+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><category scheme='http://www.blogger.com/atom/ns#' term='launchpad'/><category scheme='http://www.blogger.com/atom/ns#' term='translation'/><title type='text'>перево́д</title><content type='html'>No, this blog hasn't been hacked!&lt;br /&gt;The title &lt;a href="http://www.wordreference.com/ruen/%D0%BF%D0%B5%D1%80%D0%B5%D0%B2%D0%BE%CC%81%D0%B4"&gt;means&lt;/a&gt; "translation" in Russian.&lt;br /&gt;&lt;br /&gt;You guess it, I'll talk about the internationalization (abbreviated to i18n) of &lt;a href="http://openerp.com/"&gt;OpenERP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Contrary to the 4.2.x version, the translations are now done by module. So, instead of an unique i18n folder for the whole application, each module has its own i18n folder. In addition, OpenERP can now deal with &lt;a href="http://en.wikipedia.org/wiki/Gettext#Translating"&gt;.po files&lt;/a&gt; as import/export format. The translation files of the installed languages are automatically loaded when installing or updating a module. OpenERP can also generate a .tgz archive containing well organised .po files for each selected module.&lt;br /&gt;&lt;br /&gt;The reason why we did these changes is that we now use &lt;a href="https://launchpad.net/openobject"&gt;our launchpad project&lt;/a&gt; for &lt;a href="https://translations.launchpad.net/openobject-addons/trunk"&gt;manage the translations&lt;/a&gt;. Even if there are still some files awaiting to be reviewed by the launchpad team, you can start translate.&lt;br /&gt;&lt;br /&gt;The ball is in your court now: &lt;a href="https://translations.launchpad.net/openobject-addons/trunk"&gt;translate&lt;/a&gt; !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396375578166507166-2297358678545839957?l=christophe-simonis-at-tiny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christophe-simonis-at-tiny.blogspot.com/feeds/2297358678545839957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2396375578166507166&amp;postID=2297358678545839957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/2297358678545839957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/2297358678545839957'/><link rel='alternate' type='text/html' href='http://christophe-simonis-at-tiny.blogspot.com/2008/09/blog-post.html' title='перево́д'/><author><name>Christophe Simonis</name><uri>http://www.blogger.com/profile/07257677913888827668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/004/3c1/326c3ea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396375578166507166.post-3217070977663668737</id><published>2008-08-14T14:38:00.005+02:00</published><updated>2008-11-04T01:02:56.485+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>New new domain notation</title><content type='html'>Last week, I told you about the &lt;a href="http://christophe-simonis-at-tiny.blogspot.com/2008/08/new-domain-notation.html"&gt;new domain notation&lt;/a&gt;. After a little peer reviewing, it appears that this notation is not as good as it seems. The inability to negate an expression (and not just a &lt;span style="font-style: italic;"&gt;leaf&lt;/span&gt;) is more problematic that I have imagined. Thus, after a tiny discussion with &lt;a href="http://fptiny.blogspot.com/"&gt;Fabien&lt;/a&gt;, we decided to implement a (nearly) true &lt;a href="http://en.wikipedia.org/wiki/Polish_notation"&gt;polish notation&lt;/a&gt; for the domains. &lt;a href="http://bazaar.launchpad.net/%7Eopenerp/openobject-server/trunk/revision/966"&gt;From now&lt;/a&gt;, the domains look more like the older ones that in the last week notation. This means there is no more extra parenthesis.&lt;br /&gt;In addition of the classic &lt;span style="font-style: italic;"&gt;leafs&lt;/span&gt;, you can add &lt;span style="font-style: italic;"&gt;operators&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;« Wait... what do you name leafs? »&lt;/span&gt;&lt;br /&gt;A leaf, is a tuple of 3 elements composed of:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;a field name&lt;/li&gt;&lt;li&gt;an operator (as string)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a value&lt;/li&gt;&lt;/ol&gt;Example:&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&lt;br /&gt;('active', '=', True)&lt;br /&gt;('foo', '!=', 'bar')&lt;br /&gt;('id', 'in', [7, 13, 42, 666])&lt;br /&gt;('id', '=', False)&lt;br /&gt;('name', 'like', 'tiny')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;« And which operators are allowed? »&lt;/span&gt;&lt;br /&gt;Like the last week notation, the AND ('&amp;amp;') and OR ('|') operators are allowed . Unlike the last week notation, the &lt;a href="http://en.wiktionary.org/wiki/arity"&gt;arity&lt;/a&gt; of these operators is fixed to 2.&lt;br /&gt;And yes, the one you have all been waiting for is now in: The NOT ('!') operator. This one has an arity of 1.&lt;br /&gt;For compatibility with existing domains, the AND operator is applied by default.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;« So, what looks like this new new notation? »&lt;/span&gt;&lt;br /&gt;Some examples:&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&lt;br /&gt;['&amp;amp;', ('active', '=', True), ('value', '!=', 'foo')]&lt;br /&gt;['|', ('active', '=', True), ('state', 'in', ['open', 'draft'])&lt;br /&gt;['&amp;amp;', ('active', '=', True), '|', '!', ('state', '=', 'closed'), ('state', '=', 'draft')]&lt;br /&gt;['|', '|', ('state', '=', 'open'), ('state', '=', 'closed'), ('state', '=', 'draft')]&lt;br /&gt;['!', '&amp;amp;', '!', ('id', 'in', [42, 666]), ('active', '=', False)]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;PS: Tanks to Najlâa and Olivier for the review.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396375578166507166-3217070977663668737?l=christophe-simonis-at-tiny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christophe-simonis-at-tiny.blogspot.com/feeds/3217070977663668737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2396375578166507166&amp;postID=3217070977663668737' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/3217070977663668737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/3217070977663668737'/><link rel='alternate' type='text/html' href='http://christophe-simonis-at-tiny.blogspot.com/2008/08/new-new-domain-notation.html' title='New new domain notation'/><author><name>Christophe Simonis</name><uri>http://www.blogger.com/profile/07257677913888827668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/004/3c1/326c3ea.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396375578166507166.post-8710032590952555449</id><published>2008-08-14T12:12:00.007+02:00</published><updated>2008-11-04T01:03:03.501+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>Python: reverse enumerate</title><content type='html'>This morning, I was needed to iterate trough a list from the end to the start and getting the index in addition to the value.&lt;br /&gt;&lt;br /&gt;For getting the index, it's easy: we use the builtin function &lt;span style="font-weight: bold;"&gt;enumerate&lt;/span&gt;.&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'c']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it = enumerate(a)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it&lt;br /&gt;&amp;lt;enumerate object at ...&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;(0, 'a')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;(1, 'b')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For iterate in the other sens, it's also easy; there is the builtin function &lt;span style="font-weight: bold;"&gt;reversed&lt;/span&gt;.&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'c']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it = reversed(a)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it&lt;br /&gt;&amp;lt;listreverseiterator object at ...&amp;gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;'c'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;'b'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Therefore, getting the index with the element in the reverse order would be easy as the combination of the two functions:&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'c']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it = reversed(enumerate(a))&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;  File "&amp;lt;stdin&amp;gt;", line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;TypeError: argument to reversed() must be a sequence&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Argh! We must transform the enumerate object to a list before passing it to reversed:&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'c']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it = reversed(list(enumerate(a)))&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;(2, 'c')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It works.&lt;br /&gt;Yes, it works, &lt;span style="font-weight: bold;"&gt;but&lt;/span&gt; there is a problem. It's not evident for everybody but this technique isn't optimized. First we create an iterator object with enumerate, then we convert this object to a list before recreate another iterator object. With a tiny list of three elements like in my examples it's not a pain, but with big lists, it consume a lot of memory by doing a copy of the initial list with the indexes.&lt;br /&gt;&lt;br /&gt;The solution is no more complicated but don't use the method enumerated. We simulate his behavior with the method izip from the itertools module and the method xrange. Both methods create iterator, which is our goal.&lt;br /&gt;The &lt;span style="font-weight: bold;"&gt;itertools.izip&lt;/span&gt; method take n iterators in parameters and yield the m&lt;sup&gt;th&lt;/sup&gt; element of each iterator. Example&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&amp;gt;&amp;gt;&amp;gt; from itertools import izip&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'c']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; b = ['d', 'e', 'f']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it = izip(a, b)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;('a', 'd')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;('b', 'e')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Thus, we can rewrite the enumerate method like this:&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'c']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it = izip(xrange(len(a)), a)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;(0, 'a')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;(1, 'b')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now, to reverse the order we just reverse all the izip arguments&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'c']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it = izip(xrange(len(a)-1, -1, -1), reversed(a))&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;(2, 'c')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;(1, 'b')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To finish we hide this behind a lambda to have a more readable code...&lt;br /&gt;&lt;code class="codorize" lang="python"&gt;&amp;gt;&amp;gt;&amp;gt; reverse_enumerate = lambda l: izip(xrange(len(l)-1, -1, -1), reversed(l))&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; a = ['a', 'b', 'c']&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it = reverse_enumerate(a)&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; it.next()&lt;br /&gt;(2, c)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This simple code has been implemented into &lt;a href="https://launchpad.net/openobject-server"&gt;openobject-server&lt;/a&gt; with the &lt;a href="http://bazaar.launchpad.net/%7Eopenerp/openobject-server/trunk/revision/964"&gt;revision 964&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396375578166507166-8710032590952555449?l=christophe-simonis-at-tiny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christophe-simonis-at-tiny.blogspot.com/feeds/8710032590952555449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2396375578166507166&amp;postID=8710032590952555449' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/8710032590952555449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/8710032590952555449'/><link rel='alternate' type='text/html' href='http://christophe-simonis-at-tiny.blogspot.com/2008/08/python-reverse-enumerate.html' title='Python: reverse enumerate'/><author><name>Christophe Simonis</name><uri>http://www.blogger.com/profile/07257677913888827668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/004/3c1/326c3ea.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396375578166507166.post-2384179760566100145</id><published>2008-08-05T11:13:00.005+02:00</published><updated>2008-11-04T01:03:10.784+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>New domain notation</title><content type='html'>During the last &lt;a href="http://openerp.com/wiki/index.php/Community_Days:_26-27_June"&gt;Community Days&lt;/a&gt;, somebody (it was Joël from C2C, I think) complain about the simplicity of the domains. For example, you can't include a OR condition, or negate the domain.&lt;br /&gt;&lt;br /&gt;Negate a domain is a false problem: you may just invert the operator. So, &lt;code class="codorize twilight" lang="python"&gt;[('active', '=', 1)]&lt;/code&gt; become &lt;code class="codorize twilight" lang="python"&gt;[('active', '&amp;lt;&amp;gt;', 1)]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;But, for the OR operator, the problem is really there. An implicit AND operation is made between each part of the domain. &lt;code class="codorize twilight" lang="python"&gt;[('active', '=', 1), ('parent_id', '=', 42)]&lt;/code&gt; is translate into a SQL query that look like &lt;code class="codorize amy" lang="sql"&gt;WHERE active = 1 AND parent_id = 42&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Yes, adding a OR condition, is not a bad idea, but, how to include it without breaking all the domains already written ? After some discussions, we decide to uses a pseudo &lt;a href="http://en.wikipedia.org/wiki/Polish_notation"&gt;polish notation&lt;/a&gt;, always with a implicit AND operator. Now you can prefix domain parts with a &lt;span style="font-weight: bold;"&gt;'&amp;amp;'&lt;/span&gt; or a &lt;span style="font-weight: bold;"&gt;'|'&lt;/span&gt; and group part using parenthesis.&lt;br /&gt;&lt;br /&gt;Here are some example of domains and the resulting SQL where clause:&lt;br /&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;[('foo', '=', 'bar')]&lt;/code&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;foo = 'bar'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;[('id', 'in', [1,2,3])]&lt;/code&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;id in (1, 2, 3)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;[('field', '=', 'value'), ('field', '&amp;lt;&amp;gt;', 42)]&lt;/code&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;( field = 'value' AND field &amp;lt;&amp;gt; 42 )&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;[('&amp;amp;', ('field', '&amp;lt;', 'value'), ('field', '&amp;gt;', 'value'))]&lt;/code&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;( field &amp;lt; 'value' AND field &amp;gt; 'value' )&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;[('|', ('field', '=', 'value'), ('field', '=', 'value'))]&lt;/code&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;( field = 'value' OR field = 'value' )&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;[('&amp;amp;', ('field1', '=', 'value'), ('field2', '=', 'value'), ('|', ('field3', '&amp;lt;&amp;gt;', 'value'), ('field4', '=', 'value')))]&lt;/code&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;( field1 = 'value' AND field2 = 'value' AND ( field3 &amp;lt;&amp;gt; 'value' OR field4 = 'value' ) )&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;[('&amp;amp;', ('|', ('a', '=', 1), ('b', '=', 2)), ('|', ('c', '=', 3), ('d', '=', 4)))]&lt;/code&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;( ( a = 1 OR b = 2 ) AND ( c = 3 OR d = 4 ) )&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;[('|', (('a', '=', 1), ('b', '=', 2)), (('c', '=', 3), ('d', '=', 4)))]&lt;/code&gt;&lt;br /&gt;&lt;code class="codorize twilight" lang="python"&gt;( ( a = 1 AND b = 2 ) OR ( c = 3 AND d = 4 ) )&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Don't hesitate to ask questions if you don't understand.&lt;br /&gt;&lt;br /&gt;Stay tuned.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS: Thank you to &lt;a href="http://stephane-wirtel-at-tiny.blogspot.com/"&gt;Stéphane&lt;/a&gt; for the base code of the tree.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396375578166507166-2384179760566100145?l=christophe-simonis-at-tiny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christophe-simonis-at-tiny.blogspot.com/feeds/2384179760566100145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2396375578166507166&amp;postID=2384179760566100145' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/2384179760566100145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/2384179760566100145'/><link rel='alternate' type='text/html' href='http://christophe-simonis-at-tiny.blogspot.com/2008/08/new-domain-notation.html' title='New domain notation'/><author><name>Christophe Simonis</name><uri>http://www.blogger.com/profile/07257677913888827668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/004/3c1/326c3ea.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396375578166507166.post-7123336827455754944</id><published>2008-06-20T10:04:00.005+02:00</published><updated>2008-12-12T04:15:25.116+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>Now, you know when there are attachments !</title><content type='html'>Since a few days, with the &lt;span style="font-style: italic;"&gt;trunk&lt;/span&gt; version, you can easily know if there are attachments on a resource. The attachment button is different and the number of attachments is shown.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_m_KoYTnt3uM/SFtmBZycLMI/AAAAAAAAAAM/boWuruUfgRg/s1600-h/screenshot3.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_m_KoYTnt3uM/SFtmBZycLMI/AAAAAAAAAAM/boWuruUfgRg/s320/screenshot3.png" alt="" id="BLOGGER_PHOTO_ID_5213873167899831490" border="0" /&gt;&lt;/a&gt;   &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_m_KoYTnt3uM/SFtmBt3cYCI/AAAAAAAAAAU/p3hoor4LTIE/s1600-h/screenshot1.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_m_KoYTnt3uM/SFtmBt3cYCI/AAAAAAAAAAU/p3hoor4LTIE/s320/screenshot1.png" alt="" id="BLOGGER_PHOTO_ID_5213873173289525282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;And it's also work in eTiny !&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_m_KoYTnt3uM/SFtmBi_q4tI/AAAAAAAAAAc/6p0dKT5_66U/s1600-h/screenshot2.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_m_KoYTnt3uM/SFtmBi_q4tI/AAAAAAAAAAc/6p0dKT5_66U/s320/screenshot2.png" alt="" id="BLOGGER_PHOTO_ID_5213873170371240658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&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/2396375578166507166-7123336827455754944?l=christophe-simonis-at-tiny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christophe-simonis-at-tiny.blogspot.com/feeds/7123336827455754944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2396375578166507166&amp;postID=7123336827455754944' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/7123336827455754944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/7123336827455754944'/><link rel='alternate' type='text/html' href='http://christophe-simonis-at-tiny.blogspot.com/2008/06/now-you-know-when-there-are-attachments.html' title='Now, you know when there are attachments !'/><author><name>Christophe Simonis</name><uri>http://www.blogger.com/profile/07257677913888827668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/004/3c1/326c3ea.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_m_KoYTnt3uM/SFtmBZycLMI/AAAAAAAAAAM/boWuruUfgRg/s72-c/screenshot3.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2396375578166507166.post-5598436676159434231</id><published>2008-06-08T21:55:00.001+02:00</published><updated>2008-11-04T01:03:22.754+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openerp'/><title type='text'>Welcome Tiny</title><content type='html'>Since the 14th may, I'm 26 years old.&lt;br /&gt;But this is also when I began working for Tiny.&lt;br /&gt;And this is exactly what I'm going to talk about on this blog: how I improve OpenERP.&lt;br /&gt;I'll work on support (bug fixing) but also on code improvement.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2396375578166507166-5598436676159434231?l=christophe-simonis-at-tiny.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://christophe-simonis-at-tiny.blogspot.com/feeds/5598436676159434231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2396375578166507166&amp;postID=5598436676159434231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/5598436676159434231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2396375578166507166/posts/default/5598436676159434231'/><link rel='alternate' type='text/html' href='http://christophe-simonis-at-tiny.blogspot.com/2008/05/welcome-tiny.html' title='Welcome Tiny'/><author><name>Christophe Simonis</name><uri>http://www.blogger.com/profile/07257677913888827668</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://media.linkedin.com/mpr/mpr/shrink_80_80/p/3/000/004/3c1/326c3ea.jpg'/></author><thr:total>0</thr:total></entry></feed>
