All work and no play makes Jack a dull boy

quarta-feira, 16 de outubro de 2013

Verifica se usuário está no grupo

Como verificar se o usuário está em um grupo específico no Django? E como fazer isso em forma de decorator?

Vamos lá:
from django.contrib.auth.decorators import user_passes_test


def esta_no_grupo_Alunos(user):

    return user.is_authenticated() and not user.groups.filter(name='Alunos').exists()


@user_passes_test(esta_no_grupo_Alunos, login_url='/login/')

def nome_da_view(request):

    # código da sua view

Use com o user_passes_test para restringir acesso a usuários autenticados e que estejam no grupo.

O decorator user_passes_test tem um argumento obrigatório: um objeto User e retorna True, caso o usuário tenha permissão. Como user_passes_test não verifica automaticamente se o usuário está logado, então foi necessário incluir essa verificação.

Como bem notou Luan Fonseca, no Facebook, perceba que, para o caso de redirecionar para login, você pode muito bem usar o decorator @login_required antes do user_passes_test e remover o is_authenticated() da função.

sexta-feira, 11 de outubro de 2013

grep em tipos de arquivos

Imagina que você está em um projeto Django eu precisa buscar por 'ajax' em todos os arquivos, exceto os arquivos javascript .

Como fazer grep em certos tipos de arquivos?

$ grep 'ajax' --exclude=*.js -Rn ./

nesse caso inclui, por costume, os parâmetros R e n:
- R ou r é para buscar recursivamente
- n mostra o número da linha

Caso o grep apenas em arquivos python:

$ grep 'ajax' --include=*.py -Rn ./

terça-feira, 1 de outubro de 2013

dict comprehension

Sim, existe uma forma de fazer um comprehension para dicionários e, pasme, até há uma PEP para isso.

A sintaxe é bem simples:
{ i : chr(65+i) for i in range(26) }

Assim, você acabou de criar um dicionários com as letras do alfabeto:
{0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J', 10: 'K', 11: 'L', 12: 'M', 13: 'N', 14: 'O', 15: 'P', 16: 'Q', 17: 'R', 18: 'S', 19: 'T', 20: 'U', 21: 'V', 22: 'W', 23: 'X', 24: 'Y', 25: 'Z'}

Você também chegaria no mesmo resultado se fizesse da seguinte maneira:
dict([ (i, chr(65+i)) for i in range(26) ])

=]