sábado, 26 de abril de 2014

Instalação do Vagrant no Windows com instalador MSI

Instalar o vagrant no windows agora ficou muito mais fácil. Diferente de todos os passos vistos em Instalação do Vagrant no windows, agora tem um instalador.

Tentei instalar seguindo os passos do tutorial anterior e recebi uma mensagem de aviso dizendo que o Vagrant agora não era mais recomendado baixar como uma ruby gem, e esta não terá mais suporte nem atualizações. Ainda é possível instalar segundo os passos da mensagem, mas este não é o objetivo deste tutorial.

Vamos lá.

  1. Baixe e instale o Oracle Virtual Box no link https://www.virtualbox.org/wiki/Downloads
  2. Adicione o caminho da instalação no PATH do windows.
  3. Baixe e instale o instalador para sua windows no link http://www.vagrantup.com/downloads
  4. Crie uma pasta chamada vagrant-machine no disco C (C:) para facilitar o acesso via prompt.
  5. Abra o promt de comando (cmd) e acesse a pasta recém criada:
    1. cd c:\vagrant-machine
  6. Execute os comandos:
    1. vagrant init hashicorp/precise32
      1. Este comando criará o Vagrantfile
    2. vagrant up
      1. Este comando colocará a maquina virtual em execução
    3. sudo apt-get install 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
    4. sudo apt-get update
    5. sudo apt-get install python-virtualenv
    6. sudo apt-get build-dep python-imaging
    7. sudo sh postinstall.sh
    8. Abra o arquivo Vagrantfile dentro de C:\vagrant-machine e descomente a linha
      1. config.vm.network "forwarded_port", guest: 80, host: 8080
    9. Adicione abaixo portas extras
      1. config.vm.network "forwarded_port", guest: 8000, host: 8000
      2. config.vm.network "forwarded_port", guest: 8001, host: 8001
      3. config.vm.network "forwarded_port", guest: 8002, host: 8002
    10. Adicione abaixo de
      # config.vm.synced_folder "../data", "/vagrant_data":
      1.  
        config.vm.synced_folder "../wamp/www", "/projetos"
    11. sudo apt-get install git
    12. Crie o ENV 
      1. virtualenv --no-site-packages --unzip-setuptools django16
    13. Ligar o ENV
      1. . django16/bin/activate
    14. Instale primeiro o driver do MySQL que é o que dá mais trabalho:
      1. sudo apt-get build-dep python-mysqldb
      2. sudo pip install MySQL-python
    15. Alguns aplicativos uteis:
      1. BeautifulSoup==3.2.1
      2. Django==1.6.3
      3. Fabric==1.8.3
      4. MySQL-python==1.2.5
      5. PIL==1.1.7
      6. Pillow==2.4.0
      7. South==0.8.4
      8. argparse==1.2.1
      9. distribute==0.6.24
      10. django-appconf==0.6
      11. django-ckeditor-updated==4.2.8
      12. django-compressor==1.3
      13. django-localflavor==1.0
      14. django-pagination==1.0.7
      15. django-simple-captcha==0.4.2
      16. django-subdomains==2.0.4
      17. easy-thumbnails==2.0.1
      18. ecdsa==0.11
      19. paramiko==1.12.3
      20. pycrypto==2.6.1
      21. simplejson==3.4.0
      22. six==1.6.1
      23. sorl-thumbnail==11.12.1b
      24. wsgiref==0.1.2
    16. Salve esta lista num arquivo txt(requirements.txt) e execute o comando:
      1. pip install -r requirements.txt

quarta-feira, 16 de abril de 2014

error: command 'cc' failed with exit status 1

Problemas para instalação das libs do python no ENV no Mavericks?

Com o ENV ligado, se a instalação de algum pacote apresentar o seguinte erro:

error: command 'cc' failed with exit status 1

Execute estas duas linhas no seu shell:

export CFLAGS=-Qunused-arguments

export CPPFLAGS=-Qunused-arguments


Essas exportações dizem ao compilador para ignorar argumentos não utilizados, em vez de reclamar sobre eles.

A razão parece ser que Python compila módulos usando as opções com que ele foi construído, exceto uma dessas opções não funciona mais em mavericks.

Agora é só instalar suas libs normalmente com o pip.


hasta!

quinta-feira, 10 de abril de 2014

Como fazer um filtro personalizado pro admin do Django com o SimpleListFilter

Muitas vezes os filtros automáticos que o admin do django faz são muito úteis. Contudo há momentos que simplesmente colocar o nome do atributo no list_filter não atende. Pra esses momentos temos o SimpleListFilter. 

Ano de Copa, álbuns de figurinhas à venda, suponhamos que, assim como eu, você tenha feito (ou queira fazer)  um sistema pra gerenciamento das figurinhas da Panini.

O models.py ficaria assim:

# coding: utf-8
from django.db import models
class Figurinha(models.Model):
 """(Figurinha description)"""
 numero = models.CharField(max_length=3, verbose_name=u'Número')
 quantidade = models.IntegerField(default=0)
 especial = models.BooleanField(default=False, help_text='Figurinhas brilhantes e/ou diferenciadas')
 data = models.DateTimeField(null=True, blank=True, auto_now=True, verbose_name=u'Modificação')

 class Meta:
  ordering = ('id',)

 def __unicode__(self):
  return self.numero



Algumas explicações antes de continuarmos:

  • Número é sim um CharField, pois neste álbum existem figurinhas alfanuméricas (J1, J2, J3, J4, L1, L2, L3, L4 e W1)
  • Quantidade será o campo atualizável, onde 0 são as figurinhas que faltam, 1 pra colada no álbum e maiores que 1 pra quantidade de repetidas. Ex: Quantidade = 2, são 1 no álbum e 1 repetida.
  • Data será atualizada a cada atualização da figurinha para que seja possível emitir a data da ultima atualização da lista

E o admin.py :

class StatusListFilter(admin.SimpleListFilter):
 # Human-readable title which will be displayed in the
 # right admin sidebar just above the filter options.
 title = 'Status'

 # Parameter for the filter that will be used in the URL query.
 parameter_name = 's'

 def lookups(self, request, model_admin):
  """
  Returns a list of tuples. The first element in each
  tuple is the coded value for the option that will
  appear in the URL query. The second element is the
  human-readable name for the option that will appear
  in the right sidebar.
  """
  return (
   ('falta', 'Falta'),
   ('tenho', 'Tenho'),
   ('repetida', 'Repetida'),
  )

 def queryset(self, request, queryset):
  """
  Returns the filtered queryset based on the value
  provided in the query string and retrievable via
  `self.value()`.
  """
  # Compare the requested value (either '80s' or 'other')
  # to decide how to filter the queryset.
  if self.value() == 'falta':
   return queryset.filter(quantidade=0)
  elif self.value() == 'tenho':
   return queryset.filter(quantidade__gt=0)
  elif self.value() == 'repetida':
   return queryset.filter(quantidade__gt=1)

class FigurinhaAdmin(admin.ModelAdmin):
 search_fields = ('numero',)
 list_display = ('numero','quantidade','especial','data')
 list_filter = ['quantidade','especial','data',StatusListFilter]
 list_editable = ['quantidade',]
 date_hierarchy = 'data'
 readonly_fields = ['numero','especial',]
 save_on_top = True

 fieldsets = (
  (u'Número', {'fields': ('numero',)}),
  ('Quantidade', {'fields': ('quantidade',)}),
  ('Especial', {'fields': ('especial',)}),
 )

admin.site.register(Figurinha, FigurinhaAdmin)


Para mais informações sobre o SimpleListFilter, consulte https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

hasta!