Beispiel #1
0
 def _valida_protocolo_fluxo_area_inicial(self, **kwargs):
     """O tipo de protocolo e o tipo de documento possuem uma
     definição de fluxo rigoroso. A área onde o usuário está lotado
     deve corresponder a uma área inicial de uma das transições
     desse fluxo.
     """
     tipoprotocolo = kwargs.get('tipoprotocolo', None) 
     tipodocumento_id = kwargs.get('tipodocumento_id', None)
     if tipoprotocolo is None or tipodocumento_id is None:
         logger(_(u'O método _valida_protocolo_fluxo_area_inicial não recebeu os parâmetros tipoprotocolo e tipodocumento_id.'))
         return False
     area_id_auth = self._get_area_usuario()
     if area_id_auth is None:
         return False
     session = Session()
     fluxo = session.query(db.Fluxo).\
             filter_by(tipoprotocolo=tipoprotocolo).\
             filter_by(tipodocumento_id=tipodocumento_id).\
             filter_by(flexivel=False).first()
     if fluxo is None:
         return True
     return bool(session.query(db.Transicao).\
                 filter_by(fluxo_id=fluxo.id).\
                 filter_by(area_origem_id=area_id_auth).\
                 filter_by(inicial=True).first())
Beispiel #2
0
 def _valida_protocolo_fluxo(self, **kwargs):
     """O tipo de protocolo e o tipo de documento possuem uma
     definição de fluxo rigoroso. A tramitação de envio deve seguir
     uma transição desse fluxo.
     """
     protocolo_id = kwargs.get('protocolo_id', None)
     areas = kwargs.get('areas', [])
     if protocolo_id is None or not areas:
         logger(_(u'O método _valida_protocolo_fluxo não recebeu os parâmetros protocolo_id e areas.'))
         return False
     api = getUtility(ISPDOAPI)
     protocolo = api.getProtocolo(protocolo_id)
     if protocolo is None:
         return False
     tipoprotocolo = protocolo.tipoprotocolo
     tipodocumento_id = protocolo.tipodocumento_id
     session = Session()
     fluxo = session.query(db.Fluxo).\
             filter_by(tipoprotocolo=tipoprotocolo).\
             filter_by(tipodocumento_id=tipodocumento_id).\
             filter_by(flexivel=False).first()
     if fluxo is None:
         return True
     area_id_auth = self._get_area_usuario()
     if area_id_auth is None:
         return False
     for area in areas:
         if not bool(session.query(db.Transicao).\
                     filter_by(fluxo_id=fluxo.id).\
                     filter_by(area_origem_id=area_id_auth).\
                     filter_by(area_destino_id=area).first()):
             return False
     return True
Beispiel #3
0
 def _valida_protocolo_fluxo_area_inicial(self, **kwargs):
     """O tipo de protocolo e o tipo de documento possuem uma
     definição de fluxo rigoroso. A área onde o usuário está lotado
     deve corresponder a uma área inicial de uma das transições
     desse fluxo.
     """
     tipoprotocolo = kwargs.get('tipoprotocolo', None)
     tipodocumento_id = kwargs.get('tipodocumento_id', None)
     if tipoprotocolo is None or tipodocumento_id is None:
         logger(
             _(u'O método _valida_protocolo_fluxo_area_inicial não recebeu os parâmetros tipoprotocolo e tipodocumento_id.'
               ))
         return False
     area_id_auth = self._get_area_usuario()
     if area_id_auth is None:
         return False
     session = Session()
     fluxo = session.query(db.Fluxo).\
             filter_by(tipoprotocolo=tipoprotocolo).\
             filter_by(tipodocumento_id=tipodocumento_id).\
             filter_by(flexivel=False).first()
     if fluxo is None:
         return True
     return bool(session.query(db.Transicao).\
                 filter_by(fluxo_id=fluxo.id).\
                 filter_by(area_origem_id=area_id_auth).\
                 filter_by(inicial=True).first())
