by Stiod Desenvolvimento Web
Assine nosso RSS

Se tem algo que eu admiro muito no sistema de templates do Django, é a tag block, eu acho ela realmente f#!$ pra ca#@!&.

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 dela ser sobrescrevida por você.

É extremamente simples, vamos pegar como exemplo o seguinte template `base.html`:

 
<html>
    <head><title>{% block title%}Meu site dahora{% endblock %}</html>
    <body>{% block content %}{% endblock %}
</html>
 

A parte legal fica por conta do bloco title. Até então, sempre que eu quizesse colocar "Meu site dahora | Home" no titulo, eu teria que fazer assim em um template filho:

 
{% extends "base.html" %}
{% block title %}Meu site dahora | Home{% endblock %}
 

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.

Eis então que surge a solução

 
{% extends "base.html" %}
{% block title %}{{block.super}} | Home{% endblock %}
 

:D Simples e funcional. VIDA LONGA AO DJANGO!

Estava precisando fazer uma consulta que não levasse em conta acentos digitados pelo usuário no filtro da pesquisa, nem a capitalização (case).

Eis que após alguma pesquisa cheguei à seguinte solução:

WHERE
TRANSLATE(UPPER(campo),'ÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜ','ACEIOUAEIOUAEIOUAOEU')
LIKE
TRANSLATE(UPPER('%parametro%'),'ÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜ',
'ACEIOUAEIOUAEIOUAOEU')

 

Dependendo da complexidade da consulta, pode ser mais interessante a utilização do conceito de Full Text Search, mas para uma consulta mais 'simples', o exposto acima supre a necessidade.

Segue a segunda parte do tutorial de introdução ao framework do ExJs.

Vamos falar dos Widgets, que são aplicativos feitos com o Extjs para facilitar o desenvolvimento das aplicações web.

E pra começar crie um arquivo HTML [não esqueça de baixar os fontes do ExtJs] e :
No HEAD do arquivo HTML referencie os arquivos script e de formatação de estilo.

 
<!-- CSS pegue o arquivo na pasta ext-2.2\resources\ -->
<link rel="stylesheet" type="text/css" href="css/ext-all.css" />
 
<!-- Ext-base.js pegue o arquivo na pasta ext-2.2\adapter\ext\ -->
<script type="text/javascript" src="js/ext-base.js" ></script>
<!-- Ext-all.js pegue o arquivo na pasta raiz ext-2.2\ -->
<script type="text/javascript" src="js/ext-all.js"></script>
 

E insira no corpo do documento esses elementos:

 
<div id="quadro-id"></div>
<div id="quadro-conteudo"><span>Conte&uacute;do</span></div>
 

Coloquei essa formatação em um STYLE pra deixar os textos mais harmônicos e definir um tamanho para o quadro que irá gerar o Ext Panel

 
body{
  font:normal normal 12px/1.8em arial, 'trebuchet ms', verdana;
}
#quadro-id{
  width:500px;
}
 

Agora indo para a parte mais importante os Scripts:

 
//Verificando se o ExtJs foi carregado
Ext.onReady(function(){
  //Instanciando um novo objeto do Extjs
  var quadro = new Ext.Panel({
    title:'meu quadro',
    //referenciando um objeto no corpo do HTML
    renderTo:'quadro-id',
    //tem a opção de ser expansível
    collapsible:true,
    //Opção de ser arrastado, mas volta ao ponto original
    //Necessita incluir as propriedades de Drag n' Drop
    draggable:true,
    //icone de fechar,  precisa de programação pra interatividade
    closable:true,
    //Inserção e programação dos botões do cabeçalho do PANEL
    tools:[{
      id:'help',
      handler:function(){
          Ext.Msg.show({
          width:350,
          title:'titulo do texto de ajuda',
          msg:'corpo do  quadro de ajuda'
        })
      }
    },{
    id:'close',
    handler:function(){
      Ext.destroy(quadro);
    }
    }],
    // conteúdo a ser renderizado dentro do PANEL
    contentEl:'quadro-conteudo'
  })
  //Centralizando quadro no centro da tela
  Ext.get("quadro-id").center();
});
 

