Package: repoze.monty
repoze.montyis a library that, given a WSGI environment
dictionary (and awsgi.inputfile pointer if the request is a POST
request), will return a dictionary back containing “converted”
form/query string elements.  The form and query string elements
contained in the request are converted into simple Python types when
the form element names are decorated with special suffixes.  For
example, in an HTML form that you’d like monty to convert a form
element for, you might say:<form action=".">
   Age : <input type="hidden" name="age:int" value="20"/>
   <input type="submit" name="Submit"/>
</form>Likewise, in the query string of the URL, you could put:http://example.com/mypage?age:int=20In both of these cases, when provided the WSGI environment and thewsgi.inputfile pointer, and asked to return a value, monty might
return a dictionary like so:{'age':20}repoze.montyis a generalized version of the form marshalling
machinery originated in Zope 2.Form/Query String Element Marshallingrepoze.montyprovides a way for you to specify form input types in
the form, rather than in your application code. Instead of converting
theagevariable to an integer in a controller or vierw, you can
indicate that it is an integer in the form itself:Age <input type="text" name="age:int" />The ‘:int’ appended to the form input name tellsrepoze.montyto
convert the form input to an integer when it is invoked. This process
is calledmarshalling. If the user of your form types something that
cannot be converted to an integer in the above case (such as “22 going
on 23”) then Zope will raise a ValueError.Here is a list ofrepoze.monty’s basic parameter converters.booleanConverts a variable to true or false. Variables that are 0, None, an
empty string, or an empty sequence are false, all others are true.intConverts a variable to an integer.longConverts a variable to a long integer.floatConverts a variable to a floating point number.stringConverts a variable to a string. Most variables are strings already
so this converter is seldom used.textConverts a variable to a string with normalized line breaks.
Different browsers on various platforms encode line endings
differently, so this script makes sure the line endings are
consistent, regardless of how they were encoded by the browser.listConverts a variable to a Python list.tupleConverts a variable to a Python tuple.tokensConverts a string to a list by breaking it on white spaces.linesConverts a string to a list by breaking it on new lines.requiredRaises an exception if the variable is not present.ignore_emptyExcludes the variable from the request if the variable is an empty
string.These converters all work in more or less the same way to coerce a
form variable, which is a string, into another specific type.Thelistandtupleconverters can be used in combination with
other converters.  This allows you to apply additional converters to
each element of the list or tuple.  Consider this form:<form action=".">

  <p>I like the following numbers</p>

  <input type="checkbox" name="favorite_numbers:list:int"
  value="1" /> One<br />

  <input type="checkbox" name="favorite_numbers:list:int"
  value="2" />Two<br />

  <input type="checkbox" name="favorite_numbers:list:int"
  value="3" />Three<br />

  <input type="checkbox" name="favorite_numbers:list:int"
  value="4" />Four<br />

  <input type="checkbox" name="favorite_numbers:list:int"
  value="5" />5<br />

  <input type="submit" />
</form>By using thelistanddateconverters together,repoze.montywill convert each selected time to a date and then combine all
selected dates into a list namedfavorite_numbers.A more complex type of form conversion is to convert a series of
inputs intorecords.Records are structures that have
attributes. Using records, you can combine a number of form inputs
into one variable with attributes.  The available record converters
are:recordConverts a variable to a record attribute.recordsConverts a variable to a record attribute in a list of records.defaultProvides a default value for a record attribute if the variable is
empty.ignore_emptySkips a record attribute if the variable is empty.Here are some examples of how these converters are used:<form action=".">

  First Name <input type="text" name="person.fname:record" /><br />
  Last Name <input type="text" name="person.lname:record" /><br />
  Age <input type="text" name="person.age:record:int" /><br />

  <input type="submit" />
</form>If the information represented by this form post is passed torepoze.monty, the result dictionary will container one parameter,person. Thepersonvariable will have the attributesfname,lnameandage. Here’s an example of how you might userepoze.montyto process the form post (assuming you have a WSGI
environment in hand):from repoze.monty import marshal

info = marshal(environ, environ['wsgi.input'])
person = info['person']
full_name = "%s %s" % (person.fname, person.lname)
if person.age < 21:
    return ("Sorry, %s. You are not old enough to adopt an "
            "aardvark." % full_name)
return "Thanks, %s. Your aardvark is on its way." % full_nameTherecordsconverter works like therecordconverter except
that it produces a list of records, rather than just one. Here is
an example form:<form action=".">

  <p>Please, enter information about one or more of your next of
  kin.</p>

  <p>
    First Name <input type="text" name="people.fname:records" />
    Last Name <input type="text" name="people.lname:records" />
  </p>

  <p>
    First Name <input type="text" name="people.fname:records" />
    Last Name <input type="text" name="people.lname:records" />
  </p>

  <p>
    First Name <input type="text" name="people.fname:records" />
    Last Name <input type="text" name="people.lname:records" />
  </p>

  <input type="submit" />
</form>If you callrepoze.monty’s marshal method with the information
from this form post, a dictionary will be returned from it with a
variable calledpeoplethat is a list of records. Each record will
havefnameandlnameattributes.  Note the difference between therecordsconverter and thelist:recordconverter: the former would
create a list of records, whereas the latter would produce a single
record whose attributesfnameandlnamewould each be a list of
values.The order of combined modifiers does not matter; for example,int:listis identical tolist:int.GotchasThe file pointer passed torepoze.monty’s marshal method will be
consumed.  For all intents and purposes this means you should make a
tempfile copy of thewsgi.inputfile pointer before callingmarshalif you intend to use the POST file input data in your
application.Reporting Bugs / Development VersionsVisithttp://bugs.repoze.orgto report bugs.  Visithttp://svn.repoze.orgto download development or tagged versions.0.1Initial release.