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())
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
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())
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)
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)
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
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
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)
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.'))
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'))
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
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
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
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)
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
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())
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())
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
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)
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.'))
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
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)
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)
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)
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