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 django import forms
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!