filters
=================================================

.. module:: smisk.mvc.filters
.. versionadded:: 1.1.0


.. function:: confirm(leaf, *va, **params)
  
  Requires the client to resend the request, passing a one-time valid token
  as confirmation.
  
  Used like this::
  
    @confirm
    def delete(self, id, confirmed, *args, **kwargs):
      item = Item.get_by(id=id)
      if confirmed:
        item.delete()
        return {'msg': 'Item was successfully deleted'}
      else:
        return {'msg': 'To confirm deletion, make a new request and '\
                       'include the attached confirm_token'}
  
  Generates a random string which is stored in session with the key
  ``confirm_token`` and adds the same string to the response, keyed by 
  ``confirm_token``. The client needs to send the same request again
  with the addition of passing "confirm_token", as a confirmation. This
  token will only be valid for one confirmation, thus providing a good
  protection against accidents.
  
  The leaf being filtered by these filters receives a boolean keyword
  argument named ``confirmed``:
  
   * When the value of this argument is True, the client did confirm (client
     sent a request containing a valid token). In this case, you should perform
     whatever leaf needed to be confirmed.
     
   * When the value of ``confirmed`` is false, the client has not confirmed or
     tried to confirm with an invalid token. In this case, you should respond
     with some kind of information, telling the client to send a new request
     with the attached token.
  
  **Note:** This filter will force the session to be a dictionary. If session is 
  something else, this filter will replace session::
  
    if not isinstance(req.session, dict):
      req.session = {}
  
