<?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/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Frameworks Agiles</title>
	<atom:link href="http://sergiohinojosa.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sergiohinojosa.wordpress.com</link>
	<description>desarrollo agil con django, rails, grails y symfony</description>
	<lastBuildDate>Mon, 23 Mar 2009 21:51:03 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
		<url>http://www.gravatar.com/blavatar/4946b83232a9869738286e496e930e0f?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Frameworks Agiles</title>
		<link>http://sergiohinojosa.wordpress.com</link>
	</image>
			<item>
		<title>Instalación y configuración del Servidor y Cliente Git bajo ssh</title>
		<link>http://sergiohinojosa.wordpress.com/2009/03/23/instalacion-y-configuracion-del-servidor-y-cliente-git-bajo-ssh/</link>
		<comments>http://sergiohinojosa.wordpress.com/2009/03/23/instalacion-y-configuracion-del-servidor-y-cliente-git-bajo-ssh/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 21:51:02 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[git-server]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=68</guid>
		<description><![CDATA[Git es uno de los mejores versionadores distribuidos, si usas github pero quieres tener tu propio repositorio en tu casa o trabajo entonces esta es una simple solucion, que no te toma mas de unos minutos, esta misma configuracion la he probado en dreamhost y funciona de la misma manera, de echo deberia funcionar en cualquier host que tengas. Si quieres ademas poder publicarlo mediante http, entonces una muy buena opcion gitweb.  Gitosis es tambien otra opcion que tienes, que es muy parecido pero para algun proyecto simple creo que esto es suficiente.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=68&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><span style="font-size:small;font-family:Times New Roman;">Git es uno de los mejores versionadores distribuidos, si usas github pero quieres tener tu propio repositorio en tu casa o trabajo entonces esta es una simple solucion, que no te toma mas de unos minutos, esta misma configuracion la he probado en dreamhost y funciona de la misma manera, de echo deberia funcionar en cualquier host que tengas. Si quieres ademas poder publicarlo mediante http, entonces una muy buena opcion gitweb.  Gitosis es tambien otra opcion que tienes, que es muy parecido pero para algun proyecto simple creo que esto es suficiente.</span></p>
<h2 style="margin:12pt 0 3pt;"><span style="font-size:large;"><span style="font-family:Arial;">1. Configuración del Servidor git</span></span></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">El único requisito es tener instalado git:</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">$ sudo apt-get install git-core</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">nota: El servidor esta configurado e instalado en django-server que tiene la IP 192.168.0.139, el usuario es django-server con password *****.</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<h2 style="margin:12pt 0 3pt;"><span style="font-size:large;"><span style="font-family:Arial;">2. Configuración del Cliente git</span></span></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Primero debemos generar el conjunto de llaves RSA:</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">$ ssh-keygen -t rsa</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Luego debemos registrar nuestra llave publica en el servidor, dentro de las llaves autorizadas de ssh, como sigue:</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">$<span>  </span>cat .ssh/id_rsa.pub | ssh django-server@192.168.0.139 &#8216;cat &gt;&gt; .ssh/authorized_keys&#8217;</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">En caso de no tener git instalarlo:</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">$ sudo apt-get install git-core</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Crear el archivo initrepo con el siguiente contenido:</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">$ vim initrepo</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">DOMAIN=django-server@192.168.0.139</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">ssh $DOMAIN &#8216;mkdir -p ~/git/&#8217;$1&#8242;.git &amp;&amp; cd ~/git/&#8217;$1&#8242;.git &amp;&amp; git &#8211;bare init&#8217;</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">mkdir $1</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">cd $1</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">git init</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">git remote add origin ssh://$DOMAIN/~/git/$1.git</span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">touch .gitignore</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">git add .</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">git commit -m &#8216;Created new repo&#8217;</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">git push origin master</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">echo &#8220;</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">[branch \"master\"]</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>  </span>remote = origin</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span>  </span>merge = refs/heads/master&#8221; &gt;&gt;.git/config</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">echo &#8220;Your new git repo &#8216;$1&#8242; is ready and initialized at $DOMAIN/~/git/$1.git&#8221;</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Asignarle los permisos:</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">$ sudo chmod a+x initrepo</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Para iniciar un repositorio nuevo en la maquina remota solo es necesario ejecutar initrepo y pasarle como parámetro el nombre del repositorio:</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">$ ./initrepo test01</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Inmediatamente veras una salida como esta:</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">Reinitialized existing Git repository in /home/django-server/git/test01.git/</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">mkdir: cannot create directory `test01&#8242;: File exists</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">Initialized empty Git repository in .git/</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">Created initial commit cccf28a: Created new repo</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span> </span>0 files changed, 0 insertions(+), 0 deletions(-)</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span> </span>create mode 100644 .gitignore</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">Counting objects: 3, done.</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">Writing objects: 100% (3/3), 219 bytes, done.</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">Total 3 (delta 0), reused 0 (delta 0)</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">To ssh://django-server@192.168.0.139/~/git/test01.git</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;"><span> </span>* [new branch]<span>      </span>master -&gt; master</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;"><span style="font-family:Times New Roman;">Your new git repo &#8216;test01&#8242; is ready and initialized at django-server@192.168.0.139/~/git/test01.git</span></span></span></p>
<p class="MsoNormal" style="margin:0;"><span lang="EN-GB"><span style="font-size:small;font-family:Times New Roman;"> </span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Veras que en tu propia maquina tendrás la carpeta test01, ingresa y ya puedes empezar a hacer cambios y propagarlos en el servidor haciendo git push.</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<h2 style="margin:12pt 0 3pt;"><span style="font-size:large;"><span style="font-family:Arial;">3. Obtener una copia de un repositorio remoto git y trabajar sobre el mismo</span></span></h2>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">Para poder obtener una copia de un repositorio remoto primero deberá registrar su llave publica en el servidor remoto.</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;"><span style="font-family:Times New Roman;">git clone ssh://django-server@192.168.0.139/~/git/test01.git</span></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"> </span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;">Luego puedes hacer cambios y replicarlos en el repositorio remoto con git push.</span></p>
<p class="MsoNormal" style="margin:0;"> </p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;">Referencias:</span></p>
<p class="MsoNormal" style="margin:0;"> </p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"><a href="http://autopragmatic.com/2008/01/26/hosting-a-git-repository-on-dreamhost/">http://autopragmatic.com/2008/01/26/hosting-a-git-repository-on-dreamhost/</a></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"><a href="http://casperfabricius.com/site/2008/09/21/keeping-git-repositories-on-dreamhost-using-ssh/">http://casperfabricius.com/site/2008/09/21/keeping-git-repositories-on-dreamhost-using-ssh/</a></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"><a href="http://madduck.net/blog/2007.07.11:publishing-git-repositories/">http://madduck.net/blog/2007.07.11:publishing-git-repositories/</a></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"><a href="http://batterypowered.wordpress.com/2008/07/04/deploying-a-git-repository-server-in-ubuntu/">http://batterypowered.wordpress.com/2008/07/04/deploying-a-git-repository-server-in-ubuntu/</a></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"><a href="http://www.urbanpuddle.com/articles/2008/07/11/installing-git-on-a-server-ubuntu-or-debian">http://www.urbanpuddle.com/articles/2008/07/11/installing-git-on-a-server-ubuntu-or-debian</a></span></p>
<p class="MsoNormal" style="margin:0;"><span style="font-size:small;font-family:Times New Roman;"><a href="http://mechanicalrobotfish.com/posts/119-installing-git-server-using-gitosis">http://mechanicalrobotfish.com/posts/119-installing-git-server-using-gitosis</a></span></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/68/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/68/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/68/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=68&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2009/03/23/instalacion-y-configuracion-del-servidor-y-cliente-git-bajo-ssh/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalando mod_wsgi, nginx y cmemcache en Ubuntu Intrepid para Django</title>
		<link>http://sergiohinojosa.wordpress.com/2009/03/21/instalando-mod_wsgi-nginx-y-cmemcache-en-ubuntu-intrepid-para-django/</link>
		<comments>http://sergiohinojosa.wordpress.com/2009/03/21/instalando-mod_wsgi-nginx-y-cmemcache-en-ubuntu-intrepid-para-django/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 18:02:16 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[mod_wsgi]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=65</guid>
		<description><![CDATA[Es un resumen breve para configurar nuestro servidor apache con mod_wsgi, memcache y nginx, el cual lo he recopilado de varios sitios, el cual espero pueda ser de ayuda y tambien pueda permitirnos a abrir debatos en lo que se refiere a las mejores practicas para configurar tus host para aplicaciones django.

Por que mod_wsgi y no mod_apache, puedes encontrar en este resumen mas detalles en los siguientes links:

    * http://code.google.com/p/modwsgi/wiki/PerformanceEstimates
    * http://code.google.com/p/modwsgi/wiki/FrequentlyAskedQuestions
    * http://blog.webfaction.com/django-setup-improvements<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=65&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Es un resumen breve para configurar nuestro servidor apache con mod_wsgi, memcache y nginx, el cual lo he recopilado de varios sitios, el cual espero pueda ser de ayuda y tambien pueda permitirnos a abrir debatos en lo que se refiere a las mejores practicas para configurar tus host para aplicaciones django.</p>
<p>Por que mod_wsgi y no mod_apache, puedes encontrar en este resumen mas detalles en los siguientes links:</p>
<ul>
<li><a href="http://code.google.com/p/modwsgi/wiki/PerformanceEstimates">http://code.google.com/p/modwsgi/wiki/PerformanceEstimates</a></li>
<li><a href="http://code.google.com/p/modwsgi/wiki/FrequentlyAskedQuestions">http://code.google.com/p/modwsgi/wiki/FrequentlyAskedQuestions</a></li>
<li><a href="http://blog.webfaction.com/django-setup-improvements">http://blog.webfaction.com/django-setup-improvements</a></li>
</ul>
<p>Primero instalamos todos los paquetes requeridos:</p>
<p>$ sudo apt-get install subversion gcc curl<br />
$ sudo apt-get install build-essential python-dev python-setuptools<br />
$ sudo apt-get install python-egenix-mxdatetime memcached postfix</p>
<p>Para configurar memcache, necesitamos realizar dos pasos, el primero será inicializar memcache:</p>
<p>$ sudo memcached -u www-data -p 11211 -m 32 -d</p>
<p>(Inicializa memcached bajo el usuario www-data con 32 megabytes de ram)<br />
Ahora necesitaremos construir el cmemcache, para ello obtenemos la siguiente librería:</p>
<p>$ sudo apt-get install libmemcache-dev</p>
<p>Ahora obtenemos el cmemcache y haremos un build del mismo:</p>
<p>$ wget http://gijsbert.org/downloads/cmemcache/cmemcache-0.95.tar.bz2<br />
$ tar -xjvf cmemcache-0.95.tar.bz2<br />
$ cd cmemcache-0.95<br />
$ sudo python setup.py install</p>
<p><strong>Instalación y configuración de Nginx</strong></p>
<p>Primero debemos instalar nginx:</p>
<p>$ sudo apt-get install nginx</p>
<p>Luego inicializar nginx:</p>
<p>$ sudo /etc/init.d/nginx start</p>
<p>Podemos probarlo realizando curl 127.0.0.1 que nos devolverá una pagina html con titulo: Welcome to nginx!!</p>
<p>A continuación editamos la configuración básica de nginx, actualizando los siguientes datos:</p>
<p>$ sudo vim /etc/nginx/nginx.conf</p>
<p>worker_processes 4;  #4 indica que el servidor usa 4 procesadores<br />
tcp_nopush on;       # activar esta línea<br />
keepalive_timeout  2;<br />
gzip  on;<br />
gzip_comp_level 2;<br />
gzip_proxied any;<br />
gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;</p>
<p>Luego debemos añadir un nuevo archivo de configuración llamado proxy.conf que deberá contener lo siguiente:</p>
<p>$ sudo vim /etc/nginx/proxy.conf</p>
<p>proxy_redirect          off;<br />
proxy_set_header        Host            $host;<br />
proxy_set_header        X-Real-IP       $remote_addr;<br />
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;<br />
client_max_body_size    10m;<br />
client_body_buffer_size 128k;<br />
proxy_connect_timeout   90;<br />
proxy_send_timeout      90;<br />
proxy_read_timeout      90;<br />
proxy_buffer_size           4k;<br />
proxy_buffers               4 32k;<br />
proxy_busy_buffers_size     64k;<br />
proxy_temp_file_write_size  64k;</p>
<p>Puesto que nginx usa el Puerto 80 debemos cambiar la configuración de nuestro apache para que use el puerto 8080, para ello modificamos el archivo /etc/apache2/ports.conf y remplazamos el 80 por 8080.</p>
<p>Puesto que nginx no soporta la opción keepAlive debemos desactivar la misma en nuestro apache, para ello editamos el archivo /etc/apache2/apache2.conf y ponemos: KeepAlive off.</p>
<p>Ahora nos toca crear la estructura de directorios para nuestro dominio:</p>
<p>$ mkdir –p /home/&lt;username&gt;/webapps/&lt;midominio&gt;/{public,private,log,backup}</p>
<p>Para habilitar nginx en nuestro dominio debemos añadir nuestro dominio a los sitios habilitados y disponibles en nginx, para ello debemos añadir el siguiente archivo:</p>
<p>$ sudo vim /etc/nginx/sites-available/&lt;midominio&gt;</p>
<p>Cuyo contenido debería tener algo parecido a:</p>
<p>server {<br />
listen 80;<br />
server_name &lt;midominio&gt; www.&lt;midominio&gt;;<br />
access_log /home/&lt;username&gt;/webapps/&lt;midominio&gt;/log/access.log;<br />
error_log /home/&lt;username&gt;/webapps/&lt;midominio&gt;/log/error.log;</p>
<p># main<br />
location / {<br />
proxy_pass              http://127.0.0.1:8080/;<br />
proxy_redirect          off;<br />
proxy_set_header        Host            $host;<br />
proxy_set_header        X-Real_IP       $remote_addr;<br />
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;<br />
client_max_body_size    10m;<br />
client_body_buffer_size 128k;<br />
proxy_connect_timeout   90;<br />
proxy_send_timeout      90;<br />
proxy_read_timeout      90;<br />
proxy_buffer_size       4k;<br />
proxy_buffers           4 32k;<br />
proxy_busy_buffers_size 64k;<br />
proxy_temp_file_write_size 64k;<br />
}<br />
location /media/ {<br />
root    /home/&lt;username&gt;/webapps/&lt;midominio&gt;/public/;<br />
}<br />
}</p>
<p>Luego debemos crear un link del mismo archivo a sites-enabled:</p>
<p>$ sudo ln -s /etc/nginx/sites-available/&lt;midominio&gt; /etc/nginx/sites-enabled/&lt;midominio&gt;<br />
$ sudo /etc/init.d/nginx restart</p>
<p>Para probar nginx, primero añadimos nuestro dominio al archivo de host usando nuestra ip.</p>
<p>$ sudo vim /etc/hosts</p>
<p>Dicho archivo debería verse algo asi:</p>
<p>127.0.0.1      localhost<br />
&lt;mi ip&gt;       www.&lt;midominio&gt;</p>
<p>Luego en un browser ingresar a tu dominio y debera aparecer la pagina de error de nginx.</p>
<p><strong>Instalar y Configurar mod_wsgi, con apache, nginx</strong></p>
<p>Obtenemos mod_wsgi para nuestro servidor apache:</p>
<p>sudo apt-get install libapache2-mod-wsgi apache2-mpm-worker apache2-threaded-dev</p>
<p>En primera instancia debemos deshabilitar los sitios por defecto de apache:</p>
<p>$ sudo a2dissite 000-default</p>
<p>Asignamos los permisos correctamente:</p>
<p>$ sudo usermod -a -G www-data &lt;username&gt;</p>
<p>- Aseguramos que el directorio /home/&lt;username&gt;/webapps sea de &lt;username&gt; y que además este en el grupo www-data:</p>
<p>$ sudo chgrp -R www-data /home/&lt;username&gt;/</p>
<p>Nos aseguramos que todos los archivos nuevos de nuestro directorio webapps, heredaran los permisos:</p>
<p>$ sudo chmod -R 2750 /home/&lt;username&gt;/webapps</p>
<p>Otorgar permisos de escritura al usuario apache en el directorio privado de nuestro dominio:</p>
<p>$ sudo chmod -R 2770 /home/&lt;username&gt;/webapps/&lt;midominio&gt;/private</p>
<p>Obtener tu proyecto django y colocarlo dentro del directorio /home/&lt;username&gt;/webapps/&lt;midominio&gt;/</p>
<p>A continuación creamos el archivo wsgi:</p>
<p>vim /home/&lt;username&gt;/webapps/&lt;midominio&gt;/miproyecto.wsgi</p>
<p>El cual tendrá el siguiente contenido:</p>
<p>import os, sys<br />
sys.stdout = sys.stderr</p>
<p>if &#8216;/home/&lt;username&gt;/webapps/&lt;midominio&gt;&#8217; not in sys.path:<br />
sys.path.append(&#8217;/home/&lt;username&gt;/webapps/&lt;midominio&gt;&#8217;)<br />
if &#8216;/home/&lt;username&gt;/webapps/&lt;midominio&gt;/&lt;miproyecto&gt;&#8217; not in sys.path:<br />
sys.path.append(&#8217;/home/&lt;username&gt;/webapps/&lt;midominio&gt;/&lt;miproyecto&gt;&#8217;)<br />
os.environ['DJANGO_SETTINGS_MODULE'] = &#8216;&lt;miproyecto&gt;.settings&#8217;</p>
<p>import django.core.handlers.wsgi</p>
<p>application = django.core.handlers.wsgi.WSGIHandler()</p>
<p>Por ultimo lo que nos toca es configurar el virtual host en el apache.<br />
$ sudo vim /etc/apache2/sites-available/&lt;midominio&gt;</p>
<p>&lt;VirtualHost *:8080&gt;<br />
ServerName www.&lt;midominio&gt;<br />
ServerAlias &lt;midominio&gt;</p>
<p>&lt;Directory /home/&lt;username&gt;/webapps/&lt;midominio&gt;/&lt;miproyecto&gt;/&gt;<br />
Order deny,allow<br />
Allow from all<br />
&lt;/Directory&gt;</p>
<p>LogLevel warn<br />
ErrorLog   /home/&lt;username&gt;/webapps/&lt;midominio&gt;/log/apache_error.log<br />
CustomLog  /home/&lt;username&gt;/webapps/&lt;midominio&gt;/log/apache_access.log combined</p>
<p>WSGIDaemonProcess &lt;midominio&gt; user=www-data group=www-data threads=25<br />
WSGIProcessGroup &lt;midominio&gt;<br />
WSGIScriptAlias /  /home/&lt;username&gt;/webapps/&lt;midominio&gt;/&lt;miproyecto&gt;/&lt;miproyecto&gt;.wsgi<br />
&lt;/VirtualHost&gt;</p>
<p>Creamos un link del archivo para colocarlo entre los sitios habilitados de apache:</p>
<p>Ln –s /etc/apache2/sites-available/&lt;midominio&gt; /etc/apache2/sites-enable/&lt;midominio&gt;</p>
<p>Por ultimo le decimos a apache que agregue nuestro dominio:</p>
<p>$ sudo a2ensite &lt;midominio&gt;<br />
$ sudo /etc/init.d/apache2 reload</p>
<p>Reiniciamos nuestro apache y listo!! Tenemos nuestro dominio en www.&lt;midominio&gt;</p>
<p>Referencias:<br />
<a title="Ubuntu hardy ngingx virtual hosts" href="http://articles.slicehost.com/2008/5/16/ubuntu-hardy-nginx-virtual-hosts">http://articles.slicehost.com/2008/5/16/ubuntu-hardy-nginx-virtual-hosts<br />
</a><a title="mod wsgi ubuntu intrepid" href="http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/">http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/</a><br />
<a href="http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/">http://lethain.com/entry/2007/jul/17/dreamier-dream-server-nginx/</a><br />
<a title="ubuntu ontrepid almanac" href="http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/">http://lethain.com/entry/2009/feb/13/the-django-and-ubuntu-intrepid-almanac/</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/65/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/65/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/65/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=65&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2009/03/21/instalando-mod_wsgi-nginx-y-cmemcache-en-ubuntu-intrepid-para-django/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>Django &#8211; Managers que sobreescriben el get_query_set</title>
		<link>http://sergiohinojosa.wordpress.com/2009/01/30/django-managers-que-sobreescriben-el-get_query_set/</link>
		<comments>http://sergiohinojosa.wordpress.com/2009/01/30/django-managers-que-sobreescriben-el-get_query_set/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 06:29:00 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[Managers]]></category>
		<category><![CDATA[models]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=62</guid>
		<description><![CDATA[Los managers son una interfaz por encima de los modelos de django, que nos permiten realizar consultas sql relacionadas al modelo al cual están relacionados.

Django nos provee para todos los modelos un manager por defecto (llamado objects), el cual nos lista todos las instancias del modelo recuperadas de la Base de datos.

A continuacion mostrare unos ejemplos de opciones como podemos usar un Manager.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=62&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Los managers son una interfaz por encima de los modelos de django, que nos permiten realizar consultas sql relacionadas al modelo al cual están relacionados.</p>
<p>Django nos provee para todos los modelos un manager por defecto (objects), el cual nos provee una buena cantidad de consultas en forma de funciones (all, filter, exclude, etc)</p>
<p>Los managers los usamos en dos formas, una para sobreescribir el queryset que viene dado por defecto, y el otro para extender funcionalidad o extender nuestra gama de consultas que podemos realizar al modelo.</p>
<p><strong>Sobreescribiendo el queryset</strong></p>
<p>Cuando? si necesitas que ciertas instancias (tuplas de datos en la BD) no sean mostradas, entonces reducimos los resultados mostrados por el queryset que viene por defecto.</p>
<p>A continuacion escribimos un manager propio, en el cual sobreescribimos el queryset  par devolver uno filtrado, que solo me muestre objetos que esten activos.</p>
<p>class CustomManager(models.Manager):<br />
        def get_query_set(self):<br />
                   return super(CustomManager, self).get_query_set().filter(activo=True)</p>
<p>Class Empleado(models.Model):<br />
        nombre_completo = models.CharField(max_lenght=100)<br />
        activo                = models.BooleanField(default=True)</p>
<p>A continuacion existen dos alternativas, la primera es sobreescribir el manager que viene por defecto y es accesido usando el nombre de objects, tambien puedes designarle un otro nombre, pero ya no podras llamar al atributo objects ya que al definir uno propio como se llame, objects ya no es mas disponible a menos que lo definamos explicitamente.</p>
<p>       objects = CustomManager()</p>
<p>En el caso definido arriba, objects solo maneja los objetos empleado activos (activo=True), por lo cual:</p>
<p>     Empleado.objects.all()  </p>
<p>listara todos los empleados activos.</p>
<p>Por otro lado si se desea mantener objects, entonces debemos:</p>
<p>      objects = models.Manager()<br />
      activos = CustomManager()</p>
<p>De esta manera tenemos:</p>
<p>     Empleado.objects.all()   que nos lista todos los empleados<br />
     Empleado.activos.all()   que nos lista todos los empleados activos</p>
<p>El orden como se los define es importante, ya que el default manager, que es invocado por el admin, sera el que primero sea definido.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=62&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2009/01/30/django-managers-que-sobreescriben-el-get_query_set/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>Django Forms &#8211; Sobreescribiendo los valores iniciales de un formulario dinámicamente.</title>
		<link>http://sergiohinojosa.wordpress.com/2009/01/26/django-forms-sobreescribiendo-los-valores-iniciales-de-un-formulario-dinamicamente/</link>
		<comments>http://sergiohinojosa.wordpress.com/2009/01/26/django-forms-sobreescribiendo-los-valores-iniciales-de-un-formulario-dinamicamente/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 03:19:29 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[forms]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=47</guid>
		<description><![CDATA[sobreescribiendo los valores iniciales de un formulario dinámicamente.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=47&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Lo que se quiere:</p>
<p>Mantener el ítem seleccionado dentro de un dropdown list, después de que el usuario realice un submit, se requiere que el campo seleccionado por el usuario se mantenga seleccionado.</p>
<p>Lo que se nos provee por defecto:</p>
<p>Una vez que el cliente presiona submit, los valores de nuestro formulario son restablecidos a los por defecto (campos en blanco y sin selección).</p>
<p>Solución 1:</p>
<p>Guardar el ítem seleccionado en la sesión del usuario (para mayor seguridad), luego; cada vez que se cree el formulario, verificar si existe en la sesión el ítem seleccionado, si existe: entonces pasarlo dentro de los valores iniciales que tomara nuestro formulario.</p>
<p>Ejemplo:</p>
<p>Usaremos un formulario que permita seleccionar un usuario e ingresar/guardar sus horas de trabajo semanales, y que tambien pueda navegar a través de las semanas pasadas y posteriores, para dicha navegación requeriremos que el empleado seleccionado se mantenga seleccionado.</p>
<p>Dentro de nuestro ModelForm sobreescribimos nuestro init:</p>
<p> def __init__( self, request, *args, **kwargs ):<br />
        report = None<br />
        if &#8216;do&#8217; in request.POST:<br />
            start_date = parsedate(request.POST['hidden_start_date'])<br />
        else:<br />
            if request.session.__contains__(&#8217;employee&#8217;):     </p>
<p># En esta sección verifico si esta guardado nuestro empleado seleccionado en la sesión, si es así, obtengo el empleado seleccionado.</p>
<p>                employee=request.session.get(&#8217;employee&#8217;)<br />
                report = TimeReport.objects.extra(where=['employee_id=%s', 'company_id=%s', 'start_week_date=%s'], params=[employee, request.user.client.pk, start_date])</p>
<p># A continuación<strong> sobreescribiremos los valores iniciales de nuestro formulario</strong> y le agregaremos como valor inicial que este seleccionado el empleado que sacamos de la sesión.</p>
<p>                initial = {&#8217;employee&#8217;: employee }<br />
                initial.update(kwargs.get(&#8217;initial&#8217;, dict()))<br />
                kwargs['initial'] = initial<br />
        super( TimeReportForm, self ).__init__( *args, **kwargs ) </p>
<p>Solución 2:</p>
<p>En la vista, verificar si el usuario ha seleccionado un cliente, si es así, <strong>crear el formulario y pasarle los valores iniciales</strong> (el empleado seleccionado):</p>
<p>if &#8216;employee&#8217; in request.POST:<br />
	form = TimeReportForm(request)<br />
	form.initial = {&#8217;employee&#8217;: request.POST['employee'] }</p>
<p>En esta segunda solución tan simple, existiría varias ventajas y solo una desventaja, </p>
<p>Ventajas:</p>
<p>Menos código, ya no es necesario guardar y recuperar una variable de sesión y tampoco sera necesario realizar operaciones extras.</p>
<p>Desventaja:</p>
<p>La selección del empleado no se recordara durante la vida de la sesión del usuario como ocurre en la primera solución.</p>
<p>DRY &#8211; Dont Repeat Yourself, Django esta pensado en facilitarte muchas necesidades muy comunes.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=47&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2009/01/26/django-forms-sobreescribiendo-los-valores-iniciales-de-un-formulario-dinamicamente/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>DRY &#8211; Filtrando elementos en un campo de tipo ModelChoiceField</title>
		<link>http://sergiohinojosa.wordpress.com/2009/01/13/dry-filtrando-elementos-en-un-campo-de-tipo-modelchoicefield/</link>
		<comments>http://sergiohinojosa.wordpress.com/2009/01/13/dry-filtrando-elementos-en-un-campo-de-tipo-modelchoicefield/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 00:02:36 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[forms]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=53</guid>
		<description><![CDATA[Filtrando elementos en un ModelChoiceField<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=53&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Muchas veces descuidamos algunos detalles al leer la documentacion o simplemente no la entendemos, Dont Repeat Your Self es algo que debemos aplicar en todo momento, mas aun cuando usamos frameworks como Django, donde siempre existe una forma mas sencilla de hacer las cosas.</p>
<p>En el ejemplo siguiente, sobreescribo la manera de construir un formulario, especificamente: De lo aplicantes quiero que solo se muestren los que han sido seleccionados como empleados, en el campo employee:</p>
<p>class PayRollForm(forms.ModelForm):<br />
    def __init__( self, *args, **kwargs ):<br />
        super( PayRollForm, self ).__init__( *args, **kwargs )<br />
        self.fields['employee'] = forms.ModelChoiceField(queryset = Applicant.employees.all(), label=_(&#8217;Employee&#8217;))<br />
    class Meta:<br />
        model = PayRoll</p>
<p>En la ultima linea sobreescribo el queryset, pasandole un nuevo queryset pero que solo contiene la lista de empleados.</p>
<p>Es asi fue como resolvi la primera vez que empezaba a jugar con django. Despues de leer detenidamente la documentacion y tratando de no perder detalles, encontre que la solucion a mi problema, era tan simple como:</p>
<p>Model PayRoll(models.Model):<br />
     employee = models.ForeignKey(Applicant, verbose_name =_(&#8217;Employee&#8217;), related_name=&#8217;employee_payroll&#8217;, limit_choices_to = {&#8217;is_employee&#8217;: True})</p>
<p>El atributo limit_choices_to nos permite filtrar los datos a ser mostrados en un campo que recibe llaves extranjeras.</p>
<p>Basto con una linea para resolver mi problema, lo bueno fue que aprendi a sobreescribir mis formularios y a prestar mayor atencion a a los detalles en la documentacion de Django.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=53&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2009/01/13/dry-filtrando-elementos-en-un-campo-de-tipo-modelchoicefield/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>Anuncio del lanzamiento de la Segunda Version del Libro Oficial de Django (para la version de Django 1.0)</title>
		<link>http://sergiohinojosa.wordpress.com/2009/01/09/anuncio-del-lanzamiento-de-la-segunda-version-del-libro-oficial-de-django-para-la-version-de-django-10/</link>
		<comments>http://sergiohinojosa.wordpress.com/2009/01/09/anuncio-del-lanzamiento-de-la-segunda-version-del-libro-oficial-de-django-para-la-version-de-django-10/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 15:37:19 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=49</guid>
		<description><![CDATA[Anuncio del lanzamiento de la Segunda Version del Libro Oficial de Django (Django 1.0)<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=49&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://www.holovaty.com/blog/">Adrian Holovaty</a> nos anuncia  en su blog del lanzamiento de la <a href="http://www.djangobook.com/en/2.0/">Segunda Version del Libro Oficial de Django</a>, el cual ahora no contiene incompatibilidades con la actual version de Django 1.0.</p>
<p>Durante este periodo fue realmente una tragedia para muchos que se iniciaban en Django al no tener a la mano Libros que esten totalmente actualizados de acuerdo al a Version 1.0.</p>
<p>Enlaces de interes:</p>
<p><a href="http://twitter.com/adrianholovaty">Adrian en Twitter</a>, nos mantendra informados de los avances.<br />
Los <a href="http://www.djangobook.com/en/2.0/">borradores del libro</a> que son gratis y estan en linea.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=49&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2009/01/09/anuncio-del-lanzamiento-de-la-segunda-version-del-libro-oficial-de-django-para-la-version-de-django-10/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>El tour de Corey &#8220;Tour de Programacion en parejas&#8221;</title>
		<link>http://sergiohinojosa.wordpress.com/2008/12/23/el-tour-de-corey-tour-de-programacion-en-parejas/</link>
		<comments>http://sergiohinojosa.wordpress.com/2008/12/23/el-tour-de-corey-tour-de-programacion-en-parejas/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 16:38:07 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[desarrollo agil]]></category>
		<category><![CDATA[programacion por parejas]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=43</guid>
		<description><![CDATA[Realmente fantastico, Corey Haines lleva adelante su tour denominado &#8220;Pair-Programming Tour 2008&#8243;, lleno de nuevas experiencias y donde hace prevalecer que la experiencia de trabajar en parejas te lleva a aprender y compartir mucho mas que del modo simple y solitario. 
Quien es Core Haynes?
Corney Haines, paso el ultimo año casi exclusivamente desarrallonado con Ruby [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=43&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Realmente fantastico, <strong>Corey Haines lleva adelante su tour denominado &#8220;Pair-Programming Tour 2008&#8243;</strong>, lleno de nuevas experiencias y donde hace prevalecer que la experiencia de trabajar en parejas te lleva a aprender y compartir mucho mas que del modo simple y solitario. </p>
<p><strong>Quien es Core Haynes?</strong></p>
<p>Corney Haines, paso el ultimo año casi exclusivamente desarrallonado con <strong>Ruby on Rails</strong>, antes de ello paso 5 años desarrollando con C#. Y durante los ultimos 4 años ha estado dirigiendo e implementando tecnicas de desarrollo agil, como la <strong>programacion en parejas</strong>,<strong> BDD</strong> y <strong>TDD</strong>.</p>
<p>Actualmente se encuentra sin empleo, pero con algunos ahorros en el bolsillo y con la ayuda de sponsors, ahora lleva adelante este evento, que tambien es parte de lo que pretendia hacer como uno de sus siguientes pasos en su carrera profesional. Obviamente cuando acabe el tour quedara sin dinero practicamente y necesitara conseguir un empleo.</p>
<p>Mas datos del evento:</p>
<p>Core Haines ha creado un blog exclusivo para el evento, <a href="http://programmingtour.blogspot.com/"><strong>Corey Haines&#8217; Pair Programming Tour</strong></a>. </p>
<p>A continuacion una breve lista de las entrevistas con los personajes que tuvo la oportunidad de trabajar en pareja:</p>
<ul>
<li><a href="http://vimeo.com/2450775">Entrevista</a> con <a href="http://twitter.com/dchelimsky">David Chelimsky&#8217;s.</a>  quien trabaja manteniendo <a href="http://github.com/dchelimsky/rspec/tree/master">Rspec</a></li>
<li><a href="http://vimeo.com/2450782">Entrevista</a> con <a href="http://twitter.com/redsquirrel">Dave Hoover</a> from <a href="http://www.obtiva.com/">Obtiva</a></li>
<li>Entrevista con <a href="http://www.twitter.com/marick">Brian Marick</a> quien trabaj en el libro de <a href="http://pragprog.com/titles/bmrc/rubycocoa">Ruby Cocoa book</a>, con quien Corey tuvo la oportunidad de realizar algunos ejercicios de TDD que estaran incluidos en el libro, existen dos charlas con muy buen contenido <a href="http://vimeo.com/2504828">Parte I</a> y <a href="http://vimeo.com/2526611">Parte II</a>. </li>
<li><a href="http://vimeo.com/2527267">Entrevista</a> con <a href="http://8thlight.com/main/bios/eric_meyer">Eric Meyer</a>, con quien trabajo en <a href="http://github.com/paulwpagel/fresnel/tree/master">Fresnel</a> la interfaz de &#8220;Lighthouse bug-tracking system&#8221;.</li>
<li><a href="http://vimeo.com/2527239">Entrevista</a> con <a href="http://www.twitter.com/slagyr">Micah Martin</a> el fundador de <a href="http://www.8thlight.com/main">8th Light</a> en Chicago, 8th Light actualmente se encuentra desarrollando Limelight, el cual es un framework para el desarrollo de interfaces grafica de usuarios GUI.</li>
<li><a href="http://vimeo.com/2574917">Entrevista</a> con <a href="http://jonathanbranam.net/">Jonathan Branam</a> , autor de Red Sun, una Maquina Virtual en Ruby para flash. Corney tuvo la oportunidad de conocer como Jonathan porta directamente el codigo fuente del MRI a ActionScript.</li>
<li><a href="http://vimeo.com/2575440">Entrevista</a> con <a href="http://twitter.com/objo">Joe O&#8217;Brien</a> de <a href="http://theedgecase.com/home">Edgecase</a>, en esta ocasion Courney tuvo la oportunidad de trabajar en pares con algunos chicos de Edgecase.</li>
<li><a href="http://vimeo.com/2575622">Entrevista</a> con John Distad de Edgecase</li>
<li><a href="http://vimeo.com/2583494">Entrevista</a> con <a href="http://twitter.com/trogdoro">Craig Muth</a>, quien desarrollo el framework llamado <a href="http://github.com/trogdoro/xiki/tree/master">Xiki</a>.</li>
<li><a href="http://www.youtube.com/watch?v=buAYHonF968">Entrevista</a> con <a href="http://en.wikipedia.org/wiki/Jean_Bartik">Jean Jennings Bartik</a> quien fue una de las primeras personas en programar <a href="http://www.seas.upenn.edu/%7Emuseum/">ENIAC</a>. </li>
</ul>
<p>Fue todo un tour el que lleve adelante en el blog de Corey y fueron muchas las horas que me tomo para ver cada una de las entrevistas, pero sin duda estas experiencias son las que nos enriquecen y las que dificilmente encontraremos en libros, blogs, etc.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=43&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2008/12/23/el-tour-de-corey-tour-de-programacion-en-parejas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>Hoy es el ultimo dia de Pownce</title>
		<link>http://sergiohinojosa.wordpress.com/2008/12/15/hoy-es-el-ultimo-dia-de-pownce/</link>
		<comments>http://sergiohinojosa.wordpress.com/2008/12/15/hoy-es-el-ultimo-dia-de-pownce/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 13:38:57 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[pownce]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=37</guid>
		<description><![CDATA[Goodbye Pownce, Hello Six Apart,  es asi como titula el post que nos recuerda que hoy es el ultimo dia de esta gran aplicacion echa en django, y tal cual lo refleja su creadora leah, ahora junto a mike, seran parte del equipo de ingenieros de Six Apart. Esperemos que pronto tengan nuevas noticias [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=37&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://blog.pownce.com/2008/12/01/goodbye-pownce-hello-six-apart/">Goodbye Pownce, Hello Six Apart</a>,  es asi como titula el post que nos recuerda que hoy es el ultimo dia de esta gran aplicacion echa en django, y tal cual lo refleja su creadora leah, ahora junto a mike, seran parte del equipo de ingenieros de Six Apart. Esperemos que pronto tengan nuevas noticias y puedan traernos sorpresas para la gran comunidad de django.</p>
<p>Si quieres seguirlos en esta nueva proeza, podemos encontrar sus blogs en vox:<br />
<a href="http://leahculver.vox.com">leahculver.vox.com</a>, Mike en <a href="http://mjmalone.vox.com">mjmalone.vox.com</a>, y Ariel en <a href="http://arielwaldman.vox.com">arielwaldman.vox.com</a>. </p>
<p>Anuncio oficial de Six Apart, dando la bienvenida al equipo de pownce:<br />
<a href="http://www.sixapart.com/blog/2008/12/welcome-pownce-team.html">http://www.sixapart.com/blog/2008/12/welcome-pownce-team.html</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=37&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2008/12/15/hoy-es-el-ultimo-dia-de-pownce/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>Creando modelos y registrandolos en la interfaz de administracion en Django</title>
		<link>http://sergiohinojosa.wordpress.com/2008/12/14/creando-modelos-y-registrandolos-en-la-interfaz-de-administracion-en-django/</link>
		<comments>http://sergiohinojosa.wordpress.com/2008/12/14/creando-modelos-y-registrandolos-en-la-interfaz-de-administracion-en-django/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 23:38:39 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[models]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=32</guid>
		<description><![CDATA[Django viene con muchas aplicaciones reutilizables directamente añadidas al core o a la version de distribucion, entre una de ellas, de echo la mas utilizada, es la de administracion "django.contrib.admin". <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=32&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>Django</strong> viene con muchas aplicaciones reutilizables directamente añadidas al core o a la version de distribucion, entre una de ellas, de echo la mas utilizada, es la de administracion &#8220;<strong>django.contrib.admin</strong>&#8220;.</p>
<p>El <strong>admin de django</strong> te permite tener una interfaz administrativa para tus modelos, el unico requisito es que las registres, a continuacion recrearemos una pequeña aplicacion llamada todo manager.</p>
<p>Para habilitar el admin, debemos añadirlo a nuestro settings.py</p>
<p>INSTALLED_APPS = (<br />
&#8216;django.contrib.auth&#8217;,<br />
&#8216;django.contrib.contenttypes&#8217;,<br />
&#8216;django.contrib.sessions&#8217;,<br />
&#8216;django.contrib.sites&#8217;,<br />
&#8216;django.contrib.admin&#8217;,<br />
&#8216;todomanager&#8217;, # nuestra aplicacion que vamos a crear mas adelante<br />
)</p>
<p>Sobre el proyecto  ahora crearemos una nueva aplicacion que se llame todo:</p>
<p>#./admin.py start-app todo</p>
<p>Django nos crea los archivos models.py y views.py por defecto en el nuevo directorio de nuestra aplicacion que lleva el mismo nombre que el que le dimos.</p>
<p>Abrimos el models.py y a continuacion definimos los modelos de nuestra aplicacion:</p>
<p>(archivo: models.py)</p>
<p>from django.db import models<br />
from django.utils.translation import ugettext_lazy as _</p>
<p># ugettext_lazy es parte de la aplicacion de internacionalizacion de django y viene junto al core de django, el objetivo es que podamos mostrar tanto el contenido como las funcionalidades en varios idiomas, para añadir esta caracteristica usaremos textos traducibles de la forma _(&#8217;texto a ser traducido&#8217;). </p>
<p>from django.contrib.auth.models import User <br />
#django nos provee otra aplicacion que maneja la autenticacion, en el todo el modelo User nos servira para representar al dueño.</p>
<p>from datetime import datetime</p>
<p>class Todo(models.Model):<br />
HIGH = 3<br />
MEDIUM = 2<br />
LOW = 1<br />
CHOICES_PRIORITY =(<br />
(HIGH, _(&#8217;High&#8217;)),<br />
(MEDIUM, _(&#8217;Medium&#8217;)),<br />
(LOW, _(&#8217;Low&#8217;))<br />
)<br />
COMPLETED = 1<br />
TBD =2<br />
CHOICES_STATUS=(<br />
(COMPLETED, _(&#8217;Completed&#8217;)),<br />
(TBD, _(&#8217;To be Done&#8217;))<br />
)</p>
<p>A continuacion escribimos los campos que tendra nuestro modelo, django nos provee unos tipos basicos de fields, entre ellos tenemos el foreignkey que nos permitira relacionar nuestra entidad debil con una fuerte. En nuestro caso un User sera dueño de uno o mas todos.</p>
<p>owner = models.ForeignKey(User, related_name=&#8217;owner_group&#8217;, verbose_name=_(&#8217;owner&#8217;))</p>
<p>#  el atributo related se usa para indentificar desde el Usr al conjunto de &#8220;todos&#8221; que le pertenecen, mientras que el verbose name es la cadena que se usara para representar a ese campo.</p>
<p>name = models.CharField(_(&#8217;name&#8217;), max_length=32)</p>
<p># el tipo Charfield tiene como atributo obligatorio definir un maximo de letras de contenido, que sera un entero mayor a 1</p>
<p>created_date=models.DateTimeField(default=datetime.now)</p>
<p># el atributo default lo usamos para definir valores por defecto, el valor por defecto sera la fecha de hoy, now la pasamos como callbak (se ejecutara la funcion now cada vez que se la requiera)</p>
<p>priority = models.IntegerField(_(&#8217;priority&#8217;), choices=CHOICES_PRIORITY)<br />
status = models.IntegerField(_(&#8217;status&#8217;), choices=CHOICES_STATUS)</p>
<p># El atributo choices nos permite pasarle una lista de valores validos para dicho campo</p>
<p>description = models.TextField(_(&#8217;description&#8217;))<br />
due_date = models.DateField(_(&#8217;due_date&#8217;),blank=True,null=True,)<br />
completed_date = models.DateField(_(&#8217;completed_date&#8217;),blank=True,null=True)</p>
<p>class Meta:<br />
ordering = (&#8217;created_date&#8217;,'priority&#8217;)<br />
verbose_name = _(&#8217;Todo&#8217;)<br />
verbose_name_plural = _(&#8217;Todo List&#8217;)<br />
unique_together = (&#8221;owner&#8221;, &#8220;name&#8221;)<br />
get_latest_by = &#8216;created_date&#8217;<br />
order_with_respect_to=&#8217;owner&#8217;</p>
<p># Estas son algunas de las opciones que tenemos para definir los metadatos de nuestro modelo, estos se definen definiendo la clase interna Meta. (En otro post veremos con mas detalle las difrentes opciones, aunque muchas de elas son faciles de predecir)</p>
<p>def __unicode__(self):<br />
return self.name</p>
<p># el unicode django automaticamente nos proveera el metodo __str__() que llamara a nuestro metodo _unicode__ y entonces convertira el resultado del mismo a una codificaciion de cadena de objetos UTF-8 correctamente. Para versiones mayores de django 1.0 es aconsejable usar unicode y no asi str.</p>
<p>Para que nuestro modelo pueda ser tomado en cuenta por el admin de django debemos registrarlo, para ello dentro de nuestra aplicacion creamos el archivo admin.py y lo minimo requerido para registrarlo seria tener lo siguiente:</p>
<p>(archivo: admin.py)</p>
<p>from django.contrib import admin</p>
<p>from models import Todo</p>
<p>admin.site.register(Todo)  # aca registramos nuestro modelo con el admin de django</p>
<p>Ahora nos toca generar la base de datos:</p>
<p>./admin.py syncdb</p>
<p>Simepre la primera vez que sincronizamos nos pedira registremos las credenciales de nuestro usuario administrador (dile yes <img src='http://s.wordpress.com/wp-includes/images/smilies/face-raspberry.png' alt=':P' class='wp-smiley' /> ).</p>
<p>Para habilitar completamente las interfaz administrativa debemos editar el urls.py de nuestro proyecto y tener algo como sigue:</p>
<p>from django.conf.urls.defaults import *<br />
from django.contrib import admin</p>
<p>admin.autodiscover()</p>
<p>urlpatterns = patterns(&#8221;,<br />
(r&#8217;^admin/(.*)&#8217;, admin.site.root),<br />
)</p>
<p>Ahora podemos hacer correr nuestro proyecto con:</p>
<p>#./manage.py runserver 0.0.0.0:8000</p>
<p>Ahora nos vamos al browser y colocamos:</p>
<p><a href="http://127.0.0.1:8000/admin">http://127.0.0.1:8000/admin</a></p>
<p>Usando las credenciales que registramos al realizar el sync de bd ingresamos al sitio de administracion de djano.</p>
<p>Sin duda esta caracteristica de django es la que atrae a muchos, ya que en la mayoria de las aplicaciones que realizamos siempre necesitamos tener esta interfaz administrativa, aunque existen muchas cosas que se estan mejorando aun, no cabe duda que el admin de django nos ahorrara mucho trabajo.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/32/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=32&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2008/12/14/creando-modelos-y-registrandolos-en-la-interfaz-de-administracion-en-django/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
		<item>
		<title>Scaffolding en Grails</title>
		<link>http://sergiohinojosa.wordpress.com/2008/12/12/scaffolding-en-grails/</link>
		<comments>http://sergiohinojosa.wordpress.com/2008/12/12/scaffolding-en-grails/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 09:12:02 +0000</pubDate>
		<dc:creator>sergio hinojosa avila</dc:creator>
				<category><![CDATA[Principal]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[scaffolding]]></category>

		<guid isPermaLink="false">http://sergiohinojosa.wordpress.com/?p=27</guid>
		<description><![CDATA[Grails,
Es un framework que hereda y mejora muchas cosas de rails, esta basado en el lenguaje groovy (un lenguaje de tipeado dinamico), su estructura esta basada en las clases del dominio, las vistas y los controladores.
En esta oportunidad veremos una de las propiedades basicas que nos ofrece Grails.
Scaffolding en Grails
Que es?
Se llama al proceso de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=27&subd=sergiohinojosa&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Grails,</p>
<p>Es un framework que hereda y mejora muchas cosas de rails, esta basado en el lenguaje groovy (un lenguaje de tipeado dinamico), su estructura esta basada en las clases del dominio, las vistas y los controladores.</p>
<p>En esta oportunidad veremos una de las propiedades basicas que nos ofrece Grails.</p>
<p>Scaffolding en Grails</p>
<p>Que es?<br />
Se llama al proceso de auto generar toda la aplicacion para una clase de nuestro dominio, el scaffold nos:</p>
<ul>
<li> Crea las vistas necesarias (Para esto grails realiza una introspeccion a nuestros modelos mediante la cual determina la interfaz apropiada a ser renderizada para dicho modelo, esto lo hace en tiempo de ejecucion)</li>
<li> Crea las acciones del controlador para realizar operaciones de Crear/leer/actualizar/eliminar &#8220;CRUD&#8221; en ingles</li>
<li>Y tambien puede crear el esquema de base de datos y las relaciones para nuestras clases de dominio</li>
</ul>
<p>Empezemos con un ejemplo basico:</p>
<p>Creamos nuestra clase de dominio:</p>
<p>grails create-domain-class</p>
<p>Y le damos el nombre de Client</p>
<p>Bajo el directorio de domain clases encontraremos nuestro Client.groovy lo editamos como sigue:</p>
<p>class Client {<br />
String first_name<br />
String last_name<br />
String email<br />
}</p>
<p>En Grails para habilitar el scaffolding de una clase de dominio, editamos la clase controlador de la clase del dominio:</p>
<p>#grails create-controller  &#8211;le damos el nombre de client</p>
<p>class ClientController{<br />
def scaffold = Client<br />
}</p>
<p>Ahora solo necesitaremos hacer correr nuestra aplicacion, grails run-app<br />
y todo lo necesario sera auto generado en tiempo de ejecucion</p>
<p>Para verlo debemos ir a nuestro browser http://localhost:8080/miproyecto/ y tendremos el CRUD listo para usarlo.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/sergiohinojosa.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/sergiohinojosa.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/sergiohinojosa.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/sergiohinojosa.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/sergiohinojosa.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/sergiohinojosa.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/sergiohinojosa.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/sergiohinojosa.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/sergiohinojosa.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/sergiohinojosa.wordpress.com/27/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=sergiohinojosa.wordpress.com&blog=623039&post=27&subd=sergiohinojosa&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://sergiohinojosa.wordpress.com/2008/12/12/scaffolding-en-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/69c85938dc97ac2008ac155feb8bec0f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sergiohinojosa</media:title>
		</media:content>
	</item>
	</channel>
</rss>