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

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

Melhorias de integridade no modelo relacional. Finalização do
formulários de cadastro, edição, visualização e listagem de áreas do
organograma.

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