sexta-feira, 18 de maio de 2012

Sublime Text 2: Meu (provavelmente) Último Editor

A tempos procurava um editor com recursos interessantes para aumentar a produtividade. Tomei conhecimento do TextMate do Mac e muito me interesssei. No ambiente de trabalho por ser Windows ( triste, eu sei ), buscava algo similar. Foi quando conheci o Intype (http://inotai.com/intype/) e encontrei na net boas almas que converteram os bundles do TextMate para o Intype.
No Intype, acabei utilizando todos os bundles que haviam disponíveis e foi uma experiencia satisfatória. A questão é que o intype se tornará pago cedo ou tarde, então outra alternativa precisava ser encontrada.



Eis que surge o Sublime Text 2 (http://www.sublimetext.com/). Com versões gratuita e paga, ele supera todos os editores que já trabalhei. Possui vários recursos interessantes, tais como:
  • Highlighting para várias linguagens como C, C++, C#, CSS, D, Erlang, HTML, Groovy, Haskell, HTML, Java, JavaScript, LaTeX, Lisp, Lua, Markdown, Matlab, OCaml, Perl, PHP, Python, R, Ruby, SQL, TCL, Textile e XML e mais para download 
  • Modo Full Screen (F11) com recurso Distraction Free (Shift + F11) 
  • Scroll com o minimap do código 
  • Auto save, jamais perca algo. 
  • Vários temas disponíveis, particularmente prefiro o Monokai 
  • Somente modo texto. Sem frescura. 
  • Seleção múltipla 
  • Busca incremental durante a digitação 
  • Seleção em coluna 
  • Mantém o case durante o replace 
  • Busca e substituição por expressão regular 
  • Auto complete 
  • Snippets e Pacotes que otimizam o tempo (e viciam) durante o uso. 
  • e muitos outros. 
Os Pacotes e Snippets, merecem uma descrição a parte. Primeiramente instale o Package Control seguindo esse tutorial. Com ele será possível instalar vários pacotes com os mais diversos recursos para melhorar sua produtividade. Alguns interessantes:
  • Alignment
  • SideBarEnhancements
  • JQuery
  • HTML5
  • e muitos outros disponíveis, basta dar uma olhada no Package Control. 
O mais interessantes do esquema do  Package Control, é que tudo é feito diretamente pelo Sublime, sem burocracia de download, instalação, etc. 

Os Snippets são os mais utilizados, na minha opinião. Da mesma forma que no TextMate, o Sublime completa trechos de códigos pré-configurados após a digitação de um termo (gatilho, vulgo tab trigger) e pressionar a tecla Tab. O mais interessante é que é possível editar e criar novos de uma maneira bem fácil. Basta ir pelo menu Tools >> New Snippet. O exemplo fornecido é muito óbvio, mas vamos a ele:


<snippet>

<content><![CDATA[

Hello, ${1:this} is a ${2:snippet}.
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<!-- <tabTrigger>hello</tabTrigger> -->
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.python</scope> -->
</snippet>

Todos os termos começados com $, seguido de um número são os parâmetros editáveis do bloco inserido pelo Sublime, descrito no content, possuindo navegação através do Tab, de acordo com a ordem numérica. O valor seguido dos ":"  são os valores padrões para cada parâmetro inserido. Descomente a linha do tabTrigger e digite o gatilho de sua preferência.

Além da possibilidade de criar novos snippets, é possivel importar  todos os bundles do TextMate com uma simples operação de ctrl + c , ctrc + v ( sim, simplesmente colar os arquivos) para a pasta do Sublime. Ele se encarrega de fazer funcionar. Única alteração é que quando copiar os arquivos .tmbundle para o Windows, eles virão como se fosse um pasta com essa extensão. Retire a extensão e salve essas pastas em:
C:\Users\<USUARIO DA MAQUINA>\AppData\Roaming\Sublime Text 2\Packages (Windows)
<USUARIO DA MAQUINA>/Biblioteca/Application Suport/Sublime Text 2/Packages (MAC)

Com isso, será disponibilizado os pacotes no canto inferior direito do Sublime.

Com uma interface amigável, vários recursos fantásticos e leve, o Sublime Text 2 tem se mostrado com o melhor editor que já trabalhei. Disponível para Windows, Linux e Mac, possibilita uma interface única para quem, como eu trabalha em ambientes diferentes.

Façam download e experimentem. Vale a pena.
Hasta!


sexta-feira, 10 de fevereiro de 2012

Instalação do Vagrant


Precisa de um ambiente que simule o servidor onde fará o deploy do projeto? Cansado de lidar com as diferenças entre sistemas operacionais, versões etc?

Esta semana tive a oportunidade de conhecer o Vagrant. Um sistema que trabalha com a API do Virtual Box. Nele é possivel de uma maneira fácil criar uma máquina virtual com as caracteristicas que precisar para simular o ambiente online.

O tutorial abaixo mostra um resumo do que li a respeito para  criar uma VM com Ubuntu, python2.6, virtualenv, etc.

  1. Baixe e instale a Oracle VM Virtual Box (https://www.virtualbox.org/wiki/Downloads
  2. Baixe e instale o Ruby (http://rubyinstaller.org/downloads/
  3. Baixe o Development Kit (http://rubyinstaller.org/downloads/
    1. Installation Instructions (https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
      1. While installation is (in general) simple, please ensure you carefully follow each step below. 
      2. Preparation 
      3. If you previously installed the legacy DevKit devkit-3.4.5r3-20091110.7z, its artifacts were extracted into each Ruby installation and need to be manually removed. Remove the gcc.bat, make.bat, and sh.bat stub batch files in <RUBY_INSTALL_DIR>\bin and the <RUBY_INSTALL_DIR>\devkit subdirectory for each Ruby installation using the legacy DevKit. 
      4. If you previously installed one of the legacy self-extracting DevKit’s, follow the SFX DevKit upgrade instructions. 
    2. Download Files 
      1. The current DevKit is available at the RubyInstaller download page with older versions available at the archives page. As backup, check our GitHub downloads page. 
    3. Extract Files 
      1. Left double-click the self-extracting executable (SFX) downloaded from Step 2 and choose a directory (without spaces) to install the DevKit artifacts into. For example, C:\DevKit. NOTE: the SFX is really a 7-Zip archive with a bit of embedded magic. If you already have 7-Zip installed, you can simply right-click it and extract it’s contents as you would a normal 7z archive. In the instructions that follow, the directory that you selected is identified as <DEVKIT_INSTALL_DIR>. 
    4. Run Installation Scripts 
      1. cd <DEVKIT_INSTALL_DIR> from Step 3 above. 
      2. ruby dk.rb init to generate the config.yml file to be used later in this Step. Your installed Rubies will be listed there (only those installed by a RubyInstaller package are detected at present). 
      3. edit the generated config.yml file to include installed Rubies not automagically discovered or remove Rubies you do not want to use the DevKit with. 
      4. [optional] ruby dk.rb review to review the list of Rubies to be enhanced to use the DevKit and verify the changes you made to it are correct. 
      5. finally, ruby dk.rb install to DevKit enhance your installed Rubies. This step installs (or updates) an operating_system.rb file into the relevant directory needed to implement a RubyGems pre_install hook and a devkit.rb helper library file into <RUBY_INSTALL_DIR>\lib\ruby\site_ruby. NOTE: you may need to use the --force option to update (with backup of the originals) the above mentioned files as discussed at the SFX DevKit upgrade FAQ entry. 
    5. Test Installation 
  4. Confirm your Ruby environment is correctly using the DevKit by running gem install rdiscount --platform=ruby. RDiscount should install correctly and you should see Temporarily enhancing PATH to include DevKit... in the screen messages. Next run ruby -rubygems -e "require 'rdiscount'; puts RDiscount.new('**Hello RubyInstaller**').to_html" to confirm that the rdiscount gem is working. 
  5. Adicione o caminho da pasta bin do ruby da instalção feita no Path. Ex. C:\Ruby193\bin 
  6. Execute o comando: gem install vagrant 
  7. Antes de criar sua maquina, crie uma pasta para abrigar os arquivos de configuraçao: 
    1. mkdir vagrant-machine 
    2. cd vagrant-machine 
    3. vagrant box add lucid32 http://files.vagrantup.com/lucid32.box
    4. vagrant init lucid32 
    5. vagrant up 
    6. Acesse via ssh a maquina virtual: 
    7. pelo putty, conecte em vagrant@127.0.0.1, com a senha vagrant 
  8. Instale os pacotes de desenvolvimento: 
    1. sudo apt-get install python2.6 python2.6-dev libxml2-dev libxslt1-dev python-libxml2 python-setuptools git-core build-essential libxml2-dev libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev libgeoip-dev memcached libmemcached-dev python-mysqldb libmysqlclient16-dev python-virtualenv 
  9. Vá até a home do usuário e rode o comando abaixo para atualizar o apt-get e outros pacotes: 
    1. sudo sh postinstall.sh
    2. Vá no VagrantFile no diretorio que instalou o passo 6.a e edite. 
    3. Descomente a linha: # config.vm.forward_port 80, 8080 e configure para as portas que deseja utilizar no windows quando rodar os projetos. Ex: 
      1. config.vm.forward_port 8000, 8000 
      2. # config.vm.forward_port 9000, 9000
hasta!

terça-feira, 7 de fevereiro de 2012

Filtrar apenas os usuários staff no admin

Quando utilizamos a autenticação provida pelo django, um problema é que sempre que entramos no change list do Auth User, lá tem todos os usuários que podem fazer login, tanto no front quanto no admin.

Para isso basta colocar o código abaixo em qualquer arquivo admin.py:


from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User


class StaffAdmin(UserAdmin):
"""
Esta classe recria as propriedades do admin do model auth.User
"""
list_filter = ( 'is_active', 'is_superuser' )
date_hierarchy = 'date_joined'
save_on_top = True


def queryset(self, request):
qs = super( UserAdmin, self ).queryset( request )
qs = qs.exclude( is_staff=False )
return qs




admin.site.unregister( User )
admin.site.register( User, StaffAdmin )


Se ainda preferir deixar separado, pode criar um arquivo admin.py na raiz do projeto e incluir o nome da pasta ( fornecido no startproject ) no INSTALLED_APPS.

hasta!

terça-feira, 13 de dezembro de 2011

Integração django-ckeditor e o South

Para todos aqueles que também utilizam o South e o django-ckeditor, um poderoso editor html já integrado com o admin do django, uma dica:

Para efetuar as migrações do south, edite o arquivo fields.py dentro do seu ENV\lib\site-packages\ckeditor e adicione as seguintes linhas no fim do arquivo:


try:
    from south.modelsinspector import add_introspection_rules
    add_introspection_rules([], ["^ckeditor\.fields\.RichTextField"])
except:
    pass

Isso permitirá que vc faça as migrações sem problemas.

hasta!




segunda-feira, 7 de novembro de 2011

Permissão somente para usuários do admin (staff_member)

As vezes, algumas views requer permissões mais rígidas, como por exemplo alguma view de integração, carga, ou até mesmo para dados sigilosos.

Para tal, basta utilizar o decorator staff_member_required, que permite apenas acesso aos membos da equipe.

Para fazer uso do mesmo basta importar em seu arquivo views.py ou admin_views.py :

from django.contrib.admin.views.decorators import staff_member_required

E na view utilizar como qualquer outro decorator:

@staff_member_required
    def sua_view(request):
    #seu código aqui



hasta!

sexta-feira, 4 de novembro de 2011

Forçar incluir pelo menos um dos inlines

Normalmente temos casos que a inclusão de um determinado conteúdo, depende de outro e para facilitar a vida do usuário (e a nossa), o django possui um recurso muito interessante: O Admin Inline.

Este é util para quando, por exemplo, iremos inserir um conteúdo com múltiplas fotos, sendo que cada foto possui uma legenda.

Para tal, não precisamos disponibilizar o admin de Fotos, visto que não tem sentido nenhum o usuario inserir uma foto, fora de algum conteúdo.

Até aqui tudo tranquilo e o inline fica assim:

from models import Foto, Conteudo


class FotoInline(admin.TabularInline):
model = Foto
extra = 0


class ConteudoAdmin(admin.ModelAdmin):
       inlines = [
               FotoInline
      ]



Desta forma o django cria os inlines dentro do conteudo para inserir quantas fotos quiser.

E se, nosso layout obrigasse o conteúdo a ter pelo menos uma foto? Não precisa socar o designer a seu lado não, nem muito menos colocar campos obrigatórios de  foto e legenda no model de Conteúdo, basta utilizar um formset:


class Verifica_FK_Formset(forms.models.BaseInlineFormSet):
def is_valid(self):
return super(Verifica_FK_Formset, self).is_valid() # and not any([bool(e) for e in self.errors])


def clean(self):
count = 0
for form in self.forms:
try:
if form.cleaned_data and not form.cleaned_data.get('DELETE', False):
count += 1
except AttributeError:
pass
if count < 1:
raise forms.ValidationError('Inclua pelo menos uma linha de %s' % (self.model._meta.verbose_name,))




E alterar o seu inline para que fique da seguinte forma:


class FotoInline(admin.TabularInline):
formset = Verifica_FK_Formset
model = Foto
extra = 0

Desta forma, ao menos um item do inline de Fotos deverá ser inserido quando for inserir e/ou alterar um Conteúdo.

hasta!



terça-feira, 25 de outubro de 2011

Caught NoReverseMatch while rendering..

Algumas aplicações que utilizam do fantástico recurso de urls nomeadas, precisam ter os includes declarados no urls.py raiz do projeto.

Nem sempre a gente lembra, e acaba pegando umas telas bonitas dessa:



Basta uma conferida no arquivo urls.py da raiz e corrigir o problema incluindo as urls que faltam.


hasta!
 
Melhor visualizado em 1024x768