Conjunto de mudanças 5450 no repositório publico


Ignorar:
Timestamp:
29/10/2011 22:34:57 (8 anos atrás)
Autor:
fabianosantos
Mensagem:

Adicionado suporte a versionamento no modelo do banco de dados.

Arquivo:
1 editado

Legenda:

Não Modificado
Adicionado
Removido
  • il.spdo/trunk/il/spdo/db.py

    r5435 r5450  
    33from zope.interface import implements
    44from sqlalchemy import create_engine, Table, Column, Integer, String, DateTime, Text, Boolean, ForeignKey, func
    5 from sqlalchemy.orm import relationship, backref, sessionmaker 
     5from sqlalchemy.orm import relationship, backref, sessionmaker
    66from sqlalchemy.ext.declarative import declarative_base
    77from il.spdo.config import DEFAULT_DSN, TABLE_ARGS, CREATE_ALL_TABLES, CREATE_SAMPLES, Session
    88from il.spdo.interfaces import IArea, IUF, IPessoa, IResponsavel, ITipoDocumento, ISituacao, IProtocolo, IAddTramite, ITipoEntrega, IEntrega
     9from il.spdo.history_meta import VersionedMeta, VersionedListener
    910from random import choice
    1011import datetime
     12import string
    1113import math
    12 import string
    1314import sys
    1415
    15 Base = declarative_base()
     16Base = declarative_base(metaclass=VersionedMeta)
    1617
    1718if __name__ == '__main__':
    1819    engine = create_engine(DEFAULT_DSN)
    19     Session = sessionmaker(bind=engine)
     20    Session = sessionmaker(bind=engine, extension=VersionedListener())
    2021
    2122class Area(Base):
     
    2829    chefia_id = Column(Integer, ForeignKey('area.id'))
    2930    chefia = relationship("Area", backref=backref('area', remote_side=id))
    30     responsavel = relationship("Responsavel", backref="area")
    3131
    3232class UF(Base):
     
    9191    id = Column(Integer, primary_key=True)
    9292    area_id = Column(Integer, ForeignKey('area.id'))
     93    area = relationship("Area", backref="resposavel")
    9394    pessoa_id = Column(Integer, ForeignKey('pessoa.id'))
    9495    pessoa = relationship("Pessoa", backref="responsavel")
     
    110111    inicial = Column(Boolean(), default=False)
    111112    final = Column(Boolean(), default=False)
     113
     114class PessoaOrigem(Base):
     115    __tablename__ = 'pessoa_origem'
     116    __table_args__ = TABLE_ARGS
     117    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
     118    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
     119    pessoa = relationship("Pessoa", backref="pessoa_origem")
     120
     121class TipoEntrega(Base):
     122    implements(ITipoEntrega)
     123    __tablename__ = 'tipoentrega'
     124    __table_args__ = TABLE_ARGS
     125    id = Column(Integer, primary_key=True)
     126    nome = Column(String(40), unique=True, nullable=False)
     127
     128class PessoaDestino(Base):
     129    implements(IEntrega)
     130    __tablename__ = 'pessoa_destino'
     131    __table_args__ = TABLE_ARGS
     132    protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
     133    pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
     134    pessoa = relationship("Pessoa", backref="pessoa_destino")
     135    tipoentrega_id = Column(Integer, ForeignKey('tipoentrega.id'))
     136    tipoentrega = relationship("TipoEntrega", backref="pessoa_destino")
     137    data_entrega = Column(DateTime())
     138    objeto_correios = Column(String(20))
     139   
     140class Permissao(Base):
     141    __tablename__ = 'permissao'
     142    __table_args__ = TABLE_ARGS
     143    id = Column(Integer, primary_key=True)
     144    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
     145    area_id = Column(Integer, ForeignKey('area.id'))
     146    area = relationship("Area", backref="permissao")
     147    leitura = Column(Boolean(), default=False)
     148    escrita = Column(Boolean(), default=False)
     149   
     150class Notificacao(Base):
     151    __tablename__ = 'notificacao'
     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="notificacao")
     156
     157class Observacao(Base):
     158    __tablename__ = 'observacao'
     159    __table_args__ = TABLE_ARGS
     160    id = Column(Integer, primary_key=True)
     161    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
     162    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
     163    texto = Column(Text(), nullable=False)
     164
     165class Anexo(Base):
     166    __tablename__ = 'anexo'
     167    __table_args__ = TABLE_ARGS
     168    id = Column(Integer, primary_key=True)
     169    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
     170    arquivo = Column(Text(), nullable=False)
     171    tamanho = Column(Integer(), nullable=False)
     172    data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
     173
     174class Tramite(Base):
     175    implements(IAddTramite)
     176    __tablename__ = 'tramite'
     177    __table_args__ = TABLE_ARGS
     178    id = Column(Integer, primary_key=True)
     179    protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
     180    area_id = Column(Integer, ForeignKey('area.id'))
     181    area = relationship("Area", backref="tramite")
     182    data_disponibilizacao = Column(DateTime())
     183    data_recebimento = Column(DateTime())
     184    acao = Column(Text())
     185    copia = Column(Boolean(), default=False)
     186    responsavel_id = Column(Integer, ForeignKey('responsavel.id'))
     187    responsavel = relationship("Responsavel", backref="tramite")
     188
     189    # TODO: apesar de correta, essa logica deve ser movida para a API
     190    def __init__(self, protocolo_id, area_id, data_disponibilizacao, data_recebimento, acao, copia=False):
     191        self.protocolo_id = protocolo_id
     192        self.area_id = area_id
     193        self.data_disponibilizacao = data_disponibilizacao
     194        self.data_recebimento = data_recebimento
     195        self.acao = acao
     196        self.copia = copia
     197        session = Session()
     198
     199        #atribui o responsavel atual da área de destino do tramite
     200        query = session.query(Responsavel.id).filter(Responsavel.area_id==area_id)
     201        self.responsavel_id = query.order_by(Responsavel.id).all()[-1][0]
     202
     203        #testa se existe alguma permissão definida para o protocolo.
     204        query = session.query(Permissao).filter(Permissao.protocolo_id==protocolo_id)
     205        permissoes = query.all()
     206
     207        #na criacao do protocolo não existem permissoes
     208        if not permissoes:
     209            escrita = True
     210        else:
     211            #nas demais, deve-se desativar a escrita da permissao do tramite anterior
     212            escrita = False
     213            permissao_anterior = permissoes[-1]
     214            permissao_anterior.escrita = False
     215
     216        permissao = Permissao(
     217                    protocolo_id=protocolo_id,
     218                    area_id=area_id,
     219                    leitura=True,
     220                    escrita=escrita,
     221                    )
     222        session.add(permissao)
    112223
    113224def calculaDigitoVerificador(seq, ano):
     
    134245    apenso_id = Column(Integer, ForeignKey('protocolo.id'))
    135246    apenso = relationship("Protocolo", backref=backref('apensado', remote_side=id))
     247    pessoa_origem = relationship("PessoaOrigem", backref="pessoa_origem")
     248    pessoa_destino = relationship("PessoaDestino", backref="pessoa_destino")
     249    permissao = relationship("Permissao", backref="protocolo")
     250    notificacao = relationship("Notificacao", backref="protocolo")
    136251    observacao = relationship("Observacao", backref="protocolo")
    137252    anexo = relationship("Anexo", backref="protocolo")
    138253    tramite = relationship("Tramite", backref="protocolo")
    139     pessoa_origem = relationship("PessoaOrigem", backref="pessoa_origem")
    140     pessoa_destino = relationship("PessoaDestino", backref="pessoa_destino")
    141     notificacao = relationship("Notificacao", backref="protocolo")
    142     permissao = relationship("Permissao", backref="protocolo")
    143254   
    144255    def __init__(self, tipoprotocolo, tipodocumento_id, numero_documento, data_emissao, assunto, situacao_id):
     
    161272        return "<Protocolo:%s>" % self.numero
    162273
    163 class PessoaOrigem(Base):
    164     __tablename__ = 'pessoa_origem'
    165     __table_args__ = TABLE_ARGS
    166     protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
    167     pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
    168     pessoa = relationship("Pessoa", backref="pessoa_origem")
    169 
    170 class TipoEntrega(Base):
    171     implements(ITipoEntrega)
    172     __tablename__ = 'tipoentrega'
    173     __table_args__ = TABLE_ARGS
    174     id = Column(Integer, primary_key=True)
    175     nome = Column(String(40), unique=True, nullable=False)
    176 
    177 class PessoaDestino(Base):
    178     implements(IEntrega)
    179     __tablename__ = 'pessoa_destino'
    180     __table_args__ = TABLE_ARGS
    181     protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
    182     pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
    183     pessoa = relationship("Pessoa", backref="pessoa_destino")
    184     tipoentrega_id = Column(Integer, ForeignKey('tipoentrega.id'))
    185     tipoentrega = relationship("TipoEntrega", backref="pessoa_destino")
    186     data_entrega = Column(DateTime())
    187     objeto_correios = Column(String(20))
    188    
    189 class Notificacao(Base):
    190     __tablename__ = 'notificacao'
    191     __table_args__ = TABLE_ARGS
    192     protocolo_id = Column(Integer, ForeignKey('protocolo.id'), primary_key=True)
    193     pessoa_id = Column(Integer, ForeignKey('pessoa.id'), primary_key=True)
    194     pessoa = relationship("Pessoa", backref="notificacao")
    195 
    196274class Referencia(Base):
    197275    __tablename__ = 'referencia'
     
    202280    referencia_id = Column(Integer, ForeignKey('protocolo.id'))
    203281    referencia = relationship("Protocolo", primaryjoin=(referencia_id==Protocolo.id), backref="referencia")
    204    
    205 class Permissao(Base):
    206     __tablename__ = 'permissao'
    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="permissao")
    212     leitura = Column(Boolean(), default=False)
    213     escrita = Column(Boolean(), default=False)
    214 
    215 class Observacao(Base):
    216     __tablename__ = 'observacao'
    217     __table_args__ = TABLE_ARGS
    218     id = Column(Integer, primary_key=True)
    219     protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
    220     data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
    221     texto = Column(Text(), nullable=False)
    222 
    223 class Anexo(Base):
    224     __tablename__ = 'anexo'
    225     __table_args__ = TABLE_ARGS
    226     id = Column(Integer, primary_key=True)
    227     protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
    228     arquivo = Column(Text(), nullable=False)
    229     tamanho = Column(Integer(), nullable=False)
    230     data = Column(DateTime(), default=datetime.datetime.now(), nullable=False)
    231 
    232 class Tramite(Base):
    233     implements(IAddTramite)
    234     __tablename__ = 'tramite'
    235     __table_args__ = TABLE_ARGS
    236     id = Column(Integer, primary_key=True)
    237     protocolo_id = Column(Integer, ForeignKey('protocolo.id'))
    238     area_id = Column(Integer, ForeignKey('area.id'))
    239     area = relationship("Area", backref="tramite")
    240     data_disponibilizacao = Column(DateTime())
    241     data_recebimento = Column(DateTime())
    242     acao = Column(Text())
    243     copia = Column(Boolean(), default=False)
    244     responsavel_id = Column(Integer, ForeignKey('responsavel.id'))
    245     responsavel = relationship("Responsavel", backref="tramite")
    246 
    247     def __init__(self, protocolo_id, area_id, data_disponibilizacao, data_recebimento, acao, copia=False):
    248         self.protocolo_id = protocolo_id
    249         self.area_id = area_id
    250         self.data_disponibilizacao = data_disponibilizacao
    251         self.data_recebimento = data_recebimento
    252         self.acao = acao
    253         self.copia = copia
    254         session = Session()
    255 
    256         #atribui o responsavel atual da área de destino do tramite
    257         query = session.query(Responsavel.id).filter(Responsavel.area_id==area_id)
    258         self.responsavel_id = query.order_by(Responsavel.id).all()[-1][0]
    259 
    260         #testa se existe alguma permissão definida para o protocolo.
    261         query = session.query(Permissao).filter(Permissao.protocolo_id==protocolo_id)
    262         permissoes = query.all()
    263 
    264         #na criacao do protocolo não existem permissoes
    265         if not permissoes:
    266             escrita = True
    267         else:
    268             #nas demais, deve-se desativar a escrita da permissao do tramite anterior
    269             escrita = False
    270             permissao_anterior = permissoes[-1]
    271             permissao_anterior.escrita = False
    272 
    273         permissao = Permissao(
    274                     protocolo_id=protocolo_id,
    275                     area_id=area_id,
    276                     leitura=True,
    277                     escrita=escrita,
    278                     )
    279         session.add(permissao)
    280 
    281 class Fluxo(Base):
    282     __tablename__ = 'fluxo'
    283     __table_args__ = TABLE_ARGS
    284     id = Column(Integer, primary_key=True)
    285     nome = Column(String(40), unique=True, nullable=False)
    286     tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
    287     tipodocumento = relationship("TipoDocumento", backref="fluxo")
    288     flexivel = Column(Boolean(), default=False)
    289     transicao = relationship("Transicao", backref="fluxo")
    290282
    291283class Transicao(Base):
     
    299291    area_destino_id = Column(Integer, ForeignKey('area.id'))
    300292    area_destino = relationship("Area", primaryjoin=(area_destino_id==Area.id), backref="area_destino")
     293
     294class Fluxo(Base):
     295    __tablename__ = 'fluxo'
     296    __table_args__ = TABLE_ARGS
     297    id = Column(Integer, primary_key=True)
     298    nome = Column(String(40), unique=True, nullable=False)
     299    tipodocumento_id = Column(Integer, ForeignKey('tipodocumento.id'))
     300    tipodocumento = relationship("TipoDocumento", backref="fluxo")
     301    flexivel = Column(Boolean(), default=False)
     302    transicao = relationship("Transicao", backref="fluxo")
    301303
    302304class LogUtilizacao(Base):
Note: Veja TracChangeset para ajuda no uso do visualizador de conjunto de mudanças.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.