Conjunto de mudanças 7995 no repositório publico


Ignorar:
Timestamp:
29/03/2015 22:21:59 (5 anos atrás)
Autor:
gustavolepri
Mensagem:

Criação de arquivo exclusivo para os WS

Localização:
il.spdo/trunk/il/spdo/browser
Arquivos:
1 adicionado
1 editado

Legenda:

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

    r7943 r7995  
    22
    33import os
    4 import json
    5 import datetime
    64
    75from five import grok
     
    781779
    782780
    783 class ProtocoloAddWSView(grok.View):
    784 
    785     grok.name('ws-add-protocolo')
    786     grok.context(INavigationRoot)
    787     grok.require('zope2.View')
    788 
    789     def update(self):
    790         sc = getUtility(ISecurityChecker)
    791         sc.enforce('acessar_ws_add_protocolo')
    792         super(ProtocoloAddWSView, self).update()
    793 
    794     def _json_error(self, error_code):
    795         ERROS = {
    796             1: _(u'Parâmetro dados não informado.'),
    797             2: _(u'Estrutura de dados inválida.'),
    798             3: _(u'Esse tipo de protocolo e/ou tipo de documento não pode ser protocolado pela sua área.'),
    799         }
    800         return json.dumps(ERROS[error_code])
    801 
    802     def _tipodocumento(self, nome):
    803         session = Session()
    804         return session.query(db.TipoDocumento).filter_by(nome=nome).first()
    805    
    806     def _valida_dados(self, dados):
    807         """
    808         Valida o parâmetro 'dados', que deve ser uma estrutura como a demonstrada a seguir:
    809 
    810         import json
    811         dados = {'origens': [{'email': 'email@origem.net', 'nome': 'Nome da Pessoa de Origem'}],
    812                  'destinos': [{'email': 'email@destino.net', 'nome': 'Nome da Pessoa de Destino'}],
    813                  'assunto': 'Assunto...',
    814                  'observacao': '',
    815                  'numero_documento': '12345',
    816                  'data_emissao': '2011-11-23',
    817                  'situacao': 'Tramitando',
    818                  'tipodocumento': 'Carta',
    819                  'tipoprotocolo': 'E'}
    820         print json.dumps(dados)
    821         """
    822        
    823         # dados precisa ser um dicionário
    824         if type(dados) != type({}):
    825             return False
    826 
    827         # dados deve conter todas as chaves
    828         for k in ('origens', 'destinos', 'assunto', 'observacao', 'numero_documento',
    829                   'data_emissao', 'situacao', 'tipodocumento', 'tipoprotocolo'):
    830             if dados.get(k, None) is None:
    831                 return False
    832        
    833         # origens (e destinos) devem ser listas de dicionários não vazias
    834         for f in ('origens', 'destinos'):
    835             origens = dados.get(f)
    836             if type(origens) != type([]) or len(origens) < 1:
    837                 return False
    838             for p in origens:
    839                 if type(p) != type({}):
    840                     return False
    841                 for k in ('email', 'nome'):
    842                     if p.get(k, None) is None:
    843                         return False
    844                    
    845         # demais campos devem ser strings unicode
    846         for k in ('assunto', 'observacao', 'numero_documento', 'data_emissao',
    847                   'situacao', 'tipodocumento', 'tipoprotocolo'):
    848             if type(dados.get(k)) != type(u''):
    849                 return False
    850 
    851         # assunto é obrigatório
    852         if not dados.get('assunto', None):
    853             return False
    854 
    855         # tipo de protocolo deve ser 'R', 'E' ou 'I'
    856         if dados.get('tipoprotocolo') not in ('R', 'E', 'I'):
    857             return False
    858 
    859         # a data de emissão, quando não for uma string vazia, deve ser
    860         # uma data válida, representada como AAAA-MM-DD e que não seja
    861         # maior do que a data atual
    862         dt = dados.get('data_emissao')
    863         if dt:
    864             if len(dt) != 10:
    865                 return False
    866             try:
    867                 aaaa, mm, dd = dt.split('-')
    868                 aaaa = int(aaaa)
    869                 mm = int(mm)
    870                 dd = int(dd)
    871                 d1 = datetime.date(aaaa, mm, dd)
    872                 d2 = datetime.date.today()
    873                 if d1 > d2:
    874                     return False
    875             except ValueError, IndexError:
    876                 return False
    877 
    878         # os valores de “situacao” e “tipodocumento” devem estar cadastrados
    879         session = Session()
    880         if not session.query(db.Situacao).filter_by(nome=dados.get('situacao')).filter_by(inicial=True).first():
    881             return False
    882         if not self._tipodocumento(dados.get('tipodocumento')):
    883             return False
    884 
    885         return True
    886    
    887     def _addProtocolo(self, dados, anexos=[]):
    888 
    889         session = Session()
    890         api = getUtility(ISPDOAPI)
    891 
    892         # origens (e destinos)
    893         pessoas_origens = []
    894         pessoas_destinos = []
    895         for f in ('origens', 'destinos'):
    896             for origem in dados[f]:
    897                 pessoa = session.query(db.Pessoa).filter_by(email=origem['email']).first()
    898                 if not pessoa:
    899                     pessoa = db.Pessoa(origem['nome'], origem['email'])
    900                     session.add(pessoa)
    901                     session.flush()
    902                 if f == 'origens':
    903                     pessoas_origens.append(pessoa.id)
    904                 else:
    905                     pessoas_destinos.append(pessoa.id)
    906 
    907         # "situacao" e "tipodocumento"
    908         situacao = session.query(db.Situacao).filter_by(nome=dados.get('situacao')).filter_by(inicial=True).first()
    909         tipodocumento = self._tipodocumento(dados.get('tipodocumento'))
    910 
    911         # data de emissão
    912         dt = dados.get('data_emissao')
    913         if dt:
    914             aaaa, mm, dd = dt.split('-')
    915             aaaa = int(aaaa)
    916             mm = int(mm)
    917             dd = int(dd)
    918             dt = datetime.date(aaaa, mm, dd)
    919         else:
    920             dt = None
    921 
    922         # cria protocolo, observacao, anexos e tramite inicial, utilizando a API
    923 
    924         # IMPORTANTE: Por definição, exceto na criação dos protocolos,
    925         # os anexos e as observações são sempre adicionadas ANTES da
    926         # tramitação ocorrer.
    927 
    928         protocolo_id = api.addProtocolo(dados['tipoprotocolo'], tipodocumento.id, dados['numero_documento'], dt,
    929                                         dados['assunto'], situacao.id, pessoas_origens, pessoas_destinos)
    930 
    931         api.TramiteInicial(protocolo_id)
    932 
    933         if dados['observacao'].strip():
    934             api.addObservacao(protocolo_id, dados['observacao'])
    935            
    936         if anexos:
    937             api.addAnexos(protocolo_id, anexos)
    938 
    939         protocolo = api.getProtocolo(protocolo_id)       
    940         return protocolo.numero, protocolo.data_protocolo
    941 
    942     @log
    943     def render(self):
    944         r = self.request
    945 
    946         dados = r.get('dados', '')
    947         if not dados:
    948             return self._json_error(1)
    949 
    950         dados = json.loads(dados)
    951         if not self._valida_dados(dados):
    952             return self._json_error(2)
    953 
    954         sc = getUtility(ISecurityChecker)
    955         if not sc.check('fluxo_rigoroso_area_inicial', tipoprotocolo=dados['tipoprotocolo'],
    956                         tipodocumento_id=self._tipodocumento(dados['tipodocumento']).id):
    957             return self._json_error(3)
    958 
    959         anexos = [NamedFile(r.form[a], filename=unicode(r.form[a].filename, 'utf-8')) \
    960                   for a in r.form.keys() if a.startswith('anexo')]
    961         numero, data_protocolo = self._addProtocolo(dados, anexos)
    962         return json.dumps(_('Protocolo: %s de %s' % (numero, str(data_protocolo))))
    963 
    964 
    965 class AreaListWSView(grok.View):
    966 
    967     grok.name('ws-list-area')
    968     grok.context(INavigationRoot)
    969     grok.require('zope2.View')
    970 
    971     @log
    972     def render(self):
    973 
    974         self.dados = []
    975         session = Session()
    976         items = session.query(db.Area).all()
    977         for i in items:
    978             self.dados.append({
    979                 'id': i.id,
    980                 'sigla': i.sigla,
    981                 'nome': i.nome,
    982                 'chefia_id': i.chefia_id,
    983                 'chefia_sigla': getattr(i.area,' sigla' ,''),
    984                 'chefia_nome': getattr(i.area, 'nome', ''),
    985                 })
    986 
    987         return json.dumps(self.dados)
    988 
    989 
    990781class SecurityCheckerView(BrowserView):
    991782    """View de verificação de segurança, destinada a omitir nas
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.