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

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

Implementado interfaces e vocabularios para entregas.

File size: 18.8 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, Session
8from il.spdo.interfaces import IArea, IUF, IPessoa, IResponsavel, ITipoDocumento, ISituacao, IProtocolo, IAddTramite, ITipoEntrega, IEntrega
9from random import choice
10import datetime
11import math
12import string
13import sys
14
15Base = declarative_base()
16
17if __name__ == '__main__':
18    engine = create_engine(DEFAULT_DSN)
19    Session = sessionmaker(bind=engine)
20
21class Area(Base):
22    implements(IArea)
23    __tablename__ = 'area'
24    __table_args__ = TABLE_ARGS
25    id = Column(Integer, primary_key=True)
26    sigla = Column(String(20), unique=True, nullable=False)
27    nome = Column(String(100), unique=True, nullable=False)
28    chefia_id = Column(Integer, ForeignKey('area.id'))
29    chefia = relationship("Area", backref=backref('area', remote_side=id))
30    responsavel = relationship("Responsavel", backref="area")
31
32class UF(Base):
33    implements(IUF)
34    __tablename__ = 'uf'
35    __table_args__ = TABLE_ARGS
36    id = Column(Integer, primary_key=True)
37    sigla = Column(String(2), unique=True, nullable=False)
38    nome = Column(String(40), unique=True, nullable=False)
39
40def geraSenha(tamanho):
41    chars = string.letters + string.digits
42    s = ""
43    for i in range(tamanho):
44        s += choice(chars)
45    return s
46
47class Pessoa(Base):
48    implements(IPessoa)
49    __tablename__ = 'pessoa'
50    __table_args__ = TABLE_ARGS
51    id = Column(Integer, primary_key=True)
52    nome = Column(String(100), nullable=False)
53    email = Column(String(50), unique=True, nullable=False)
54    endereco = Column(String(100))
55    bairro = Column(String(30))
56    cep = Column(String(8))
57    cidade = Column(String(50))
58    uf_id = Column(Integer, ForeignKey('uf.id'))
59    uf = relationship("UF", backref="pessoa")
60    telefone = Column(String(30))
61    cpf_cnpj = Column(String(20))
62    tipopessoa = Column(String(1), nullable=False)
63    contato = Column(String(100))
64    area_id = Column(Integer, ForeignKey('area.id'))
65    area = relationship("Area", backref="pessoa")
66    senha = Column(String(20), nullable=False)
67   
68    def __init__(self, nome, email, endereco=None, bairro=None, cep=None, cidade=None, uf_id=None,
69                 telefone=None, cpf_cnpj=None, tipopessoa='F', contato=None, area_id=None):
70        self.nome = nome
71        self.email = email
72        self.endereco = endereco
73        self.bairro = bairro
74        self.cep = cep
75        self.cidade = cidade
76        self.uf_id = uf_id
77        self.telefone = telefone
78        self.cpf_cnpj = cpf_cnpj
79        self.tipopessoa = tipopessoa
80        self.contato = contato
81        self.area_id = area_id
82        self.senha = geraSenha(8)
83
84    def __repr__(self):
85        return "<Pessoa:%s>" % self.email
86
87class Responsavel(Base):
88    implements(IResponsavel)
89    __tablename__ = 'responsavel'
90    __table_args__ = TABLE_ARGS
91    id = Column(Integer, primary_key=True)
92    area_id = Column(Integer, ForeignKey('area.id'))
93    pessoa_id = Column(Integer, ForeignKey('pessoa.id'))
94    pessoa = relationship("Pessoa", backref="responsavel")
95    data = Column(DateTime(), default=datetime.date.today(), nullable=False)
96
97class TipoDocumento(Base):
98    implements(ITipoDocumento)
99    __tablename__ = 'tipodocumento'
100    __table_args__ = TABLE_ARGS
101    id = Column(Integer, primary_key=True)
102    nome = Column(String(40), unique=True, nullable=False)
103
104class Situacao(Base):
105    implements(ISituacao)
106    __tablename__ = 'situacao'
107    __table_args__ = TABLE_ARGS
108    id = Column(Integer, primary_key=True)
109    nome = Column(String(40), unique=True, nullable=False)
110    inicial = Column(Boolean(), default=False)
111    final = Column(Boolean(), default=False)
112
113def calculaDigitoVerificador(seq, ano):
114    return int(math.log(seq + ano) * 10000) % 100
115
116class Protocolo(Base):
117    implements(IProtocolo)
118    __tablename__ = 'protocolo'
119    __table_args__ = TABLE_ARGS
120    id = Column(Integer, primary_key=True)
121    tipoprotocolo = Column(String(1), nullable=False)
122    seq = Column(Integer, nullable=False)
123    ano = Column(Integer, nullable=False)
124    dv = Column(Integer, nullable=False)
125    numero = Column(String(20), unique=True, nullable=False)
126    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
127    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
128    tipodocumento = relationship("TipoDocumento", backref="protocolo")
129    numero_documento = Column(String(20))
130    data_emissao = Column(DateTime())
131    assunto = Column(String(100), nullable=False)
132    situacao_id = Column(Integer, ForeignKey('situacao.id'))
133    situacao = relationship("Situacao", backref="protocolo")
134    apenso_id = Column(Integer, ForeignKey('protocolo.id'))
135    apenso = relationship("Protocolo", backref=backref('apensado', remote_side=id))
136    observacao = relationship("Observacao", backref="protocolo")
137    anexo = relationship("Anexo", backref="protocolo")
138    tramite = relationship("Tramite", backref="protocolo")
139    pessoa_origem = relationship("PessoaOrigem", backref="pessoa_origem")
140    pessoa_destino = relationship("PessoaDestino", backref="pessoa_destino")
141    notificacao = relationship("Notificacao", backref="protocolo")
142    permissao = relationship("Permissao", backref="protocolo")
143   
144    def __init__(self, tipoprotocolo, tipodocumento_id, numero_documento, data_emissao, assunto, situacao_id):
145        self.tipoprotocolo = tipoprotocolo
146        self.tipodocumento_id = tipodocumento_id
147        self.numero_documento = numero_documento
148        self.data_emissao = data_emissao
149        self.assunto = assunto
150        self.situacao_id = situacao_id
151        session = Session()
152
153        # TODO: isso não pode ser feito dessa maneira, pois desconsidera o session e requer um commit ao invez de um flush
154        self.ano = datetime.datetime.now().year
155        max_seq = session.bind.execute('SELECT max(p.seq) from protocolo p where p.ano = %d' % self.ano).fetchone()[0]
156        self.seq = max_seq is None and 1 or max_seq + 1
157        self.dv = calculaDigitoVerificador(self.seq, self.ano)
158        self.numero = "%s-%08d/%04d-%02d" % (tipoprotocolo, self.seq, self.ano, self.dv)
159
160    def __repr__(self):
161        return "<Protocolo:%s>" % self.numero
162
163class PessoaOrigem(Base):
164    __tablename__ = 'pessoa_origem'
165    __table_args__ = TABLE_ARGS
166    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
167    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
168    pessoa = relationship("Pessoa", backref="pessoa_origem")
169
170class TipoEntrega(Base):
171    implements(ITipoEntrega)
172    __tablename__ = 'tipoentrega'
173    __table_args__ = TABLE_ARGS
174    id = Column(Integer, primary_key=True)
175    nome = Column(String(40), unique=True, nullable=False)
176
177class PessoaDestino(Base):
178    implements(IEntrega)
179    __tablename__ = 'pessoa_destino'
180    __table_args__ = TABLE_ARGS
181    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
182    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
183    pessoa = relationship("Pessoa", backref="pessoa_destino")
184    tipoentrega_id = Column(Integer, ForeignKey('tipoentrega.id'))
185    tipoentrega = relationship("TipoEntrega", backref="pessoa_destino")
186    data_entrega = Column(DateTime())
187    objeto_correios = Column(String(20))
188   
189class Notificacao(Base):
190    __tablename__ = 'notificacao'
191    __table_args__ = TABLE_ARGS
192    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
193    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
194    pessoa = relationship("Pessoa", backref="notificacao")
195
196class Referencia(Base):
197    __tablename__ = 'referencia'
198    __table_args__ = TABLE_ARGS
199    id = Column(Integer, primary_key=True)
200    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
201    protocolo = relationship("Protocolo", primaryjoin=(protocolo_id==Protocolo.id), backref="protocolo")
202    referencia_id = Column(Integer, ForeignKey('protocolo.id'))
203    referencia = relationship("Protocolo", primaryjoin=(referencia_id==Protocolo.id), backref="referencia")
204   
205class Permissao(Base):
206    __tablename__ = 'permissao'
207    __table_args__ = TABLE_ARGS
208    id = Column(Integer, primary_key=True)
209    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
210    area_id = Column(Integer, ForeignKey('area.id'))
211    area = relationship("Area", backref="permissao")
212    leitura = Column(Boolean(), default=False)
213    escrita = Column(Boolean(), default=False)
214
215class Observacao(Base):
216    __tablename__ = 'observacao'
217    __table_args__ = TABLE_ARGS
218    id = Column(Integer, primary_key=True)
219    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
220    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
221    texto = Column(Text(), nullable=False)
222
223class Anexo(Base):
224    __tablename__ = 'anexo'
225    __table_args__ = TABLE_ARGS
226    id = Column(Integer, primary_key=True)
227    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
228    arquivo = Column(Text(), nullable=False)
229    tamanho = Column(Integer(), nullable=False)
230    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
231
232class Tramite(Base):
233    implements(IAddTramite)
234    __tablename__ = 'tramite'
235    __table_args__ = TABLE_ARGS
236    id = Column(Integer, primary_key=True)
237    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
238    area_id = Column(Integer, ForeignKey('area.id'))
239    area = relationship("Area", backref="tramite")
240    data_disponibilizacao = Column(DateTime())
241    data_recebimento = Column(DateTime())
242    acao = Column(Text())
243    copia = Column(Boolean(), default=False)
244    responsavel_id = Column(Integer, ForeignKey('responsavel.id'))
245    responsavel = relationship("Responsavel", backref="tramite")
246
247    def __init__(self, protocolo_id, area_id, data_disponibilizacao, data_recebimento, acao, copia=False):
248        self.protocolo_id = protocolo_id
249        self.area_id = area_id
250        self.data_disponibilizacao = data_disponibilizacao
251        self.data_recebimento = data_recebimento
252        self.acao = acao
253        self.copia = copia
254        session = Session()
255
256        #atribui o responsavel atual da área de destino do tramite
257        query = session.query(Responsavel.id).filter(Responsavel.area_id==area_id)
258        self.responsavel_id = query.order_by(Responsavel.id).all()[-1][0]
259
260        #testa se existe alguma permissão definida para o protocolo.
261        query = session.query(Permissao).filter(Permissao.protocolo_id==protocolo_id)
262        permissoes = query.all()
263
264        #na criacao do protocolo não existem permissoes
265        if not permissoes:
266            escrita = True
267        else:
268            #nas demais, deve-se desativar a escrita da permissao do tramite anterior
269            escrita = False
270            permissao_anterior = permissoes[-1]
271            permissao_anterior.escrita = False
272
273        permissao = Permissao(
274                    protocolo_id=protocolo_id,
275                    area_id=area_id,
276                    leitura=True,
277                    escrita=escrita,
278                    )
279        session.add(permissao)
280
281class Fluxo(Base):
282    __tablename__ = 'fluxo'
283    __table_args__ = TABLE_ARGS
284    id = Column(Integer, primary_key=True)
285    nome = Column(String(40), unique=True, nullable=False)
286    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
287    tipodocumento = relationship("TipoDocumento", backref="fluxo")
288    flexivel = Column(Boolean(), default=False)
289    transicao = relationship("Transicao", backref="fluxo")
290
291class Transicao(Base):
292    __tablename__ = 'transicao'
293    __table_args__ = TABLE_ARGS
294    id = Column(Integer, primary_key=True)
295    fluxo_id = Column(Integer, ForeignKey('fluxo.id'))
296    passo = Column(Integer, default=1, nullable=False)     
297    area_origem_id = Column(Integer, ForeignKey('area.id'))
298    area_origem = relationship("Area", primaryjoin=(area_origem_id==Area.id), backref="area_origem")
299    area_destino_id = Column(Integer, ForeignKey('area.id'))
300    area_destino = relationship("Area", primaryjoin=(area_destino_id==Area.id), backref="area_destino")
301
302class LogUtilizacao(Base):
303    __tablename__ = 'logutilizacao'
304    __table_args__ = TABLE_ARGS
305    id = Column(Integer, primary_key=True)
306    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
307    usuario = Column(String(50))
308    url = Column(Text(), nullable=False)
309
310class LogModificacao(Base):
311    __tablename__ = 'logmodificacao'
312    __table_args__ = TABLE_ARGS
313    id = Column(Integer, primary_key=True)
314    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
315    usuario = Column(String(50), nullable=False)
316    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
317    protocolo = relationship("Protocolo", backref="log")
318    anexo_id = Column(Integer, ForeignKey('anexo.id'))
319    anexo = relationship("Anexo", backref="log")
320    observacao_id = Column(Integer, ForeignKey('observacao.id'))
321    observacao = relationship("Observacao", backref="log")
322    tramite_id = Column(Integer, ForeignKey('tramite.id'))
323    tramite = relationship("Tramite", backref="log")
324    detalhes = Column(Text(), nullable=False)
325
326if __name__ == '__main__':
327
328    if CREATE_ALL_TABLES:
329        metadata = Base.metadata
330        metadata.drop_all(engine)
331        metadata.create_all(engine)
332
333    if not CREATE_SAMPLES:
334        sys.exit()
335
336    session = Session()
337
338    # TipoDocumento
339    td1 = TipoDocumento(nome='Projeto')
340    session.add(td1)
341    td2 = TipoDocumento(nome='Parecer')
342    session.add(td2)
343    td3 = TipoDocumento(nome='Carta')
344    session.add(td3)
345
346    # Situacao
347    st1 = Situacao(nome='Tramitando', inicial = True)
348    session.add(st1)
349    st2 = Situacao(nome='Em Análise')
350    session.add(st2)
351    st3 = Situacao(nome='Arquivado', final = True)
352    session.add(st3)
353
354    # TipoEntrega
355    te1 = TipoEntrega(nome='Pessoalmente')
356    session.add(te1)
357    te2 = TipoEntrega(nome='SEDEX')
358    session.add(te2)
359    te3 = TipoEntrega(nome='email')
360    session.add(te3)
361
362    session.flush()
363
364    # Area
365    a1 = Area(sigla='t1', nome='Teste1')
366    session.add(a1)
367    session.flush()
368    a2 = Area(sigla='t2', nome='Teste2', chefia_id=a1.id)
369    session.add(a2)
370    session.flush()
371    a3 = Area(sigla='t3', nome='Teste3', chefia_id=a2.id)
372    session.add(a3)
373    session.flush()
374
375    # UF
376    UFs = """
377          AC Acre
378          AL Alagoas
379          AP Amapá
380          AM Amazonas
381          BA Bahia
382          CE Ceará
383          DF Distrito Federal
384          ES Espirito Santo
385          GO Goiás
386          MA Maranhão
387          MT Mato Grosso
388          MS Mato Grosso do Sul
389          MG Minas Gerais
390          PA Pará
391          PB Paraíba
392          PR Paraná
393          PE Pernanbuco
394          PI Piauí
395          RJ Rio de Janeiro
396          RN Rio Grande do Norte
397          RS Rio Grande do Sul
398          RO Rondônia
399          RR Roraima
400          SC Santa Catarina
401          SP São Paulo
402          SE Sergipe
403          TO Tocantins
404          """
405    UFs = [{'sigla':uf.strip().split()[0],
406            'nome':" ".join(uf.strip().split()[1:])} \
407            for uf in UFs.split('\n') if uf.strip()]
408    for uf in UFs:
409        uf1 = UF(sigla=uf['sigla'], nome=uf['nome'])
410        session.add(uf1)
411
412    # Pessoa
413    ps1 = Pessoa(u'Xiru', u'xiru@xiru.org', area_id=a1.id)
414    session.add(ps1)
415    ps2 = Pessoa(u'Tião Macalé', u'tiao@macale.net', area_id=a2.id)
416    session.add(ps2)
417    ps3 = Pessoa(u'ZÉ Pequeno', u'john@small.org', 'Rua dos bobos, 0', 'Centro', 95096000,
418                 'Caxias do Sul', 1, '54 3226.1234', '12312312312', 'F', 'Baiano', a3.id)
419    session.add(ps3)
420    ps4 = Pessoa(u'BOPE', 'cpt.nascimento@bope.gov.br', 'Morro dos Caveiras, 100', u'Favela do Alemão', 12312000,
421                 'Rio de Janeiro', 1, '11 1212.1234', '12312312312', 'O', u'Capitão Nascimento', a3.id)
422    session.add(ps4)
423    session.flush()
424
425    # Responsavel
426    re1 = Responsavel(area_id=a1.id, pessoa_id=ps2.id)
427    session.add(re1)
428    re2 = Responsavel(area_id=a2.id, pessoa_id=ps3.id)
429    session.add(re2)
430    re3 = Responsavel(area_id=a3.id, pessoa_id=ps1.id)
431    session.add(re3)
432    re4 = Responsavel(area_id=a1.id, pessoa_id=ps3.id)
433    session.add(re4)
434    re5 = Responsavel(area_id=a2.id, pessoa_id=ps1.id)
435    session.add(re5)
436    re6 = Responsavel(area_id=a3.id, pessoa_id=ps2.id)
437    session.add(re6)
438
439    session.flush()
440
441    # Protocolo
442    pt1 = Protocolo('I', td1.id, None, None, 'Assunto 1...', st1.id)
443    session.add(pt1)
444    session.commit()
445    pt2 = Protocolo('R', td2.id, '123', None, 'Assunto 2...', st2.id)
446    session.add(pt2)
447    session.commit()
448    pt3 = Protocolo('E', td3.id, '456-X', datetime.datetime.now(), 'Assunto 3...', st3.id)
449    session.add(pt3)
450    session.commit()
451
452    # Pessoa de Origem
453    po1 = PessoaOrigem(protocolo_id=pt1.id, pessoa_id=ps1.id)
454    session.add(po1)
455    po2 = PessoaOrigem(protocolo_id=pt2.id, pessoa_id=ps2.id)
456    session.add(po2)
457    po3 = PessoaOrigem(protocolo_id=pt3.id, pessoa_id=ps3.id)
458    session.add(po3)
459    po4 = PessoaOrigem(protocolo_id=pt3.id, pessoa_id=ps4.id)
460    session.add(po4)
461
462    # Pessoa de Destino
463    pd1 = PessoaDestino(protocolo_id=pt1.id, pessoa_id=ps4.id)
464    session.add(pd1)
465    pd2 = PessoaDestino(protocolo_id=pt2.id, pessoa_id=ps4.id)
466    session.add(pd2)
467    pd3 = PessoaDestino(protocolo_id=pt3.id, pessoa_id=ps1.id, tipoentrega_id=te2.id, objeto_correios='RM283505565BR')
468    session.add(pd3)
469    pd4 = PessoaDestino(protocolo_id=pt3.id, pessoa_id=ps2.id, tipoentrega_id=te3.id, data_entrega=datetime.datetime.now())
470    session.add(pd4)
471   
472    # Notificacao
473    nt1 = Notificacao(protocolo_id=pt1.id, pessoa_id=ps1.id)
474    session.add(nt1)
475    nt2 = Notificacao(protocolo_id=pt3.id, pessoa_id=ps3.id)
476    session.add(nt2)
477    nt3 = Notificacao(protocolo_id=pt3.id, pessoa_id=ps4.id)
478    session.add(nt3)
479   
480    # Observacao
481    ob1 = Observacao(protocolo_id=pt1.id, texto='Texto 1')
482    session.add(ob1)
483    ob2 = Observacao(protocolo_id=pt1.id, texto='Texto 2')
484    session.add(ob2)
485    ob3 = Observacao(protocolo_id=pt3.id, texto='Texto 3')
486    session.add(ob3)
487    ob4 = Observacao(protocolo_id=pt3.id, texto='Texto 4')
488    session.add(ob4)
489   
490    # Anexo
491    an1 = Anexo(protocolo_id=pt1.id, arquivo='documento.txt', tamanho=1200)
492    session.add(an1)
493    an2 = Anexo(protocolo_id=pt3.id, arquivo='documento2.doc', tamanho=2300)
494    session.add(an2)
495    an3 = Anexo(protocolo_id=pt3.id, arquivo='apresent.ppt', tamanho=2500)
496    session.add(an3)
497   
498    # Tramite
499    data = datetime.datetime.now()
500    tr1 = Tramite(pt1.id, a1.id, None, data,'',False)
501    session.add(tr1)
502    tr2 = Tramite(pt1.id, a2.id, None, data, 'Revisar...')
503    session.add(tr2)
504    tr3 = Tramite(pt1.id, a3.id, None, data, 'Verificar...')
505    session.add(tr3)
506    session.flush()
507
508    session.commit()
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.