You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

109 lines
3.6 KiB

MODELO
======
Modelo das entidades e como elas se relacionam.
Nenhum dos campos deve permitir acentos e/ou cedilhas.
Todas as entidades devem referenciar uma Fonte de Dados, de forma a evitar
redundancia de dados (com o objetivo de melhorar o desempenho e possibilitar
o uso de cache de persistencia de dados serializados).
>>> from pynfe.entidades import FonteDados
>>> fonte_dados = FonteDados()
Nao eh da funcao do PyNFe efetuar a persistencia dos objetos, mas a classe
FonteDados deve facilitar esse processo ao software que for implementa-la.
>>> hasattr(FonteDados, 'carregar_objetos')
True
>>> from pynfe.entidades import Emitente
Populando fonte de dados com objetos
>>> bool(Emitente(cnpj='12.345.678/0001-90', _fonte_dados=fonte_dados))
True
>>> bool(Emitente(razao_social='JKL Calcados Ltda.', _fonte_dados=fonte_dados))
True
>>> bool(Emitente(razao_social='JKL Calcados Ltda.', _fonte_dados=fonte_dados))
True
O metodo carregar_objetos pode ser sobrecarregado para alterar o carregamento de
objetos da memoria para forcar mocking ou para carregar de camada persistente.
Ele sempre retorna uma lista de objetos, independente se vazia ou com qualquer
quantidade de objetos.
>>> def carregar_objetos(self, **kwargs):
... if kwargs.get('cnpj', None) == 'xxx':
... return ['encontrado!']
...
... return self.antigo_carregar_objetos(**kwargs)
Substituindo metodo 'carregar_objetos'
>>> fonte_dados.antigo_carregar_objetos = fonte_dados.carregar_objetos
>>> import new
>>> fonte_dados.carregar_objetos = new.instancemethod(carregar_objetos, fonte_dados, FonteDados)
>>> fonte_dados.obter_objeto(cnpj='xxx')
'encontrado!'
O metodo 'obter_objeto' retorna um unico objeto que atende aos atributos informados.
O argumento especial '_classe' eh utilizado para indicar que a classe da entidade eh
a atribuida a esse argumento.
>>> emitente = fonte_dados.obter_objeto(cnpj='12.345.678/0001-90', _classe=Emitente)
>>> isinstance(emitente, Emitente)
True
Caso nenhum objeto seja encontrado, uma excecao deve ser levantada.
>>> from pynfe.excecoes import NenhumObjetoEncontrado
>>> try:
... fonte_dados.obter_objeto(cnpj='98.765.432/0001-10', _classe=Emitente)
... except NenhumObjetoEncontrado, e:
... print e.message
Nenhum objeto foi encontrado!
Caso mais de um objeto sejam encontrados, uma excecao deve ser levantada tambem.
>>> from pynfe.excecoes import MuitosObjetosEncontrados
>>> try:
... fonte_dados.obter_objeto(razao_social='JKL Calcados Ltda.', _classe=Emitente)
... except MuitosObjetosEncontrados, e:
... print e.message
Muitos objetos foram encontrados!
O metodo 'obter_lista' retorna uma lista de objetos, mesmo que vazia.
>>> len(fonte_dados.obter_lista(razao_social='JKL Calcados Ltda.'))
2
>>> len(fonte_dados.obter_lista(razao_social='Inexistente S/A'))
0
Qualquer entidade que for instanciada deve ser acrescentada automaticamente a lista de
objetos da Fonte de Dados, atraves de um metodo especifico pra isso
>>> conta_antes = fonte_dados.contar_objetos()
>>> emitente = Emitente(razao_social='Emitente Novo', _fonte_dados=fonte_dados)
>>> fonte_dados.contar_objetos() - conta_antes
1
O contador de objetos retorna a quantidade de instancias que casem com os argumentos passados
>>> fonte_dados.contar_objetos(_classe=Emitente, razao_social='Emitente Novo')
1
Permitir tambem remover objetos (que por padrao remove apenas da lista da memoria e nao
eh persistente.
>>> fonte_dados.remover_objeto(emitente)