Beispiel #4
0
 def _valida_privilegio_criador_observacao(self, **kwargs):
     """A observação deve ter sido criada pelo usuário que quer
     modificá-la ou apagá-la. Não deve existir um tramite com data
     de disponibilização posterior a data da observação.
     """
     observacao_id = kwargs.get('observacao_id', None)
     protocolo_id = kwargs.get('protocolo_id', None)
     if observacao_id is None or protocolo_id is None:
         logger(
             _(u'O método _valida_privilegio_criador_observacao não recebeu os parâmetros observacao_id ou protocolo_id.'
               ))
         return False
     session = Session()
     api = getUtility(ISPDOAPI)
     usuario = api.getAuthId()
     observacao = session.query(db.Observacao).\
                  filter_by(id=observacao_id).\
                  filter_by(protocolo_id=protocolo_id).\
                  filter_by(usuario=usuario).first()
     if observacao is None:
         return False
     tramite = session.query(db.Tramite).\
               filter_by(protocolo_id=observacao.protocolo_id).\
               filter(db.Tramite.data_disponibilizacao > observacao.data_observacao).first()
     return not bool(tramite)
Beispiel #5
0
 def _valida_privilegio_criador_anexo(self, **kwargs):
     """O anexo deve ter sido criado pelo usuário que quer
     apagá-lo. Não deve existir um tramite com data de
     disponibilização posterior a data do anexo.
     """
     anexo_id = kwargs.get('anexo_id', None)
     protocolo_id = kwargs.get('protocolo_id', None)
     if anexo_id is None or protocolo_id is None:
         logger(
             _(u'O método _valida_privilegio_criador_anexo não recebeu os parâmetros anexo_id ou protocolo_id.'
               ))
         return False
     session = Session()
     api = getUtility(ISPDOAPI)
     usuario = api.getAuthId()
     anexo = session.query(db.Anexo).\
             filter_by(id=anexo_id).\
             filter_by(protocolo_id=protocolo_id).\
             filter_by(usuario=usuario).first()
     if anexo is None:
         return False
     tramite = session.query(db.Tramite).\
               filter_by(protocolo_id=anexo.protocolo_id).\
               filter(db.Tramite.data_disponibilizacao > anexo.data_anexo).first()
     return not bool(tramite)
Beispiel #6
0
 def _valida_protocolo_fluxo(self, **kwargs):
     """O tipo de protocolo e o tipo de documento possuem uma
     definição de fluxo rigoroso. A tramitação de envio deve seguir
     uma transição desse fluxo.
     """
     protocolo_id = kwargs.get('protocolo_id', None)
     areas = kwargs.get('areas', [])
     if protocolo_id is None or not areas:
         logger(
             _(u'O método _valida_protocolo_fluxo não recebeu os parâmetros protocolo_id e areas.'
               ))
         return False
     api = getUtility(ISPDOAPI)
     protocolo = api.getProtocolo(protocolo_id)
     if protocolo is None:
         return False
     tipoprotocolo = protocolo.tipoprotocolo
     tipodocumento_id = protocolo.tipodocumento_id
     session = Session()
     fluxo = session.query(db.Fluxo).\
             filter_by(tipoprotocolo=tipoprotocolo).\
             filter_by(tipodocumento_id=tipodocumento_id).\
             filter_by(flexivel=False).first()
     if fluxo is None:
         return True
     area_id_auth = self._get_area_usuario()
     if area_id_auth is None:
         return False
     for area in areas:
         if not bool(session.query(db.Transicao).\
                     filter_by(fluxo_id=fluxo.id).\
                     filter_by(area_origem_id=area_id_auth).\
                     filter_by(area_destino_id=area).first()):
             return False
     return True
Beispiel #7
0
 def enforce(self, acao, **kwargs):
     if not self.check(acao, **kwargs):
         logger(
             kwargs.get(
                 'msg',
                 _(u'Privilégios Insuficientes. Ação: ') +
                 unicode(acao, 'utf-8')))
         raise Unauthorized
Beispiel #8
0
 def check(self, acao, **kwargs):
     verificacoes = CONFIG.get(acao, None)
     if verificacoes is None:
         logger(
             _(u'Ação informada não existe na configuração do sistema. Ação: '
               ) + unicode(acao, 'utf-8'))
         raise Unauthorized
     return self._run_verificacoes(acao, verificacoes, **kwargs)
