source: publico/il.spdo/trunk/il/spdo/db.py @ 5574

Última Alteração nesse arquivo desde 5574 foi 5574, incluída por fabianosantos, 8 anos atrás

Nesse commit reside 90% da inteligencia desse sistema. Adicionado algoritmos de tramitacao inicial, de envio, de recebimento e recuperacao de protocolos enviados e nao recebidos. Adicionadas tabelas que representam o inbox e outbox das áreas. Adiciona coluna na tabela de tramitacao para armazenar a área anterior de um tramite, util para implementar a recuperacao e atualizacao de inbox e outbox no momento do recebimento. Todos os metodos recebem listas de identificadores de protocolos, para permitir a tramitacao em lote, desobrigando o usuario a tramitar protocolo por protocolo, dando agilidade ao sistema.

File size: 21.4 KB
Linha 
1# -*- coding: utf-8 -*-
2
3from zope.interface import implements
4from sqlalchemy import create_engine, Table, Column, Integer, String, DateTime, Text, Boolean, ForeignKey, func
5from sqlalchemy.orm import relationship, backref, sessionmaker
6from sqlalchemy.ext.declarative import declarative_base
7from il.spdo.config import DEFAULT_DSN, TABLE_ARGS, CREATE_ALL_TABLES, CREATE_SAMPLES, LOTS_OF_SAMPLES, Session
8from il.spdo import interfaces
9from il.spdo.history_meta import VersionedMeta, VersionedListener
10from random import choice
11import datetime
12import string
13import math
14import sys
15from zExceptions import Forbidden
16
17Base = declarative_base(metaclass=VersionedMeta)
18
19if __name__ == '__main__':
20    engine = create_engine(DEFAULT_DSN)
21    Session = sessionmaker(bind=engine, extension=VersionedListener())
22
23def nextVersion(tabela, **kw):
24    session = Session()
25    clausula_where = ''
26    if kw:
27        # Xiru: proteção contra SQL Injection
28        for v in kw.values():
29            try:
30                int(v)
31            except ValueError:
32                raise Forbidden
33        clausula_where = 'where ' + " and ".join(["%s=%s" % (k, str(v)) for k, v in kw.items()])
34    max_version = session.bind.execute('SELECT max(version) from %s_history %s' % (tabela, clausula_where)).fetchone()[0]
35    return max_version is None and 1 or (max_version + 1)
36
37class Area(Base):
38    implements(interfaces.IArea)
39    __tablename__ = 'area'
40    __table_args__ = TABLE_ARGS
41    id = Column(Integer, primary_key=True)
42    sigla = Column(String(20), unique=True, nullable=False)
43    nome = Column(String(100), unique=True, nullable=False)
44    chefia_id = Column(Integer, ForeignKey('area.id'))
45    chefia = relationship("Area", backref=backref('area', remote_side=id))
46
47class UF(Base):
48    implements(interfaces.IUF)
49    __tablename__ = 'uf'
50    __table_args__ = TABLE_ARGS
51    id = Column(Integer, primary_key=True)
52    sigla = Column(String(2), unique=True, nullable=False)
53    nome = Column(String(40), unique=True, nullable=False)
54
55def geraSenha(tamanho):
56    chars = string.letters + string.digits
57    s = ""
58    for i in range(tamanho):
59        s += choice(chars)
60    return s
61
62class Pessoa(Base):
63    implements(interfaces.IPessoa)
64    __tablename__ = 'pessoa'
65    __table_args__ = TABLE_ARGS
66    id = Column(Integer, primary_key=True)
67    nome = Column(String(100), nullable=False)
68    email = Column(String(50), unique=True, nullable=False)
69    endereco = Column(String(100))
70    bairro = Column(String(30))
71    cep = Column(String(8))
72    cidade = Column(String(50))
73    uf_id = Column(Integer, ForeignKey('uf.id'))
74    uf = relationship("UF", backref="pessoa")
75    telefone = Column(String(30))
76    cpf_cnpj = Column(String(20))
77    tipopessoa = Column(String(1), nullable=False)
78    contato = Column(String(100))
79    area_id = Column(Integer, ForeignKey('area.id'))
80    area = relationship("Area", backref="pessoa")
81    senha = Column(String(20), nullable=False)
82   
83    def __init__(self, nome, email, endereco=None, bairro=None, cep=None, cidade=None, uf_id=None,
84                 telefone=None, cpf_cnpj=None, tipopessoa='F', contato=None, area_id=None):
85        self.nome = nome
86        self.email = email
87        self.endereco = endereco
88        self.bairro = bairro
89        self.cep = cep
90        self.cidade = cidade
91        self.uf_id = uf_id
92        self.telefone = telefone
93        self.cpf_cnpj = cpf_cnpj
94        self.tipopessoa = tipopessoa
95        self.contato = contato
96        self.area_id = area_id
97        self.senha = geraSenha(8)
98
99    def __repr__(self):
100        return "<Pessoa:%s>" % self.email
101
102class Responsavel(Base):
103    implements(interfaces.IResponsavel)
104    __tablename__ = 'responsavel'
105    __table_args__ = TABLE_ARGS
106    id = Column(Integer, primary_key=True)
107    area_id = Column(Integer, ForeignKey('area.id'))
108    area = relationship("Area", backref="resposavel")
109    pessoa_id = Column(Integer, ForeignKey('pessoa.id'))
110    pessoa = relationship("Pessoa", backref="responsavel")
111    data_responsavel = Column(DateTime(), default=datetime.date.today(), nullable=False)
112
113class TipoDocumento(Base):
114    implements(interfaces.ITipoDocumento)
115    __tablename__ = 'tipodocumento'
116    __table_args__ = TABLE_ARGS
117    id = Column(Integer, primary_key=True)
118    nome = Column(String(40), unique=True, nullable=False)
119
120class Situacao(Base):
121    implements(interfaces.ISituacao)
122    __tablename__ = 'situacao'
123    __table_args__ = TABLE_ARGS
124    id = Column(Integer, primary_key=True)
125    nome = Column(String(40), unique=True, nullable=False)
126    inicial = Column(Boolean(), default=False)
127    final = Column(Boolean(), default=False)
128
129class PessoaOrigem(Base):
130    implements(interfaces.IPessoaOrigem)
131    __tablename__ = 'pessoa_origem'
132    __table_args__ = TABLE_ARGS
133    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
134    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
135    pessoa = relationship("Pessoa", backref="pessoa_origem")
136
137class TipoEntrega(Base):
138    implements(interfaces.ITipoEntrega)
139    __tablename__ = 'tipoentrega'
140    __table_args__ = TABLE_ARGS
141    id = Column(Integer, primary_key=True)
142    nome = Column(String(40), unique=True, nullable=False)
143
144class PessoaDestino(Base):
145    implements(interfaces.IPessoaDestino, interfaces.IEntrega)
146    __tablename__ = 'pessoa_destino'
147    __table_args__ = TABLE_ARGS
148    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
149    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
150    pessoa = relationship("Pessoa", backref="pessoa_destino")
151    tipoentrega_id = Column(Integer, ForeignKey('tipoentrega.id'))
152    tipoentrega = relationship("TipoEntrega", backref="pessoa_destino")
153    data_entrega = Column(DateTime())
154    objeto_correios = Column(String(20))
155
156class Observacao(Base):
157    implements(interfaces.IObservacao)
158    __tablename__ = 'observacao'
159    __table_args__ = TABLE_ARGS
160    id = Column(Integer, primary_key=True)
161    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
162    texto = Column(Text(), nullable=False)
163    data_observacao = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
164    usuario = Column(String(50), nullable=False)
165
166class Anexo(Base):
167    implements(interfaces.IAddAnexo)
168    __tablename__ = 'anexo'
169    __table_args__ = TABLE_ARGS
170    id = Column(Integer, primary_key=True)
171    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
172    arquivo = Column(Text(), nullable=False)
173    tamanho = Column(Integer(), nullable=False)
174    data_anexo = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
175    usuario = Column(String(50), nullable=False)
176
177"""
178Há 3 tabelas que merecem alguns comentários, pois seu funcionamento
179não é trivial. A tabela "Tramite" armazena o histórico da tramitação
180de um protocolo. As tabelas TramiteInbox e TramiteOutbox podem ser
181encaradas como estruturas auxiliares. A tabela "TramiteInbox" simula a
182caixa de entrada de uma determinada área, armazenando referências para
183todos os protocolos recebidos. Por sua vez, a tabela "TramiteOutbox"
184simula a caixa de saída, armazenando referências para todos os
185protocolos enviados enviados e ainda não recebidos.
186"""
187
188class Tramite(Base):
189    implements(interfaces.IAddTramite)
190    __tablename__ = 'tramite'
191    __table_args__ = TABLE_ARGS
192    id = Column(Integer, primary_key=True)
193    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
194    area_id = Column(Integer, ForeignKey('area.id'))
195    area = relationship("Area", primaryjoin=(area_id==Area.id), backref="tramite")
196    data_disponibilizacao = Column(DateTime())
197    data_recebimento = Column(DateTime())
198    acao = Column(Text())
199    copia = Column(Boolean(), default=False)
200    area_id_anterior = Column(Integer, ForeignKey('area.id'))
201    area_anterior = relationship("Area", primaryjoin=(area_id_anterior==Area.id), backref="tramite_anterior")
202    responsavel_id = Column(Integer, ForeignKey('responsavel.id'))
203    responsavel = relationship("Responsavel", backref="tramite")
204    usuario = Column(String(50), nullable=False)
205
206    def __init__(self, protocolo_id, area_id, data_disponibilizacao, data_recebimento, acao, usuario, copia=False, area_id_anterior=None):
207        self.protocolo_id = protocolo_id
208        self.area_id = area_id
209        self.data_disponibilizacao = data_disponibilizacao
210        self.data_recebimento = data_recebimento
211        self.acao = acao
212        self.copia = copia
213        self.area_id_anterior = area_id_anterior
214        # o responsável pelo tramite é o responsável atual da área de destino
215        session = Session()
216        query = session.query(Responsavel.id).filter(Responsavel.area_id==area_id)
217        self.responsavel_id = query.order_by(Responsavel.data_responsavel).all()[-1][0]
218        self.usuario = usuario
219
220def calculaDigitoVerificador(seq, ano):
221    return int(math.log(seq + ano) * 10000) % 100
222
223class Protocolo(Base):
224    implements(interfaces.IAddProtocolo,
225               interfaces.IEditProtocolo,
226               interfaces.IApenso)
227    __tablename__ = 'protocolo'
228    __table_args__ = TABLE_ARGS
229    id = Column(Integer, primary_key=True)
230    tipoprotocolo = Column(String(1), nullable=False)
231    seq = Column(Integer, nullable=False)
232    ano = Column(Integer, nullable=False)
233    dv = Column(Integer, nullable=False)
234    numero = Column(String(20), unique=True, nullable=False)
235    data_protocolo = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
236    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
237    tipodocumento = relationship("TipoDocumento", backref="protocolo")
238    numero_documento = Column(String(20))
239    data_emissao = Column(DateTime())
240    assunto = Column(String(100), nullable=False)
241    situacao_id = Column(Integer, ForeignKey('situacao.id'))
242    situacao = relationship("Situacao", backref="protocolo")
243    apenso_id = Column(Integer, ForeignKey('protocolo.id'))
244    apenso = relationship("Protocolo", backref=backref('apensado', remote_side=id))
245    pessoa_origem = relationship("PessoaOrigem", backref="pessoa_origem")
246    pessoa_destino = relationship("PessoaDestino", backref="pessoa_destino")
247    observacao = relationship("Observacao", backref="protocolo")
248    anexo = relationship("Anexo", backref="protocolo")
249    tramite = relationship("Tramite", backref="protocolo")
250    usuario = Column(String(50), nullable=False)
251   
252    def __init__(self, tipoprotocolo, tipodocumento_id, numero_documento, data_emissao, assunto, situacao_id, usuario):
253        self.tipoprotocolo = tipoprotocolo
254        self.tipodocumento_id = tipodocumento_id
255        self.numero_documento = numero_documento
256        self.data_emissao = data_emissao
257        self.assunto = assunto
258        self.situacao_id = situacao_id
259        self.usuario = usuario
260        session = Session()
261
262        # TODO: isso não poderia ser feito dessa maneira, pois desconsidera o session e requer um commit ao invez de um flush
263        self.ano = datetime.datetime.now().year
264        max_seq = session.bind.execute('SELECT max(p.seq) from protocolo p where p.ano = %d' % self.ano).fetchone()[0]
265        self.seq = max_seq is None and 1 or max_seq + 1
266        self.dv = calculaDigitoVerificador(self.seq, self.ano)
267        self.numero = "%s-%08d/%04d-%02d" % (tipoprotocolo, self.seq, self.ano, self.dv)
268
269    def __repr__(self):
270        return "<Protocolo:%s>" % self.numero
271
272class TramiteInbox(Base):
273    __tablename__ = 'tramite_inbox'
274    __table_args__ = TABLE_ARGS
275    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
276    protocolo = relationship("Protocolo", backref="tramite_inbox")
277    area_id = Column(Integer, ForeignKey('area.id'), primary_key=True)
278    area = relationship("Area", backref="tramite_inbox")
279
280class TramiteOutbox(Base):
281    __tablename__ = 'tramite_outbox'
282    __table_args__ = TABLE_ARGS
283    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
284    protocolo = relationship("Protocolo", backref="tramite_outbox")
285    area_id = Column(Integer, ForeignKey('area.id'), primary_key=True)
286    area = relationship("Area", backref="tramite_outbox")
287
288class Referencia(Base):
289    implements(interfaces.IAddReferencia)
290    __tablename__ = 'referencia'
291    __table_args__ = TABLE_ARGS
292    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
293    protocolo = relationship("Protocolo", primaryjoin=(protocolo_id==Protocolo.id), backref="protocolo")
294    referencia_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
295    referencia = relationship("Protocolo", primaryjoin=(referencia_id==Protocolo.id), backref="referencia")
296
297class Notificacao(Base):
298    implements(interfaces.IAddNotificacao)
299    __tablename__ = 'notificacao'
300    __table_args__ = TABLE_ARGS
301    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
302    pessoa = relationship("Pessoa", backref="notificacao")
303    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
304    protocolo = relationship("Protocolo", backref="notificacao")
305
306class Transicao(Base):
307    implements(interfaces.IAddTransicao)
308    __tablename__ = 'transicao'
309    __table_args__ = TABLE_ARGS
310    id = Column(Integer, primary_key=True)
311    fluxo_id = Column(Integer, ForeignKey('fluxo.id'))
312    area_origem_id = Column(Integer, ForeignKey('area.id'))
313    area_origem = relationship("Area", primaryjoin=(area_origem_id==Area.id), backref="area_origem")
314    area_destino_id = Column(Integer, ForeignKey('area.id'))
315    area_destino = relationship("Area", primaryjoin=(area_destino_id==Area.id), backref="area_destino")
316
317class Fluxo(Base):
318    implements(interfaces.IFluxo)
319    __tablename__ = 'fluxo'
320    __table_args__ = TABLE_ARGS
321    id = Column(Integer, primary_key=True)
322    nome = Column(String(40), unique=True, nullable=False)
323    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'), unique=True, nullable=False)
324    tipodocumento = relationship("TipoDocumento", backref="fluxo")
325    flexivel = Column(Boolean(), default=False)
326    transicao = relationship("Transicao", backref="fluxo")
327
328class Log(Base):
329    __tablename__ = 'log'
330    __table_args__ = TABLE_ARGS
331    id = Column(Integer, primary_key=True)
332    usuario = Column(String(50), nullable=False)
333    url = Column(Text(), nullable=False)
334    modulo = Column(Text())
335    classe = Column(Text())
336    funcao = Column(Text())
337    args = Column(Text())
338    kwargs = Column(Text())
339
340if __name__ == '__main__':
341
342    if CREATE_ALL_TABLES:
343        metadata = Base.metadata
344        metadata.drop_all(engine)
345        metadata.create_all(engine)
346
347    if not CREATE_SAMPLES:
348        sys.exit()
349
350    session = Session()
351
352    # Area
353    a1 = Area(sigla='t1', nome='Teste1')
354    session.add(a1)
355    session.flush()
356    a2 = Area(sigla='t2', nome='Teste2', chefia_id=a1.id)
357    session.add(a2)
358    session.flush()
359    a3 = Area(sigla='t3', nome='Teste3', chefia_id=a2.id)
360    session.add(a3)
361    session.flush()
362
363    # UF
364    UFs = """
365          AC Acre
366          AL Alagoas
367          AP Amapá
368          AM Amazonas
369          BA Bahia
370          CE Ceará
371          DF Distrito Federal
372          ES Espirito Santo
373          GO Goiás
374          MA Maranhão
375          MT Mato Grosso
376          MS Mato Grosso do Sul
377          MG Minas Gerais
378          PA Pará
379          PB Paraíba
380          PR Paraná
381          PE Pernanbuco
382          PI Piauí
383          RJ Rio de Janeiro
384          RN Rio Grande do Norte
385          RS Rio Grande do Sul
386          RO Rondônia
387          RR Roraima
388          SC Santa Catarina
389          SP São Paulo
390          SE Sergipe
391          TO Tocantins
392          """
393    UFs = [{'sigla':uf.strip().split()[0],
394            'nome':" ".join(uf.strip().split()[1:])} \
395            for uf in UFs.split('\n') if uf.strip()]
396    for uf in UFs:
397        uf1 = UF(sigla=uf['sigla'], nome=uf['nome'])
398        session.add(uf1)
399
400    # Pessoa
401    ps1 = Pessoa(u'Xiru', u'xiru@xiru.org', area_id=a1.id)
402    session.add(ps1)
403    ps2 = Pessoa(u'Tião Macalé', u'tiao@macale.net', area_id=a2.id)
404    session.add(ps2)
405    ps3 = Pessoa(u'ZÉ Pequeno', u'john@small.org', 'Rua dos bobos, 0', 'Centro', 95096000,
406                 'Caxias do Sul', 1, '54 3226.1234', '12312312312', 'F', 'Baiano', a3.id)
407    session.add(ps3)
408    ps4 = Pessoa(u'BOPE', 'cpt.nascimento@bope.gov.br', 'Morro dos Caveiras, 100', u'Favela do Alemão', 12312000,
409                 'Rio de Janeiro', 1, '11 1212.1234', '12312312312', 'O', u'Capitão Nascimento', a3.id)
410    session.add(ps4)
411    if LOTS_OF_SAMPLES:
412        for i in xrange(1000):
413            psN = Pessoa(u'Teste %s...' % str(i), u'xiru%s@xiru.org' % str(i), area_id=a1.id)
414            session.add(psN)
415
416    session.flush()
417
418    # BUG: a pessoa com id = 1 deve ser apagada pois o plone.formwidget.autocomplete
419    # não funciona como esperado com esse registro. No futuro esse widget precisará
420    # ser reescrito utilizando http://docs.jquery.com/UI/Autocomplete
421    session.delete(ps1)
422
423    # Para facilitar os testes, a senha da pessoa com id = 2 é trocada para 12345
424    ps2.senha = '12345'
425
426    # Responsavel
427    re1 = Responsavel(area_id=a1.id, pessoa_id=ps2.id)
428    session.add(re1)
429    re2 = Responsavel(area_id=a2.id, pessoa_id=ps3.id)
430    session.add(re2)
431    re3 = Responsavel(area_id=a3.id, pessoa_id=ps4.id)
432    session.add(re3)
433    re4 = Responsavel(area_id=a1.id, pessoa_id=ps3.id)
434    session.add(re4)
435    re5 = Responsavel(area_id=a2.id, pessoa_id=ps4.id)
436    session.add(re5)
437    re6 = Responsavel(area_id=a3.id, pessoa_id=ps2.id)
438    session.add(re6)
439
440    # TipoDocumento
441    td1 = TipoDocumento(nome='Projeto')
442    session.add(td1)
443    td2 = TipoDocumento(nome='Parecer')
444    session.add(td2)
445    td3 = TipoDocumento(nome='Carta')
446    session.add(td3)
447
448    # Situacao
449    st1 = Situacao(nome='Tramitando', inicial = True)
450    session.add(st1)
451    st2 = Situacao(nome='Em Análise')
452    session.add(st2)
453    st3 = Situacao(nome='Arquivado', final = True)
454    session.add(st3)
455
456    # TipoEntrega
457    te1 = TipoEntrega(nome='Pessoalmente')
458    session.add(te1)
459    te2 = TipoEntrega(nome='SEDEX')
460    session.add(te2)
461    te3 = TipoEntrega(nome='email')
462    session.add(te3)
463
464    session.flush()
465
466    USUARIO = 'tiao@macale.net'
467   
468    # Protocolo
469    pt1 = Protocolo('I', td1.id, None, None, '...', st1.id, USUARIO)
470    session.add(pt1)
471    session.commit()
472    pt2 = Protocolo('R', td1.id, '123', None, 'Assunto 1...', st1.id, USUARIO)
473    session.add(pt2)
474    session.commit()
475    pt3 = Protocolo('E', td2.id, '456-X', datetime.date.today(), 'Assunto 2...', st2.id, USUARIO)
476    session.add(pt3)
477    session.commit()
478    pt4 = Protocolo('E', td3.id, None, None, 'Assunto 3...', st3.id, USUARIO)
479    session.add(pt4)
480    session.commit()
481
482    # BUG: o mesmo bug que ocorre com pessoa com id = 1 ocorre com o
483    # protocolo com id = 1
484    session.delete(pt1)
485
486    # Pessoa de Origem
487    po1 = PessoaOrigem(protocolo_id=pt2.id, pessoa_id=ps4.id)
488    session.add(po1)
489    po2 = PessoaOrigem(protocolo_id=pt3.id, pessoa_id=ps2.id)
490    session.add(po2)
491    po3 = PessoaOrigem(protocolo_id=pt4.id, pessoa_id=ps3.id)
492    session.add(po3)
493    po4 = PessoaOrigem(protocolo_id=pt4.id, pessoa_id=ps4.id)
494    session.add(po4)
495
496    # Pessoa de Destino
497    pd1 = PessoaDestino(protocolo_id=pt2.id, pessoa_id=ps2.id)
498    session.add(pd1)
499    pd2 = PessoaDestino(protocolo_id=pt2.id, pessoa_id=ps3.id)
500    session.add(pd2)
501    pd3 = PessoaDestino(protocolo_id=pt3.id, pessoa_id=ps4.id, tipoentrega_id=te2.id, objeto_correios='RM283505565BR')
502    session.add(pd3)
503    pd4 = PessoaDestino(protocolo_id=pt4.id, pessoa_id=ps2.id, tipoentrega_id=te3.id, data_entrega=datetime.date.today())
504    session.add(pd4)
505
506    if LOTS_OF_SAMPLES:
507        for i in xrange(10000):
508            ptN = Protocolo('I', td1.id, None, None, 'Teste %s...' % str(i), st1.id, USUARIO)
509            session.add(ptN)
510            session.commit()
511            poN = PessoaOrigem(protocolo_id=ptN.id, pessoa_id=ps2.id)
512            session.add(poN)
513            pdN = PessoaDestino(protocolo_id=ptN.id, pessoa_id=ps3.id)
514            session.add(pdN)
515   
516    # Referências
517    rf1 = Referencia(protocolo_id=pt4.id, referencia_id=pt2.id)
518    session.add(rf1)
519    rf2 = Referencia(protocolo_id=pt4.id, referencia_id=pt3.id)
520    session.add(rf2)
521   
522    # Notificacao
523    nt1 = Notificacao(pessoa_id=ps2.id, protocolo_id=pt2.id)
524    session.add(nt1)
525    nt2 = Notificacao(pessoa_id=ps2.id, protocolo_id=pt3.id)
526    session.add(nt2)
527    nt3 = Notificacao(pessoa_id=ps2.id, protocolo_id=pt4.id)
528    session.add(nt3)
529   
530    # Observacao
531    ob1 = Observacao(protocolo_id=pt4.id, texto='Texto 1', usuario=USUARIO)
532    session.add(ob1)
533    ob2 = Observacao(protocolo_id=pt4.id, texto='Texto 2', usuario=USUARIO)
534    session.add(ob2)
535    ob3 = Observacao(protocolo_id=pt3.id, texto='Texto 3', usuario=USUARIO)
536    session.add(ob3)
537    ob4 = Observacao(protocolo_id=pt3.id, texto='Texto 4', usuario=USUARIO)
538    session.add(ob4)
539   
540    # Anexo
541    an1 = Anexo(protocolo_id=pt4.id, arquivo='documento.txt', tamanho=1000, usuario=USUARIO)
542    session.add(an1)
543    an2 = Anexo(protocolo_id=pt4.id, arquivo='documento2.doc', tamanho=2000, usuario=USUARIO)
544    session.add(an2)
545    an3 = Anexo(protocolo_id=pt2.id, arquivo='apresent.ppt', tamanho=3000, usuario=USUARIO)
546    session.add(an3)
547    an4 = Anexo(protocolo_id=pt2.id, arquivo='apresent2.ppt', tamanho=4000, usuario=USUARIO)
548    session.add(an4)
549   
550    # Tramite
551    data = datetime.datetime.now()
552    tr1 = Tramite(pt4.id, a1.id, None, data, 'Teste 1', USUARIO, True)
553    session.add(tr1)
554    tr2 = Tramite(pt4.id, a2.id, None, data, 'Teste 2', USUARIO, True)
555    session.add(tr2)
556    tr3 = Tramite(pt4.id, a3.id, None, data, 'Teste 3', USUARIO, True)
557    session.add(tr3)
558    session.flush()
559
560    session.commit()
561
Note: Veja TracBrowser para ajuda no uso do navegador do trac.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.