def msgHasAcceptableViewNo(self, msg, frm) -> bool:
        """
        Return true if the view no of message corresponds to the current view
        no or a view no in the future
        :param msg: the node message to validate
        :return:
        """
        # TODO: refactor this! this should not do anything except checking!
        view_no = getattr(msg, f.VIEW_NO.nm, None)
        if not (isinstance(view_no, int) and view_no >= 0):
            return False
        if self.viewNo - view_no > 1:
            self.discard(msg, "un-acceptable viewNo {}"
                         .format(view_no), logMethod=logger.warning)
        if isinstance(msg, ViewChangeDone) and view_no < self.viewNo:
            self.discard(msg, "Proposed viewNo {} less, then current {}"
                         .format(view_no, self.viewNo), logMethod=logger.warning)
        elif (view_no > self.viewNo) or self._is_initial_view_change_now():
            if view_no not in self.msgsForFutureViews:
                self.msgsForFutureViews[view_no] = deque()
            logger.debug('{} stashing a message for a future view: {}'.format(self, msg))
            self.msgsForFutureViews[view_no].append((msg, frm))
            if isinstance(msg, ViewChangeDone):
                future_vcd_msg = FutureViewChangeDone(vcd_msg=msg)
                self.msgsToViewChanger.append((future_vcd_msg, frm))
        else:
            return True
        return False
Return true if the view no of message corresponds to the current view
        no or a view no in the future
        :param msg: the node message to validate
        :return: