Páginas

sexta-feira, agosto 29, 2014

Grouping Django querysets

This is a simple tip for group or "sum" or "make a union" of Django query sets.

This is the case:

class SomeModel(models.Model):
    name = models.CharField(max_length=100)
    short= models.CharField(max_length=10)

fst_exemple = SomeModel.objects.create(
    name="Luiz Guilherme", short="LG")
scd_exemple = SomeModel.objects.create(
    name="Guilherme Silva", short="Silva")

lg_cases = SomeModel.objects.filter(short="LG")
silva_cases = SomeModel.objects.filter(short="Silva")

# getting the two cases
lg_or_silva = lg_cases | silva_cases

# starting from empty
starting_from_none = SomeModel.objects.none()

# adding cases on empty:
# Usefull for loops (this is my reason for write this)
starting_from_none |= lg_or_silva

I hope to save somebody with this.

quinta-feira, agosto 29, 2013

Creating Django permissions using South Datamigrations.

After a long time away I'm back to post (for my own information and for everybody who needs it) how to create django permissions using South datamigrations. For understanding what is Django, South and Python, follow the links in the end of this post.

First step, create a Data Migration:
python manage.py datamigration app_name name_describing_your_permission_creation

This command will generate a file like XXXX_name_describing_your_permission_creation.py. Open and edit this file. It will have a "fowards" method. Change it to be like this:

     def forwards(self, orm):
        ct = orm['contenttypes.ContentType'].objects.get(
            model='model_name', app_label='app_label')
        orm['auth.permission'].objects.get_or_create(
            content_type=ct, codename='permission_codename',
            defaults=dict(name=u'Permission Label')
        )

After create this, run this command:
python manage.py migrate your_app_name

It will apply your data migration creating permissions. You can add the backwards for your datamigration deleting the permissions:

    def backwards(self, orm):
        ct = orm['contenttypes.ContentType'].objects.get(
            model='nome_do_model', app_label='label_da_app')
        orm['auth.permission'].objects.filter(
            content_type=ct, codename='permission_codename',
        ).delete()

I found it on this page on Stack Overflow:
http://stackoverflow.com/questions/1742021/adding-new-custom-permissions-in-django

More interesting links:
[1] http://south.aeracode.org/
[2] https://www.djangoproject.com/
[3] http://www.python.org.br/wiki
[4] https://docs.djangoproject.com/en/dev/ref/django-admin/#syncdb
[5] https://docs.djangoproject.com/en/dev/topics/auth/

Criando permissões Django com South

Após muito tempo sem postar volto aqui pra registrar (pra mim mesmo e a quem interessar), como criar permissões usando South. Obviamente para entender este post é necessário conhecer o South[1], Django[2] e Python[3]. Se não preenche nenhum dos requisitos provavelmente isso vai parecer grego.

Quando criamos um model no Django e adicionamos permissões (seja no Meta ou as permissões automáticas) o comando syncdb[4] as adiciona ao .model Permission [5]. Apesar disso, quem usa o South não usa syncdb e o south, muito simpático não cria as permissões. Explicado o problema, acredito...

Com isso frequentemente acabava criando as permissões manualmente via django admin porém em um grupo de desenvolvedores isso acaba sendo trabalhoso demais por que as bases deveriam ser o mais semelhantes possível Enfim, precisava de forma simples atualizar as permissões com o South. Obviamente uma datamigration seria a solução obvia, e procurando quais seriam os dados necessários encontrei no Stack Overflow[6] a resposta:

Primeiro vamos criar a datamigration:
python manage.py datamigration nome_da_app nome_que_quiser_descrevendo_a_data_migration

Esse comando vai gerar um arquivo XXXX_nome_que_quiser_descrevendo_a_data_migration.py. Abra o arquivo para edição. Vai haver um método fowards que deve ficar assim:

    def forwards(self, orm):
        ct = orm['contenttypes.ContentType'].objects.get(
            model='nome_do_model', app_label='label_da_app')
        orm['auth.permission'].objects.get_or_create(
            content_type=ct, codename='codename_da_permission',
            defaults=dict(name=u'Label da Permission')
        )

Se quiser pode adicionar também o backwards:

    def backwards(self, orm):
        ct = orm['contenttypes.ContentType'].objects.get(
            model='nome_do_model', app_label='label_da_app')
        orm['auth.permission'].objects.filter(
            content_type=ct, codename='codename_da_permission',
        ).delete()

Espero que ajude!

