<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Diego Búrigo Zacarão's Weblog &#187; Django</title>
	<atom:link href="http://diegobz.net/category/django/feed/" rel="self" type="application/rss+xml" />
	<link>http://diegobz.net</link>
	<description>Let me talk about something</description>
	<lastBuildDate>Mon, 01 Aug 2011 14:53:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Dear (Slovenian) Translator</title>
		<link>http://diegobz.net/2011/02/17/dear-slovenian-translator/</link>
		<comments>http://diegobz.net/2011/02/17/dear-slovenian-translator/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 20:05:37 +0000</pubDate>
		<dc:creator>diegobz</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Transifex]]></category>

		<guid isPermaLink="false">http://diegobz.net/?p=370</guid>
		<description><![CDATA[Last week we came across an issue involving a request from Django. A person from the Slovenian team filed a ticket on the Django system asking to change the plural equation for the translation files. Once Django is now officially using Transifex for managing its translations, this ended up here to us. Long short history&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>Last week we came across an issue involving a request from Django. A person from the Slovenian team filed a <a href="http://code.djangoproject.com/ticket/14129" target="_blank">ticket on the Django system</a> asking to change the plural equation for the translation files. Once Django is now officially using Transifex for managing its translations, this ended up here to us.</p>
<p>Long short history&#8230;</p>
<p>Transifex plural rules are based on <a href="http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#sl" target="_blank">this document</a>. The possible plural rules currently supported are 6, <strong>*always*</strong> in the respect order:</p>
<blockquote><p>zero, one, two, few, many, other</p></blockquote>
<p>The &#8216;other&#8217; rule is the general exception for anything that doesn&#8217;t fit into the other rules. For Japanese, for example, that doesn&#8217;t have plural forms, it only uses the &#8216;other&#8217; rule and nothing else.</p>
<p>According to the document above, Slovenian has 4 plural rules, which are:</p>
<blockquote><p>one → n mod 100 is 1;<br />
two → n mod 100 is 2;<br />
few → n mod 100 in 3..4;<br />
other → everything else</p></blockquote>
<p>For the PO file format, the plural equation for the above would be:</p>
<blockquote><p>(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)</p></blockquote>
<p>Which means that for a sl.po with a plural entry, we would have the following mapping:</p>
<blockquote><p>msgstr[0] → one<br />
msgstr[1] → two<br />
msgstr[2] → few<br />
msgstr[3] → other</p></blockquote>
<p>Back to the initial issue, for some reason good part of the Slovenian teams across the FOSS world started to prefer to use the following plural equation:</p>
<blockquote><p>(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0)</p></blockquote>
<p>This results in the following swapping of position:</p>
<blockquote><p>msgstr[0] → other<br />
msgstr[1] → one<br />
msgstr[2] → two<br />
msgstr[3] → few</p></blockquote>
<p>This, as far as I know, because the &#8216;zero&#8217; rule, which actually doesn&#8217;t exist for the language, just fits as the &#8216;other&#8217; rule and in this way the &#8216;one&#8217; and &#8216;two&#8217; rules would have a synchronized msgstr index (e.g. msgstr[1] → one).</p>
<p><strong>So, dear Slovenian translator, is there any other reason for doing it that I&#8217;m not aware of?</strong></p>
<p>Changing that because of the above seems just wrong to me. And I would like to ask a greater audience of people that might be interested on it, before taking any decision on the Transifex side.</p>
]]></content:encoded>
			<wfw:commentRss>http://diegobz.net/2011/02/17/dear-slovenian-translator/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Django Database Router using settings</title>
		<link>http://diegobz.net/2011/02/10/django-database-router-using-settings/</link>
		<comments>http://diegobz.net/2011/02/10/django-database-router-using-settings/#comments</comments>
		<pubDate>Thu, 10 Feb 2011 18:53:32 +0000</pubDate>
		<dc:creator>diegobz</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Transifex]]></category>

		<guid isPermaLink="false">http://diegobz.net/?p=346</guid>
		<description><![CDATA[It&#8217;s been a while without passing here&#8230; but let&#8217;s not talk about it! So, this week I just came across an issue related to how to setup multiple databases on Django. Reading the documentation I found it quite trivial to setup. After having the databases configured, you can use a Database Router, if you want [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a while without passing here&#8230; but let&#8217;s not talk about it! <img src='http://diegobz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>So, this week I just came across an issue related to <strong>how to setup multiple databases on Django</strong>. Reading the <a title="Django docs for multi-db" href="http://docs.djangoproject.com/en/1.2/topics/db/multi-db/" target="_blank">documentation</a> I found it quite trivial to setup. After having the databases configured, you can use a <strong>Database Router</strong>, if you want to automatically route your app models, or use <em><strong>.using(&#8216;db1&#8242;)</strong> </em>manually on your queries, specifying the wanted database.</p>
<p>As I didn&#8217;t want to specify the databases on the queries in my code, so I decided to use the<strong> Database Router</strong>, which is, by the way, a very nice solution for such a problem. Looking at the example on the Django docs, I realized that the example was only covering the routing of an unique app. Looking further, I also noticed that it was a bit tied with placeholders related to the app and the database names inside the class. Then I asked myself:</p>
<p><strong>Couldn&#8217;t it be more generic and reusable for more than one app?</strong></p>
<p>Searching a bit on the Web I couldn&#8217;t find anything. Having that in mind, I came with the following code that can be used to specify several apps using different databases. Everything just using a single settings variable and in a very simple way:</p>
<pre class="brush:py">from django.conf import settings

class DatabaseAppsRouter(object):
    """
    A router to control all database operations on models for different
    databases.

    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
    will fallback to the `default` database.

    Settings example:

    DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
    """

    def db_for_read(self, model, **hints):
        """"Point all read operations to the specific database."""
        if settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label):
            return settings.DATABASE_APPS_MAPPING[model._meta.app_label]
        return None

    def db_for_write(self, model, **hints):
        """Point all write operations to the specific database."""
        if settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label):
            return settings.DATABASE_APPS_MAPPING[model._meta.app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """Allow any relation between apps that use the same database."""
        db_obj1 = settings.DATABASE_APPS_MAPPING.get(obj1._meta.app_label)
        db_obj2 = settings.DATABASE_APPS_MAPPING.get(obj2._meta.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None

    def allow_syncdb(self, db, model):
        """Make sure that apps only appear in the related database."""
        if db in settings.DATABASE_APPS_MAPPING.values():
            return settings.DATABASE_APPS_MAPPING.get(model._meta.app_label) == db
        elif settings.DATABASE_APPS_MAPPING.has_key(model._meta.app_label):
            return False
        return None
</pre>
<p>I hope the code can self explain what each one of those methods do. And, of course, it&#8217;s a generic solution that might be customized as needed. <img src='http://diegobz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://diegobz.net/2011/02/10/django-database-router-using-settings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django reverse with JavaScript</title>
		<link>http://diegobz.net/2010/07/16/django-reverse-with-javascript/</link>
		<comments>http://diegobz.net/2010/07/16/django-reverse-with-javascript/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 21:06:39 +0000</pubDate>
		<dc:creator>diegobz</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Transifex]]></category>

		<guid isPermaLink="false">http://diegobz.net/?p=336</guid>
		<description><![CDATA[Taking the cobwebs out of here… Here I go to cite a way that can &#8216;solve&#8217; the URL reversing problem when you are using a Django app that uses some JavaScript and Ajax requests. Django has a very nice way to resolve URLs based on its name and optionally some args. It uses the regex [...]]]></description>
			<content:encoded><![CDATA[<p>Taking the cobwebs out of here…</p>
<p>Here I go to cite a way that can &#8216;solve&#8217; the URL reversing problem when you are using a Django app that uses some JavaScript and Ajax requests.</p>
<p>Django has a very nice way to resolve URLs based on its name and optionally some args. It uses the regex pattern defined in the related urls.py file of the given app. Example:</p>
<blockquote><p>from django.core.urlresolvers import reverse</p>
<p>reverse(&#8216;project_detail&#8217;, args=['foo'])<br />
&#8216;/projects/p/foo/&#8217;</p>
<p>reverse(&#8216;project_detail&#8217;, args=['bar'])<br />
&#8216;/projects/p/bar/&#8217;</p></blockquote>
<p>The problem turns when you want to make a Ajax request based on some dynamic data from a form or something. As some URLs sometimes need arguments to be resolved, we can&#8217;t always pre-reverse and attach them to the Context, on the Django response.</p>
<p>For the record, I found an alternative <a href="http://stackoverflow.com/questions/2724383/dry-urls-in-django-javascript" target="_blank">here</a>. With it you can take the args from the browser and request through Ajax to Django the resolved URL. It&#8217;s pretty cool, but I think it was a bit expensive to multiply by 2 the number of requests to the server.</p>
<p>It made me think on another approach, where I would pre-fill in the Context response of Django, the URL already resolved, but with named args like, %(project)s, for the required arguments. I ended up with this:</p>
<blockquote><p>from django.core.urlresolvers import get_resolver</p>
<p>def get_url_pattern(urlname):<br />
&#8220;&#8221;"<br />
Return pattern for an URL based on its name.</p>
<p>&gt;&gt;&gt; get_url_pattern(&#8216;project_deails&#8217;)<br />
u&#8217;/projects/p/%(project_slug)s/&#8217;</p>
<p>&#8220;&#8221;"<br />
return &#8216;/%s&#8217; % get_resolver(None).reverse_dict.get(urlname)[0][0][0]</p></blockquote>
<p>As you can notice, passing an URL name to that function will give you the resolved URL with named args. I&#8217;m not really aware about corner cases, so feel free to give any comment on it.</p>
<p>Once you have the URL as a string with named args, you can use this <a href="http://plugins.jquery.com/project/printf" target="_blank">JQuery plugin</a>, to resolve the named args using only JavaScript in the client side.</p>
<p>&#8230; and that&#8217;s it! <img src='http://diegobz.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://diegobz.net/2010/07/16/django-reverse-with-javascript/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Running Transifex with PostgreSQL on Fedora</title>
		<link>http://diegobz.net/2009/11/22/running-transifex-with-postgresql-on-fedora/</link>
		<comments>http://diegobz.net/2009/11/22/running-transifex-with-postgresql-on-fedora/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 20:02:57 +0000</pubDate>
		<dc:creator>diegobz</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Transifex]]></category>

		<guid isPermaLink="false">http://diegobz.net/?p=257</guid>
		<description><![CDATA[Steps with sudo command configured to the current user: $ sudo yum install postgresql-server python-psycopg2 $ sudo service postgresql initdb Initializing database: [ OK ] $ sudo service postgresql start Starting postgresql service: [ OK ] $ sudo su &#8211; postgres -bash-4.0$ psql postgres=# CREATE USER transifex WITH PASSWORD &#8216;transifex&#8217;; CREATE ROLE postgres=# CREATE DATABASE [...]]]></description>
			<content:encoded><![CDATA[<p>Steps with sudo command configured to the current user:</p>
<blockquote><p>$ sudo yum install postgresql-server python-psycopg2</p>
<p>$ sudo service postgresql initdb<br />
Initializing database:                                     [  OK  ]</p>
<p>$ sudo service postgresql start<br />
Starting postgresql service:                           [  OK  ]</p>
<p>$ sudo su &#8211; postgres</p>
<p>-bash-4.0$ psql</p>
<p>postgres=# CREATE USER transifex WITH PASSWORD &#8216;transifex&#8217;;<br />
CREATE ROLE</p>
<p>postgres=# CREATE DATABASE transifex OWNER transifex;<br />
CREATE DATABASE</p>
<p>postgres=# \q</p>
<p>-bash-4.0$ exit</p>
<p>$ sudo vim /var/lib/pgsql/data/pg_hba.conf</p>
<p># &#8220;local&#8221; is for Unix domain socket connections only<br />
local   transifex   transifex                      password    # Add this line<br />
local   all            all                               ident</p>
<p>$ sudo service postgresql restart</p>
<p>$ psql transifex transifex<br />
Password for user transifex:<br />
psql (8.4.1)<br />
Type &#8220;help&#8221; for help.</p>
<p>transifex=&gt;</p>
<p>transifex=&gt; \q</p>
<p># Bellow it assumes the Tx code is under ~/workspace/mainline/ and<br />
# all the dependencies are installed. http://docs.transifex.org/intro/install.html</p>
<p>$ cd workspace/mainline/transifex/</p>
<p>$ vim settings/21-engines.conf</p>
<p># Database configuration<br />
DATABASE_ENGINE = &#8216;postgresql_psycopg2&#8242;<br />
DATABASE_NAME = &#8216;transifex&#8217;<br />
DATABASE_USER = &#8216;transifex&#8217;<br />
DATABASE_PASSWORD = &#8216;transifex&#8217;</p>
<p>$ ./manage.py syncdb</p>
<p>$ ./manage.py migrate codebases  # It shouldn&#8217;t be necessary :/</p>
<p>$ ./manage.py migrate</p>
<p>$ ./manage.py loaddata txcommon/fixtures/*</p>
<p>$ ./manage.py runserver 8080</p></blockquote>
<p>That&#8217;s it!</p>
]]></content:encoded>
			<wfw:commentRss>http://diegobz.net/2009/11/22/running-transifex-with-postgresql-on-fedora/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unicode usernames in Django admin panel</title>
		<link>http://diegobz.net/2009/11/10/unicode-usernames-in-django-admin-panel/</link>
		<comments>http://diegobz.net/2009/11/10/unicode-usernames-in-django-admin-panel/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 14:10:43 +0000</pubDate>
		<dc:creator>diegobz</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Transifex]]></category>

		<guid isPermaLink="false">http://diegobz.net/?p=243</guid>
		<description><![CDATA[This week we&#8217;ve gotten a request from translate.moblin.org for being able to login using unicode chars. They use a custom backend for authentication that allows, for example, Chinese chars in the username. Django seems to handle it pretty well, although the Django Admin Panel complains about it. As a solution, we&#8217;ve implemented a way to [...]]]></description>
			<content:encoded><![CDATA[<p>This week we&#8217;ve gotten a request from <a href="http://translate.moblin.org/" target="_blank">translate.moblin.org</a> for being able to login using unicode chars. They use a custom backend for authentication that allows, for example, Chinese chars in the username. Django seems to handle it pretty well, although the Django Admin Panel complains about it. As a solution, we&#8217;ve implemented a way to override the Django admin forms for creating and editing users, using a UnicodeRegexField.</p>
<p>That was a cool stuff. Here is a code example of an <a href="http://diegobz.net/wp-content/uploads/2009/11/admin.txt" target="_blank">admin.py</a></p>
]]></content:encoded>
			<wfw:commentRss>http://diegobz.net/2009/11/10/unicode-usernames-in-django-admin-panel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

