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

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

Adicionada rotina de calculo de digito verificador.

File size: 9.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
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   
77# -.-.-.-.-.-.-.-.-.-
78
79class Protocolo(Base):
80    __tablename__ = 'protocolo'
81    __table_args__ = TABLE_ARGS
82    id = Column(Integer, primary_key=True)
83    tipoprotocolo = Column(String(1))
84    seq = Column(Integer)
85    ano = Column(Integer)
86    dv = Column(Integer)
87    numero = Column(String(20))
88    data = Column(DateTime(), default=datetime.datetime.now())
89    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
90    tipodocumento = relationship("TipoDocumento", backref="protocolo")
91    situacao_id = Column(Integer, ForeignKey('situacao.id'))
92    situacao = relationship("Situacao", backref="protocolo")
93    observacao = relationship("Observacao", backref="protocolo")
94    anexo = relationship("Anexo", backref="protocolo")
95    tramite = relationship("Tramite", backref="protocolo")
96    apensado_id = Column(Integer, ForeignKey('protocolo.id'))
97    apensado = relationship("Protocolo", backref=backref('protocolo', remote_side=id))
98    pessoa_origem = relationship("PessoaOrigem", backref="pessoa_origem")
99    pessoa_destino = relationship("PessoaDestino", backref="pessoa_destino")
100    notificacao = relationship("Notificacao", backref="notificacao")
101
102    def _calcula_dv(self):
103        return int(math.log(self.seq + self.ano) * 10000) % 100
104   
105    def __init__(self, tipoprotocolo, tipodocumento_id, situacao_id):
106        self.tipoprotocolo = tipoprotocolo
107        self.tipodocumento_id = tipodocumento_id
108        self.situacao_id = situacao_id
109        session = Session()
110        self.ano = datetime.datetime.now().year
111        # TODO: isso não pode ser feito dessa maneira, pois desconsidera o session
112        max_seq = session.bind.execute('SELECT max(p.seq) from protocolo p where p.ano = %d' % self.ano).fetchone()[0]
113        self.seq = max_seq is None and 1 or max_seq + 1
114        self.dv = self._calcula_dv()
115        self.numero = "%s-%08d/%04d-%02d" % (tipoprotocolo, self.seq, self.ano, self.dv)
116
117    def __repr__(self):
118        return "<Protocolo:%s>" % self.numero
119
120class PessoaOrigem(Base):
121    __tablename__ = 'pessoa_origem'
122    __table_args__ = TABLE_ARGS
123    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
124    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
125    pessoa = relationship("Pessoa", backref="pessoa_origem")
126
127class PessoaDestino(Base):
128    __tablename__ = 'pessoa_destino'
129    __table_args__ = TABLE_ARGS
130    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
131    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
132    pessoa = relationship("Pessoa", backref="pessoa_destino")
133    tipoentrega_id = Column(Integer, ForeignKey('tipoentrega.id'))
134    tipoentrega = relationship("TipoEntrega", backref="pessoa_destino")
135    data_entrega = Column(DateTime(), default=datetime.datetime.now())
136    objeto_correios = Column(String(20))
137
138class TipoEntrega(Base):
139    __tablename__ = 'tipoentrega'
140    __table_args__ = TABLE_ARGS
141    id = Column(Integer, primary_key=True)
142    nome = Column(String(40))
143
144class Notificacao(Base):
145    __tablename__ = 'notificacao'
146    __table_args__ = TABLE_ARGS
147    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
148    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
149    pessoa = relationship("Pessoa", backref="notificacao")
150
151class Observacao(Base):
152    __tablename__ = 'observacao'
153    __table_args__ = TABLE_ARGS
154    id = Column(Integer, primary_key=True)
155    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
156    texto = Column(Text())
157
158class Anexo(Base):
159    __tablename__ = 'anexo'
160    __table_args__ = TABLE_ARGS
161    id = Column(Integer, primary_key=True)
162    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
163    arquivo = Column(Text())
164
165class Tramite(Base):
166    __tablename__ = 'tramite'
167    __table_args__ = TABLE_ARGS
168    id = Column(Integer, primary_key=True)
169    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
170    area_origem_id = Column(Integer, ForeignKey('area.id'))
171    area_origem = relationship("Area", backref="area_origem")
172    area_destino = relationship("AreaDestino", backref="area_destino")
173
174class AreaDestino(Base):
175    __tablename__ = 'area_destino'
176    __table_args__ = TABLE_ARGS
177    tramite_id = Column(Integer, ForeignKey('tramite.id'), primary_key=True)
178    area_id = Column(Integer, ForeignKey('area.id'), primary_key=True)
179    area = relationship("Area", backref="area_destino")
180
181class LogUtilizacao(Base):
182    __tablename__ = 'logutilizacao'
183    __table_args__ = TABLE_ARGS
184    id = Column(Integer, primary_key=True)
185    data = Column(DateTime(), default=datetime.datetime.now())
186    usuario = Column(String(50))
187    url = Column(Text())
188
189class LogModificacao(Base):
190    __tablename__ = 'logmodificacao'
191    __table_args__ = TABLE_ARGS
192    id = Column(Integer, primary_key=True)
193    data = Column(DateTime(), default=datetime.datetime.now())
194    usuario = Column(String(50))
195    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
196    protocolo = relationship("Protocolo", backref="log")
197    anexo_id = Column(Integer, ForeignKey('anexo.id'))
198    anexo = relationship("Anexo", backref="log")
199    tramite_id = Column(Integer, ForeignKey('tramite.id'))
200    tramite = relationship("Tramite", backref="log")
201    detalhes = Column(Text())
202
203class Fluxo(Base):
204    __tablename__ = 'fluxo'
205    __table_args__ = TABLE_ARGS
206    id = Column(Integer, primary_key=True)
207    nome = Column(String(40))
208    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
209    tipodocumento = relationship("TipoDocumento", backref="fluxo")
210    transicao = relationship("Transicao", backref="fluxo")
211    flexivel = Column(Boolean())
212
213class Transicao(Base):
214    __tablename__ = 'transicao'
215    __table_args__ = TABLE_ARGS
216    id = Column(Integer, primary_key=True)
217    fluxo_id = Column(Integer, ForeignKey('fluxo.id'))
218    #transicao_origem_id = Column(Integer, ForeignKey('area.id'))
219    #transicao_origem = relationship("Area", backref="transicao_origem")
220    #transicao_destino_id = Column(Integer, ForeignKey('area.id'))
221    #transicao_destino = relationship("Area", backref="transicao_destino")
222    inicial = Column(Boolean())
223
224if __name__ == '__main__':
225
226    if CREATE_ALL_TABLES:
227        metadata = Base.metadata
228        metadata.drop_all(engine)
229        metadata.create_all(engine)
230
231    session = Session()
232
233    td1 = TipoDocumento(nome='Projeto')
234    session.add(td1)
235    td2 = TipoDocumento(nome='Parecer')
236    session.add(td2)
237    td3 = TipoDocumento(nome='Carta')
238    session.add(td3)
239
240    st1 = Situacao(nome='Tramitando')
241    session.add(st1)
242    st2 = Situacao(nome='Em Análise')
243    session.add(st2)
244    st3 = Situacao(nome='Arquivado', final = True)
245    session.add(st3)
246
247    session.flush()
248
249    p1 = Protocolo('R', td1.id, st1.id)
250    session.add(p1)
251    session.commit()
252   
253    p2 = Protocolo('E', td2.id, st2.id)
254    session.add(p2)
255    session.commit()
256
257    p3 = Protocolo('I', td3.id, st3.id)
258    session.add(p3)
259    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.