[1] http://south.aeracode.org/
[2] https://www.djangoproject.com/
[3] http://www.python.org.br/wiki
[4] https://docs.djangoproject.com/en/dev/ref/django-admin/#syncdb
[5] https://docs.djangoproject.com/en/dev/topics/auth/
[6]http://stackoverflow.com/questions/1742021/adding-new-custom-permissions-in-django

domingo, agosto 30, 2009

Habilitar Python em servidor apache (Mandriva)

Estou começando agora a me aprofundar na linguagem python pra web. Obviamente, preciso testar meus scripts, mas a tarefa fica complicada sem documentação. Depois de procurar bastante, encontrei esta página que ensina os passos para várias distros, e o mandriva está entre elas. Não vou entrar em detalhes nem me aprofundar muito no assunto, mas pra quem não manja de inglês é só executar os comandos que a coisa vai estar funcionando. Abraço.

http://www.howtoforge.com/embedding-python-in-apache2-with-mod_python-debian-ubuntu-fedora-centos-mandriva-opensuse-p2

segunda-feira, outubro 13, 2008

Instalando o Mandriva Linux 2009 sem DVD

O mandriva linux 2009 free, assim como o 2008.1 vem em duas versões: em 3 CDs ou1 DVD. A versão em DVD é mais completa, e incomoda menos na instalação, com inserção e remoção do CD. Apesar disso, alguns computadores (como o meu) não têm leitor ou gravador de DVDs, o que acaba obrigando a instalação por meio de CDs. Ou obrigava. Este tutorial ensina como instalar o mandriva linux pelo disco rígido e sem grandes complicações. Vamos ao Tutorial:

Baixe o Mandriva Linux 2009 versão em DVD;


Crie um diretório na raíz de alguma partição do seu disco rígido, que não seja a partição onde será instalado o sistema. Por exemplo, se o seu disco tem uma partição para o sistema e outra para a home, crie a pasta com:

mkdir /home/mdv2009

, sendo que mdv2009 é um nome alternativo somente para a montagem da imagem do DVD. (faça isso como root).
crie um diretório temporario para receber os arquivos do DVD. este pode ser em qualquer lugar, mas, para facilitar, eu crio na /home também:

mkdir /home/temporario

Depois de criado o diretório para os arquivos, vamos montar a imagem do dvd no diretório criado

mount -o loop /caminha/do/arquivo.iso /home/temporario

Depois disso, copie os arquivos para o diretório que será usado na instalação

cp -R /home/temporario/* /home/mdv2009

o argumento "-R" é para que ele copie também os diretórios (recursivamente). Este processo pode demorar um pouco, são 4gbs de informação sendo copiados. Não cancele ou feche o terminal.

Após a cópia dos arquivos, basta criar uma entrada no grub para bootar pela imagem do dvd para iniciar a instalação. Para isso você pode usar um editor qualquer. O comando inclui o kwrite:

kwrite /boot/grub/menu.lst

No fim do arquivo inclua:

title Mandriva_2009.0
kernel (hd1,0)/mdv2009/i586/isolinux/alt0/vmlinuz
initrd (hd1,0)/mdv2009/i586/isolinux/alt0/all.rdz

sendo que 1,0 deve ser substituido pelo correspondente de suas partições, lembrando que:
0,x: zero é o numero do disco;
x,0: zero é o numero da partição.
No meu caso, o diretório está no segundo disco (1), na primeira partição (0).

/mdv2009/tmp/i586/isolinux/alt0/vmlinuz e /mdv2009/i586/isolinux/alt0/all.rdz são os arquivos que o sistema irá utilizar para bootar o instalador. /mdv2009 é o diretório que criamos para receber os arquivos, lembra?

Salve o arquivo e para iniciar a instalação reinicie o computador usando a opção criada para o boot.
Iniciando o instalador, ele mostrara um menu que contem opções de instalação. selecione HD. Ele vai perguntar qual disco e partição. Selecione segundo as suas configurações (identico ao grub). Em partição, caso tenha seguido o que disse acima, após selecionado o disco, coloque /mdv2009, ou o nome que você deu ao diretório que contem os arquivos.pressione enter e, caso esteja tudo certo, ele deverá abrir o instalador tradicional. Quando a numeração das partições está correta, o processo de configuração para a instalação a partir do disco rígido não leva mais que 10 minutos (salvo a espera pela cópia dos arquivos). Este mesmo período é ganho na instalação, bem mais rápida pelo disco ao inves do CD. Tome o cuidado de não deixar os arquivos do DVD na mesma partição do sistema, senõa o processo irá falhar. Dúvidas ou correções adicionem por favor por comentário.



ps: desculpem a ausencia de imagens... sem VM fica difícil.