<?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"
	>

<channel>
	<title>Vientos de Libertad</title>
	<atom:link href="http://www.juanjoconti.com.ar/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.juanjoconti.com.ar</link>
	<description>el blog de Juanjo Conti - en borrador permanente</description>
	<pubDate>Thu, 07 Aug 2008 02:35:30 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Como un viejo rock &#8216;n&#8217; roll&#8230;</title>
		<link>http://www.juanjoconti.com.ar/2008/08/02/como-un-viejo-rock-n-roll/</link>
		<comments>http://www.juanjoconti.com.ar/2008/08/02/como-un-viejo-rock-n-roll/#comments</comments>
		<pubDate>Sat, 02 Aug 2008 23:57:00 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Música]]></category>

		<category><![CDATA[Búfalo blanco]]></category>

		<category><![CDATA[rock]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/?p=483</guid>
		<description><![CDATA[El viernes en Santa Fe tuvimos una tarde fría que me encontró paseando por la peatonal San Martín. Como tenía que esperar unos minutos, entré a una disquería a mirar albumenes.
- ¿Flaco? ¿Qué estás buscando?
- Hola. Estoy mirando CDs solamente.
Y seguí mirando los albumenes en su celofán original. A los pocos segundos tenía en mi [...]]]></description>
			<content:encoded><![CDATA[<p>El viernes en Santa Fe tuvimos una tarde fría que me encontró paseando por la peatonal San Martín. Como tenía que esperar unos minutos, entré a una disquería a mirar albumenes.</p>
<p>- ¿Flaco? ¿Qué estás buscando?</p>
<p>- Hola. Estoy mirando CDs solamente.</p>
<p>Y seguí mirando los albumenes en su celofán original. A los pocos segundos tenía en mi mano una cajita un poco polvorienta. En la tapa tenía dibujada una manada de búfalos negros y uno blanco. Era un CD de una banda oriunda de <a title="San Carlos Centro" href="http://es.wikipedia.org/wiki/San_Carlos_Centro" target="_blank">San Carlos Centro</a>. Lo anecdótico de la historia es que hace unos 8 años me pasaron unos mp3 de canciones de esta banda, y aún recordaba el single principal.</p>
<p>Salía $15 y parecía estar esperando en la estantería de grupos locales por mucho tiempo. No se si por nostalgia de aquellos años (qué encierran muchas historias) o por puro <a title="Comprar por impulso" href="http://es.wikipedia.org/wiki/Compra_por_impulso" target="_blank">comprador compulsivo</a> me lo llevé a casa. La siguiente es la lista de temas que incluye el trabajo:<br />
<span id="more-483"></span></p>
<h2>Como un viejo rock &#8216;n&#8217; roll - Búfalo Blanco</h2>
<p>1 Resignado a perderte</p>
<p>2 Como un viejo rock &#8216;n&#8217; roll</p>
<p>3 Dulce adicción</p>
<p>4 Uvita (torrontes)</p>
<p>5 En la ruta</p>
<p>6 Extraña relación</p>
<p>7 Otra oportunidad</p>
<p>8 El viejo Orsi</p>
<p>9 Vacío cerebral</p>
<p>10 Aún te amo</p>
<p>11 Confusión</p>
<p>12 Es por tus ojos</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/08/02/como-un-viejo-rock-n-roll/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Buen viaje! y nuevo blog en la familia</title>
		<link>http://www.juanjoconti.com.ar/2008/07/29/buen-viaje-y-nuevo-blog-en-la-familia/</link>
		<comments>http://www.juanjoconti.com.ar/2008/07/29/buen-viaje-y-nuevo-blog-en-la-familia/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 00:05:30 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Blogósfera]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/07/29/buen-viaje-y-nuevo-blog-en-la-familia/</guid>
		<description><![CDATA[Mi hermana está partiendo esta semana para Florianópolis (Brasil). Va a estar estudiando el próximo cuatrimestre en la UFSC y para documentar la experiencia empezó un blog: http://marisuconti.wordpress.com/
Buen viaje y bienvenida a la blogósfera!
]]></description>
			<content:encoded><![CDATA[<p>Mi hermana está partiendo esta semana para <a href="http://es.wikipedia.org/wiki/Florian%C3%B3polis" title="Floripa" target="_blank">Florianópolis (Brasil)</a>. Va a estar estudiando el próximo cuatrimestre en la <a href="http://www.ufsc.br/" title="Universidad Federal de Santa Catarina" target="_blank">UFSC</a> y para documentar la experiencia empezó un blog: <a href="http://marisuconti.wordpress.com/" title="Blog de Marisú" target="_blank">http://marisuconti.wordpress.com/</a></p>
<p>Buen viaje y bienvenida a la blogósfera!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/07/29/buen-viaje-y-nuevo-blog-en-la-familia/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Bing Bang Theory Theme Song</title>
		<link>http://www.juanjoconti.com.ar/2008/07/27/the-bing-bang-theory-theme-song-bare-naked-ladies/</link>
		<comments>http://www.juanjoconti.com.ar/2008/07/27/the-bing-bang-theory-theme-song-bare-naked-ladies/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 04:37:20 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Música]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/07/27/the-bing-bang-theory-theme-song-bare-naked-ladies/</guid>
		<description><![CDATA[The Bing Bang Theory Theme Song - Bare Naked LadiesOur whole universe was in a hot dense state,
Then nearly fourteen billion years ago expansion started. Wait&#8230;
The Earth began to cool,
The autotrophs began to drool,
Neanderthals developed tools,
We built a wall (we built the pyramids),
Math, science, history, unraveling the mysteries,
That all started with the big bang!
&#8220;Since the [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>The Bing Bang Theory Theme Song - Bare Naked Ladies</strong>Our whole universe was in a hot dense state,<br />
Then nearly fourteen billion years ago expansion started. Wait&#8230;<br />
The Earth began to cool,<br />
The autotrophs began to drool,<br />
Neanderthals developed tools,<br />
We built a wall (we built the pyramids),<br />
Math, science, history, unraveling the mysteries,<br />
That all started with the big bang!</p>
<p>&#8220;Since the dawn of man&#8221; is really not that long,<br />
As every galaxy was formed in less time than it takes to sing this song.<br />
A fraction of a second and the elements were made.<br />
The bipeds stood up straight,<br />
The dinosaurs all met their fate,<br />
They tried to leap but they were late<br />
And they all died (they froze their asses off)<br />
The oceans and pangea<br />
See ya, wouldn&#8217;t wanna be ya<br />
Set in motion by the same big bang!</p>
<p>It all started with the big BANG!</p>
<p>It&#8217;s expanding ever outward but one day<br />
It will cause the stars to go the other way,<br />
Collapsing ever inward, we won&#8217;t be here, it wont be hurt<br />
Our best and brightest figure that it&#8217;ll make an even bigger bang!</p>
<p>Australopithecus would really have been sick of us<br />
Debating out while here they&#8217;re catching deer (we&#8217;re catching viruses)<br />
Religion or astronomy, Encarta, Deuteronomy<br />
It all started with the big bang!</p>
<p>Music and mythology, Einstein and astrology<br />
It all started with the big bang!<br />
It all started with the big BANG!</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/07/27/the-bing-bang-theory-theme-song-bare-naked-ladies/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hoy se recibieron Mariano y Nico</title>
		<link>http://www.juanjoconti.com.ar/2008/07/11/hoy-se-recibieron-mariano-y-nico/</link>
		<comments>http://www.juanjoconti.com.ar/2008/07/11/hoy-se-recibieron-mariano-y-nico/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 01:59:03 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Eventos]]></category>

		<category><![CDATA[Facultad]]></category>

		<category><![CDATA[Fotos]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/07/11/hoy-se-recibieron-mariano-y-nico/</guid>
		<description><![CDATA[Hay 2 nuevos ingenieros en la ciudad. Hoy en un laboratorio de la UTN facultad regional Santa Fe, mis amigos Mariano Galán y Nicolás César presentaron su proyecto final de carrera.

Bruno publicó sus fotos y César también.
]]></description>
			<content:encoded><![CDATA[<p>Hay 2 nuevos ingenieros en la ciudad. Hoy en un laboratorio de la UTN facultad regional Santa Fe, mis amigos Mariano Galán y Nicolás César presentaron su proyecto final de carrera.</p>
<p align="center"><img src="http://www.juanjoconti.com.ar/wp-content/uploads/2008/07/collage.gif" alt="Nico_Y_Mariano" /></p>
<p>Bruno <a href="http://picasaweb.google.com/bgnoatto/MarianoNicoCesarIngenierosRecibimiento" title="Fotos por Bruno" target="_blank">publicó sus fotos</a> y César <a href="http://www.cesaremilioportela.com.ar/fotos001/" title="Fotos por César" target="_blank">también</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/07/11/hoy-se-recibieron-mariano-y-nico/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Decoradores en Python (I)</title>
		<link>http://www.juanjoconti.com.ar/2008/07/11/decoradores-en-python-i/</link>
		<comments>http://www.juanjoconti.com.ar/2008/07/11/decoradores-en-python-i/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 04:30:14 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Aprendiendo Python]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/07/11/decoradores-en-python-i/</guid>
		<description><![CDATA[Este artículo es el primero de un plan de 3 artículos. Empezamos con una introducción a los decoradores en Python.

Funciones
Cómo todo en Python, las funciones son objetos. La forma más común de crear un objeto de tipo &#60;function&#62; es mediante el keyword def:

def saludo():
    print "Hola"
Al realizar esta definición, el cuerpo de [...]]]></description>
			<content:encoded><![CDATA[<p>Este artículo es el primero de un plan de 3 artículos. Empezamos con una introducción a los decoradores en Python.<br />
<span id="more-473"></span></p>
<h2>Funciones</h2>
<p>Cómo todo en Python, las funciones son objetos. La forma más común de crear un objeto de tipo &lt;function&gt; es mediante el keyword def:</p>
<pre>
def saludo():
    print "Hola"</pre>
<p>Al realizar esta definición, el cuerpo de la función es compilado pero no ejecutado y el objeto de tipo &lt;function&gt; es asociado al nombre &#8217;saludo&#8217;. Mediante este nombre podemos referirnos al objeto:</p>
<pre>
saludo
&lt;function saludo at 0xb7d82fb4&gt;</pre>
<p>y utilizando la notación de paréntesis podemos llamar a (ejecutar) la función.</p>
<pre>
saludo()
Hola</pre>
<p>Una función puede tener parámetros (los parámetros son nombres a los que podemos referirnos en el cuerpo de la función):</p>
<pre>
def saludo2(nombre):
    print "Hola %s" % nombre</pre>
<pre>
def saludo3(nombre, apellido):
    print "Hola %s %s" % (nombre, apellido)</pre>
<p>Cuando llamamos a la función con argumentos (los argumentos son valores que en principio se asocian uno a uno a los parámetros de la función):</p>
<pre>
saludo2("Ceci")
Hola Ceci</pre>
<pre>
saludo3("Ceci", "Pucci")
Hola Ceci Pucci</pre>
<p>Los últimos n parámetros pueden tener valores por defecto, entonces estas definiciones y sus consiguientes ejecuciones son válidas:</p>
<pre>
def saludo4(nombre, apellido="Conti"):
    print "Hola %s %s" % (nombre, apellido)</pre>
<pre>
saludo4("Juanjo")
Hola Juanjo Conti</pre>
<pre>
saludo4("Juanjo", "Garau")
Hola Juanjo Garau</pre>
<pre>
def saludo5(nombre="Juanjo", apellido="Conti"):
    print "Hola %s %s" % (nombre, apellido)</pre>
<pre>
saludo5()
Hola Juanjo Conti</pre>
<pre>
saludo5("Mary")
Hola Mary Conti</pre>
<p>Los últimos n argumentos pueden ser argumentos nombrados, es decir utilizando el nombre de los parámetros con los que el argumento se debe asociar. En las siguientes ejecuciones se pueden ver ejemplos de esto:</p>
<pre>
def saludo6(tratamiento, nombre, apellido):
    print "Hola %s %s %s" % (tratamiento, nombre, apellido)</pre>
<pre>
saludo6("Sr.", apellido="Conti", nombre="Juanjo")
Hola Sr. Juanjo Conti</pre>
<pre>
saludo6("Sr.", "Juanjo", apellido="Conti")
Hola Sr. Juanjo Conti</pre>
<p>Los parámetros de una función pueden terminar con *&lt;nombre&gt; (una tupla con los últimos argumentos posicionales) y/o **&lt;nombre&gt; (un diccionario con los últimos argumentos nombrados).</p>
<pre>
def saludo7(tratamiento, *args):
    print "Hola %s %s" % (tratamiento, " ".join(args))</pre>
<pre>
saludo7("Sr.", "Juanjo", "Conti")
Hola Sr. Juanjo Conti</pre>
<pre>
saludo7("Sr.", "Juanjo", "Conti", "Garau")
Hola Sr. Juanjo Conti Garau</pre>
<p>Notemos que esta forma de definir una función es bastante útil cuando no sabemos el número de argumentos que se recibirán.<br />
La siguiente es la forma más genérica de definir una función:</p>
<pre>
def saludo8(*args, **kwargs):
    pass</pre>
<h2>Decoradores</h2>
<p>Un decorador es una función &#8216;d&#8217; que recibe como argumento otra función &#8216;a&#8217; y retorna una nueva función &#8216;b&#8217;. La nueva función &#8216;b&#8217; es la función &#8216;a&#8217; decorada con &#8216;d&#8217;.</p>
<p>Supongamos que queremos avisarle a un sistema de seguridad cada vez que se ejecutan las funciones abrir_puerta y cerrar_puerta. Para hacer una simplificación, el aviso simplemente será imprimir por un mensaje en la pantalla. Podemos escribir el siguiente &#8216;decorador&#8217;:</p>
<pre>
def avisar(f):
    def inner(*args, **kwargs):
        f(*args, **kwargs)
        print "Se ha ejecutado %s" % f.__name__
    return inner</pre>
<p>Las siguientes son las funciones a decorar:</p>
<pre>
def abrir_puerta():
    print "Abrir puerta"

def cerrar_puerta():
    print "Cerrar puerta"</pre>
<pre>
abrir_puerta()
Abrir puerta

cerrar_puerta()
Cerrar puerta</pre>
<p>Y ahora solo nos limitamos a seguir la definción que di al principio de un decorador:</p>
<pre>
abrir_puerta = avisar(abrir_puerta)
cerrar_puerta = avisar(cerrar_puerta)</pre>
<p>Listo!, ambas funciones han sido decoradas:</p>
<pre>
abrir_puerta()
Abrir puerta
Se ha ejecutado abrir_puerta

cerrar_puerta()
Cerrar puerta
Se ha ejecutado cerrar_puerta</pre>
<h2>Azúca sintáctica</h2>
<p>En Python 2.3, la anterior era la forma de decorar una función. A partir de Python 2.4 se a añadido azúcar sintáctica al lenguaje que nos permite hacer lo mismo de esta forma:</p>
<pre>
@avisar
def abrir_puerta():
    print "Abrir puerta"

@avisar
def cerrar_puerta():
    print "Cerrar puerta"</pre>
<p>Esta es una forma mucho más visual de hacerlo.</p>
<h2>Encadenando decoradores</h2>
<p>La decoración de funciones puede encadenarse. Para ejemplificarlo vamos a suponer ahora que solo usuarios autenticados en el sistema pueden ejecutar las funciones abrir_puerta y cerrar puerta.</p>
<p>Nuevamente hacemos una simplificación. Existe la variable AUTHENTICATED que indica el estado del usuario actual. Si el usuario no está autenticado y se intente ejecutar alguna de las funciones, una excepción es lanzada.</p>
<pre>
def autenticado(f):
    def inner(*args, **kwargs):
        if AUTHENTICATED:
            f(*args, **kwargs)
       else:
           raise Exception
    return inner</pre>
<p>Luego, la definición de abrir_puerta y cerrar_puerta debería ser:</p>
<pre>
@autenticado
@avisar
def abrir_puerta():
    print "Abrir puerta"

@autenticado
@avisar
def cerrar_puerta():
    print "Cerrar puerta"</pre>
<p>Con AUTENTICATED = True:</p>
<pre>
cerrar_puerta()
Cerrar puerta</pre>
<p>Se ha ejecutado cerrar_puerta</p>
<p>Pero si AUTHENTICATED = False:</p>
<pre>
cerrar_puerta()
Traceback (most recent call last):
File "&lt;stdin&gt;", line 1, in &lt;module&gt;
File "&lt;stdin&gt;", line 6, in inner
Exception</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/07/11/decoradores-en-python-i/feed/</wfw:commentRss>
		</item>
		<item>
		<title>django-messages en español</title>
		<link>http://www.juanjoconti.com.ar/2008/06/28/django-messages-en-espanol/</link>
		<comments>http://www.juanjoconti.com.ar/2008/06/28/django-messages-en-espanol/#comments</comments>
		<pubDate>Sat, 28 Jun 2008 23:58:11 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/06/28/django-messages-en-espanol/</guid>
		<description><![CDATA[django-messages es una aplicación que podemos integrar en nuestro proyecto Django para permitir a los usuarios enviarse mensajes entre ellos.
Hoy la traducimos con Ceci al español (es_AR, en realidad) mientras por IRC uno de los miembros del proyecto nos indicaba dónde tocar (nunca habíamos traducido una aplicación Django). Disponible desde la revisión 41.
Nuestra traducción, por [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/django-messages" title="Messages" target="_blank">django-messages</a> es una aplicación que podemos integrar en nuestro proyecto Django para permitir a los usuarios enviarse mensajes entre ellos.</p>
<p>Hoy la traducimos con Ceci al español (es_AR, en realidad) mientras por IRC uno de los miembros del proyecto nos indicaba dónde tocar (nunca habíamos traducido una aplicación Django). Disponible desde la <a href="http://code.google.com/p/django-messages/source/detail?r=41" title="41" target="_blank">revisión 41</a>.</p>
<p>Nuestra traducción, por si alguien tiene sugerencias o correcciones: <a href="http://code.google.com/p/django-messages/source/browse/branches/django-trunk/messages/locale/es_AR/LC_MESSAGES/django.po?r=41" title=".po" target="_blank">es_AR</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/06/28/django-messages-en-espanol/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Usando django-notification</title>
		<link>http://www.juanjoconti.com.ar/2008/06/28/usando-django-notification/</link>
		<comments>http://www.juanjoconti.com.ar/2008/06/28/usando-django-notification/#comments</comments>
		<pubDate>Sat, 28 Jun 2008 04:54:51 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/06/28/usando-django-notification/</guid>
		<description><![CDATA[django-notification es una aplicación para Django que permite al resto de las aplicaciones de un proyecto enviar notas a los usuarios. Así, cuando la aplicación Stock detecta que el número de bulones que hay en el depósito es menor límite de reposición puede enviar una nota de tipo &#8220;Avisos prioritarios&#8221; al usuario responsable del depósito. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/django-notification" target="_blank">django-notification</a> es una aplicación para Django que permite al resto de las aplicaciones de un proyecto enviar notas a los usuarios. Así, cuando la aplicación Stock detecta que el número de bulones que hay en el depósito es menor límite de reposición puede enviar una nota de tipo &#8220;Avisos prioritarios&#8221; al usuario responsable del depósito. Esta nota puede ser recibida por mail, feed o mostrarse en el sistema cuando el usuario inicia su sesión.</p>
<p>El siguiente es un artículo del proyecto que hemos traducido yo y Cecilia.</p>
<p><span id="more-467"></span></p>
<h2>Integrar Notification</h2>
<p>Integrar notification a tu aplicación es un proceso simple de dos pasos.</p>
<ol>
<li>crear tus tipos de notas (Notice Type)</li>
<li>enviar notificaciones</li>
</ol>
<h3>Crear tipos de notas (Notice Type)</h3>
<p>Debes ejecutar <code>create_notice_type(label, display, description)</code> una vez para crear los tipos de notas para tu aplicación en la base de datos. <code>label</code> es un nombre interno, corto, que será usado para el tipo, <code>display</code> es lo que el usuario verá como el nombre del tipo de nota y <code>description</code> es una descripción corta.</p>
<p>Por ejemplo:</p>
<pre>
from django.dispatch import dispatcher
from django.db.models import signals

try:
    from notification import models as notification

    def create_notice_types(app, created_models, verbosity, **kwargs):
        notification.create_notice_type("invitacion_amigo", u"Invitación recibida",
                                                     u"has recibido una invitación")
        notification.create_notice_type("invitacion_aceptada", u"Invitación aceptada",
                                                     u"una invitación que enviaste fue aceptada")

    dispatcher.connect(create_notice_types, signal=signals.post_syncdb, sender=notification)
except ImportError:
    print "No se encontró la aplicación notification, no se crearán objetos del tipo NoticeTypes"</pre>
<p>Notar que el código está envuelto con un try para que si django-notification no está instalado, tu aplicación funcione de todas formas.</p>
<h3>Enviar notificaciones</h3>
<p>Para enviar mensajes se usa <code>send(users, notice_type_label, message_template, object_list, issue_notice)</code> dónde <code>object_list</code> y <code>issue_notice</code> son opcionales.</p>
<p><code>users</code> es una lista de usuarios que deben recibir la nota. <code>notice_type_label</code> es la etiqueta que usaste en el paso previo para identificar un tipo de nota. <code>message_template</code> es solo un string, aunque si <code>object_list</code> no está vacía, entonces <code>message_template</code> debe contener tantos <code>%s</code> como objetos en <code>object_list</code>. Entonces serán reemplazados con referencias a los correspondientes objetos de <code>object_list</code>.</p>
<p>Por ejemplo:</p>
<pre>
notification.send([to_user], "invitacion_amigo", "%s solicita ser tu amigo.", [from_user])</pre>
<p>enviará una nota de tipo <code>invitacion_amigo</code> a <code>to_user</code> con el mensaje <code>XXX solicita ser tu amigo.</code> dónde XXX es una referencia al objeto <code>from_user</code>. Dependiendo del medio de notificación, esta referencia será un link o solo texto plano.</p>
<p><code>issue_notice</code> es <code>True</code> por defecto pero se puede cambiar a <code>False</code> si querés que una notificación se envíe pero no se persista como un objeto de tipo <code>Notice</code> en la base de datos.</p>
<p>Para permitir que tu aplicación funcione sin notification, podés envolver el import en un try y testear si el módulo fue cargado antes de enviar la nota.</p>
<p>Por ejemplo:</p>
<pre>
try:
    from notification import models as notification
except ImportError:
    notification = None</pre>
<p>y luego:</p>
<pre>
if notification:
    notification.send([to_user], "invitacion_amigo", "%s solicita ser tu amigo.", [from_user])</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/06/28/usando-django-notification/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Generar archivos rtf en forma dinámica desde Django</title>
		<link>http://www.juanjoconti.com.ar/2008/06/27/generar-archivos-rtf-en-forma-dinamica-desde-django/</link>
		<comments>http://www.juanjoconti.com.ar/2008/06/27/generar-archivos-rtf-en-forma-dinamica-desde-django/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 18:33:46 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/06/27/generar-archivos-rtf-en-forma-dinamica-desde-django/</guid>
		<description><![CDATA[En mi anterior artículo les conté sobre pyrtf-ng, una librería para generar archivos rtf en forma fácil desde un programa escrito en Python. Fue la primer alternativa que manejamos a la hora de plantearnos el problema de generar archivos rtf en forma dinámica desde Django.
En este artículo les cuento el aproach que finalmente adoptamos. Si [...]]]></description>
			<content:encoded><![CDATA[<p>En mi anterior artículo les conté sobre <a href="http://www.juanjoconti.com.ar/2008/06/12/soporte-unicode-para-pyrtf-ng/" title="pyrtf-ng" target="_blank">pyrtf-ng</a>, una librería para generar <a href="http://es.wikipedia.org/wiki/Rich_Text_Format" title="Rich Text Format" target="_blank">archivos rtf</a> en forma fácil desde un programa escrito en Python. Fue la primer alternativa que manejamos a la hora de plantearnos el problema de generar archivos rtf en forma dinámica desde <a href="http://www.djangoproject.com" title="Django project" target="_blank">Django</a>.</p>
<p>En este artículo les cuento el <em>aproach</em> que finalmente adoptamos. Si la naturaleza dinámica del documento que queremos generar radica en que ciertas partes del texto tendrán valores dinámicos o ciertas partes pueden estar o no dependiendo de alguna condición, lo que podemos hacer es utilizar un sistema de templates. El formato rtf es un lenguaje de marcas (es texto, no binario!). Por lo que fácilmente podemos usar el <a href="http://www.djangoproject.com/documentation/templates/" target="_blank">subsistema de templates de Django</a> para lograr nuestro objetivo.<span id="more-466"></span></p>
<h2>Un ejemplo de lo que queremos obtener</h2>
<p>Simplificando, si en el sistema la variable <code>nombre</code> vale <code>"Juan"</code> y la variable <code>tratamiento</code> es <code>False</code>, el resultado esperado en el archivo rtf es:</p>
<blockquote><p>Hola Juan</p></blockquote>
<p>Si la variable <code>nombre</code> vale <code>"Raúl"</code>, la variable <code>tratamiento</code> es <code>"Sr."</code> el resultado esperado en el archivo rtf es:</p>
<blockquote><p>Hola Sr. Raúl</p></blockquote>
<p>Para lograrlo necesitamos un archivo hola.rtf (puede tener cualquier nombre y cualquier extensión, pero estos parecen apropiados para el ejemplo) ubicado en algún <a href="http://www.djangoproject.com/documentation/settings/#template-dirs" title="Definido en settings.py" target="_blank">directorio accesible por el subsistema de templates</a>. Tip: crear un archivo rtf con OpenOffice Writer o WordPad y luego editarlo con un editor de texto para agregar las marcas necesarias para que Django lo procese.</p>
<h2>El template</h2>
<p>Así se ve el template del ejemplo cuando lo abrimos con un editor de texto, luego de agregar las marcas correspondientes:<br />
<code><br />
<strong>{% load filtros %}</strong>{\rtf1\ansi\deff0\adeflang1025<br />
{\fonttbl{\f0\froman\fprq2\fcharset0 Bitstream Vera Sans;}{\f1\froman\fprq2\fcharset0 Bitstream Vera Sans;}{\f2\fswiss\fprq2\fcharset0 Bitstream Vera Sans;}{\f3\fnil\fprq2\fcharset0 Bitstream Vera Sans;}}<br />
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}<br />
[....]<br />
{\rtlch \ltrch\loch\f0\fs24\lang11274\i0\b0 Hola <strong>{% if tratamiento %}{{ tratamiento }} {% endif %}{{ nombre|rtf }}</strong>}<br />
\par }<br />
</code><br />
El encabezado suele ser largo (esto depende del programa utilizado para crear el documento, con WordPad se obtienen los encabezados más cortos). Las partes importantes están resaltadas en <strong>negrita</strong>.</p>
<p>El bloque <code>load</code> carga el filtro de nombre rtf que luego es usado. Notar que este bloque debe incluirse en la misma línea que la primer línea del documento o en alguna línea siguiente, pero nunca en la primer línea del archivo y solo. Esto provocará una línea en blanco al principio del documento resultante, un error de sintaxis en el formato rtf, y por lo tanto no podrá ser interpretado por los procesadores de palabras.</p>
<h2>Un filtro para codificar caracteres Unicode en rtf</h2>
<p>Como rtf no soporta nativamente caracteres Unicode (tildes y otros caracteres no ascii), estos deben ser codificados para ser correctamente interpretados. El siguiente filtro hace esa tarea, es un <a href="http://www.djangoproject.com/documentation/templates_python/#template-filters-that-expect-strings" target="_blank">string filter</a> de Django:</p>
<pre>
@register.filter(name='rtf')
@stringfilter
def rtf(value):
    if isinstance(value, UnicodeType):
        return "".join(["u%s?" % str(ord(c)) for c in value])
    return value</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/06/27/generar-archivos-rtf-en-forma-dinamica-desde-django/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Soporte Unicode para pyrtf-ng</title>
		<link>http://www.juanjoconti.com.ar/2008/06/12/soporte-unicode-para-pyrtf-ng/</link>
		<comments>http://www.juanjoconti.com.ar/2008/06/12/soporte-unicode-para-pyrtf-ng/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 03:04:28 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[Aprendiendo Python]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/06/12/soporte-unicode-para-pyrtf-ng/</guid>
		<description><![CDATA[pyrtf-ng es un módulo para Python que permite generar archivos en formato RTF en forma dinámica. Esta semana empecé a probarlo con la idea de usarlo para generar documentos de texto con formato (Word-like) en forma dinámica.


Al intentar instalarlo tuve algunos problemas , se los comenté al autor y le sugerí soluciones. Rápidamente estas modificaciones [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/pyrtf-ng" title="code" target="_blank">pyrtf-ng</a> es un módulo para Python que permite generar archivos en formato <a href="http://en.wikipedia.org/wiki/Rich_Text_Format" title="RTF" target="_blank">RTF</a> en forma dinámica. Esta semana empecé a probarlo con la idea de usarlo para generar documentos de texto con formato (<a href="http://es.wikipedia.org/wiki/DOC" title=".doc?" target="_blank">Word</a>-like) en forma dinámica.
</p>
<p>
Al intentar instalarlo tuve algunos problemas , se los comenté al autor y le sugerí soluciones. Rápidamente estas modificaciones estuvieron hechas en el repositorio del proyecto.
</p>
<p>
Una vez que tuve la librería instalada y los ejemplos corriendo, empecé a modificar algunos para experimentar un poco. Cuando quise generar un documento que contenga una palabra con tilde (cómo <code>canción</code>), el programa tiró una horrible excepción. Esto hacía que desechara totalmente la idea de usar este software.
</p>
<p>
Leí sobre la codificación utilizada por el formato RTF y descubrí que <a href="http://en.wikipedia.org/wiki/Rich_Text_Format#Character_encoding" title="RTF Encoding" target="_blank">no soporta Unicode</a> en forma nativa, pero si mediante una secuencia de escape de la forma: <code>\uxxxx?</code> en dónde <code>xxxx</code> es un entero con signo de 16 bits correspondiente al caracter que se quiere representar. Ejemplo: <a href="http://www.fileformat.info/info/unicode/char/00e1/index.htm" title="LATIN SMALL LETTER A WITH ACUTE" target="_blank">á</a>.
</p>
<p>
Pedí instrucciones al autor de la librería, quien me indicó que partes del código tendría que revisar par incluir la funcionalidad de soportar Unicode. Luego de algunas horas empapándome en la arquitectura de clases de pyrtf, tenía un parche listo para ser aplicado e incorporar la funcionalidad. Hoy <a href="http://code.google.com/p/pyrtf-ng/source/detail?r=69" title="Parche para Unicode" target="_blank">fue incluido</a> en la versión en desarrollo de la librería.</p>
<h2>Código</h2>
<p>Un pequeño snippet que muestra el algoritmo básico para pasar de un string Unicode a su representación codificada en RTF:</p>
<p><code>encoded = ''.join(['\u%s?' % str(ord(b)) for b in base])</code></p>
<h2>Datos</h2>
<ul>
<li>pyrtf-ng es mantenido por <a href="http://oubiwann.blogspot.com/" title="Duncan's blog" target="_blank">Duncan Mc Greggor</a> y está basado en <a href="http://pyrtf.sourceforge.net/" title="PyRTF" target="_blank">PyRTF,</a> un proyecto que ya no es mantenido.</li>
<li>Se encuentra en activo desarrollo: modificación del <a href="http://www.python.org/dev/peps/pep-0008/" title="PEP8" target="_blank">estilo</a> del código y <em>refactoring</em>.</li>
<li>También puede ser modificado mediante bazaar en <a href="https://launchpad.net/pyrtf" title="Launchpad" target="_blank">lauchpad</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/06/12/soporte-unicode-para-pyrtf-ng/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Propinas</title>
		<link>http://www.juanjoconti.com.ar/2008/06/10/propinas/</link>
		<comments>http://www.juanjoconti.com.ar/2008/06/10/propinas/#comments</comments>
		<pubDate>Tue, 10 Jun 2008 22:46:14 +0000</pubDate>
		<dc:creator>Juanjo</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.juanjoconti.com.ar/2008/06/10/propinas/</guid>
		<description><![CDATA[Acabo de añadir a este blog una latita para que quien quiera pueda dejarme alguna propina.
¿Te sirvió un artículo? ¿Te reíste con un chiste? Podés agradecerme tirando una moneda en mi latita de propinas  
Por cierto&#8230; me gustaría probar si esto funciona, alguien sería tan amable de donar 1 u$s con fines puramente académicos?
]]></description>
			<content:encoded><![CDATA[<p>Acabo de añadir a este blog una latita para que quien quiera pueda dejarme alguna propina.</p>
<p>¿Te sirvió un artículo? ¿Te reíste con un chiste? Podés agradecerme tirando una moneda en mi latita de propinas <img src='http://www.juanjoconti.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Por cierto&#8230; me gustaría probar si esto funciona, alguien sería tan amable de donar 1 u$s con fines puramente académicos?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.juanjoconti.com.ar/2008/06/10/propinas/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