Beispiel #9
0
    def _EnviaNotificacoes(self, protocolos):
        """Envia emails de notificação, avisando as pessoas
        interessadas que os protocolos tramitaram.
        """
        protocolos = list(set(protocolos))
        pu = getToolByName(getSite(), 'portal_url')
        portal = pu.getPortalObject()
        mh = portal.MailHost
        session = Session()
        for protocolo_id in protocolos:
            notificacoes = session.query(db.Notificacao).\
                           filter_by(protocolo_id=protocolo_id).all()
            for notificacao in notificacoes:
                logger(_(u'Notificando ') + notificacao.pessoa.email)

                # TODO: refatorar. Essa lista de tramites pode vir
                # pronta do método TramiteEnvio, evitando notificações
                # desnecessárias nas tramitações por cópia.

                tramites = session.query(db.Tramite).\
                           filter_by(protocolo_id=protocolo_id).\
                           filter_by(data_recebimento=None).all()
                for tramite in tramites:
                    d = {
                        'numero':
                        notificacao.protocolo.numero,
                        'data_tramitacao':
                        tramite.data_disponibilizacao,
                        'assunto':
                        notificacao.protocolo.assunto,
                        'area_origem':
                        tramite.area_anterior.nome,
                        'responsavel_origem':
                        tramite.area_anterior.responsavel[-1].pessoa.nome,
                        'area_destino':
                        tramite.area.nome,
                        'responsavel_destino':
                        tramite.responsavel.pessoa.nome,
                        'situacao':
                        notificacao.protocolo.situacao.nome,
                        'url_protocolo':
                        url('show-protocolo', id=notificacao.protocolo.id),
                        'url_notificacoes':
                        url('list-notificacao')
                    }
                    mfrom = unicode(portal.getProperty('email_from_address'),
                                    'utf-8')
                    mto = notificacao.pessoa.email
                    subject = NOTIFICACAO_ASSUNTO % d
                    body = NOTIFICACAO_MSG % d
                    text = u"From: %s\nTo: %s\nSubject: %s\n\n%s" % (
                        mfrom, mto, subject, body)
                    try:
                        mh.send(text, immediate=True, charset='utf8')
                    except:
                        logger(_(u'Erro ao enviar a mensagem de notificação.'))
Beispiel #10
0
 def configuration(self):
     urltool = getToolByName(getSite(), 'portal_url')
     portal = urltool.getPortalObject()
     try:
         saconnect = ISQLAlchemyConnectionStrings(portal)
         dsn = saconnect['spdo']
         logger(u"Utilizando configuração local: " + unicode(dsn, 'utf-8'))
     except (ComponentLookupError, KeyError), e:
         dsn = DEFAULT_DSN
         logger(u"Utilizando configuração padrão: " + unicode(dsn, 'utf-8'))
Beispiel #11
0
 def configuration(self):
     urltool = getToolByName(getSite(), 'portal_url')
     portal = urltool.getPortalObject()
     try:
         saconnect = ISQLAlchemyConnectionStrings(portal)
         dsn = saconnect['spdo']
         logger(u"Utilizando configuração local: " + unicode(dsn, 'utf-8'))
     except (ComponentLookupError, KeyError), e:
         dsn = DEFAULT_DSN
         logger(u"Utilizando configuração padrão: " + unicode(dsn, 'utf-8'))
Beispiel #12
0
 def removeItem(self):
     content = self.getContent()
     status = IStatusMessage(self.request)
     try:
         session = Session()
         session.delete(content)
         session.flush()
     except AssertionError, e:
         msg = _(u'Falha de integridade relacional: ' + str(e))
         status.add(msg, 'error')
         logger(msg)
         raise
Beispiel #13
0
 def removeItem(self):
     content = self.getContent()
     status = IStatusMessage(self.request)
     try:
         session = Session()
         session.delete(content)
         session.flush()
     except AssertionError, e:
         msg = _(u'Falha de integridade relacional: ' + str(e))
         status.add(msg, 'error')
         logger(msg)
         raise
