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

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

Revisado integridado dos modelos.

File size: 10.9 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
21def geraSenha(tamanho):
22    chars = string.letters + string.digits
23    s = ""
24    for i in range(tamanho):
25        s += choice(chars)
26    return s
27
28class Pessoa(Base):
29    __tablename__ = 'pessoa'
30    __table_args__ = TABLE_ARGS
31    id = Column(Integer, primary_key=True)
32    nome = Column(String(100), unique=True, nullable=False)
33    email = Column(String(50), unique=True, nullable=False)
34    endereco = Column(String(100))
35    bairro = Column(String(30))
36    cep = Column(Integer)
37    cidade = Column(String(50))
38    uf_id = Column(Integer, ForeignKey('uf.id'))
39    uf = relationship("UF", backref="pessoa")
40    telefone = Column(String(30))
41    cpf_cnpj = Column(String(20))
42    tipopessoa = Column(String(1), nullable=False)
43    contato = Column(String(100))
44    senha = Column(String(20), nullable=False)
45   
46    def __init__(self, nome, email, endereco=None, bairro=None, cep=None, cidade=None, uf=None, telefone=None, cpf_cnpj=None, tipopessoa='F', contato=None):
47        self.nome = nome
48        self.email = email
49        self.endereco = endereco
50        self.bairro = bairro
51        self.cidade = cidade
52        self.uf_id = uf
53        self.telefone = telefone
54        self.cpf_cnpj = cpf_cnpj
55        self.tipopessoa = tipopessoa
56        self.contato = contato
57        self.senha = geraSenha(8)
58
59    def __repr__(self):
60        return "<Pessoa:%s>" % self.email
61
62class UF(Base):
63    __tablename__ = 'uf'
64    __table_args__ = TABLE_ARGS
65    id = Column(Integer, primary_key=True)
66    sigla = Column(String(2), unique=True, nullable=False)
67    nome = Column(String(40), unique=True, nullable=False)
68
69class Situacao(Base):
70    __tablename__ = 'situacao'
71    __table_args__ = TABLE_ARGS
72    id = Column(Integer, primary_key=True)
73    nome = Column(String(40), unique=True, nullable=False)
74    final = Column(Boolean(), default=False)
75   
76class TipoDocumento(Base):
77    __tablename__ = 'tipodocumento'
78    __table_args__ = TABLE_ARGS
79    id = Column(Integer, primary_key=True)
80    nome = Column(String(40), unique=True, nullable=False)
81
82class TipoEntrega(Base):
83    __tablename__ = 'tipoentrega'
84    __table_args__ = TABLE_ARGS
85    id = Column(Integer, primary_key=True)
86    nome = Column(String(40), unique=True, nullable=False)
87
88class Area(Base):
89    implements(IArea)
90    __tablename__ = 'area'
91    __table_args__ = TABLE_ARGS
92    id = Column(Integer, primary_key=True)
93    nome = Column(String(100), unique=True, nullable=False)
94    chefia_id = Column(Integer, ForeignKey('area.id'))
95    chefia = relationship("Area", backref=backref('area', remote_side=id))
96    responsavel = relationship("Responsavel", backref="area")
97
98class Responsavel(Base):
99    __tablename__ = 'responsavel'
100    __table_args__ = TABLE_ARGS
101    id = Column(Integer, primary_key=True)
102    area_id = Column(Integer, ForeignKey('area.id'))
103    pessoa_id = Column(Integer, ForeignKey('pessoa.id'))
104    pessoa = relationship("Pessoa", backref="responsavel")
105    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
106
107def calculaDigitoVerificador(seq, ano):
108    return int(math.log(seq + ano) * 10000) % 100
109
110class Protocolo(Base):
111    __tablename__ = 'protocolo'
112    __table_args__ = TABLE_ARGS
113    id = Column(Integer, primary_key=True)
114    tipoprotocolo = Column(String(1), nullable=False)
115    seq = Column(Integer, nullable=False)
116    ano = Column(Integer, nullable=False)
117    dv = Column(Integer, nullable=False)
118    numero = Column(String(20), unique=True, nullable=False)
119    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
120    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
121    tipodocumento = relationship("TipoDocumento", backref="protocolo")
122    situacao_id = Column(Integer, ForeignKey('situacao.id'))
123    situacao = relationship("Situacao", backref="protocolo")
124    apensado_id = Column(Integer, ForeignKey('protocolo.id'))
125    apensado = relationship("Protocolo", backref=backref('protocolo', remote_side=id))
126    observacao = relationship("Observacao", backref="protocolo")
127    anexo = relationship("Anexo", backref="protocolo")
128    tramite = relationship("Tramite", backref="protocolo")
129    pessoa_origem = relationship("PessoaOrigem", backref="pessoa_origem")
130    pessoa_destino = relationship("PessoaDestino", backref="pessoa_destino")
131    notificacao = relationship("Notificacao", backref="notificacao")
132   
133    def __init__(self, tipoprotocolo, tipodocumento_id, situacao_id):
134        self.tipoprotocolo = tipoprotocolo
135        self.tipodocumento_id = tipodocumento_id
136        self.situacao_id = situacao_id
137        session = Session()
138
139        # TODO: isso não pode ser feito dessa maneira, pois desconsidera o session
140        # e requer um commit ao invez de um flush
141        self.ano = datetime.datetime.now().year
142        max_seq = session.bind.execute('SELECT max(p.seq) from protocolo p where p.ano = %d' % self.ano).fetchone()[0]
143        self.seq = max_seq is None and 1 or max_seq + 1
144        self.dv = calculaDigitoVerificador(self.seq, self.ano)
145        self.numero = "%s-%08d/%04d-%02d" % (tipoprotocolo, self.seq, self.ano, self.dv)
146
147    def __repr__(self):
148        return "<Protocolo:%s>" % self.numero
149
150class PessoaOrigem(Base):
151    __tablename__ = 'pessoa_origem'
152    __table_args__ = TABLE_ARGS
153    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
154    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
155    pessoa = relationship("Pessoa", backref="pessoa_origem")
156
157class PessoaDestino(Base):
158    __tablename__ = 'pessoa_destino'
159    __table_args__ = TABLE_ARGS
160    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
161    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
162    pessoa = relationship("Pessoa", backref="pessoa_destino")
163    tipoentrega_id = Column(Integer, ForeignKey('tipoentrega.id'))
164    tipoentrega = relationship("TipoEntrega", backref="pessoa_destino")
165    data_entrega = Column(DateTime())
166    objeto_correios = Column(String(20))
167
168class Notificacao(Base):
169    __tablename__ = 'notificacao'
170    __table_args__ = TABLE_ARGS
171    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
172    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
173    pessoa = relationship("Pessoa", backref="notificacao")
174
175class Observacao(Base):
176    __tablename__ = 'observacao'
177    __table_args__ = TABLE_ARGS
178    id = Column(Integer, primary_key=True)
179    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
180    texto = Column(Text(), nullable=False)
181
182class Anexo(Base):
183    __tablename__ = 'anexo'
184    __table_args__ = TABLE_ARGS
185    id = Column(Integer, primary_key=True)
186    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
187    arquivo = Column(Text(), nullable=False)
188
189class Tramite(Base):
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_origem_id = Column(Integer, ForeignKey('area.id'))
195    area_origem = relationship("Area", backref="area_origem")
196    area_destino = relationship("AreaDestino", backref="area_destino")
197
198class AreaDestino(Base):
199    __tablename__ = 'area_destino'
200    __table_args__ = TABLE_ARGS
201    tramite_id = Column(Integer, ForeignKey('tramite.id'), primary_key=True)
202    area_id = Column(Integer, ForeignKey('area.id'), primary_key=True)
203    area = relationship("Area", backref="area_destino")
204
205class LogUtilizacao(Base):
206    __tablename__ = 'logutilizacao'
207    __table_args__ = TABLE_ARGS
208    id = Column(Integer, primary_key=True)
209    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
210    usuario = Column(String(50))
211    url = Column(Text(), nullable=False)
212
213class LogModificacao(Base):
214    __tablename__ = 'logmodificacao'
215    __table_args__ = TABLE_ARGS
216    id = Column(Integer, primary_key=True)
217    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
218    usuario = Column(String(50), nullable=False)
219    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
220    protocolo = relationship("Protocolo", backref="log")
221    anexo_id = Column(Integer, ForeignKey('anexo.id'))
222    anexo = relationship("Anexo", backref="log")
223    tramite_id = Column(Integer, ForeignKey('tramite.id'))
224    tramite = relationship("Tramite", backref="log")
225    detalhes = Column(Text(), nullable=False)
226
227class Fluxo(Base):
228    __tablename__ = 'fluxo'
229    __table_args__ = TABLE_ARGS
230    id = Column(Integer, primary_key=True)
231    nome = Column(String(40), unique=True, nullable=False)
232    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
233    tipodocumento = relationship("TipoDocumento", backref="fluxo")
234    transicao = relationship("Transicao", backref="fluxo")
235    flexivel = Column(Boolean(), default=False)
236
237class Transicao(Base):
238    __tablename__ = 'transicao'
239    __table_args__ = TABLE_ARGS
240    id = Column(Integer, primary_key=True)
241    fluxo_id = Column(Integer, ForeignKey('fluxo.id'))
242    # TODO: revisar
243    #transicao_origem_id = Column(Integer, ForeignKey('area.id'))
244    #transicao_origem = relationship("Area", backref="transicao_origem")
245    #transicao_destino_id = Column(Integer, ForeignKey('area.id'))
246    #transicao_destino = relationship("Area", backref="transicao_destino")
247    inicial = Column(Boolean(), default=False)
248
249if __name__ == '__main__':
250
251    if CREATE_ALL_TABLES:
252        metadata = Base.metadata
253        metadata.drop_all(engine)
254        metadata.create_all(engine)
255
256    session = Session()
257
258    td1 = TipoDocumento(nome='Projeto')
259    session.add(td1)
260    td2 = TipoDocumento(nome='Parecer')
261    session.add(td2)
262    td3 = TipoDocumento(nome='Carta')
263    session.add(td3)
264
265    st1 = Situacao(nome='Tramitando')
266    session.add(st1)
267    st2 = Situacao(nome='Em Análise')
268    session.add(st2)
269    st3 = Situacao(nome='Arquivado', final = True)
270    session.add(st3)
271
272    session.flush()
273
274    a1 = Area(nome='Teste1')
275    session.add(a1)
276    session.flush()
277
278    a2 = Area(nome='Teste2', chefia_id=a1.id)
279    session.add(a2)
280    session.flush()
281
282    a3 = Area(nome='Teste3', chefia_id=a2.id)
283    session.add(a3)
284    session.flush()
285
286    p1 = Protocolo('R', td1.id, st1.id)
287    session.add(p1)
288    session.commit()
289   
290    p2 = Protocolo('E', td2.id, st2.id)
291    session.add(p2)
292    session.commit()
293
294    p3 = Protocolo('I', td3.id, st3.id)
295    session.add(p3)
296    session.commit()
297
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.