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

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

Ajustes gerais.

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