Beispiel #14
0
 def _valida_protocolo_situacao_final(self, **kwargs):
     """Protocolo não pode estar em situação final.
     """
     api = getUtility(ISPDOAPI)
     protocolo_id = kwargs.get('protocolo_id', api.getProtocoloId())
     if protocolo_id is None:
         logger(_(u'O método _valida_protocolo_situacao_final não recebeu o parâmetro protocolo_id.'))
         return False
     protocolo = api.getProtocolo(protocolo_id)
     if protocolo is None:
         return False
     return not protocolo.situacao.final
Beispiel #15
0
 def _valida_protocolo_apensado(self, **kwargs):
     """Protocolo não estar apensado em outro protocolo.
     """
     api = getUtility(ISPDOAPI)
     protocolo_id = kwargs.get('protocolo_id', api.getProtocoloId())
     if protocolo_id is None:
         logger(_(u'O método _valida_protocolo_apensado não recebeu o parâmetro protocolo_id.'))
         return False
     protocolo = api.getProtocolo(protocolo_id)
     if protocolo is None:
         return False
     return protocolo.apenso_id is None
Beispiel #16
0
 def _valida_protocolo_apenso_ciclo(self, **kwargs):
     """Não podem existir ciclos nas definições de apensos.
     """
     protocolo_id = kwargs.get('protocolo_id', None)
     apenso_id = kwargs.get('apenso_id', None)
     if protocolo_id is None or apenso_id is None:
         logger(_(u'O método _valida_protocolo_apenso_ciclo não recebeu os parâmetros protocolo_id ou apenso_id.'))
         return False
     api = getUtility(ISPDOAPI)
     protocolo = api.getProtocolo(protocolo_id)
     if protocolo is None:
         return False
     ids_visitados = []
     return not self._procura_ciclo(protocolo, apenso_id, ids_visitados)
Beispiel #17
0
 def handleCadastrar(self, action):
     data, errors = self.extractData()
     if errors:
         self.status = self.formErrorsMessage
         return
     status = IStatusMessage(self.request)
     try:
         obj = self.createAndAdd(data)
         session = Session()
         session.flush()
     except IntegrityError, e:
         msg = _(u'Falha de integridade relacional: ' + str(e))
         status.add(msg, 'error')
         logger(msg)
         raise
Beispiel #18
0
 def handleCadastrar(self, action):
     data, errors = self.extractData()
     if errors:
         self.status = self.formErrorsMessage
         return
     status = IStatusMessage(self.request)
     try:
         obj = self.createAndAdd(data)
         session = Session()
         session.flush()
     except IntegrityError, e:
         msg = _(u'Falha de integridade relacional: ' + str(e))
         status.add(msg, 'error')
         logger(msg)
         raise
Beispiel #19
0
 def _valida_protocolo_nao_recebido(self, **kwargs):
     """Protocolo enviado pela área de lotação do usuário mas ainda
     não recebido pela área destino.
     """
     api = getUtility(ISPDOAPI)
     protocolo_id = kwargs.get('protocolo_id', api.getProtocoloId())
     if protocolo_id is None:
         logger(_(u'O método _valida_protocolo_nao_recebido não recebeu o parâmetro protocolo_id.'))
         return False
     area_id_auth = self._get_area_usuario()
     if area_id_auth is None:
         return False
     session = Session()
     return bool(session.query(db.TramiteOutbox).\
                 filter_by(area_id=area_id_auth).\
                 filter_by(protocolo_id=protocolo_id).first())
Beispiel #20
0
 def _valida_protocolo_tramita_area(self, **kwargs):
     """Protocolo tramita na área onde o usuário autenticado está
     lotado.
     """
     api = getUtility(ISPDOAPI)
     protocolo_id = kwargs.get('protocolo_id', api.getProtocoloId())
     if protocolo_id is None:
         logger(_(u'O método _valida_protocolo_tramita_area não recebeu o parâmetro protocolo_id.'))
         return False
     area_id_auth = self._get_area_usuario()
     if area_id_auth is None:
         return False
     session = Session()
     return bool(session.query(db.TramiteInbox).\
                 filter_by(protocolo_id=protocolo_id).\
                 filter_by(area_id=area_id_auth).first())
