Conjunto de mudanças 8011 no repositório publico


Ignorar:
Timestamp:
14/04/2015 19:20:54 (5 anos atrás)
Autor:
gustavolepri
Mensagem:

inclusão de WS de busca do protocolo

Arquivo:
1 editado

Legenda:

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

    r8006 r8011  
    33import json
    44import datetime
     5import sqlalchemy as rdb
     6from sqlalchemy.orm import aliased
    57
    68from five import grok
     
    1012from plone.namedfile.file import NamedFile
    1113
    12 from il.spdo.config import Session
     14from il.spdo.config import Session, SEARCH_LIMIT
    1315from il.spdo import db
    1416from il.spdo.config import MessageFactory as _
    1517from il.spdo.log import log
    1618from il.spdo.interfaces import ISPDOAPI, ISecurityChecker
     19from il.spdo.nav import url
     20
     21
     22class ProtocoloSearchWSView(grok.View):
     23
     24    grok.name('ws-search-protocolo')
     25    grok.context(INavigationRoot)
     26    grok.require('zope2.View')
     27
     28    @log
     29    def update(self):
     30        self.api = getUtility(ISPDOAPI)
     31
     32    def _json_error(self, error_code):
     33        ERROS = {
     34            1: _(u'Parâmetro dados não informado.'),
     35            2: _(u'Estrutura de dados inválida.'),
     36        }
     37        return json.dumps(ERROS[error_code])
     38
     39    def _valida_dados(self, dados):
     40        """
     41        Valida o parâmetro 'dados', que deve ser uma estrutura como a demonstrada a seguir:
     42
     43        import json
     44        dados = {'origem': 'Nome da Pessoa de Origem',
     45                 'destino': 'Nome da Pessoa de Destino',
     46                 'assunto': 'Assunto...',
     47                 'situacao': 'Tramitando',
     48                 'tipodocumento': 'Carta',
     49                 'tipoprotocolo': 'E',
     50                 'inativo': '4',
     51                 'area': 'Comissão'}
     52        print json.dumps(dados)
     53        """
     54
     55        # dados precisa ser um dicionário
     56        if not isinstance(dados, dict):
     57            return False
     58
     59        # os valores de “situacao”, “tipodocumento” e ”area” devem estar cadastrados
     60        if dados.get('situacao', None):
     61            session = Session()
     62            if not session.query(db.Situacao).filter_by(nome=dados.get('situacao')).filter_by(inicial=True).first():
     63                return False
     64        if dados.get('tipodocumento', None):
     65            if not self._tipodocumento(dados.get('tipodocumento')):
     66                return False
     67        if dados.get('area', None):
     68            if not self._area(dados.get('area')):
     69                return False
     70
     71        return True
     72
     73    def _area(self, nome):
     74        session = Session()
     75        return session.query(db.Area).filter_by(nome=nome).first()
     76
     77    def _tipodocumento(self, nome):
     78        session = Session()
     79        return session.query(db.TipoDocumento).filter_by(nome=nome).first()
     80
     81    def _consulta_protocolos(self, dados):
     82        session = Session()
     83        items = session.query(db.Protocolo)
     84
     85        tipoprotocolo = dados.get('tipoprotocolo', None)
     86        if tipoprotocolo is not None:
     87            items = items.filter_by(tipoprotocolo=tipoprotocolo)
     88
     89        tipodocumento_id = dados.get('tipodocumento', None)
     90        if tipodocumento_id is not None:
     91            items = items.filter_by(tipodocumento_id=tipodocumento_id)
     92
     93        situacao_id = dados.get('situacao', None)
     94        if situacao_id is not None:
     95            items = items.filter_by(situacao_id=situacao_id)
     96
     97        origem = dados.get('origem', None)
     98        if origem is not None:
     99            pessoa1 = aliased(db.Pessoa)
     100            items = items.join(db.PessoaOrigem).join(pessoa1)
     101            clause = rdb.or_(pessoa1.nome.contains(origem),
     102                             pessoa1.nome.ilike(origem))
     103            items = items.filter(clause)
     104
     105        destino = dados.get('destino', None)
     106        if destino is not None:
     107            pessoa2 = aliased(db.Pessoa)
     108            items = items.join(db.PessoaDestino).join(pessoa2)
     109            clause = rdb.or_(pessoa2.nome.contains(destino),
     110                             pessoa2.nome.ilike(destino))
     111            items = items.filter(clause)
     112
     113        assunto = dados.get('assunto', None)
     114        if assunto is not None:
     115            clause = rdb.or_(db.Protocolo.assunto.contains(assunto),
     116                             db.Protocolo.assunto.ilike(assunto))
     117            items = items.filter(clause)
     118
     119        area = dados.get('area', None)
     120        if area is not None:
     121            area_tb = aliased(db.Area)
     122            area_id = area_tb.id
     123            inbox1 = aliased(db.TramiteInbox)
     124            items = items.join(inbox1).filter_by(area_id=area_id)
     125
     126        tempo_inativo = dados.get('inativo', None)
     127        if tempo_inativo is not None:
     128            tempo_inativo = int(tempo_inativo)
     129            d = datetime.datetime.now() - datetime.timedelta(days=tempo_inativo)
     130            inbox2 = aliased(db.TramiteInbox)
     131            items = items.join(inbox2).filter(inbox2.version_date < d)
     132
     133        ret = []
     134        resultado = items.limit(SEARCH_LIMIT).all()
     135        for i in resultado:
     136            ret.append({
     137               'id': i.id,
     138               'numero': i.numero,
     139               'data_protocolo': i.data_protocolo.strftime('%d/%m/%Y'),
     140               'assunto': i.assunto,
     141               'tipodocumento': i.tipodocumento.nome,
     142               'situacao': i.situacao.nome,
     143               'url': url('show-protocolo', id=i.id),
     144               })
     145        return ret
     146
     147    @log
     148    def render(self):
     149        r = self.request
     150
     151        dados = r.get('dados', '')
     152        if not dados:
     153            return self._json_error(1)
     154
     155        dados = json.loads(dados)
     156        if not self._valida_dados(dados):
     157            return self._json_error(2)
     158
     159        resultado = self._consulta_protocolos(dados)
     160        return json.dumps(resultado)
    17161
    18162
     
    58202
    59203        # dados precisa ser um dicionário
    60         if type(dados) != type({}):
     204        if not isinstance(dados, dict):
    61205            return False
    62206
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.