Publicado em python, turbogears

CPFValidator

Quando eu estava desenvolvendo o Sistema de Consignações da Prefeitura de Teresina, codinome Moréia, na Prodater, precisei validar alguns campos que eram preenchidos com CPF. Logo fui atrás do que já existia na comunidade. Encontrei um módulo para validar CPF no CookBook do PythonBrasil, a maior comunidade pythonista do Brasil. Peguei aquele módulo e o coloquei dentro do pacote do projeto e depois fiz o código do CPFValidator que dependia do código do Pedro Werneck.

Fica rapidamente claro que a forma como organizei não oferece chances para reaproveitamento de código nos moldes tradicionais. Estava seguindo um outro padrão chamado RCP Pattern da Programação Orientada a Gambiarras. A verdade é que quebrou um galhão 🙂

Nesses dias recentes quando estudava a construção de plugins em Python voltei a me interessar em criar um pacote para a validação de CPF. Isso sendo uma prévia para um desafio maior. Vou aqui apenas demonstrar como usar o validador de CPF no Turbogears além de demonstrar a facilidade de obter pacotes em Python (a exemplos das linguagens Perl e Ruby), então mãos à obra.

Estou supondo que você já tem o TurboGears instalado em sua máquina. Se não, recomendo que visitem o seguinte link para ver como baixar e instalar. Após isso vamos criar a estrutura do nosso projeto (num terminal Linux, Mac OS X ou Windows):

tg-admin quickstart

Chame o projeto e o pacote de cpf_teste. Escolha não para a instalação do identity. Após isso temos uma estrutura de pastas e arquivos para nosso projeto.

Antes de continuarmos, baixemos o CPFValidator com “easy_install CPFValidator”. Além do CPFValidator, também será baixado o pacote CPF.

Com um editor de sua preferência abra o arquivo cpf_teste/controllers.py. Antes da classe Root coloque o seguinte:

from turbogears import widgets

from turbogears.validators import NotEmpty

from cpfvalidator import CPFValidator

class PessoaFields(widgets.WidgetsList):

nome = widgets.TextField(label=’Nome’, validator = NotEmpy())

cpf = widgets.TextField(label=’CPF’, validator = CPFValidator())

pessoa_form = widgets.TableForm(fields = PessoaFields())

class Root(controllers.RootController):

@expose(template = ‘cpf_teste.templates.welcome’)

def index(self, tg_errors = None):

return dict(form = pessoa_form)

@expose()

@validate(form= pessoa_form)

@turbogears.error_handler(index)

def cadastrar(self, **kw):

turbogears.flash(‘Cadastrado com sucesso!’)

raise redirect(‘/’)

Bom, agora temos de editar o arquivo templates/welcome.kid. Basta apagar o conteúdo do BODY e colocar:

${form.display(action = ‘cadastrar’)}

Após isso, execute o arquivo start-cpf_teste.py e no navegador vá ao endereço: http://localhost:8080/ . Teste então se o formulário estar sendo validado corretamente.

É isso! Quaisquer dúvidas bastar comentar o post.

Anúncios

5 comentários em “CPFValidator

  1. Olá, Paulo Nunes

    O Sistema de Consignação que eu estava desenvolvendo foi descontinuado. Depois eu verificarei se ainda tenho os fontes do projeto em algum lugar. Recentemente, minha máquina foi para a assistência técnica e talvez volte sem muita coisa no HD.

  2. Algum problema no arquivo?

    Searching for cpfvalidator
    Reading http://cheeseshop.python.org/pypi/cpfvalidator/
    Couldn’t find index page for ‘cpfvalidator’ (maybe misspelled?)
    Scanning index of all packages (this may take a while)
    Reading http://cheeseshop.python.org/pypi/
    Reading http://cheeseshop.python.org/pypi/CPFValidator/0.1b4
    Reading https://claudiotorcato.wordpress.com
    No local packages or download links found for cpfvalidator
    error: Could not find suitable distribution for Requirement.parse(‘cpfvalidator’)

  3. Andei fazendo testes em planilha para entender o algoritmo e consegui chegar a esta forma bem concisa.

    CPF = [0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
    CNPJ = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];

    def calcDigit(str, factors, size, first):
    digit = sum(int(str[i]) * factors[first+i] for i in range(size)) % 11;
    if 11 – digit < 10:
    return 11 – digit
    else:
    return 0

    def checkVDs(str, factors):
    d1 = calcDigit(str, factors, len(str) – 2, 1)
    d2 = calcDigit(str, factors, len(str) – 1, 0)
    return d1 *10 + d2 == int(str[-2:])

    def checkCPF(str):
    return checkVDs(str, CPF)

    def checkCNPJ(str):
    return checkVDs(str, CNPJ)

    if __name__ == ‘__main__’:
    print(checkCPF(‘00000000000’))
    print(checkCNPJ(‘00000000000000’))

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s