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

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

Atualizado modelo de dados.

File size: 14.3 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 TABLE_ARGS, CREATE_ALL_TABLES
8from il.spdo.interfaces import IArea, IPessoa
9from random import choice
10import datetime
11import math
12import string
13
14Base = declarative_base()
15
16if __name__ == '__main__':
17    # http://www.sqlalchemy.org/docs/06/dialects/mysql.html#known-issues
18    engine = create_engine('mysql://root:interlegis@localhost/spdo?charset=utf8&use_unicode=0', pool_recycle=3600)
19    Session = sessionmaker(bind=engine)
20
21class TipoDocumento(Base):
22    __tablename__ = 'tipodocumento'
23    __table_args__ = TABLE_ARGS
24    id = Column(Integer, primary_key=True)
25    nome = Column(String(40), unique=True, nullable=False)
26
27class Situacao(Base):
28    __tablename__ = 'situacao'
29    __table_args__ = TABLE_ARGS
30    id = Column(Integer, primary_key=True)
31    nome = Column(String(40), unique=True, nullable=False)
32    final = Column(Boolean(), default=False)
33
34class TipoEntrega(Base):
35    __tablename__ = 'tipoentrega'
36    __table_args__ = TABLE_ARGS
37    id = Column(Integer, primary_key=True)
38    nome = Column(String(40), unique=True, nullable=False)
39
40class Area(Base):
41    implements(IArea)
42    __tablename__ = 'area'
43    __table_args__ = TABLE_ARGS
44    id = Column(Integer, primary_key=True)
45    nome = Column(String(100), unique=True, nullable=False)
46    chefia_id = Column(Integer, ForeignKey('area.id'))
47    chefia = relationship("Area", backref=backref('area', remote_side=id))
48    responsavel = relationship("Responsavel", backref="area")
49
50class UF(Base):
51    __tablename__ = 'uf'
52    __table_args__ = TABLE_ARGS
53    id = Column(Integer, primary_key=True)
54    sigla = Column(String(2), unique=True, nullable=False)
55    nome = Column(String(40), unique=True, nullable=False)
56
57def geraSenha(tamanho):
58    chars = string.letters + string.digits
59    s = ""
60    for i in range(tamanho):
61        s += choice(chars)
62    return s
63
64class Pessoa(Base):
65    implements(IPessoa)
66    __tablename__ = 'pessoa'
67    __table_args__ = TABLE_ARGS
68    id = Column(Integer, primary_key=True)
69    nome = Column(String(100), nullable=False)
70    email = Column(String(50), unique=True, nullable=False)
71    endereco = Column(String(100))
72    bairro = Column(String(30))
73    cep = Column(String(8))
74    cidade = Column(String(50))
75    uf_id = Column(Integer, ForeignKey('uf.id'))
76    uf = relationship("UF", backref="pessoa")
77    telefone = Column(String(30))
78    cpf_cnpj = Column(String(20))
79    tipopessoa = Column(String(1), nullable=False)
80    contato = Column(String(100))
81    area_id = Column(Integer, ForeignKey('area.id'))
82    area = relationship("Area", backref="pessoa")
83    senha = Column(String(20), nullable=False)
84   
85    def __init__(self, nome, email, endereco=None, bairro=None, cep=None, cidade=None, uf=None,
86                 telefone=None, cpf_cnpj=None, tipopessoa='F', contato=None, area=None):
87        self.nome = nome
88        self.email = email
89        self.endereco = endereco
90        self.bairro = bairro
91        self.cidade = cidade
92        self.uf_id = uf
93        self.telefone = telefone
94        self.cpf_cnpj = cpf_cnpj
95        self.tipopessoa = tipopessoa
96        self.contato = contato
97        self.area_id = area
98        self.senha = geraSenha(8)
99
100    def __repr__(self):
101        return "<Pessoa:%s>" % self.email
102
103class Responsavel(Base):
104    __tablename__ = 'responsavel'
105    __table_args__ = TABLE_ARGS
106    id = Column(Integer, primary_key=True)
107    area_id = Column(Integer, ForeignKey('area.id'))
108    pessoa_id = Column(Integer, ForeignKey('pessoa.id'))
109    pessoa = relationship("Pessoa", backref="responsavel")
110    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
111
112def calculaDigitoVerificador(seq, ano):
113    return int(math.log(seq + ano) * 10000) % 100
114
115class Protocolo(Base):
116    __tablename__ = 'protocolo'
117    __table_args__ = TABLE_ARGS
118    id = Column(Integer, primary_key=True)
119    tipoprotocolo = Column(String(1), nullable=False)
120    seq = Column(Integer, nullable=False)
121    ano = Column(Integer, nullable=False)
122    dv = Column(Integer, nullable=False)
123    numero = Column(String(20), unique=True, nullable=False)
124    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
125    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
126    tipodocumento = relationship("TipoDocumento", backref="protocolo")
127    situacao_id = Column(Integer, ForeignKey('situacao.id'))
128    situacao = relationship("Situacao", backref="protocolo")
129    apensado_id = Column(Integer, ForeignKey('protocolo.id'))
130    apensado = relationship("Protocolo", backref=backref('protocolo', remote_side=id))
131    observacao = relationship("Observacao", backref="protocolo")
132    anexo = relationship("Anexo", backref="protocolo")
133    tramite = relationship("Tramite", backref="protocolo")
134    pessoa_origem = relationship("PessoaOrigem", backref="pessoa_origem")
135    pessoa_destino = relationship("PessoaDestino", backref="pessoa_destino")
136    notificacao = relationship("Notificacao", backref="notificacao")
137   
138    def __init__(self, tipoprotocolo, tipodocumento_id, situacao_id):
139        self.tipoprotocolo = tipoprotocolo
140        self.tipodocumento_id = tipodocumento_id
141        self.situacao_id = situacao_id
142        session = Session()
143
144        # TODO: isso não pode ser feito dessa maneira, pois desconsidera o session
145        # e requer um commit ao invez de um flush
146        self.ano = datetime.datetime.now().year
147        max_seq = session.bind.execute('SELECT max(p.seq) from protocolo p where p.ano = %d' % self.ano).fetchone()[0]
148        self.seq = max_seq is None and 1 or max_seq + 1
149        self.dv = calculaDigitoVerificador(self.seq, self.ano)
150        self.numero = "%s-%08d/%04d-%02d" % (tipoprotocolo, self.seq, self.ano, self.dv)
151
152    def __repr__(self):
153        return "<Protocolo:%s>" % self.numero
154
155class PessoaOrigem(Base):
156    __tablename__ = 'pessoa_origem'
157    __table_args__ = TABLE_ARGS
158    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
159    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
160    pessoa = relationship("Pessoa", backref="pessoa_origem")
161
162class PessoaDestino(Base):
163    __tablename__ = 'pessoa_destino'
164    __table_args__ = TABLE_ARGS
165    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
166    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
167    pessoa = relationship("Pessoa", backref="pessoa_destino")
168    tipoentrega_id = Column(Integer, ForeignKey('tipoentrega.id'))
169    tipoentrega = relationship("TipoEntrega", backref="pessoa_destino")
170    data_entrega = Column(DateTime())
171    objeto_correios = Column(String(20))
172
173class Notificacao(Base):
174    __tablename__ = 'notificacao'
175    __table_args__ = TABLE_ARGS
176    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
177    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
178    pessoa = relationship("Pessoa", backref="notificacao")
179
180class Observacao(Base):
181    __tablename__ = 'observacao'
182    __table_args__ = TABLE_ARGS
183    id = Column(Integer, primary_key=True)
184    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
185    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
186    texto = Column(Text(), nullable=False)
187
188class Anexo(Base):
189    __tablename__ = 'anexo'
190    __table_args__ = TABLE_ARGS
191    id = Column(Integer, primary_key=True)
192    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
193    arquivo = Column(Text(), nullable=False)
194
195class Tramite(Base):
196    __tablename__ = 'tramite'
197    __table_args__ = TABLE_ARGS
198    id = Column(Integer, primary_key=True)
199    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
200    area_id = Column(Integer, ForeignKey('area.id'))
201    area = relationship("Area", backref="tramite")
202    data_disponibilizacao = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
203    data_recebimento = Column(DateTime())
204    acao = Column(Text())
205    copia = Column(Integer, default=1, nullable=False)
206
207class Fluxo(Base):
208    __tablename__ = 'fluxo'
209    __table_args__ = TABLE_ARGS
210    id = Column(Integer, primary_key=True)
211    nome = Column(String(40), unique=True, nullable=False)
212    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
213    tipodocumento = relationship("TipoDocumento", backref="fluxo")
214    transicao = relationship("Transicao", backref="fluxo")
215    flexivel = Column(Boolean(), default=False)
216
217class Transicao(Base):
218    __tablename__ = 'transicao'
219    __table_args__ = TABLE_ARGS
220    id = Column(Integer, primary_key=True)
221    fluxo_id = Column(Integer, ForeignKey('fluxo.id'))
222    # TODO: revisar
223    #transicao_origem_id = Column(Integer, ForeignKey('area.id'))
224    #transicao_origem = relationship("Area", backref="transicao_origem")
225    #transicao_destino_id = Column(Integer, ForeignKey('area.id'))
226    #transicao_destino = relationship("Area", backref="transicao_destino")
227    inicial = Column(Boolean(), default=False)
228
229class LogUtilizacao(Base):
230    __tablename__ = 'logutilizacao'
231    __table_args__ = TABLE_ARGS
232    id = Column(Integer, primary_key=True)
233    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
234    usuario = Column(String(50))
235    url = Column(Text(), nullable=False)
236
237class LogModificacao(Base):
238    __tablename__ = 'logmodificacao'
239    __table_args__ = TABLE_ARGS
240    id = Column(Integer, primary_key=True)
241    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
242    usuario = Column(String(50), nullable=False)
243    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
244    protocolo = relationship("Protocolo", backref="log")
245    anexo_id = Column(Integer, ForeignKey('anexo.id'))
246    anexo = relationship("Anexo", backref="log")
247    tramite_id = Column(Integer, ForeignKey('tramite.id'))
248    tramite = relationship("Tramite", backref="log")
249    detalhes = Column(Text(), nullable=False)
250
251if __name__ == '__main__':
252
253    if CREATE_ALL_TABLES:
254        metadata = Base.metadata
255        metadata.drop_all(engine)
256        metadata.create_all(engine)
257
258    session = Session()
259
260    # TipoDocumento
261    td1 = TipoDocumento(nome='Projeto')
262    session.add(td1)
263    td2 = TipoDocumento(nome='Parecer')
264    session.add(td2)
265    td3 = TipoDocumento(nome='Carta')
266    session.add(td3)
267
268    # Situacao
269    st1 = Situacao(nome='Tramitando')
270    session.add(st1)
271    st2 = Situacao(nome='Em Análise')
272    session.add(st2)
273    st3 = Situacao(nome='Arquivado', final = True)
274    session.add(st3)
275
276    # TipoEntrega
277    te1 = TipoEntrega(nome='Pessoalmente')
278    session.add(te1)
279    te2 = TipoEntrega(nome='SEDEX')
280    session.add(te2)
281    te3 = TipoEntrega(nome='email')
282    session.add(te3)
283
284    session.flush()
285
286    # Area
287    a1 = Area(nome='Teste1')
288    session.add(a1)
289    session.flush()
290    a2 = Area(nome='Teste2', chefia_id=a1.id)
291    session.add(a2)
292    session.flush()
293    a3 = Area(nome='Teste3', chefia_id=a2.id)
294    session.add(a3)
295    session.flush()
296
297    # UF
298    uf1 = UF(sigla='RS', nome='Rio Grande do Sul')
299    session.add(uf1)
300    uf2 = UF(sigla='RJ', nome='Rio de Janeiro')
301    session.add(uf2)
302    session.flush()
303
304    # Pessoa
305    ps1 = Pessoa('Xiru', 'xiru@xiru.org', area=a1.id)
306    session.add(ps1)
307    ps2 = Pessoa('Tião Macalé', 'tiao@macale.net', area=a2.id)
308    session.add(ps2)
309    ps3 = Pessoa('ZÉ Pequeno', 'john@small.org', 'Rua dos bobos, 0', 'Centro', 95096000, 'Caxias do Sul', uf1.id, '54 3226.1234', '12312312312', 'F', 'Baiano', a3.id)
310    session.add(ps3)
311    ps4 = Pessoa('BOPE', 'cpt.nascimento@bope.gov.br', 'Morro dos Caveiras, 100', 'Favela do Alemão', 12312000, 'Rio de Janeiro', uf2.id, '11 1212.1234', '12312312312', 'O', 'Capitão Nascimento', a3.id)
312    session.add(ps4)
313    session.flush()
314
315    # Responsavel
316    re1 = Responsavel(area_id=a1.id, pessoa_id=ps1.id)
317    session.add(re1)
318    re2 = Responsavel(area_id=a2.id, pessoa_id=ps2.id)
319    session.add(re2)
320    re3 = Responsavel(area_id=a3.id, pessoa_id=ps3.id)
321    session.add(re3)
322    session.flush()
323
324    # Protocolo
325    pt1 = Protocolo('I', td1.id, st1.id)
326    session.add(pt1)
327    session.commit()
328    pt2 = Protocolo('R', td2.id, st2.id)
329    session.add(pt2)
330    session.commit()
331    pt3 = Protocolo('E', td3.id, st3.id)
332    session.add(pt3)
333    session.commit()
334
335    # Pessoa de Origem
336    po1 = PessoaOrigem(protocolo_id=pt1.id, pessoa_id=ps1.id)
337    session.add(po1)
338    po2 = PessoaOrigem(protocolo_id=pt2.id, pessoa_id=ps2.id)
339    session.add(po2)
340    po3 = PessoaOrigem(protocolo_id=pt3.id, pessoa_id=ps3.id)
341    session.add(po3)
342    po4 = PessoaOrigem(protocolo_id=pt3.id, pessoa_id=ps4.id)
343    session.add(po4)
344
345    # Pessoa de Destino
346    pd1 = PessoaDestino(protocolo_id=pt1.id, pessoa_id=ps4.id)
347    session.add(pd1)
348    pd2 = PessoaDestino(protocolo_id=pt2.id, pessoa_id=ps4.id)
349    session.add(pd2)
350    pd3 = PessoaDestino(protocolo_id=pt3.id, pessoa_id=ps1.id, tipoentrega_id=te2.id, objeto_correios='RM283505565BR')
351    session.add(pd3)
352    pd4 = PessoaDestino(protocolo_id=pt3.id, pessoa_id=ps2.id, tipoentrega_id=te3.id, data_entrega=datetime.datetime.now())
353    session.add(pd4)
354   
355    # Notificacao
356    nt1 = Notificacao(protocolo_id=pt1.id, pessoa_id=ps1.id)
357    session.add(nt1)
358    nt2 = Notificacao(protocolo_id=pt3.id, pessoa_id=ps3.id)
359    session.add(nt2)
360    nt3 = Notificacao(protocolo_id=pt3.id, pessoa_id=ps4.id)
361    session.add(nt3)
362   
363    # Observacao
364    ob1 = Observacao(protocolo_id=pt1.id, texto='Texto 1')
365    session.add(ob1)
366    ob2 = Observacao(protocolo_id=pt1.id, texto='Texto 2')
367    session.add(ob2)
368    ob3 = Observacao(protocolo_id=pt3.id, texto='Texto 3')
369    session.add(ob3)
370    ob4 = Observacao(protocolo_id=pt3.id, texto='Texto 4')
371    session.add(ob4)
372   
373    # Anexo
374    an1 = Anexo(protocolo_id=pt1.id, arquivo='documento.txt')
375    session.add(an1)
376    an2 = Anexo(protocolo_id=pt3.id, arquivo='documento2.doc')
377    session.add(an2)
378    an3 = Anexo(protocolo_id=pt3.id, arquivo='apresent.ppt')
379    session.add(an3)
380   
381    # Tramite
382    tr1 = Tramite(protocolo_id=pt1.id, area_id=a1.id)
383    session.add(tr1)
384    tr2 = Tramite(protocolo_id=pt1.id, area_id=a2.id, acao='Revisar...')
385    session.add(tr2)
386    tr3 = Tramite(protocolo_id=pt1.id, area_id=a3.id, acao='Verificar...')
387    session.add(tr3)
388    session.flush()
389
390    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.