O Widget PANEL e seus elementos visuais podem ser customizados, os arquivos de imagens e css desse objeto estão separados na pasta RESOURCES com seu respectivo nome.

Bom.. é só isso :).

Coloquei esse exemplo no nosso servidor pra quem quiser acessar e ver funcionando.

Abraços a todos e em seguinda colocarei mais funcionalidades do ExtJs.

Gerando pacotes de atualização com base no SVN

Rafael Monteiro

Olá galera,

Hoje vou dar uma dica sobre geração de pacotes utilizando o Subversion.

O cenário é o seguinte: você desenvolve um projeto que utiliza o SVN como controlador de versões.
Periodicamente, você deve enviar pacotes para o cliente com atualizações do sistema (novas implementações, correções, ajustes, enfim...).
Entretanto, tais pacotes são incrementais, já que não é necessário enviar toda a estrutura do sistema a cada atualização.

Pelo Windows, é possível fazer a exportação dos arquivos mediante a utilização da ferramenta TortoiseSVN.
Através da opção Log, é obtido o histórico das revisões. Com base nesse histórico, podemos selecionar a última revisão que fora enviada ao cliente e a revisão desejada, comparar as revisões (a fim de obter os arquivos alterados) e, finalmente, exportá-los para uma pasta que manterá a estrutura do sistema.

Continue Lendo »

Gerenciamento de usuários Trac com Django

Rafael Sierra

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 de acesso a diferentes Tracs eu to fucked

Foi então que eu resolvi procurar uma alternativa, e o primeiro (e mais obvio) lugar que eu procurei foi no Django, felizmente encontrei a documentação que ensina passo-a-passo como configurar o Apache para autenticar com o Django, é tão ridiculamente simples configurar que recomendo acessar o link por você mesmo e configurar.

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 Djapian (ainda não publicado), dessa forma fiz o seguinte:

  • Os 3 Tracs já existentes estão configurados para permitir apenas acesso de pessoas com o atributo is_staff habilidado
  • O novo Trac foi configurado para permitir acesso de qualquer pessoa que tenha a permissão djapian

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.

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.

O problema: Como eu permito que usuários se cadastrem?
A solução: Construir um plugin para o Trac que faça a interface com o Django :D
Levei aproximadamente 1 dia útil de trabalho para desenvolver esse plugin que pode ser baixado aqui, o plugin é bem simples de se configurar e instalar, para isso siga os seguintes passos:

 
$ wget http://pub.stiod.com/TracDjangoAuth-0.1.tar.gz
$ tar -zxvf TracDjangoAuth-0.1.tar.gz
$ cd TracDjangoAuth-0.1
$ python setup.py bdist_egg
$ cp dist/TracDjangoAuth-0.1-*.egg /path/para/o/seu/trac/plugins/
 

Agora é preciso apenas editar o arquivo trac.ini e acrescentar no final dele as seguintes linhas:

 
[djangoauth]
# Adicione aqui sua permissao
django_permission_name = can_do_something
# Permissoes padroes para cada usuario que se cadastras
default_trac_permissions = WIKI_CREATE,WIKI_MODIFY,WIKI_VIEW
# Settings que deve ser usado
django_settings_module = some_project.settings
 

Apenas note que a opção django_permission_name requer apenas o atributo codename da permissão, diferentemente de seu equivalente no Apache, que precisa do nome da aplicação também como myapp.some_perm.

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 :)
Qualquer dúvida, bug, sugestão, correção ou patch, é só comentar ai em baixo ;)
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, de ClearSilver para Genshi.

Criamos uma página para o projeto Djapian.

\o/

Djapian - Search API for Django with Xapian

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 sobre o Djapian.

Já percebemos que o mercado exige que as novas interfaces alcancem níveis de usabilidade ainda maiores, e a interface com o usuário seja a mais agradável possível, com efeitos de navegação, crossbrowser, folksonômica, microformatada e assim vai.

