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

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

Ajuste na navegação dos formulários: após edição e novo cadastro
redireciona para o formulário de visualização do item.

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