docs: def get_next_action(self, request, application, label, roles):
          """ Process the get_next_action request at the current step. """
          actions = self.get_actions(request, application, roles)
  
          # if the user is not the applicant, the steps don't apply.
          if 'is_applicant' not in roles:
              return super(StateWithSteps, self).get_next_action(
                  request, application, label, roles)
  
          # was label supplied?
          if label is None:
              # no label given, find first step and redirect to it.
              this_id = self._order[0]
              url = base.get_url(request, application, roles, this_id)
              return HttpResponseRedirect(url)
          else:
              # label was given, get the step position and id for it
              this_id = label
              if this_id not in self._steps:
                  return HttpResponseBadRequest("<h1>Bad Request</h1>")
              position = self._order.index(this_id)
  
          # get the step given the label
          this_step = self._steps[this_id]
  
          # define list of allowed actions for step
          step_actions = {}
          if 'cancel' in actions:
              step_actions['cancel'] = "state:cancel"
          if 'submit' in actions and position == len(self._order) - 1:
              step_actions['submit'] = "state:submit"
          if position > 0:
              step_actions['prev'] = self._order[position - 1]
          if position < len(self._order) - 1:
              step_actions['next'] = self._order[position + 1]
  
          # process the request
          if request.method == "GET":
              # if GET request, state changes are not allowed
              response = this_step.view(
                  request, application, this_id, roles, step_actions.keys())
              assert isinstance(response, HttpResponse)
              return response
          elif request.method == "POST":
              # if POST request, state changes are allowed
              response = this_step.view(
                  request, application, this_id, roles, step_actions.keys())
              assert response is not None
  
              # If it was a HttpResponse, just return it
              if isinstance(response, HttpResponse):
                  return response
              else:
                  # try to lookup the response
                  if response not in step_actions:
                      raise RuntimeError(
                          "Invalid response '%s' from step '%s'"
                          % (response, this_step))
                  action = step_actions[response]
  
                  # process the required action
                  if action.startswith("state:"):
                      return action[6:]
                  else:
                      url = base.get_url(request, application, roles, action)
                      return HttpResponseRedirect(url)
  
          # Something went wrong.
          return HttpResponseBadRequest("<h1>Bad Request</h1>")