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

<channel>
	<title>Stiod Blog &#187; Python</title>
	<atom:link href="http://blog.stiod.com/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.stiod.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 22 Feb 2010 14:20:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Python logging em Django</title>
		<link>http://blog.stiod.com/2009/11/03/python-logging-em-django/</link>
		<comments>http://blog.stiod.com/2009/11/03/python-logging-em-django/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 12:30:05 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[logging]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=661</guid>
		<description><![CDATA[Que o módulo logging e o framework Django são excelentes ferramentas pra qualquer trabalho todos sabem, mas como fazer para integrar os dois?
Eu sempre achei um saco o fato do Django não ter um módulo builtin/contrib que permitisse que ao fazer um simples logging.error('PAN!') a mensagem, a data, o nível, the universe and everything, fossem [...]]]></description>
			<content:encoded><![CDATA[<p>Que o módulo <a href="http://docs.python.org/library/logging.html" targe="_blank">logging</a> e o framework <a href="http://djangoproject.com">Django</a> são excelentes ferramentas pra qualquer trabalho todos sabem, mas como fazer para integrar os dois?</p>
<p>Eu sempre achei um saco o fato do Django não ter um módulo builtin/contrib que permitisse que ao fazer um simples <strong>logging.error('PAN!')</strong> a mensagem, a data, o nível, the universe and everything, fossem gravados no banco de dados. Pra resolver esse simples problema, nada como uma simples solução.</p>
<p><center><img src="http://blog.stiod.com/wp-content/uploads/2009/10/hiccup.gif" alt="Solução" title="Solução" width="250" height="281" class="aligncenter size-full wp-image-663" /><br/><small>A Solução</small></center></p>
<p>Para começar crie um aplicativo em sua aplicação chamado "log", nunca crie a aplicação com nome de "logging", a não ser que você queira problemas com imports não funcionando:</p>
<pre class="bash">python manage.py startapp log</pre>
<p>Em seguida crie o seguinte model:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># -*- encoding: utf-8 -*-</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Log<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
    level = models.<span style="color: black;">IntegerField</span><span style="color: black;">&#40;</span>db_index=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    <span style="color: #008000;">file</span> = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">512</span>, db_index=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    lineno = models.<span style="color: black;">IntegerField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    date = models.<span style="color: black;">DateTimeField</span><span style="color: black;">&#40;</span>db_index=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
    message = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_level_name<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">logging</span>.<span style="color: black;">getLevelName</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">level</span><span style="color: black;">&#41;</span>
    levelName = <span style="color: #008000;">property</span><span style="color: black;">&#40;</span>fget=_get_level_name<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_message_summary<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">message</span><span style="color: black;">&#41;</span> &gt; <span style="color: #ff4500;">100</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'%s...'</span>%<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">message</span><span style="color: black;">&#91;</span>:<span style="color: #ff4500;">100</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">message</span>
    messageSummary = <span style="color: #008000;">property</span><span style="color: black;">&#40;</span>fget=_get_message_summary<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _get_file_summary<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #008000;">file</span><span style="color: black;">&#41;</span> &gt; <span style="color: #ff4500;">30</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'...%s'</span>%<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: #008000;">file</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">-30</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: #008000;">file</span>
    fileSummary = <span style="color: #008000;">property</span><span style="color: black;">&#40;</span>fget=_get_file_summary<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> LogAdmin<span style="color: black;">&#40;</span>admin.<span style="color: black;">ModelAdmin</span><span style="color: black;">&#41;</span>:
   date_hierarchy = <span style="color: #483d8b;">'date'</span>
   list_display = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'level'</span>, <span style="color: #483d8b;">'levelName'</span>, <span style="color: #483d8b;">'date'</span>,<span style="color: #483d8b;">'messageSummary'</span>, <span style="color: #483d8b;">'fileSummary'</span>, <span style="color: #483d8b;">'lineno'</span><span style="color: black;">&#41;</span>
   list_filter = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'level'</span>,<span style="color: black;">&#41;</span>
   search_fields = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'message'</span>, <span style="color: #483d8b;">'file'</span><span style="color: black;">&#41;</span>
&nbsp;
admin.<span style="color: #dc143c;">site</span>.<span style="color: black;">register</span><span style="color: black;">&#40;</span>Log, LogAdmin<span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Em seguida crie o arquivo "handler.py" dentro do aplicativo "log" com o seguinte conteúdo:</p>
<pre class="python">&nbsp;
<span style="color: #808080; font-style: italic;"># -*- encoding: utf-8 -*-</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
<span style="color: #ff7700;font-weight:bold;">from</span> SEUPROJETO.<span style="color: black;">log</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Log
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> DjangoHandler<span style="color: black;">&#40;</span><span style="color: #dc143c;">logging</span>.<span style="color: black;">Handler</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'Executa a manipulação do log e insere no banco de dados'</span><span style="color: #483d8b;">''</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> emit<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, record<span style="color: black;">&#41;</span>:
        log = Log<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        log.<span style="color: black;">level</span> = record.<span style="color: black;">levelno</span>
        log.<span style="color: #008000;">file</span> = record.<span style="color: black;">pathname</span>
        log.<span style="color: black;">lineno</span> = record.<span style="color: black;">lineno</span>
        log.<span style="color: black;">message</span> = record.<span style="color: black;">msg</span>
        <span style="color: #808080; font-style: italic;"># TODO: Utiizar o record.created</span>
        log.<span style="color: black;">date</span> = <span style="color: #dc143c;">datetime</span>.<span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        log.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Com isso você já tem tudo que precisa pra logar direto pro banco de dados, só falta uma coisa: Configurar o projeto para o logging usar nosso handler.</p>
<p>Pra fazer isso, edite o arquivo __init__.py (e você achando que esse arquivo era inutil <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  e adicione o seguinte conteúdo ao arquivo:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">logging</span>
<span style="color: #ff7700;font-weight:bold;">from</span> SEUPROJETO.<span style="color: black;">log</span>.<span style="color: black;">handler</span> <span style="color: #ff7700;font-weight:bold;">import</span> DjangoHandler
django_handler = DjangoHandler<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">logging</span>.<span style="color: black;">root</span>.<span style="color: black;">addHandler</span><span style="color: black;">&#40;</span>django_handler<span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>E pronto, é só correr pro abraço, todo e qualquer log que você executar vai ser armazenado no banco de dados.</p>
<p><center><img src="http://blog.stiod.com/wp-content/uploads/2009/10/8.jpg" alt="Yes! Tudo que faltava pra terminar meu projeto!" title="É nois!" width="380" height="315" class="size-full wp-image-671" /><br/><small>Yes! Tudo que faltava pra terminar meu projeto!</small></center></p>
<p>... e antes que você venha me reclamar que a p0rr@ do log não ta aparecendo em lugar nenhum, verifique se você está usando o <strong>logging.debug</strong> com a configuração padrão do módulo logging (que só exibe mensagens de nível mais alto).</p>
<p>Em tempo: Eu sei que é extremamente simples criar um módulo/pacote com tudo isso, mas não seria tão didatico simplesmente falar "baixe aqui, copie ali e import lá".</p>
<p>Se você tiver interesse, sugira a implantação deste módulo ao <strong>django.contrib</strong> <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/11/03/python-logging-em-django/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>API do Twitter para Python</title>
		<link>http://blog.stiod.com/2009/10/14/api-do-twitter-para-python/</link>
		<comments>http://blog.stiod.com/2009/10/14/api-do-twitter-para-python/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 04:50:52 +0000</pubDate>
		<dc:creator>Yoshio Iwamoto</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=528</guid>
		<description><![CDATA[Hoje vou mostrar como fazer uso da API do Twitter para Python, a Python Twitter API. Sua utilização é bem simples e podemos criar vários aplicativos ou scripts para automatizar algumas tarefas no microblog, como o script que fiz no meu último post.
Instalação no Linux
Baixe o código fonte da última versão aqui.
Descompacte com o comando:
$ [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje vou mostrar como fazer uso da API do Twitter para Python, a <a href="http://code.google.com/p/python-twitter/">Python Twitter API</a>. Sua utilização é bem simples e podemos criar vários aplicativos ou scripts para automatizar algumas tarefas no microblog, como o script que fiz no meu <a href="http://blog.stiod.com/2009/10/07/seja-seguido-no-twitter-sem-incomodar-as-pessoas/">último post</a>.<br/></p>
<p><strong>Instalação no Linux</strong><br />
Baixe o código fonte da última versão <a href="http://code.google.com/p/python-twitter/downloads/list">aqui</a>.</p>
<p>Descompacte com o comando:<br />
<code>$ tar -zxvf python-twitter-XXX.tar.gz</code></p>
<p>Após descompactar entre no diretório criado e execute o seguinte comando como usuário root:<br />
<code># python setup.py install</code><br />
<br/><br />
<strong>Utilização</strong><br />
Para utilizar a API importe o módulo <a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html">twitter</a>:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> twitter
...</pre>
<p>As principais classes que você deve conhecer são:<br />
<a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#Api">twitter.Api</a><br />
<a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#User">twitter.User</a><br />
<a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#Status">twitter.Status</a><br />
<a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#DirectMessage">twitter.DirectMessage</a></p>
<p>Para iniciar, crie uma instancia da classe <a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#Api">twitter.Api</a>:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> twitter
api = twitter.<span style="color: black;">Api</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre>
<p>Com este objeto você pode utilizar os métodos da API que não necessitam de autenticação do usuário. Um Exemplo é o método <a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#Api-GetPublicTimeline">GetPublicTimeline</a>, que sem parâmetros retorna as últimas 20 mensagens de status dos usuários.</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> twitter
api = twitter.<span style="color: black;">Api</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
status_list = api.<span style="color: black;">GetPublicTimeline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> status <span style="color: #ff7700;font-weight:bold;">in</span> status_list:
    <span style="color: #ff7700;font-weight:bold;">print</span> status.<span style="color: #dc143c;">user</span>.<span style="color: black;">name</span></pre>
<p>No exemplo anterior o status é um objeto da classe <a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#Status">twitter.Status</a>. A classe twitter.Status possui um atributo user que é um objeto da classe <a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#User">twitter.User</a>.</p>
<p>Para realizar a autenticação de um usuário, instancie a classe <a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#Api">twitter.Api</a>, porém passando o usuário e a senha como parâmetros:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> twitter
api = twitter.<span style="color: black;">Api</span><span style="color: black;">&#40;</span>username=<span style="color: #483d8b;">'joao'</span>, password=<span style="color: #483d8b;">'abc123'</span><span style="color: black;">&#41;</span></pre>
<p>Para enviar uma mensagem utilize o método <a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#Api-PostUpdate">PostUpdate</a>:</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># -*- encoding: utf-8 -*-</span>
<span style="color: #ff7700;font-weight:bold;">import</span> twitter
api = twitter.<span style="color: black;">Api</span><span style="color: black;">&#40;</span>username=<span style="color: #483d8b;">'joao'</span>, password=<span style="color: #483d8b;">'abc123'</span><span style="color: black;">&#41;</span>
status = api.<span style="color: black;">PostUpdate</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: #483d8b;">'Yohohoho! Enviei uma mensagem! Mas cuidado
com os limite de 140 caracteres.'</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span></pre>
<p>Repare que ele retorna o status da mensagem enviada.<br/></p>
<p><strong>Várias mensagens contínuas</strong><br />
Um método interessante da API é o <a href="http://static.unto.net/python-twitter/0.6/doc/twitter.html#Api-PostUpdates">PostUpdates</a>, que permite que seja enviada uma mensagem com mais de 140 caracteres. A mensagem na verdade é enviada como se fosse várias mensagens com no máximo 140 caracteres.</p>
<p>Você também pode indicar uma string de continuação no segundo parâmetro, esta string é colocada no final das mensagens para indicar a continuação.</p>
<pre class="python"><span style="color: #808080; font-style: italic;"># -*- encoding: utf-8 -*-</span>
<span style="color: #ff7700;font-weight:bold;">import</span> twitter
api = twitter.<span style="color: black;">Api</span><span style="color: black;">&#40;</span>username=<span style="color: #483d8b;">'joao'</span>, password=<span style="color: #483d8b;">'abc123'</span><span style="color: black;">&#41;</span>
status = api.<span style="color: black;">PostUpdates</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: #483d8b;">'Yohohoho! Enviei uma mensagem bem grande!
Agora você não precisa se preocupar com o tamanho da mensagem pois
este método irá dividi-la para você em várias mensagens, você também
pode utilizar uma string de continuação ao lado.'</span><span style="color: #483d8b;">''</span>, <span style="color: #483d8b;">'…'</span><span style="color: black;">&#41;</span></pre>
<p><em><strong>Obs: Segundo a documentação da API, o Twitter remove as reticências ("...") das strings das mensagem, por isso utilize o caractere UNICODE \u2026 ("…"). Também não ultrapasse o limite dos 150 requests permitidos por hora pelo Twitter.</strong></em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/10/14/api-do-twitter-para-python/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Seja seguido no Twitter sem incomodar as pessoas</title>
		<link>http://blog.stiod.com/2009/10/07/seja-seguido-no-twitter-sem-incomodar-as-pessoas/</link>
		<comments>http://blog.stiod.com/2009/10/07/seja-seguido-no-twitter-sem-incomodar-as-pessoas/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 16:36:57 +0000</pubDate>
		<dc:creator>Yoshio Iwamoto</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=468</guid>
		<description><![CDATA[Em dois dias meu usuário doTwitter pulou de 20 seguidores para quase 200. Não é enganação, é até um problema do Twitter, ou não, já que não é bem um bug.
Se você procurar por aí na internet irá encontrar vários métodos de como conseguir mais seguidores no Twitter, mas todos dizem praticamente a mesma coisa: [...]]]></description>
			<content:encoded><![CDATA[<p>Em dois dias <a href="http://twitter.com/yoshioiwamoto">meu usuário doTwitter</a> pulou de 20 seguidores para quase 200. Não é enganação, é até um problema do <a href="http://twitter.com/">Twitter</a>, ou não, já que não é bem um bug.</p>
<p>Se você procurar por aí na internet irá encontrar vários métodos de como conseguir mais seguidores no Twitter, mas todos dizem praticamente a mesma coisa: seguir os outros e esperar que eles te sigam também.</p>
<p>De fato isto é verdade e funciona se você seguir muitos (muitos) usuários, mas minha idéia foi um pouco diferente. Vou contar uma historinha.</p>
<p>Estava vendo na <a href="http://www.folha.uol.com.br/">Folha Online</a> uma <a href="http://www1.folha.uol.com.br/folha/informatica/ult124u631036.shtml">matéria sobre as principais frases ditas pelos famosos no Twitter</a> e umas das frases era do ilustre William Bonner (que aliás sou grande fã). Eu já esqueci qual foi a frase dele, mas o importante é que graças a matéria eu descobri que ele tinha Twitter (<a href="http://twitter.com/realwbonner">@realwbonner</a>), então passei a segui-lo.</p>
<p>Por curiosidade fui ver quantos seguidores ele tinha e ao entrar na página de seguidores dele meu usuário do Twitter estava sendo exibido no topo dos resultados.</p>
<p>Naquele dia, acho que ele tinha mais ou menos 40 mil seguidores. A exibição do meu usuário na página de seguidores dele acabou me rendendo 3 novos seguidores. Uma idéia estava surgindo...</p>
<p>Entrei novamente na página de seguidores dele, mas meu usuário não estava mais no topo. A causa era que o <a href="http://twitter.com/realwbonner">@realwbonner</a> estava adquirindo mais seguidores fazendo os antigos caírem nos resultados. Uma idéia se completou!</p>
<p>Eureka! <strong>Vou criar um script para dar Unfollows e Follows nos Twitters com mais usuários do Brasil</strong>. Em tempos em tempos eu executo o script e ele faz o meu usuário ficar no topo dos resultados dos seguidores deles.</p>
<p>Se pegarmos o <a href="http://twitter.com/hucklucianO">@hucklucianO</a> que possui mais de 1 milhão de seguidores e deixar o seu usuário em exibição no topo da página de seguidores dele, isto irá fazer as pessoas prestarem mais atenção em você.</p>
<p><strong>Vamos ao script</strong></p>
<p>O script foi desenvolvido em <a href="http://www.python.org/">Python (v2.6)</a> e utiliza a <a href="http://code.google.com/p/python-twitter/">Python Twitter API (v0.6)</a>.</p>
<p>Baixe o código fonte da <a href="http://code.google.com/p/python-twitter/">Python Twitter API</a> em:<br />
<a href="http://python-twitter.googlecode.com/files/python-twitter-0.6.tar.gz">http://python-twitter.googlecode.com/files/python-twitter-0.6.tar.gz</a></p>
<p>Descompacte com o arquivo com o comando:<br />
<code>$ tar -zxvf python-twitter-0.6.tar.gz</code></p>
<p>Entre na pasta criada e instale a API (como root):<br />
<code>$ cd python-twitter-0.6<br />
$ sudo python setup.py install</code></p>
<p>Finalmente, <a href='http://blog.stiod.com/wp-content/uploads/2009/10/followme.py'>baixe o script que criei aqui</a>. Será necessário edita-lo. Abra com algum editor de texto e altere este trecho:</p>
<pre class="python">your_users = <span style="color: black;">&#91;</span>
    <span style="color: black;">&#40;</span><span style="color: #483d8b;">'seu_usuario'</span>, <span style="color: #483d8b;">'senha'</span>,<span style="color: black;">&#41;</span>, <span style="color: #808080; font-style: italic;"># Ex: ('joao', 'asd123'),</span>
    <span style="color: #808080; font-style: italic;"># ('outro usuario', 'senha'),</span>
    <span style="color: #808080; font-style: italic;"># ...</span>
<span style="color: black;">&#93;</span></pre>
<p>No trecho acima você deve inserir o seu usuário e senha do Twitter para que a API possa realizar o login. Você está de posse de 100% do código, repare que em momento algum o seu usuário e senhas são enviados para mim. <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Neste outro trecho você insere os usuário do Twitter que deseja seguir. Coloque cada usuário em uma linha dentro do espaço delimitado entre as três aspas. No script eu já adicionei alguns camaradas <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="python">twitter_users = <span style="color: #483d8b;">''</span><span style="color: #483d8b;">'
yoshioiwamoto
rafaelsdm
ricardoperez
gabrielverta
'</span><span style="color: #483d8b;">''</span></pre>
<p>Quanto mais seguidores eles tiverem, melhor. Uma dica é dar uma passada no <a href="http://twittercounter.com/">twittercounter</a> onde você pode encontrar quem são os usuários mais seguidos no mundo ou em um país específico (Brasil).</p>
<p>Para rodar o script execute na linha de comando:<br />
<code>$ python followme.py</code></p>
<p>No meu usuário <a href="http://twitter.com/yoshioiwamoto">@yoshioiwamoto</a> eu precisei seguir os 15 usuários do Twitter mais seguidos do Brasil e o script era rodado 3 vezes ao dia.</p>
<p>Uma informação importante, para cada usuário que você segue são necessários 2 requests e o Twitter possui um limite de 150 requests por hora, então gerencie bem os uso deste script.</p>
<p>Se você utiliza sistemas operacionais proprietários que não são baseados em Unix, aguarde até que uma boa alma crie um tutorial para você. <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/10/07/seja-seguido-no-twitter-sem-incomodar-as-pessoas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Django RequestContext</title>
		<link>http://blog.stiod.com/2009/01/19/django-requestcontext/</link>
		<comments>http://blog.stiod.com/2009/01/19/django-requestcontext/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 17:28:34 +0000</pubDate>
		<dc:creator>Ricardo Perez</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[django templates]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=227</guid>
		<description><![CDATA[O RequestContext do django serve para popular o template com variavés padrões, ou seja váriaveis comum aos templates. Quando você usar o RequestContext como parâmetro no render_to_response de sua view, ele usará os chamados context_processor setados na váriavel TEMPLATE_CONTEXT_PROCESSOR do settings.py do projeto(por padrão esta váriavel não esta no settings), funções que retornão um dicionário [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://docs.djangoproject.com/en/dev/ref/templates/api/?from=olddocs#id1" target="_blank">RequestContext</a> do django serve para popular o template com variavés padrões, ou seja váriaveis comum aos templates. Quando você usar o RequestContext como parâmetro no <a href="http://docs.djangoproject.com/en/dev/topics/http/shortcuts/?from=olddocs#render-to-response">render_to_response</a> de sua view, ele usará os chamados context_processor setados na váriavel <a href="http://docs.djangoproject.com/en/dev/ref/settings/#setting-TEMPLATE_CONTEXT_PROCESSORS">TEMPLATE_CONTEXT_PROCESSOR</a> do settings.py do projeto(por padrão esta váriavel não esta no settings), funções que retornão um dicionário de dados.</p>
<pre class="python">&nbsp;
TEMPLATE_CONTEXT_PROCESSORS = <span style="color: black;">&#40;</span>
    <span style="color: #483d8b;">&quot;django.core.context_processors.auth&quot;</span>,
    <span style="color: #483d8b;">&quot;django.core.context_processors.debug&quot;</span>,
    <span style="color: #483d8b;">&quot;django.core.context_processors.i18n&quot;</span>,
    <span style="color: #483d8b;">&quot;django.core.context_processors.media&quot;</span>,
<span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Para criar um contex_processor é só criar uma função da seguinte maneira, você pode criar um arquivo context_processor.py na pasta de sua app.</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> teste_contex_processor<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
    <span style="color: #dc143c;">user</span> = request.<span style="color: #dc143c;">user</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span>
      <span style="color: #483d8b;">'user'</span>:<span style="color: #dc143c;">user</span>,
      <span style="color: #483d8b;">'ip_address'</span>: request.<span style="color: black;">META</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'REMOTE_ADDR'</span><span style="color: black;">&#93;</span>
    <span style="color: black;">&#125;</span>
&nbsp;</pre>
<p>e colocar o context_processor criado no settings</p>
<pre class="python">&nbsp;
TEMPLATE_CONTEXT_PROCESSORS = <span style="color: black;">&#40;</span>
    ...,
    <span style="color: #483d8b;">&quot;meuprojeto.app.context_processor.teste_context_processor&quot;</span>,
<span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Para usar o RequestContext no render_to_response, basta fazer o seguinte:</p>
<pre class="python">&nbsp;
    ...
    <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span>
        <span style="color: #483d8b;">'templates/index.html'</span>,
        dicionario_de_dados,
        context_instance=RequestContext<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>
    <span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>*lembrando que você tem que passar <em>request</em> como parâmetro.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/01/19/django-requestcontext/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Reaproveitando a inteface do Admin do Django</title>
		<link>http://blog.stiod.com/2008/12/16/reaproveitando-a-inteface-do-admin-do-django/</link>
		<comments>http://blog.stiod.com/2008/12/16/reaproveitando-a-inteface-do-admin-do-django/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 02:59:55 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[python django admin]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=213</guid>
		<description><![CDATA[Finalmente o Django pra mim atingiu a perfeição, depois da minha surpresa com o {{ block.super }}, agora foi a vez de eu realizar um sonho meu: Aproveitar as interfaces maravilhosas de administração do Django.
Sempre é um verdadeiro pé no saco ter que ficar escrevendo código que você sabe que ta pronto, e mais sacal [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente o <a href="http://www.djangoproject.com/">Django</a> pra mim atingiu a perfeição, depois da minha surpresa com o <a href="http://blog.stiod.com/2008/12/16/acessando-block-tags-parentes-em-templates-django/">{{ block.super }}</a>, agora foi a vez de eu realizar um sonho meu: Aproveitar as interfaces maravilhosas de administração do Django.</p>
<p>Sempre é um verdadeiro pé no saco ter que ficar escrevendo código que você sabe que ta pronto, e mais sacal ainda quando o código ta a apenas "../../" de você, mas agora é um trabalho a menos que eu tenho <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  (especialmente considerando a minha "super habilidade" com CSS).</p>
<p>Agora vamos ao que interessa, o conhecimento necessário pra fazer isso funcionar levou cerca de 4 horas pra ser adiquirido, foram 4 horas engolindo e reengolindo código do Django, mas no final resultou em uma view como a seguinte (ignorem os imports desnecessários):</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">shortcuts</span> <span style="color: #ff7700;font-weight:bold;">import</span> render_to_response
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span> <span style="color: #ff7700;font-weight:bold;">import</span> RequestContext
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">utils</span>.<span style="color: black;">text</span> <span style="color: #ff7700;font-weight:bold;">import</span> ugettext_lazy as _
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">decorators</span> <span style="color: #ff7700;font-weight:bold;">import</span> login_required
<span style="color: #ff7700;font-weight:bold;">from</span> mysearch.<span style="color: black;">profiles</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Profile
<span style="color: #ff7700;font-weight:bold;">from</span> mysearch.<span style="color: black;">profiles</span>.<span style="color: black;">admin</span> <span style="color: #ff7700;font-weight:bold;">import</span> ProfileAdmin
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">admin</span>.<span style="color: black;">views</span>.<span style="color: black;">main</span> <span style="color: #ff7700;font-weight:bold;">import</span> ChangeList
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> User
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">forms</span> <span style="color: #ff7700;font-weight:bold;">import</span> UserCreationForm
&nbsp;
@login_required
<span style="color: #ff7700;font-weight:bold;">def</span> index<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
    admin_model = admin.<span style="color: #dc143c;">site</span>._registry<span style="color: black;">&#91;</span>Profile<span style="color: black;">&#93;</span>
    admin_model.<span style="color: black;">admin_site</span>.<span style="color: black;">root_path</span> = request.<span style="color: black;">path</span>
    cl = ChangeList<span style="color: black;">&#40;</span>
        request,
        Profile,
        ProfileAdmin.<span style="color: black;">list_display</span>,
        ProfileAdmin.<span style="color: black;">list_display_links</span>,
        ProfileAdmin.<span style="color: black;">list_filter</span>,
        ProfileAdmin.<span style="color: black;">date_hierarchy</span>,
        ProfileAdmin.<span style="color: black;">search_fields</span>,
        ProfileAdmin.<span style="color: black;">list_select_related</span>,
        ProfileAdmin.<span style="color: black;">list_per_page</span>,
        admin_model<span style="color: black;">&#41;</span>
    cl.<span style="color: black;">query_set</span> = cl.<span style="color: black;">query_set</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span>=request.<span style="color: #dc143c;">user</span><span style="color: black;">&#41;</span>
    cl.<span style="color: black;">get_results</span><span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>
&nbsp;
    context = <span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'title'</span>: cl.<span style="color: black;">title</span>,
        <span style="color: #483d8b;">'is_popup'</span>: cl.<span style="color: black;">is_popup</span>,
        <span style="color: #483d8b;">'cl'</span>: cl,
        <span style="color: #483d8b;">'has_add_permission'</span>: admin_model.<span style="color: black;">has_add_permission</span><span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>,
        <span style="color: #483d8b;">'root_path'</span>: admin_model.<span style="color: black;">admin_site</span>.<span style="color: black;">root_path</span>,
        <span style="color: #483d8b;">'app_label'</span>: _<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Profile'</span><span style="color: black;">&#41;</span>,
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">'admin/change_list.html'</span>,
        context, context_instance=RequestContext<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Vamos as explicações agora. Primeiramente, pra que isso funcione é preciso que seu model tenha sido <a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin">registrado no Admin do Django</a>, no meu caso o model utilizado foi esse chamado <strong>Profile</strong>.</p>
<p>Depois disso é criado um objeto do tipo `django.contrib.admin.views.main.ChangeList`, infelizmente <strong>todos</strong> os parametros devem ser passados, e essa foi a parte que mais me decepcionou, uma vez que todos os atributos poderiam ser resgatados com base no último argumento, ou simplesmente pedindo a classe que define o model, mas tudo bem, é um pequeno preço a se pagar pelo beneficio.</p>
<p>Após criar a variável `cl`, vem o ponto que meu deu maior dor de cabeça: Filtrar o que eu quero que apareca para o usuário. Nesse caso eu precisava que o usuário tivesse acesso apenas ao próprio conteudo, e pra isso adicionei o `.filter(user=request.user)`, porém, isso não basta, é preciso chamar a função `cl.get_results(request)` pra que ele possa atualizar a lista de resultados que vai ser usada</p>
<p>A váriavel `context`, neste caso, é usada pelo template `admin/change_list.html`, sinta-se a vontade para copiar o template da pasta do Django e colocar na sua pra editar.</p>
<p>Por fim, basta retornar o template que vai pegar o resultado e imprimir na tela pro seu usuário que será muito feliz <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><strong>Observações</strong><br />
O template `admin/change_list.html` não imprime a tabela propriamente dia, ela utiliza uma tag (não documentada no site) chamada `result_list`, essa tag recebe um objeto do tipo `ChangeList` que é o nosso `cl`.</p>
<p>Você ainda vai precisa escrever uma view (ou aproveitar a do Admin) para fazer o handle quando o usuário clicar no objeto, mas essa é a parte fácil <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/12/16/reaproveitando-a-inteface-do-admin-do-django/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Acessando `block` tags parentes em templates Django</title>
		<link>http://blog.stiod.com/2008/12/16/acessando-block-tags-parentes-em-templates-django/</link>
		<comments>http://blog.stiod.com/2008/12/16/acessando-block-tags-parentes-em-templates-django/#comments</comments>
		<pubDate>Tue, 16 Dec 2008 20:58:40 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=209</guid>
		<description><![CDATA[Se tem algo que eu admiro muito no sistema de templates do Django, é a tag block, eu acho ela realmente f#!$ pra ca#@!&#038;.
Só que recemente eu descobri algo nela que se eu estivesse em um ato sexual teria resultado em um fork(), que é a possibilidade de acessar o conteúdo antigo da tag antes [...]]]></description>
			<content:encoded><![CDATA[<p>Se tem algo que eu admiro <strong>muito</strong> no sistema de templates do <a href="http://www.djangoproject.com/">Django</a>, é a tag <a href="http://docs.djangoproject.com/en/dev/ref/templates/builtins/#block">block</a>, eu acho ela realmente f#!$ pra ca#@!&.</p>
<p>Só que recemente eu descobri algo nela que se eu estivesse em um ato sexual teria resultado em um fork(), que é a possibilidade de acessar o conteúdo antigo da tag <strong>antes</strong> dela ser sobrescrevida por você.</p>
<p>É extremamente simples, vamos pegar como exemplo o seguinte template `base.html`:</p>
<pre>&nbsp;
&lt;html&gt;
    &lt;head&gt;&lt;title&gt;{% block title%}Meu site dahora{% endblock %}&lt;/html&gt;
    &lt;body&gt;{% block content %}{% endblock %}
&lt;/html&gt;
&nbsp;</pre>
<p>A parte legal fica por conta do bloco <em>title</em>. Até então, sempre que eu quizesse colocar "Meu site dahora | Home" no titulo, eu teria que fazer assim em um template filho:</p>
<pre>&nbsp;
{% extends &quot;base.html&quot; %}
{% block title %}Meu site dahora | Home{% endblock %}
&nbsp;</pre>
<p>O problema óbvio nesse caso, é que se um dia eu resolver trocar o titulo pra "O Jardineiro é Jesus", então eu vo ter que editar todo template que extende o template `base.html` pra arrumar isso.</p>
<p>Eis então que <a href="http://docs.djangoproject.com/en/dev/topics/templates/#template-inheritance">surge a solução</a></p>
<pre>&nbsp;
{% extends &quot;base.html&quot; %}
{% block title %}{{block.super}} | Home{% endblock %}
&nbsp;</pre>
<p> <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Simples e funcional. VIDA LONGA AO DJANGO!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/12/16/acessando-block-tags-parentes-em-templates-django/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gerenciamento de usuários Trac com Django</title>
		<link>http://blog.stiod.com/2008/11/25/gerenciamento-de-usuarios-trac-com-django/</link>
		<comments>http://blog.stiod.com/2008/11/25/gerenciamento-de-usuarios-trac-com-django/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 16:13:30 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[python django trac authentication]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=165</guid>
		<description><![CDATA[Uma das minhas maiores broncas com o Trac é na hora de gerenciar usuários.
Até poucos meses atrás eu costumava gerenciar os usuários com o famoso aplicativo htpasswd que utiliza um arquivo de texto simples pra gerenciar os usuários. O primeiro problema que eu tive com ele veio quando eu pensei:

Holly shit...se eu precisar definir permissões [...]]]></description>
			<content:encoded><![CDATA[<p>Uma das minhas maiores broncas com o <a href="http://trac.edgewall.com/">Trac</a> é na hora de gerenciar usuários.</p>
<p>Até poucos meses atrás eu costumava gerenciar os usuários com o famoso aplicativo <a href="http://httpd.apache.org/docs/2.2/programs/htpasswd.html">htpasswd</a> que utiliza um arquivo de texto simples pra gerenciar os usuários. O primeiro problema que eu tive com ele veio quando eu pensei:</p>
<blockquote><p>
Holly shit...se eu precisar definir permissões de acesso a diferentes Tracs eu to fucked
</p></blockquote>
<p>Foi então que eu resolvi procurar uma alternativa, e o primeiro (e mais obvio) lugar que eu procurei foi no <a href="http://www.djangoproject.com">Django</a>, felizmente encontrei a <a href="http://docs.djangoproject.com/en/dev/howto/apache-auth/#howto-apache-auth">documentação que ensina passo-a-passo como configurar o Apache para autenticar com o Django</a>, é tão ridiculamente simples configurar que recomendo acessar o link por você mesmo e configurar.</p>
<p>Agora eu estava feliz, tinha 3 tracs pra administrar, felizmente, todos com as mesmas permissões de acesso e tudo sobre controle, gerenciamento de usuários centralizado e tudo mais. E eis que finalmente surge a oportunidade de por a prova o gerenciamento de permissões de acesso com o Trac do projeto <a href="http://www.djapian.com">Djapian</a> (ainda não publicado), dessa forma fiz o seguinte:</p>
<ul>
<li>Os 3 Tracs já existentes estão configurados para permitir apenas acesso de pessoas com o atributo <strong>is_staff</strong> habilidado</li>
<li>O novo Trac foi configurado para permitir acesso de qualquer pessoa que tenha a <a href="http://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions">permissão</a> <strong>djapian</strong></li>
</ul>
<p>Após configurar o Apache apropriadamente eu criei um usuário de teste pelo Admin do Django, feito isso, testei o usuário no Trac do Djapian e no Trac interno, resultado: Perfeito, conseguindo logar-se e negando autenticação respectivamente.</p>
<p>Agora estava tudo perfeito, até eu perceber um detalhe: O projeto Djapian é OpenSource, e eu gostaria que o wiki também fosse, porém, não gostaria de deixar habilitado a edição do mesmo por usuários anonimos, até por questões de rastreamento no caso de alguem apagar ou estragar uma página.</p>
<p>O problema: Como eu permito que usuários se cadastrem?<br />
A solução: Construir um plugin para o Trac que faça a interface com o Django <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Levei aproximadamente 1 dia útil de trabalho para desenvolver esse <a href="http://pub.stiod.com/TracDjangoAuth-0.1.tar.gz">plugin que pode ser baixado aqui</a>, o plugin é bem simples de se configurar e instalar, para isso siga os seguintes passos:</p>
<pre class="bash">&nbsp;
$ <span style="color: #c20cb9; font-weight: bold;">wget</span> http://pub.stiod.com/TracDjangoAuth<span style="color: #000000;">-0.1</span>.<span style="color: #c20cb9; font-weight: bold;">tar</span>.gz
$ <span style="color: #c20cb9; font-weight: bold;">tar</span> -zxvf TracDjangoAuth<span style="color: #000000;">-0.1</span>.<span style="color: #c20cb9; font-weight: bold;">tar</span>.gz
$ <span style="color: #7a0874; font-weight: bold;">cd</span> TracDjangoAuth<span style="color: #000000;">-0.1</span>
$ python setup.py bdist_egg
$ <span style="color: #c20cb9; font-weight: bold;">cp</span> dist/TracDjangoAuth<span style="color: #000000;">-0.1</span>-*.egg /path/para/o/seu/trac/plugins/
&nbsp;</pre>
<p>Agora é preciso apenas editar o arquivo <strong>trac.ini</strong> e acrescentar no final dele as seguintes linhas:</p>
<pre class="ini">&nbsp;
<span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>djangoauth<span style="">&#93;</span></span>
# Adicione aqui sua permissao
<span style="color: #000099;">django_permission_name </span>=<span style="color: #660066;"> can_do_something</span>
# Permissoes padroes para cada usuario que se cadastras
<span style="color: #000099;">default_trac_permissions </span>=<span style="color: #660066;"> WIKI_CREATE,WIKI_MODIFY,WIKI_VIEW</span>
# Settings que deve ser usado
<span style="color: #000099;">django_settings_module </span>=<span style="color: #660066;"> some_project.settings</span>
&nbsp;</pre>
<p>Apenas note que a opção <strong>django_permission_name</strong> requer apenas o atributo <strong>codename</strong> da permissão, diferentemente de seu equivalente no Apache, que precisa do nome da aplicação também como <strong>myapp.some_perm</strong>.</p>
<p>Feito isso apenas reinicie o Apache e divirta-se, o novo plugin irá criar um novo link chamado "Signup" para que seus usuários possam se cadastrar e se logar <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Qualquer dúvida, bug, sugestão, correção ou patch, é só comentar ai em baixo <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Em tempo: Fiz esse plugin para o Trac 0.10.x, se você estiver disposto a migrar para o 0.11, saiba que a unica mudança é no sistema de templates, <a href="http://trac.edgewall.org/wiki/TracDev/PortingFromClearSilverToGenshi">de ClearSilver para Genshi</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/11/25/gerenciamento-de-usuarios-trac-com-django/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Djapian &#8211; Search API for Django with Xapian</title>
		<link>http://blog.stiod.com/2008/11/19/djapian-search-api-for-django-with-xapian/</link>
		<comments>http://blog.stiod.com/2008/11/19/djapian-search-api-for-django-with-xapian/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 17:57:40 +0000</pubDate>
		<dc:creator>caio</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Xapian]]></category>
		<category><![CDATA[djapian xapian django api search]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=157</guid>
		<description><![CDATA[Criamos uma página para o projeto Djapian.
\o/

Para quem não conhece, o Djapian, é um aplicativo que você pode incorporar à sua própria solução afim de permitir buscas nos textos, essencial em aplicativos como: Wiki, Blog, CMS e todo tipo de projeto que envolva colaboração de usuários em informação.
Acesse esse post para ver um artigo completo [...]]]></description>
			<content:encoded><![CDATA[<p>Criamos uma página para o projeto <strong><a href="http://www.djapian.com">Djapian.</a></strong></p>
<p>\o/</p>
<p style="text-align: center;"><img src="http://caio.stiod.com/blog2.png" width="100%" alt="Djapian - Search API for Django with Xapian " /></p>
<p>Para quem não conhece, o <strong>Djapian</strong>, é um aplicativo que você pode incorporar à sua própria solução afim de permitir buscas nos textos, essencial em aplicativos como: Wiki, Blog, CMS e todo tipo de projeto que envolva colaboração de usuários em informação.</p>
<p>Acesse <a href="http://blog.stiod.com/2007/08/25/djapian-solucao-de-search-engine-para-seu-projeto/">esse post</a> para ver um artigo completo sobre o <strong>Djapian</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/11/19/djapian-search-api-for-django-with-xapian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mudar o nome da aplicação no admin do Django</title>
		<link>http://blog.stiod.com/2008/10/22/mudar-o-nome-da-aplicacao-no-admin-do-django/</link>
		<comments>http://blog.stiod.com/2008/10/22/mudar-o-nome-da-aplicacao-no-admin-do-django/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 02:54:11 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=130</guid>
		<description><![CDATA[Atenção! Pode conter links inúteis
É incrivel, passei meus ultimos um ano e meio trabalhando em empresas de terceiros, porém, eu não sentia aquele prazer que só um verdadeiro programador sente ao programar.
 Mãs! Tudo mudou quando decidimos (eu e mais 4 socios) que era hora de tocar a empresa seriamente, então eu sai da empresa [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Atenção!</strong> Pode conter links inúteis</p>
<p>É incrivel, passei meus ultimos um ano e meio trabalhando em empresas de terceiros, porém, eu não sentia aquele prazer que só um <a href="http://tinyurl.com/2rz8x6">verdadeiro programador</a> sente ao <a href="http://desciclo.pedia.ws/wiki/POG">programar</a>.</p>
<p> <strong>Mãs!</strong> Tudo mudou quando decidimos (eu e mais 4 socios) que era hora de tocar a empresa seriamente, então eu sai da empresa onde trabalhava e segui viagem para <a href="http://stiod.com">minha própria empresa</a>.</p>
<p>Bom, enrolei muito já, vamos ao que interessa.</p>
<p>Você já deve ter se revoltado com o <a href="http://djangoproject.com">Django</a>, mais precisamente com o aplicativo <a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin">Admin</a>, quando você era obrigado a aceitar uma versão capitalizada (no sentido da primeira-letra-maiúscula, e não financeiro) do nome do seu aplicativo na tela inicial da administração.<br />
<img src="http://blog.stiod.com/wp-content/uploads/2008/10/admin02t-300x80.png" alt="" title="Admin" width="300" height="80" class="alignnone size-medium wp-image-128" /></p>
<p>Porém, agora sei que é possivel modificar esse nome que fica com fundo azul, tudo graças a uma introspecção no código do Django, algo que eu dificilmente faria trabalhando para terceiros (esse foi o motivo de eu ter escrito aquelas abobrinhas ali em cima <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ), e ao que tudo indica, essa "funcionalidade", não está documentada (pelo menos não foi fácil encontrar informações sobre isso, tanto que devo um link aqui).</p>
<p>Pra resolver esse problema é simples, basta editar o model desejado e adicionar dentro da classe <a href="http://docs.djangoproject.com/en/dev/ref/models/options/#ref-models-options">Meta</a> um atributo chamado "app_label" (repare que ele não se encontra na documentação), e com isso o model será agrupado no nome que você der para ele, o interessante, é que você pode agrupar varios aplicativos dentro de uma só tabela, desde que todos os models tenham o mesmo nome no app_label.</p>
<p>Mas o mais bizarro mesmo, é que você pode modificar o app_label de outros aplicativos que não fazem parte do seu projeto, por exemplo, ao adicionar as seguintes linhas em algum model.py seu:</p>
<pre class="python"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> User</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">User._meta.<span style="color: black;">app_label</span> = <span style="color: #483d8b;">&quot;AWAAAY&quot;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li></ol></pre>
<p>Você vai jogar o modelo User pra dentro da tabela <strong>AWAAAAY</strong>.</p>
<p>Só gostaria de deixar claro que usar essa "funcionalidade" (não sei se isso seria realmente uma funcionalidade, já que não está documentada) pode resultar em comportamentos adversos (do projeto, não seus), uma vez que eu não estudei completamente o código-fonte do Django pra saber até onde vão os efeitos desse atributo.</p>
<p>So, have fun with moderation.</p>
<p>Em tempo: Estou com o Django-1.0<br />
Nota de copyright: A imagem que utilizei aqui pertence ao site http://djangoproject.com</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/10/22/mudar-o-nome-da-aplicacao-no-admin-do-django/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Django com WSGI</title>
		<link>http://blog.stiod.com/2008/10/15/django-com-mod_wsgi/</link>
		<comments>http://blog.stiod.com/2008/10/15/django-com-mod_wsgi/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 18:35:33 +0000</pubDate>
		<dc:creator>Ricardo Perez</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[python django mod_wsgi]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=99</guid>
		<description><![CDATA[Para quem usa o mod_python para servir suas aplicações em Django e esta insatisfeito ou  teve algum problemas com o mesmo. Pois é, eu mesmo tive um baita problemão com o mod_python e precisava de solução urgente, que fosse rápida e fácil de configurar,  uma ótima alternativa que eu encontrei foi o mod_wsgi [...]]]></description>
			<content:encoded><![CDATA[<p>Para quem usa o mod_python para servir suas aplicações em Django e esta insatisfeito ou  teve algum problemas com o mesmo. Pois é, eu mesmo tive um baita problemão com o mod_python e precisava de solução urgente, que fosse rápida e fácil de configurar,  uma ótima alternativa que eu encontrei foi o mod_wsgi (http://code.google.com/p/modwsgi/), logo de inicio verifiquei que num servidor de alto acesso de usuários a diferença de performance foi visivelmente absurda, hoje em dia só uso o mod_wsgi.Não vou abranger instalação do mod_wsgi mas somente a configuração do Apache e do arquivo wsgi</p>
<p>No seu arquivo de configurção do apache</p>
<pre class="apache"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">WSGIDaemonProcess <span style="color: #00007f;">user</span> processes=<span style="color: #ff0000;">2</span> maximum-requests=<span style="color: #ff0000;">500</span> threads=<span style="color: #ff0000;">1</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">WSGIProcessGroup usergroup</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">WSGIScriptAlias / /path/para/aplicacao <span style="color: #adadad; font-style: italic;"># sabendo que é a pasta onde fica a aplicação e não ela</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #00007f;">Alias</span> /public /path/para/aplicacao/app/public/</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li></ol></pre>
<p>crie um arquivo na pasta da sua aplicação com o nome app.wsgi</p>
<pre class="python"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">sys</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/path/para/aplicacao/'</span><span style="color: black;">&#41;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'DJANGO_SETTINGS_MODULE'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'app.settings'</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff7700;font-weight:bold;">import</span> django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">application = django.<span style="color: black;">core</span>.<span style="color: black;">handlers</span>.<span style="color: black;">wsgi</span>.<span style="color: black;">WSGIHandler</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li></ol></pre>
<p>Maiores Informações: <a href="http://code.google.com/p/modwsgi/">http://code.google.com/p/modwsgi/</a> e<br />
<a href="http://code.google.com/p/modwsgi/wiki/InstallationInstructions">http://code.google.com/p/modwsgi/wiki/InstallationInstructions</a></p>
<p>Referência:<br />
<a href="http://ericholscher.com/blog/2008/jul/8/setting-django-and-mod_wsgi/">http://ericholscher.com/blog/2008/jul/8/setting-django-and-mod_wsgi/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/10/15/django-com-mod_wsgi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