Beispiel #21
0
    def _run_verificacoes(self, acao, verificacoes, **kwargs):
        """Esse método executa as verificações, de acordo com as
        definições da estrutura de dados CONFIG, considerando que as
        componentes da tupla representam um OR das diversas
        possibilidades de verificação. Quando a componente for uma
        tupla, a validação deve ser calculada como um AND das
        componentes.
        """

        # o widget de autocomplete faz chamadas ajax no contexto da
        # view e esses requests não devem ser bloqueados
        if kwargs.get('ajax',
                      None) is not None and acao.startswith('acessar_'):
            r = getRequest()
            url = r.URL
            view = acao.replace('acessar_', '/@@').replace('_', '-')
            if not url.endswith(view):
                logger(
                    _(u'Permitindo acesso direto a URL: ') +
                    unicode(url, 'utf-8'))
                return True

        context = self
        for v in verificacoes:
            if type(v) == type(()):
                result = True
                for vi in v:
                    func = getattr(context, "_valida_%s" % vi, None)
                    if func is None:
                        result = False
                        break
                    ret = func(**kwargs)
                    if not ret:
                        result = False
                        break
                if result:
                    return True
            else:
                func = getattr(context, "_valida_%s" % v, None)
                if func is not None:
                    ret = func(**kwargs)
                    if ret:
                        return True
        return False
Beispiel #22
0
 def _valida_protocolo_apenso_momento(self, **kwargs):
     """Para que um protocolo seja apensado em outro é necessário
     que ambos compartilhem o mesmo momento na tramitação, ou seja,
     estejam tramitando nas mesmas áreas e tenham o mesmo tipo de
     documento e protocolo.
     """
     protocolo_id = kwargs.get('protocolo_id', None)
     apenso_id = kwargs.get('apenso_id', None)
     if protocolo_id is None or apenso_id is None:
         logger(_(u'O método _valida_protocolo_apenso_momento não recebeu os parâmetros protocolo_id ou apenso_id.'))
         return False
     api = getUtility(ISPDOAPI)
     protocolo = api.getProtocolo(protocolo_id)
     if protocolo is None:
         return False
     apenso = api.getProtocolo(apenso_id)
     if apenso is None:
         return False
     return self._compara_protocolos(protocolo, apenso)
Beispiel #23
0
    def _EnviaNotificacoes(self, protocolos):
        """Envia emails de notificação, avisando as pessoas
        interessadas que os protocolos tramitaram.
        """
        protocolos = list(set(protocolos))
        pu = getToolByName(getSite(), 'portal_url')
        portal = pu.getPortalObject()
        mh = portal.MailHost
        session = Session()
        for protocolo_id in protocolos:
            notificacoes = session.query(db.Notificacao).\
                           filter_by(protocolo_id=protocolo_id).all()
            for notificacao in notificacoes:
                logger(_(u'Notificando ') + notificacao.pessoa.email)

                # TODO: refatorar. Essa lista de tramites pode vir
                # pronta do método TramiteEnvio, evitando notificações
                # desnecessárias nas tramitações por cópia.

                tramites = session.query(db.Tramite).\
                           filter_by(protocolo_id=protocolo_id).\
                           filter_by(data_recebimento=None).all()
                for tramite in tramites:
                    d = {'numero': notificacao.protocolo.numero,
                         'data_tramitacao': tramite.data_disponibilizacao,
                         'assunto': notificacao.protocolo.assunto,
                         'area_origem': tramite.area_anterior.nome,
                         'responsavel_origem': tramite.area_anterior.responsavel[-1].pessoa.nome,
                         'area_destino': tramite.area.nome,
                         'responsavel_destino': tramite.responsavel.pessoa.nome,
                         'situacao': notificacao.protocolo.situacao.nome,
                         'url_protocolo': url('show-protocolo', id=notificacao.protocolo.id),
                         'url_notificacoes': url('list-notificacao')}
                    mfrom=unicode(portal.getProperty('email_from_address'), 'utf-8')
                    mto=notificacao.pessoa.email
                    subject=NOTIFICACAO_ASSUNTO % d
                    body=NOTIFICACAO_MSG % d
                    text = u"From: %s\nTo: %s\nSubject: %s\n\n%s" % (mfrom, mto, subject, body)
                    try:
                        mh.send(text, immediate=True, charset='utf8')
                    except:
                        logger(_(u'Erro ao enviar a mensagem de notificação.'))
