code: def msgHasAcceptableViewNo(self, msg, frm) -> bool:
          
          # 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
docs: 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: