<?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; Django</title>
	<atom:link href="http://blog.stiod.com/category/python/django/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>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>
		<item>
		<title>Django EmailMessage(Erro Com Cópia Oculta)</title>
		<link>http://blog.stiod.com/2008/09/08/django-emailmessageerro-bcc/</link>
		<comments>http://blog.stiod.com/2008/09/08/django-emailmessageerro-bcc/#comments</comments>
		<pubDate>Mon, 08 Sep 2008 17:58:02 +0000</pubDate>
		<dc:creator>Ricardo Perez</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[email bcc cco tips]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=81</guid>
		<description><![CDATA[Hoje deparei com um pequeno problema no módulo EmailMessage do Django, eu precisava mandar um email oculto em uma certa funcionalidade, apesar do EmailMessage dar suporte a cópia oculta(BCC),  ele definitvamente mostra para os outros destinatários do email quem foi enviado o email oculto(¬¬), dando uma buscadinha no Google encontrei essa snippet, FixedEmailMessage(http://www.djangosnippets.org/snippets/630/), que [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje deparei com um pequeno problema no módulo EmailMessage do Django, eu precisava mandar um email oculto em uma certa funcionalidade, apesar do EmailMessage dar suporte a cópia oculta(BCC),  ele definitvamente mostra para os outros destinatários do email quem foi enviado o email oculto(¬¬), dando uma buscadinha no Google encontrei essa snippet, <a href="http://www.djangosnippets.org/snippets/630/" target="_blank">FixedEmailMessage</a>(http://www.djangosnippets.org/snippets/630/), que além de resolver este problema, também tem suporte a CC.</p>
<p>Vai la um exemplo:</p>
<p><code><br />
FixedEmailMessage('titulo', 'corpo', from_email='ex@exemplo.com', to=['para@exemplo.com'], bcc=['oculto@email.com'], cc=['copiado@exemplo.com']).send()</code></p>
<p>Referência: <a href="http://www.djangosnippets.org/snippets/630/" target="_blank">http://www.djangosnippets.org/snippets/630/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/09/08/django-emailmessageerro-bcc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Chart API e Bovespa</title>
		<link>http://blog.stiod.com/2007/12/09/google-chart-api-e-bovespa/</link>
		<comments>http://blog.stiod.com/2007/12/09/google-chart-api-e-bovespa/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 22:49:55 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.stiod.com.br/?p=59</guid>
		<description><![CDATA[Esses dias eu resolvi fazer um programa pra acompanhar a movimentação financeiras das ações de todas as empresas na bovespa, isso porque nos sites você só encontra informações sobre as empresas top-alguma-coisa ("Maiores altas" e "Maiores baixas" por exemplo), mas com essas informações você não sabe o estado de outras empresas, por exemplo: Qual a [...]]]></description>
			<content:encoded><![CDATA[<p>Esses dias eu resolvi fazer um programa pra acompanhar a movimentação financeiras das ações de todas as empresas na <a href="http://www.bovespa.com.br">bovespa</a>, isso porque nos sites você só encontra informações sobre as empresas top-alguma-coisa ("Maiores altas" e "Maiores baixas" por exemplo), mas com essas informações você não sabe o estado de outras empresas, por exemplo: <em>Qual a empresa que tem o menor valor por ação?</em>, só com a informação dos sites você nunca vai saber. Por esses motivos resolvi fazer esse programa.<br />
<span id="more-48"></span><br />
Esse programa é um script simples que usa o XML vindo do site da bovespa pra atualizar a base de dados, ele é feito em Python com Django e possui uma tela (beeem) simples com a listagem das empresas e um grafico usando o <a href="http://chart.apis.google.com/">Google Chart API</a>, ele é uma URL que pode ser montada com os valores e gerar um gráfico muito bom, como esse exemplo:<br />
<img src="http://chart.apis.google.com/chart?cht=lc&chs=200x100&chd=t:41.3223140496,0.0,4.95867768595,4.95867768595,3.30578512397,4.13223140496,9.09090909091,7.43801652893,9.09090909091,11.5702479339,14.8760330579,12.3966942149,9.9173553719,16.5289256198,28.9256198347,33.0578512397,42.9752066116,36.3636363636,37.1900826446,41.3223140496,41.3223140496,37.1900826446,38.8429752066,44.6280991736,44.6280991736,52.8925619835,52.8925619835,53.7190082645,48.7603305785,47.1074380165,47.1074380165,42.1487603306,35.5371900826,28.9256198347,24.7933884298,41.3223140496,20.6611570248,66.1157024793,82.6446280992,75.2066115702,74.3801652893,66.9421487603,63.6363636364,78.5123966942,86.7768595041,93.3884297521,86.7768595041,90.9090909091,90.9090909091,90.9090909091,97.520661157,100.0,95.867768595,95.041322314,86.7768595041,90.9090909091,74.3801652893,85.9504132231,82.6446280992,78.5123966942,78.5123966942,85.1239669421,82.6446280992,79.3388429752,86.7768595041,88.4297520661,83.4710743802,90.0826446281,91.7355371901,87.6033057851,86.7768595041,79.3388429752,78.5123966942,82.6446280992,86.7768595041,95.867768595,92.5619834711,89.2561983471,90.9090909091,91.7355371901,86.7768595041,84.2975206612,76.0330578512,70.2479338843,70.2479338843,78.5123966942,72.7272727273,81.8181818182,30.5785123967,25.6198347107,29.7520661157,42.9752066116&chco=76A4FB&chxt=y&chxr=0,22.6,23.81"/><br />
Na classe <em>bovespa.bolsa.models.Empresa</em> tem uma função que eu criei baseado no exemplo JS que tem no site do Google que gera um gráfico mais "legível".</p>
<p><a href="http://pub.stiod.com/bovespa.tar.gz">Para baixar o programa clique aqui</a>, ele já vem com uma base sqlite3 preenchida com muitas empresas (todas que eu achei), e seu funcionamento é bem simples, bastar executar o script "bot.py" que ele automaticamente irá atualizar a base de dados a cada 5 minutos.</p>
<p>Exemplo:<br />
<code><br />
cd /lugar/onde/esta/o/bovespa/<br />
export PYTHONPATH=/caminho/ate/onde/descompatou/o/targz<br />
export DJANGO_SETTINGS_MODULE=bovespa.settings<br />
python bot.py<br />
</code></p>
<p>Para acessar a tela basta rodar:<br />
<code><br />
cd /lugar/onde/esta/o/bovespa/<br />
python manage.py runserver<br />
</code></p>
<p>E acessar <a href="http://localhost:8000/">http://localhost:8000</a> para visualizar as cotações, ou <a href="http://localhost:8000/admin/">/admin</a> e se logar com usuário <em>admin</em> e senha <em>admin666</em> para adicionar ou editar as <a href="http://localhost:8000/admin/bolsa/empresa/">empresas</a>.</p>
<h3>Avisos</h3>
<ul>
<li>
        Não é necessário executar o script das 20:00 às 10:00, pois nesse periodo o mercado de ações não funciona.
    </li>
<li>
        Você <strong>não</strong> pode disponibilizar um acesso publico aos dados capturados, isso vai contra a <a href="http://www.bovespa.com.br/Home/copy.htm">politica de copyright da bovespa</a>, mas você pode usa-lo como monitor financeiro particular <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
    </li>
<li>
        Pretendo em breve colocar esse projeto no Google, mas ele precisa de algumas melhorias, como criar alguma funcionalidade de alerta, e coisas do tipo
    </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2007/12/09/google-chart-api-e-bovespa/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