Recentemente, em um cliente, tive que utilizar o framework javascript Extjs pra constuir uma interface no famoso estilo web 2.0 , com vários efeitos de navegação(Drag 'n Drop, Fade, Slides) e como não a conhecia tive que entrar em debugLearning mode on.

Extjs já está na sua versão 2.2 e não me aprofundei nos conhecimentos das versões anteriores e nesse post quero ser mais objetivo e pouco introdutório nos seus conceitos e ir por as mãos na massa.

Você pode começar baixando o código fonte com exemplos e documentação que estão em http://www.extjs.com/download e aconselho também a baixar a documentação que esta em arquivo de AdobeAir.

Pra prática logo né ?!

Você já deve conhecer o getElementById, o getElementsByTagName e um monte de outras propriedades em javascript.

Segue alguns Exemplos de como funciona no ExtJs:

- document.getElementsById("id") = ExtJs fica Ext.get("id")
- document.getElementsByTagName("tag") =  Ext.select("tag")
- Recuperar todos os elementos com a classe "red-link" = Ext.select(".red-link")
- Todos os DIVs com a classe "box" =  Ext.select("div .box")
- Centralizar um objeto no centro da tela = Ext.get("obj").center()
- E NÃO É SÓ ISSO! [Polishop Rules]

Pra quem conhece frameworks javascript já nota a semelhança com Jquery, Prototype e outras similares.

Mas o ponto forte do ExtJs são os seus widgets pra montar Panels, Grids, MsgBoxes, Drag'n Drop e muitos outros objetos e efeitos de navegação que tanto enchem os olhos do usuário final.

A seguir estarei publicando mais textos sobre as funcionalidades, dicas e algumas outras coisas que acredito serem interessantes sobre esse framework.

That's not all folks.

See you in a while!

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 onde trabalhava e segui viagem para minha própria empresa.

Bom, enrolei muito já, vamos ao que interessa.

Você já deve ter se revoltado com o Django, mais precisamente com o aplicativo Admin, 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.

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 :P), 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).

Pra resolver esse problema é simples, basta editar o model desejado e adicionar dentro da classe Meta 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.

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:

  1.  
  2. from django.contrib.auth.models import User
  3. User._meta.app_label = "AWAAAY"
  4.  

Você vai jogar o modelo User pra dentro da tabela AWAAAAY.

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.

So, have fun with moderation.

Em tempo: Estou com o Django-1.0
Nota de copyright: A imagem que utilizei aqui pertence ao site http://djangoproject.com

Django com WSGI

ricardo

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

No seu arquivo de configurção do apache

  1.  
  2. WSGIDaemonProcess user processes=2 maximum-requests=500 threads=1
  3. WSGIProcessGroup usergroup
  4. WSGIScriptAlias / /path/para/aplicacao # sabendo que é a pasta onde fica a aplicação e não ela
  5. Alias /public /path/para/aplicacao/app/public/
  6.  

crie um arquivo na pasta da sua aplicação com o nome app.wsgi

  1.  
  2. import os, sys
  3. sys.path.append('/path/para/aplicacao/')
  4. os.environ['DJANGO_SETTINGS_MODULE'] = 'app.settings'
  5. import django.core.handlers.wsgi
  6. application = django.core.handlers.wsgi.WSGIHandler()
  7.  

Maiores Informações: http://code.google.com/p/modwsgi/ e
http://code.google.com/p/modwsgi/wiki/InstallationInstructions

Referência:
http://ericholscher.com/blog/2008/jul/8/setting-django-and-mod_wsgi/

Olá galera, meu nome é Rafael Monteiro e esse é o meu primeiro post aqui na Stiod.

Atualmente desenvolvo em PHP e venho utilizando os SGBD's: MySQL, PostgreSQL e Oracle.

Espero conseguir manter a qualidade das informações passadas pelos demais membros do blog...

Bom, vamos ao que interessa.

Hoje vou dar uma pequena dica, acerca de dois comandos que por muitas vezes são desconhecidos pelos próprios usuários do Oracle.

São os comandos EXP (export) e IMP (import), acessíveis via linha de comando.

Continue Lendo »