Beispiel #24
0
    def _run_verificacoes(self, acao, verificacoes, **kwargs):
        """Esse método executa as verificações, de acordo com as
        definições da estrutura de dados CONFIG, considerando que as
        componentes da tupla representam um OR das diversas
        possibilidades de verificação. Quando a componente for uma
        tupla, a validação deve ser calculada como um AND das
        componentes.
        """

        # o widget de autocomplete faz chamadas ajax no contexto da
        # view e esses requests não devem ser bloqueados
        if kwargs.get('ajax', None) is not None and acao.startswith('acessar_'):
            r = getRequest()
            url = r.URL
            view = acao.replace('acessar_', '/@@').replace('_', '-')
            if not url.endswith(view):
                logger(_(u'Permitindo acesso direto a URL: ') + unicode(url, 'utf-8'))
                return True

        context = self
        for v in verificacoes:
            if type(v) == type(()):
                result = True
                for vi in v:
                    func = getattr(context, "_valida_%s" % vi, None)
                    if func is None:
                        result = False
                        break
                    ret = func(**kwargs)
                    if not ret:
                        result = False
                        break
                if result:
                    return True
            else:
                func = getattr(context, "_valida_%s" % v, None)
                if func is not None:
                    ret = func(**kwargs)
                    if ret:
                        return True
        return False
Beispiel #25
0
    def _valida_privilegio_criador_anexo(self, **kwargs):
        """O anexo deve ter sido criado pelo usuário que quer
        apagá-lo. Não deve existir um tramite com data de
        disponibilização posterior a data do anexo.
        """
        anexo_id = kwargs.get('anexo_id', None)
        protocolo_id = kwargs.get('protocolo_id', None)
	if anexo_id is None or protocolo_id is None:
            logger(_(u'O método _valida_privilegio_criador_anexo não recebeu os parâmetros anexo_id ou protocolo_id.'))
            return False
        session = Session()
        api = getUtility(ISPDOAPI)
        usuario = api.getAuthId()
        anexo = session.query(db.Anexo).\
                filter_by(id=anexo_id).\
                filter_by(protocolo_id=protocolo_id).\
                filter_by(usuario=usuario).first()
        if anexo is None:
            return False
        tramite = session.query(db.Tramite).\
                  filter_by(protocolo_id=anexo.protocolo_id).\
                  filter(db.Tramite.data_disponibilizacao > anexo.data_anexo).first()
        return not bool(tramite)
Beispiel #26
0
 def _valida_privilegio_criador_observacao(self, **kwargs):
     """A observação deve ter sido criada pelo usuário que quer
     modificá-la ou apagá-la. Não deve existir um tramite com data
     de disponibilização posterior a data da observação.
     """
     observacao_id = kwargs.get('observacao_id', None)
     protocolo_id = kwargs.get('protocolo_id', None)
     if observacao_id is None or protocolo_id is None:
         logger(_(u'O método _valida_privilegio_criador_observacao não recebeu os parâmetros observacao_id ou protocolo_id.'))
         return False
     session = Session()
     api = getUtility(ISPDOAPI)
     usuario = api.getAuthId()
     observacao = session.query(db.Observacao).\
                  filter_by(id=observacao_id).\
                  filter_by(protocolo_id=protocolo_id).\
                  filter_by(usuario=usuario).first()
     if observacao is None:
         return False
     tramite = session.query(db.Tramite).\
               filter_by(protocolo_id=observacao.protocolo_id).\
               filter(db.Tramite.data_disponibilizacao > observacao.data_observacao).first()
     return not bool(tramite)
Beispiel #27
0
 def check(self, acao, **kwargs):
     verificacoes = CONFIG.get(acao, None)
     if verificacoes is None:
         logger(_(u'Ação informada não existe na configuração do sistema. Ação: ') + unicode(acao, 'utf-8'))
         raise Unauthorized
     return self._run_verificacoes(acao, verificacoes, **kwargs)
Beispiel #28
0
 def enforce(self, acao, **kwargs):
     if not self.check(acao, **kwargs):
         logger(kwargs.get('msg', _(u'Privilégios Insuficientes. Ação: ') + unicode(acao, 'utf-8')))
         raise Unauthorized