[Tailorization of .
tailor@miles.mems-exchange.org**20041122170742
 Import of the upstream sources from the repository
 
  svn://svn/repos/trunk/quixote
 
 as of revision 3028
 
] 
[.: changeset 3029
akuchlin**20000502005017
 Initial check-in of current test code
] 
[.: changeset 3036
akuchlin**20000502042618
 Implement parser framework, and support the 'if' PTL statement
] 
[.: changeset 3038
akuchlin**20000502044257
 Pull out parsing of 'if' statement into parse_IF method
] 
[.: changeset 3053
akuchlin**20000502184550
 Added test for 'for' executable statement
] 
[.: changeset 3054
akuchlin**20000502184638
 Added more tests of parsing
] 
[.: changeset 3058
akuchlin**20000502191921
 Add variable references, 'stmt', 'for', 'while', 'block'
] 
[.: changeset 3059
akuchlin**20000502192048
 Add test for parsing 'for' statement
] 
[.: changeset 3065
akuchlin**20000502203838
 Implement 'template' directive
] 
[.: changeset 3066
akuchlin**20000502203852
 Added test case for 'template' directive
] 
[.: changeset 3071
akuchlin**20000503003335
 Generate a Python function from a PTL file Fix a typo in the execution
 code
] 
[.: changeset 3072
akuchlin**20000503003509
 Rename compile() to compile_template()
] 
[.: changeset 3073
akuchlin**20000503003527
 Delete the syntax tree evaluator
] 
[.: changeset 3077
akuchlin**20000503064453
 Initial check-in of Zope's request/response classes
] 
[.: changeset 3078
akuchlin**20000503065830
 Remov some Zope-specific code
] 
[.: changeset 3079
akuchlin**20000503065937
 Add imphooks.py module, which implements an import hook for importing
 PTL files directly
] 
[.: changeset 3080
akuchlin**20000503070006
 Remove some debugging prints
] 
[.: changeset 3081
akuchlin**20000503070048
 Import HTTP{Request,Response} from Zope subpackage
] 
[.: changeset 3082
akuchlin**20000503213102
 Automatically create __exports__ for a PTL module
] 
[.: changeset 3083
akuchlin**20000503231444
 Remove some magic; set the Content-type to text/html by default,
 instead of trying to guess whether the response contains HTML or not.
 Also, removed code that added <html><head></head> to HTML documents.
 The changes also break the .insertBase() method; I suspect we don't
 want to automatically insert a BASE element, either, so we don't care
 about this.
] 
[.: changeset 3085
akuchlin**20000504015850
 Added DISPLAY_EXCEPTIONS config option to print tracebacks to Web
 browser Preserve old contents of sys.path while importing the root
 package Add failing __exports__ value to exception message Call
 request.processInputs() to actually read form data
] 
[.: changeset 3086
akuchlin**20000504192925
 Add the dump() method from our patched version of Zope
] 
[.: changeset 3087
akuchlin**20000504193052
 When configured to do so, e-mail exceptions to a given e-mail address
] 
[.: changeset 3091
akuchlin**20000505020522
 Added Distutils setup file
] 
[.: changeset 3096
akuchlin**20000506024108
 Make the publisher support FastCGI
] 
[.: changeset 3097
akuchlin**20000506024156
 Added Robin Dunn's fcgi.py module in the util subpackage
] 
[.: changeset 3103
akuchlin**20000509012246
 Set __file__ and __name__ on the newly created module
] 
[.: changeset 3104
akuchlin**20000509012358
 Added AUTOMATIC_RELOAD configuration variable Implemented automatic
 reloading of modules (handled by reloading the entire Web application
 package whenever any module becomes out of date)
] 
[.: changeset 3116
akuchlin**20000509190726
 Fix regexes to allow newlines inside directives Add .text_pos() method
 to Directive class, and use it in one error message (More changes like
 this are still needed)
] 
[.: changeset 3117
akuchlin**20000509190809
 Added a newline-containing signature to tests for template directive
] 
[.: changeset 3118
akuchlin**20000509190845
 Add html_quote and url_quote functions to newly imported template
 modules
] 
[.: changeset 3122
akuchlin**20000509203521
 Rename Template.generate_code() to output_code(), and remove __call__
 method Templates are no longer callable; instead, they can output
 Python code which is then compiled.
] 
[.: changeset 3123
akuchlin**20000509203635
 If the final object is a module, automatically call a function named
 'index', if present. Send a note to stderr when reloading the
 application package
] 
[.: changeset 3130
akuchlin**20000510003250
 Change the config.ROOT_PACKAGE variable to hold just a package name
 (like 'mems.ui'), not a filesystem path name.
] 
[.: changeset 3135
akuchlin**20000510233932
 When traversing a module, try importing a submodule if the attribute
 isn't found. This avoids the need to explicitly import all the
 subpackages in a package's __init__.py file.
] 
[.: changeset 3141
akuchlin**20000511014419
 Check modtime of __init__.py package files properly
] 
[.: changeset 3154
akuchlin**20000512002644
 Added session code
] 
[.: changeset 3159
akuchlin**20000512011003
 Delete faulty assertion in code generation for FOR directive
] 
[.: changeset 3329
akuchlin**20000601031112
 Comments & code cleanups. Renamed uses of 'token' to 'directive'.
] 
[.: changeset 3330
akuchlin**20000601031149
 Added code cleanups, comments, and docstrings.
] 
[.: changeset 3331
akuchlin**20000601031340
 Minor additional comments & reformatting
] 
[.: changeset 3339
akuchlin**20000602002317
 Allow setting LOG_FILENAME to None Use full package path when
 importing subpackages
] 
[.: changeset 3340
akuchlin**20000602002440
 Delete vestigial import
] 
[.: changeset 3341
akuchlin**20000602002502
 Additional comments
] 
[.: changeset 3342
akuchlin**20000602003543
 First stab at documentation.
] 
[.: changeset 3346
akuchlin**20000602023013
 More packaging
] 
[.: changeset 3351
akuchlin**20000602201628
 Minor changes; added manifest file.
] 
[.: changeset 3404
akuchlin**20000609014511
 Include the doc/ subdirectory in the source distribution
] 
[.: changeset 3568
akuchlin**20000624203408
 Include cgi script in source distribution
] 
[.: changeset 3569
akuchlin**20000624211359
 Create _get_module_filename() and _check_reload() functions; use them
 in _traverse() to simplify the logic
] 
[.: changeset 3570
akuchlin**20000624220229
 Fix NameError when there's only one template in a file
] 
[.: changeset 3571
akuchlin**20000624224854
 Add .browser_version() method to HTTPRequest to return the browser and
 version
] 
[.: changeset 3572
akuchlin**20000624224922
 Add 3 functions for external use
] 
[.: changeset 3573
akuchlin**20000625005856
 Add a message to ParseError exception class Report the problematic
 line number for a missing /if
] 
[.: changeset 3574
akuchlin**20000625005921
 Added a script to syntax-check PTL files
] 
[.: changeset 3576
akuchlin**20000626181250
 Bump version number. Use correct URL.
] 
[.: changeset 3597
akuchlin**20000627213649
 Simplification: delete the .common attribute, a dictionary that's
 never modified.
] 
[.: changeset 3598
akuchlin**20000627214034
 Remove support for req.REQUEST returning the object itself
] 
[.: changeset 3599
akuchlin**20000627214900
 Delete all the Zope-specific traversal and authorization machinery
] 
[.: changeset 3600
akuchlin**20000627215022
 Return the correct default value
] 
[.: changeset 3629
akuchlin**20000628230500
 Add __str__ to ParseError exception class Allow newlines within 'for'
 directives Add line number to error message
] 
[.: changeset 3711
akuchlin**20000705235941
 Remove .group attribute, and use the .user attribute of the session
 object to hold the logged-in user object.
] 
[.: changeset 3712
akuchlin**20000705235957
 Updated to-do list
] 
[.: changeset 3758
akuchlin**20000707230819
 Improve a few error messages, and simplify some parsing methods a bit
] 
[.: changeset 3777
akuchlin**20000710233407
 Removed some magical behaviour based on the contents of the HTML
 returned (guessing when the HTML is bogus).
] 
[.: changeset 3778
akuchlin**20000710233842
 Remove some unused Zope traversal machinery
] 
[.: changeset 3780
akuchlin**20000710234454
 Simplify the .setBody() method some more Move the setting of the
 _wrote class variable to just above the method that actually uses its
 value. Delete more Zope error handlers that we never use.
] 
[.: changeset 3781
akuchlin**20000710235424
 Clean out more unused methods
] 
[.: changeset 3782
akuchlin**20000710235458
 Remove deleted 'clean' parameter from HTTPRequest constructor
] 
[.: changeset 3794
akuchlin**20000711032143
 Split up logging config option into DEBUG_LOG and ERROR_LOG Change
 cookie domain to work on any of our workstations
] 
[.: changeset 3795
akuchlin**20000711032302
 Send debug and error log output to different files
] 
[.: changeset 3838
nascheme**20000712191146
 simplify automatic reloading of published modules
] 
[.: changeset 3851
nascheme**20000712220132
 fix automatic module reload
] 
[.: changeset 3852
akuchlin**20000712221039
 Work around bug in Python 1.5.2's ihooks.py
] 
[.: changeset 3891
nascheme**20000713220202
 allow restart of quixote with sys.exit()
] 
[.: changeset 3893
nascheme**20000713221447
 simplify restart logic
] 
[.: changeset 3916
akuchlin**20000715000344
 Raise an exception when the callable returns None by accident
] 
[.: changeset 3922
nascheme**20000715013531
 fix URL without trailing slashes for modules
] 
[.: changeset 3974
akuchlin**20000725002155
 Implement the <?comment?> directive
] 
[.: changeset 3975
akuchlin**20000725002214
 Add test cases for <?comment?> directive
] 
[.: changeset 3976
akuchlin**20000725002337
 Document comment directive
] 
[.: changeset 3989
nascheme**20000725043201
 better error message for nested templates
] 
[.: changeset 3991
akuchlin**20000725202050
 Try executing the generated code, so parse-ptl can be used to check
 for errors in the code generation.
] 
[.: changeset 3992
akuchlin**20000725202215
 Implement <?# ... ?> for single-line comments, and add test cases &
 docs
] 
[.: changeset 3993
akuchlin**20000725215818
 Stop traversing the object space on reaching something that isn't a
 namespace Set SCRIPT_NAME and PATH_INFO appropriately Added a
 URL_PREFIX setting to config.py, currently set to /q
] 
[.: changeset 4010
akuchlin**20000727004845
 Initialize .session attribute to None
] 
[.: changeset 4016
akuchlin**20000727025513
 Get session collection and session inside the publisher, and commit or
 abort the session transaction, depending on whether the application
 ran successfully or not.
] 
[.: changeset 4018
akuchlin**20000727031039
 Changes for persistent sessions:        * abort(), commit() added to
 SessionCollection  * Individual sessions are created by called the
 new_session()    method which can be overridden.        * Instead of
 automatically creating an instance of SessionCollection,    the user
 of this module must call {get,set}_session_collection(),
 permitting the use of a subclass.
] 
[.: changeset 4025
gward**20000727195445
 Beefed up class docstring for GlobalSession, and removed now-redundant
 comments in constructor.
] 
[.: changeset 4026
gward**20000727200405
 Added 'get_{creation,access}_age()' methods to GlobalSession. Added
 '__repr__()', revised '__str__()' in GlobalSession. Comment, docstring
 tweaks.
] 
[.: changeset 4028
gward**20000727200451
 Renamed SESSION_COLL to _session_coll, since it's a private and
 mutable global (rather than a public constant).
] 
[.: changeset 4029
akuchlin**20000727201101
 Updated TODO list
] 
[.: changeset 4032
akuchlin**20000727204915
 Remove leading whitespace from every line inside a <?block?>
 directive, using the indentation of the first non-blank line as the
 model.
] 
[.: changeset 4033
akuchlin**20000727205046
 Document removal of leading whitespace from lines inside a <?block?>
 directive
] 
[.: changeset 4034
gward**20000727211047
 Add a new entry to sys.modules when we load a PTL module.
] 
[.: changeset 4038
gward**20000728001434
 When we don't care about capturing stdout, send it to /dev/null
 instead of an unused CStringIO object. Cosmetic/typo tweaks to some
 messages and docs.
] 
[.: changeset 4050
nascheme**20000728212805
 new PTL compiler supporting new PTL syntax
] 
[.: changeset 4051
nascheme**20000728212901
 new StringIO class used by new PTL modules
] 
[.: changeset 4052
nascheme**20000728212944
 import .ptl files by compiling then with the new PTL compiler
] 
[.: changeset 4068
gward**20000728233131
 Fix regexes in 'translate_tokens()'.
] 
[.: changeset 4069
gward**20000728233934
 Compile the "^def" and "^template" regexes separately, and in multi-
 line mode; this lets both the regex and the substitution pattern get
 simpler. Tweak syntax error message for consistency with Python's.
] 
[.: changeset 4073
nascheme**20000729002004
 set lineno for inserted nodes if possible
] 
[.: changeset 4090
akuchlin**20000801013825
 Add IgnoredException exception class, which can be raised by a Quixote
 handler to break out of processing; the exception is then ignored.
] 
[.: changeset 4091
akuchlin**20000801014201
 Pass server name to HTTPResponse constructor
] 
[.: changeset 4092
akuchlin**20000801014231
 Accept server name to HTTPResponse constructor, and make .redirect()
 ensure that the redirection is to a complete URL
] 
[.: changeset 4104
nascheme**20000801023242
 catch SyntaxErrors raised by the compiler code as well as the parser
 module.
] 
[.: changeset 4105
akuchlin**20000801024518
 Added RUN_ONCE configure option, to make Quixote service exactly one
 request and then exit.
] 
[.: changeset 4107
gward**20000801172810
 Get rid of the AUTOMATIC_RELOAD option -- it can't work, so why
 bother?
] 
[.: changeset 4108
gward**20000801172845
 Get rid of automatic reload support -- never really worked, and can't
 really work, and the RUN_ONCE config option should solve the problem.
] 
[.: changeset 4109
gward**20000801172939
 Added debugging print to announce when a PTL module is loaded.
] 
[.: changeset 4114
akuchlin**20000801205109
 Delete Zope-specific header
] 
[.: changeset 4116
gward**20000801210013
 Factored the stdout redirection out into init.py. The idea was so that
 we could do it earlier: before initializing much else, so debugging
 prints from other initialization code go to the debug log. This
 doesn't work due to an evil (and inadvertent) conspiracy between
 mod_fcgi and fcgi.py; until that's fixed, we just redirect/restore
 stdout around every hit.
] 
[.: changeset 4117
gward**20000801210044
 Quixote initialization code, so it's all in one convenient place for
 the CGI or FCGI script to call.
] 
[.: changeset 4118
gward**20000801211744
 Don't change sys.{stdin,stdout,stderr} -- they are the domain of
 Quixote and we don't need to worry about accomodating old CGI code
 that just writes to stdout or stderr and expects it to go to the web
 server correctly. Added some (commented-out) debugging statements.
] 
[.: changeset 4119
gward**20000801211848
 Added std{in,out,err} parameters to 'call()', and changed
 'call_fcgi()' to pass in the FCGI instance's 'inp', 'out', and 'err'
 attributes for them. Also changed to redirect/restore stdout *outside*
 the main loop, just to make sure that it works (it does).
] 
[.: changeset 4121
gward**20000801212541
 Ditch redirect/restore of stdout -- it's now done in the FCGI script.
] 
[.: changeset 4165
gward**20000803225902
 Flush debug log (sys.stdout) after every hit.
] 
[.: changeset 4168
gward**20000803231038
 Document the fragility of importing ZODB and installing Quixote's
 import hooks.
] 
[.: changeset 4199
gward**20000804185128
 Added the AutoflushFile class, and changed so the debug log is an
 AutoflushFile instead of a boring old file.
] 
[.: changeset 4200
gward**20000804185204
 Don't flush sys.stdout anymore -- not needed since the debug log is
 now an AutoflushFile instance.
] 
[.: changeset 4208
akuchlin**20000804222034
 Add .actual_user attribute
] 
[.: changeset 4230
akuchlin**20000805211837
 Add separate module for Quixote-specific exceptions
] 
[.: changeset 4231
akuchlin**20000805212606
 Added check for __access__ method at every point of the traversal, to
 check whether a user is permitted to traverse or access an object.
] 
[.: changeset 4370
gward**20000810203700
 Revert one part of last revision: call 'traverse_url()' *inside* the
 main try block, so that import errors, syntax errors, etc. are caught
 and reported by Quixote (rather than winding up in the Apache error
 log with a mysterious "Internal server error").
] 
[.: changeset 4379
nascheme**20000811023031
 Add an optimization as suggested by Greg.
] 
[.: changeset 4380
nascheme**20000811023133
 - templates are now saved as .ptlc
 
 - compiled templates have their own magic header, distinct from .pyc
 
 - rename compile_module to compile_template
] 
[.: changeset 4381
nascheme**20000811023156
 cache compiled templates
] 
[.: changeset 4390
nascheme**20000811203618
 - remove $def$ hack, generate a nice SyntaxError traceback instead
 
 - generate a nice SyntaxError for ParserErrors as well
] 
[.: changeset 4432
akuchlin**20000812233633
 Updated docs for impending release Remove old PTL compiler
] 
[.: changeset 4433
akuchlin**20000812233640
 Removed docs for old PTL compiler
] 
[.: changeset 4434
akuchlin**20000812233650
 Added change log
] 
[.: changeset 4435
akuchlin**20000813011343
 Updated the installation docs
] 
[.: changeset 4436
akuchlin**20000813012941
 Remove obsolete PTL parsing script
] 
[.: changeset 4437
akuchlin**20000813013121
 Update value of __all__, renaming template to compile_template and
 adding errors
] 
[.: changeset 4440
akuchlin**20000813025334
 Remove item
] 
[.: changeset 4481
gward**20000815033158
 Added 'close()' to AutoflushFile.
] 
[.: changeset 4482
gward**20000815033241
 Got rid of annoyingly noisy '__str__()' and '__repr__()'.
] 
[.: changeset 4483
gward**20000815033347
 Renamed the excessively noisy '__str__()' to 'dump_html()'.
] 
[.: changeset 4602
nascheme**20000817004655
 remove verbose debugging messages
] 
[.: changeset 4610
nascheme**20000817035950
 remove more debugging verbage
] 
[.: changeset 4624
akuchlin**20000818012730
 Open PTLC files in binary mode for Windows compatibility
] 
[.: changeset 4629
akuchlin**20000818020047
 Always assume regular CGI on Windows
] 
[.: changeset 4683
gward**20000825184312
 RUN_ONCE now defaults to false.
] 
[.: changeset 5099
nascheme**20000923025037
 - Figure out the location of TemplateIO based on quixote's location
   (ie. don't assume quixote.TemplateIO).
 
 - Handle Python 2.0 from imports properly.
 
 - Don't leave empty .ptlc files around if there is an exception when
   compiling (eg. syntax errors).
] 
[.: changeset 5100
nascheme**20000923025103
 - Don't leave empty .ptlc files around if there is an exception when
   compiling (eg. syntax errors).
 
 - Only install the PTL hooks once.
] 
[.: changeset 5126
gward**20000926002737
 More randomness in session ID: two numbers in the range 0 ..
 sys.maxint, rather than just one in the range 1e6 .. 1e7. Should make
 it harder for attackers to guess session cookies. If we get a session
 cookie "" or "*del*", treat it as no cookie at all. Moved cookie-
 dropping code out to 'set_session_cookie()' to support magically
 joining a session. Added 'revoke_session_cookie()' to support leaving
 a session.
] 
[.: changeset 5127
gward**20000926002803
 Cosmetic tweak forgotton on previous checkin.
] 
[.: changeset 5208
gward**20000929011530
 Changed the return value of 'redirect()' to a useful HTML document
 that says "You should have been redirected...". Now we can just say
 "return response.redirect(...)" whenever we need to redirect.
] 
[.: changeset 5209
nascheme**20000929012617
 added __add__ and __radd__ methods
] 
[.: changeset 5210
gward**20000929012830
 Added CVS revision string.
] 
[.: changeset 5215
akuchlin**20000929040821
 Added the text of the license
] 
[.: changeset 5216
akuchlin**20000929041132
 Updated version number and e-mail address
] 
[.: changeset 5219
gward**20000929204000
 Added a dummy 'flush()' method to AutoflushFile.
] 
[.: changeset 5241
gward**20001003014011
 - [from late August] Yet another aborted attempt to handle module
   reloading:
 
 - make all imports of other Quixote modules lazy (ie. do 'em only in
   the function or method that needs 'em)
 
 - added some (commented-out) debug prints
 
 - added 'reload_hack()', with commented-out call to it from
   'call_fcgi()' Also:
 
 - tweaked docstring for 'call()'
 
 - better error message when we fail to open the error log file
] 
[.: changeset 5242
gward**20001003014422
 - Restore the useful changes from that ill-fated attempt to do module
   reloading (relegated to a branch):
 
 - docstring fix
 
 - better error message
 
 - move 'get_session()' call into the main "try" block
] 
[.: changeset 5243
gward**20001003020038
 Fix two (apparent) doc/comment typos.
] 
[.: changeset 5244
gward**20001003023023
 Added TraversalError to handle traversal errors: can generate either
 explicit, detailed, insecure error messages or terse, useless, more
 secure messages. Make the existing exception classes inherit from
 Exception.
] 
[.: changeset 5245
gward**20001003023110
 Changed '_traverse()' and 'traverse_url()' to raise TraversalError
 instead of ValueError. Pass 'original_path' to '_traverse()' for use
 in raising TraversalError.
] 
[.: changeset 5246
gward**20001003023204
 Added 'SECURE_ERRORS' variable (default true).
] 
[.: changeset 5247
gward**20001003023421
 Always use absolute module name to import quixote.config module.
] 
[.: changeset 5249
gward**20001003034210
 Better exception message when we hit an ImportError.
] 
[.: changeset 5253
gward**20001003041720
 - Modified the traversal algorithm to look for a '__getname__()'
   function if the current name isn't in the current namespace's export
   list. This allows interpolation of arbitrary user object IDs into
   the URL, which is why it has to circumvent the __exports__ check:
   the object IDs won't be known until runtime, so it would be silly to
   add them to __exports__. Very useful and powerful feature, but has
   security implications! Other changes:
 
 - deleted some cruft
 
 - added some comments in '_traverse()'
 
 - improved some error messages in '_traverse()'
 
 - rearranged some other code in '_traverse()'
 
 - take advantage of the 'callable()' builtin in a few places,
   including to sanity-check the supposedly-callable object returned by
   '_traverse()'
 
 - in 'traverse_url()', give instances similar treatment to modules
   (goes hand-in-hand with the '__getname__()' addition, since
   '__getname__()' will most likely return an instance)
] 
[.: changeset 5260
nascheme**20001004024241
 Simplify AccessError object. It now only takes one error message.
] 
[.: changeset 5261
nascheme**20001004024838
 Simplify calling of __access__. The __access__ method now raises a
 quixote.errors.AccessError object if the access check fails. An
 optional failure message can be supplied (like all normal exceptions).
 Processing of the path is aborted and the exception is passed to
 ACCESS_VIOLATION_PAGE.
] 
[.: changeset 5298
nascheme**20001006233928
 use different magic for 2.0 compiled templates
] 
[.: changeset 5299
nascheme**20001006234005
 - remove debugging print statments
 
 - don't use FixedModuleImporter for Python 2.0
] 
[.: changeset 5336
akuchlin**20001011194935
 Remove obsolete test cases
] 
[.: changeset 5400
nascheme**20001016202001
 Allow module level expressions in PTL templates (ie. Greg can now use
 his beloved doc strings).
] 
[.: changeset 5459
gward**20001020224229
 Added 'del_session()' method to SessionCollection.
] 
[.: changeset 5461
gward**20001020224534
 Remove 'del_session()' -- I forgot this class acts sort of like a
 dictionary of sessions and has a '__delitem__()' method.
] 
[.: changeset 5467
akuchlin**20001021002449
 Added significant changes since the last release
] 
[.: changeset 5469
akuchlin**20001021003422
 Remove some completed tasks from the TODO list
] 
[.: changeset 5470
akuchlin**20001021003718
 Added copies of the testing framework, slightly modified to refer to
 them from the quixote.test package instead of mems.tools.test
] 
[.: changeset 5472
akuchlin**20001021003926
 Install the quixote.test subdirectory
] 
[.: changeset 5477
akuchlin**20001021015622
 Added copy of code coverage module
] 
[.: changeset 5548
akuchlin**20001025235026
 Add list of acknowledgements
] 
[.: changeset 5549
akuchlin**20001025234850
 Set a session collection object, and add some comments
] 
[.: changeset 5550
nascheme**20001025235348
 the usual
] 
[.: changeset 5556
akuchlin**20001026003412
 Modified __str__() so it no longer mutates the object (it had side
 effects, such as deleting the Status header!) .setBody()'s docstring
 claimed it set the content-length, but it didn't. With this fix the
 Content-length header should have the correct value. Minor docstring
 changes
] 
[.: changeset 5562
akuchlin**20001026023207
 Minor rewrite: FastCGI is now not completely mandatory
] 
[.: changeset 5597
gward**20001027203120
 Pass request and response objects to '__getname__()' along with object
 ID. Cosmetic tweak.
] 
[.: changeset 5658
gward**20001031043833
 Don't dump all data in '__repr__()' -- just the number of data chunks.
] 
[.: changeset 5663
gward**20001031212431
 - First steps towards replacing the overgrown, all-singing/all-dancing
   '__getitem__()" inherited from Zope:
 
 - added 'get_url(n)' and 'get_url_base(n)' to take the place of the
   URLn and BASEn computed attributes
 
 - added '_construct_url()' and '_parse_url()' for use by 'get_url(n)'
   and 'get_url_base(n)'
 
 - added 'get_environ()'
] 
[.: changeset 5664
gward**20001031212701
 Delete '__str__()' and '__repr__()' -- no more outrageously voluminous
 stringifications of response objects (I hope).
] 
[.: changeset 5665
gward**20001031213824
 Added 'default' parameter to 'get_environ()'. Deleted the massively
 overgrown and complex '__getitem__()', as well as its alias
 '__getattr__()'. Rewrite 'get()': no longer a wrapper around
 '__getitem__()', now it just checks the environment, then the form,
 then gives up and returns the default. This is a temporary backwards
 compatibility measure to handle code that does 'request.get(...)'.
 Deleted 'has_key()' and 'keys()', since they only made sense in the
 context of the massive '__getitem__()' method.
] 
[.: changeset 5685
gward**20001101193212
 Fix to use 'request.get_environ()'.
] 
[.: changeset 5686
gward**20001101193627
 Don't act like a dictionary: ie. removed '__len__()', '__setitem__()'
 (and alias 'set()'), '__getitem__()' (and aliases 'get()' and
 '__getattr__()'), 'has_key()', 'keys()', 'items()', and 'values()'.
 Mainly ditched all this because I just don't see the need for it -- it
 all seems completely gratuitous.
] 
[.: changeset 6035
akuchlin**20001115214458
 Ensure that __access__ is called before trying to call __getname__
 Generate redirect to ensure a trailing slash for any objects that
 aren't callable
] 
[.: changeset 6051
nascheme**20001116025733
 The traverse loop has been modified yet again. __access__ should now
 be called at the appropriate times.
] 
[.: changeset 6411
gward**20001205202232
 Renamed SessionCollection to SessionManager and GlobalSession to
 Session; updated comments and docstrings accordingly, and also renamed
 the '{get,set}_session_collection()' functions. Added, updated, and
 reformatted lots of docstrings. Added/updated some comments.
] 
[.: changeset 6412
gward**20001205202326
 Added DummySessionManager and DummySession so applications can choose
 not to do session management at all.
] 
[.: changeset 6512
akuchlin**20001208032551
 Remove BASEx and URLx values from the dump() and dump_html() methods
] 
[.: changeset 6513
akuchlin**20001208033401
 When mailing a traceback, make the subject and from headers a bit more
 informative
] 
[.: changeset 6526
gward**20001208233215
 Put both Quixote log files in /www/logs, and rename the error log to
 quixote-error.log.
] 
[.: changeset 6527
gward**20001208233853
 Oops, /www/log not /www/logs!
] 
[.: changeset 6549
gward**20001209034610
 - Overhauled for bettern external distribution and usability by
   outsiders:
 
 - beefed up comments and module docstring
 
 - renamed ROOT_PACKAGE to ROOT_NAMESPACE
 
 - changed several default values to be more widely applicable:
   ROOT_NAMESPACE ("quixote.demo") DEBUG_LOG (None) ERROR_LOG (None)
   SECURE_ERRORS (0) COOKIE_DOMAIN ("example.com") COOKIE_NAME
   ("Qsession")
] 
[.: changeset 6550
gward**20001209034730
 ROOT_PACKAGE -> ROOT_NAMESPACE
] 
[.: changeset 6569
nascheme**20001211211649
 Support augmented assignment statements.
] 
[.: changeset 6570
gward**20001211214630
 Added Config class and 'config', its default instance. Moved
 SECURE_ERRORS up to be right after DISPLAY_EXCEPTIONS.
] 
[.: changeset 6571
gward**20001211215022
 Change to use 'config' instance rather than 'config' module. A handful
 of formatting and docstring tweaks.
] 
[.: changeset 6572
gward**20001211214659
 Change to use 'config' instance rather than 'config' module.
] 
[.: changeset 6573
gward**20001211214837
 Changed SessionManager so the cookie parameters (name, domain, path)
 are taken from the 'config' instance at initialization time and stored
 in the SessionManager object, rather than partly as static class
 attributes and partly fetch from the 'config' module at run-time.
] 
[.: changeset 6574
gward**20001211215142
 Formatting tweak.
] 
[.: changeset 6575
gward**20001211215807
 Renamed 'redirect_stdout()' to 'setup_logs()' and 'restore_stdout()'
 to 'shutdown_logs()'; added aliases for backwards compatibility.
 Changed to use 'config' instance instead of 'config' module. Added
 'read_config_file()' and 'set_config()'.
] 
[.: changeset 6589
akuchlin**20001212001345
 - Don't list .other dictionary in dump() and dump_html() output Remove
   more unused junk:
 
 - setSite() method
 
 - Storing cookies in self.other dictionary
 
 - Various other assignments to self.other (Not removing self.other
   completely because it is used by _parse_url(), which we *are* using,
   and I don't want to disentangle the details. Instead, my plan is to
   actually work on PEP222 tomorrow.)
] 
[.: changeset 6625
nascheme**20001214003334
 Handy script for debugging compiled PTL files.
] 
[.: changeset 6651
nascheme**20001215045123
 - remove access_violation_page and add error_handler
 
 - make security the default setting
] 
[.: changeset 6652
nascheme**20001215045418
 - Derive AccessError and TraversalError from a common exception. They
   are special because they don't result in lots of debugging output.
 
 - Add format methods to PublishException subclasses. Quixtote uses
   this method to generate a response page. It is expected that
   applications will create subclasses of PublishException to handle
   specific errors in an application specific manner.
] 
[.: changeset 6653
nascheme**20001215050141
 - Create a new function report_error for handling exceptions.
 
 - If a PublishException is raised then use the format method to
   generate an error page. Other exceptions are formatted using
   error_handler().
 
 - Don't catch ImportErrors and re-raise them as TranverseErrors. An
   ImportError means that something is wrong with the application.
 
 - Simplify the call() function.
 
 - Rename send_traceback to mail_error and simplify it.
 
 - Change the order of arguments for TraversalError. A path is always
   required while a more detailed message is optional.
] 
[.: changeset 6654
nascheme**20001215050352
 Add get_path method.
] 
[.: changeset 6667
nascheme**20001219003941
 Format traversal errors as HTML (a temporary solution until I figure
 out the proper solution).
] 
[.: changeset 6708
nascheme**20001219220916
 - Remove IgnoredException, its not needed.
 
 - Rename PublishException to PublishError.
 
 - Add QueryError.
 
 - Document exception classes.
] 
[.: changeset 6709
nascheme**20001219220938
 Remove IgnoredException, its not needed.
] 
[.: changeset 6722
nascheme**20001220022139
 Clarify title of request dump.
] 
[.: changeset 6863
nascheme**20010110020451
 Don't pass response object. It can be accessed from the request
 object.
] 
[.: changeset 6889
nascheme**20010111031952
 - Massive lobotomy:
 
 - Support for xml-rpc and typed form variables are gone.
 
 - get_url() and get_path() have been re-written. Hopefully they do the
   right thing now. The old versions didn't handle the HTTP scheme
   properly.
 
 - Added get_server() method. Removed get_url_base() method. It was
   only used in one place in our code and that use looked incorrect. We
   can add it back later if we feel the need.
 
 - Removed retry() method.
 
 - Removed lots of ugly optimizations.
 
 - Added redirect() method (builts a full URL and calls
   response.redirect)
 
 - Constructor no longer takes response object. A new response is
   automaticly created.
] 
[.: changeset 6890
nascheme**20010111032245
 - Remove some Zope crud.
 
 - redirect() method now requires a complete URL.
 
 - constructor no longer requires the server_name. It was only used to
   build a complete redirect URL.
] 
[.: changeset 6891
nascheme**20010111032307
 Add fix_trailing_slash option.
] 
[.: changeset 6892
nascheme**20010111033009
 - Be much more careful about handling URLs with a trailing slash. A
   trailing slash really means that the last component of the path is
   the empty string. Quixote treats this as an alias to "index". Apache
   treats as an alias to "index.html". Making the publish loop work
   this way simplified things and fixed a few bugs.
 
 - Add fix_trailing_slash option.
 
 - Minor updates due to HTTPResponse and HTTPRequest cleanups.
] 
[.: changeset 6907
nascheme**20010111203431
 Always traverse the entire path (ie. PATH_INFO is now always empty).
 Previously, scripts that didn't expect PATH_INFO would silently accept
 extra compoments on the end of the path. This could cause pages to
 break in subtle ways (think relative links). __getname__ or a query
 string can be used instead of PATH_INFO and are a cleaner solution.
] 
[.: changeset 6974
nascheme**20010116022609
 Add some info about things I changed.
] 
[.: changeset 6982
nascheme**20010116214259
 Update version.
] 
[.: changeset 6983
nascheme**20010116214333
 Bring demo script up to date.
] 
[.: changeset 6984
nascheme**20010116214349
 - update version
 
 - add demo package
] 
[.: changeset 6985
nascheme**20010116214407
 Silly demo.
] 
[.: changeset 6986
nascheme**20010116214455
 Update install docs. Compiler is now part of Python 2.0. No longer
 have to edit config.py.
] 
[.: changeset 6987
nascheme**20010116215107
 More stuff for 0.2.
] 
[.: changeset 6990
akuchlin**20010116220439
 Add two items to the CHANGES file from my copy
] 
[.: changeset 7300
akuchlin**20010206013811
 On a PublishError(), commit the transaction instead of aborting it.
 Read the large comment in the code to understand why.
] 
[.: changeset 7977
nascheme**20010301234937
 Remove NotImplementedError exceptions.
] 
[.: changeset 8038
gward**20010302235645
 At long last, deleted the oldest debug print in the entire system:
 "Session: just created ...".
] 
[.: changeset 8233
gward**20010315020302
 Beefed up docstrings to play along with the gen_schema script (since
 instances of classes derived from the Quixote session classes find
 their way into the MEMS Exchange database, it's best if Quixote's
 session classes are included in our object schema). Fixed a silly
 typo: now 'SessionManager.value()' actually returns the values of its
 dictionary (not the keys!).
] 
[.: changeset 8234
gward**20010315020555
 Remove ZODB awareness from SessionManager's 'sorted_keys()' method;
 it's up to ZODB-aware subclasses (such as MXSessionManager) to know
 that the objects returned by a BTree's 'keys()' method don't have or
 need a 'sort()' method.
] 
[.: changeset 8311
akuchlin**20010318003323
 Use .setStatus() method instead of doing it by hand
] 
[.: changeset 8318
akuchlin**20010319213103
 Record the time of an error Add a separator line after each error
] 
[.: changeset 8371
nascheme**20010321000013
 - add trailing newline to PTL modules if required
 
 - add support for 2.1a2 interpreter and compiler
] 
[.: changeset 8372
nascheme**20010321000027
 Remove unused imports.
] 
[.: changeset 8373
akuchlin**20010321000125
 Use re module instead of regex Rewrite parse_cookie to be iterative
 instead of recursive
] 
[.: changeset 8416
gward**20010323015921
 Typo fix in comment. Change example ERROR_EMAIL value to something
 more generic.
] 
[.: changeset 8462
gward**20010324012712
 Fix formatting of TraversalError: it ended with "</htm>" rather than
 "</html>", and didn't have a trailing newline. One or the other of
 these caused Mozilla to hang on the line, waiting for the end of the
 document; both are fixed now.
] 
[.: changeset 8532
nascheme**20010328005037
 - Add cache flag and make it default to true. Almost everything
   generated by a Quixote application will un-cachable. There should be
   a more general way to control caching but not right now.
 
 - Import individual types from type module.
] 
[.: changeset 8586
nascheme**20010330034704
 - use struct module to pack and unpack data
 
 - optimize internal isFCGI() tests a little
 
 - move global statments to start of functions
 
 - fix small bug with FCGI_WEB_SERVER_ADDRS
] 
[.: changeset 8609
abenard**20010331003045
 dump the session into the error log
] 
[.: changeset 8610
abenard**20010331003106
 fix session dump
] 
[.: changeset 8619
nascheme**20010331013022
 Change __getname__ and __access__ to _q_getname and _q_access.
] 
[.: changeset 8620
nascheme**20010331013338
 Change __getname_, __access__, and __exports__ to _q_getname,
 _q_access and _q_exports.
] 
[.: changeset 8621
nascheme**20010331013856
 - Change __getname_, __access__, and __exports__ to _q_getname,
   _q_access and _q_exports.
 
 - Save complied regex for removing extra slashs from paths.
] 
[.: changeset 8625
nascheme**20010331015854
 An empty path component now maps into _q_index instead of index.
 _q_index does not have to be exported.
] 
[.: changeset 8652
gward**20010402221558
 Add "To:" header to error email (to conform with RFC 822). Typo fix.
] 
[.: changeset 8653
gward**20010402221647
 Add a link from an integer's page to its factorial's page.
] 
[.: changeset 8736
eoverly**20010405012601
 don't immediately add session id to cookies so we can check if we are
 cookie enabled
] 
[.: changeset 8737
nascheme**20010405014902
 - Fix type declarations.
 
 - Remove old backward-compatibile names get_session_collection,
   set_session_collection, SessionCollection, GlobalSession.
] 
[.: changeset 8738
nascheme**20010405014950
 Use new get_session_manager() function instead of old
 get_session_collection().
] 
[.: changeset 8765
eoverly**20010406014632
 add the user id to the mail message sent out by mail_error so we know
 who to contact if we want to
] 
[.: changeset 8808
eoverly**20010410011442
 clean up error message displayed to user
] 
[.: changeset 8809
eoverly**20010410011904
 fix spelling error
] 
[.: changeset 8814
akuchlin**20010410024703
 Add ACCESS_LOG configuration setting Remove extra " in comment
] 
[.: changeset 8816
akuchlin**20010410025743
 Write each call to the access log
] 
[.: changeset 8817
akuchlin**20010410030038
 Update change log (I don't know what the next version of Quixote will
 be)
] 
[.: changeset 8835
akuchlin**20010410190807
 At Neil's suggestion, set buffering in open() instead of calling
 flush()
] 
[.: changeset 8843
abenard**20010410234636
 - fix attribute error if user is None
 
 - remove unused kwarg
] 
[.: changeset 8917
gward**20010413212728
 Fix strftime() format: '%m' for month, not '%M'.
] 
[.: changeset 9117
gward**20010425190218
 - Fixed session-dumping so it can work with non-MEMS Exchange
   applications:
 
 - don't call '_startdump()' from Session.dump()
 
 - do indentation manually, since we can't assume that 'file' is an
   IndentedFile
 
 - added tiny 'dump()' method to DummySession -- the 'dump()' it
   inherits from Session is wrong, since it assumes all kinds of
   attributes that DummySession doesn't have
] 
[.: changeset 9118
gward**20010425192328
 Added 'debug()' function to print a message to stderr -- ie. to
 Apache's error log. Added a bunch of (commented-out) 'debug()' calls
 so I could attempt to figure out Quixote's error-handling. Renamed
 'sess_coll' to 'session_mgr' in 'call()'.
] 
[.: changeset 9125
gward**20010425203514
 - Tore up the generic internal error message:
 
 - renamed from GENERAL_INTERNAL_ERROR to _generic_internal_error: this
   is a private global, not shared by other modules
 
 - rewrote the message; in particular, removed hard-coded reference to
   webmaster@mems-exchange.org and replaced with SERVER_ADMIN from the
   environment
 
 - changed from plain text to HTML
] 
[.: changeset 9126
gward**20010425210203
 Added two methods used as "hooks" into the Quixote publishing loop:
 'start_request()' and 'finish_request()'. We might want to add a third
 method to call when a request ends in an error, since
 'finish_request()' is only called if we successfully find and call a
 callable object.
] 
[.: changeset 9127
gward**20010425210256
 - Invoke the two new "hook" methods of Session:
 
 - call 'start_request()' before traversing the URL
 
 - call 'finish_request()' after successfully finding and calling a
   callable object
] 
[.: changeset 9216
nascheme**20010427202653
 Don't blow up when writing error message if request.session is None.
] 
[.: changeset 9278
nascheme**20010501225248
 Don't cache cookie setting on SessionManager instance. Get them from
 the config.
] 
[.: changeset 9279
nascheme**20010501225409
 Update to support Python 2.1.
] 
[.: changeset 9618
gward**20010518182913
 Fix mail_error() so it doesn't assume request.session is always
 defined (it was dying with AttributeError on request.session.user,
 because request.session can sometimes be None).
] 
[.: changeset 9653
nascheme**20010524004926
 Add handy functions for getting request, session, user, etc.
] 
[.: changeset 9654
nascheme**20010524004956
 Remove config global. Make set_from_dict() method public.
] 
[.: changeset 9655
nascheme**20010524005038
 Remove custom exception formatting. Use Quixote's default (which can
 be override by applications).
] 
[.: changeset 9656
nascheme**20010524005230
 Move publishing loop into a class. Split session handling logic into a
 subclass. This change should make it easier for Quixote applications
 to customize the object publisher.
] 
[.: changeset 9657
nascheme**20010524005434
 Remove DummySessionManager and DummySession. They are no longer
 necessary now that session management has been moved out of the base
 publisher class. Get configuration information from Publisher object
 instead of using the global in the config module.
] 
[.: changeset 9658
nascheme**20010524005510
 Rename index to _q_index.
] 
[.: changeset 9668
nascheme**20010524213721
 - Show pid in debugging output.
 
 - Split the main publishing logic out into a try_publish method. This
   makes it easy for subclasses to override this part of the publishing
   loop.
 
 - Update environment variables inside of traverse_url instead of
   returning the new values to the caller.
 
 - Set _request global inside of parse_request(). The request should
   only be parsed once.
] 
[.: changeset 9740
gward**20010530011935
 - Ditched tons of unused code:
 
 - all imports
 
 - config file functions (read_config_file(), set_config())
 
 - call to setup_logs() from init_quixote() (couldn't have worked as
   this name was undefined)
 
 - AutoflushFile class This module is now reduced to init_quixote() and
   install_imphooks(), and init_quixote() is just a wrapper around
   install_imphooks(). Most work that was formerly done here is now in
   the Publisher constructor.
] 
[.: changeset 9741
gward**20010530012647
 Tweak docstring so Emacs colourization doesn't get confused.
] 
[.: changeset 9750
gward**20010530071249
 Allow application to supply the Publisher's 'config' object, either by
 supplying it as an optional keyowrd to the constructor or by calling
 the new 'set_config()' method.
] 
[.: changeset 9762
gward**20010530222533
 Add 'root_namespace' instance attribute to Publisher, and add it as a
 required constructur argument to both Publisher and SessionPublisher.
] 
[.: changeset 9763
gward**20010530222616
 Removed ROOT_NAMESPACE config variable.
] 
[.: changeset 9768
gward**20010530223832
 Now that security is the default setting, rewrite the comment that
 said it wasn't to say it is.
] 
[.: changeset 9808
nascheme**20010602021345
 Add compress_pages config option.
] 
[.: changeset 9809
nascheme**20010602021420
 Compression responses if client accepts gzip encoding.
] 
[.: changeset 9810
nascheme**20010602021441
 Update example CGI script.
] 
[.: changeset 9811
nascheme**20010602021539
 Add get_encoding() method to find the encodings a client accepts.
] 
[.: changeset 9812
nascheme**20010602021629
 Add missing "\r" characters to headers. It seems that most clients
 don't care but its better to conform to the spec.
] 
[.: changeset 9909
akuchlin**20010607211350
 Don't use '.', because it's not portable to the Mac. (Observed by
 David Goodger) Bump version number to 0.3
] 
[.: changeset 9910
akuchlin**20010607220624
 Initial stab at PTL docs, assembled from Neil and Greg's postings with
 some rewriting.
] 
[.: changeset 9911
akuchlin**20010607222226
 Updated the change log
] 
[.: changeset 9912
akuchlin**20010607222308
 Fix goofy sentence Add some people
] 
[.: changeset 9913
akuchlin**20010607230240
 Revise the README; it's still not very good, though.
] 
[.: changeset 9928
akuchlin**20010608012709
 Add paragraph about TemplateIO, as suggested by David Goodger
] 
[.: changeset 9933
akuchlin**20010608052042
 How to write a Quixote application
] 
[.: changeset 9934
akuchlin**20010608052251
 Remove trailing blank lines
] 
[.: changeset 9935
akuchlin**20010608052858
 Simplify instructions by assuming Python 2.x
] 
[.: changeset 9936
akuchlin**20010608053424
 Add explanatory comment line
] 
[.: changeset 9937
akuchlin**20010608053926
 Update the manifest, removing an old directory and adding some new
 files
] 
[.: changeset 9938
akuchlin**20010608192424
 Remove CGI config information from INSTALL, moving it into
 programming.txt Fix error in _q_getname() example, pointed out by Neil
] 
[.: changeset 9939
akuchlin**20010608195147
 In example, install import hook before creating Publisher instance.
 (This is works even when the root package tries to import PTL modules
 right off the bat.)
] 
[.: changeset 9940
akuchlin**20010608195222
 Use full import
] 
[.: changeset 9941
akuchlin**20010608195249
 Get this script working again, and make it match the example in
 doc/programming.txt better
] 
[.: changeset 9942
akuchlin**20010608200029
 Update the manifest; quixote.cgi is now demo/quixote.fcgi, and the
 sample/ directory really does need to be pruned.
] 
[.: changeset 9945
akuchlin**20010608202539
 Add Greg's suggested edits, and de-emphasize the books example
] 
[.: changeset 9946
akuchlin**20010608202554
 Note Python 2.x requirement
] 
[.: changeset 9947
akuchlin**20010608202605
 Add two projects
] 
[.: changeset 10066
gward**20010614231556
 - In the access log, write "-" instead of "None" if there is no
   current user. Two changes to 'mail_error()':
 
 - take an 'error_summary' argument which is included in the subject
   line (this is generated in finish_failed_request() from the
   exception type and value -- eg. "AttributeError: foo" or what-have-
   you)
 
 - don't bother with the -f option to /usr/lib/sendmail -- Exim ignores
   it (the value was bogus, and ordinary users aren't allowed to supply
   -f anyways), and it's unnecessary since there's a From header in the
   generate message anyways
] 
[.: changeset 10119
nascheme**20010620014034
 Remove unused import. Fix typo.
] 
[.: changeset 10120
nascheme**20010620014045
 Fix typo.
] 
[.: changeset 10121
nascheme**20010620014116
 Remove unused imports and variables. Fix typo.
] 
[.: changeset 10122
nascheme**20010620014322
 Set default character set to iso-8850-1. HTML 4 allows the browser to
 use any character set if none specified. That's madness if you want to
 safely quote data. Fix a typo found by PyChecker.
] 
[.: changeset 10243
gward**20010625225510
 When run as a regular CGI script (ie. _isFCGI is false), set the
 input/ output/error files from sys.{__stdin__,__stdout__,__stderr__}
 -- that gets the original stdin/out/err rather than the versions
 redirected by Quixote for debug/error logging. Fixes bug 0016, and
 finally allows Quixote apps to run as plain old CGI scripts.
] 
[.: changeset 10306
nascheme**20010628004948
 Save sessions at the end of requests and don't save empty sessions.
] 
[.: changeset 10308
nascheme**20010628005225
 Don't save empty sessions. Sessions are now saved after processing a
 request rather than at the beginning.
] 
[.: changeset 10311
nascheme**20010628005856
 Remove old __setstate__.
] 
[.: changeset 10454
akuchlin**20010704003831
 Change TraversalError to have both private and public messages
] 
[.: changeset 10455
akuchlin**20010704003844
 Fix use of TraversalError
] 
[.: changeset 10461
gward**20010705010601
 Added SessionError, raised by SessionManager.get_session() if the
 client supplies an invalid session ID cookie. (This mainly happens if
 sessions are expired, but it could also be a result of a buggy or
 malicious client sending bogus cookies.) Supply a default message in
 QueryError: "Invalid query". Cosmetic tweaks.
] 
[.: changeset 10462
gward**20010705010836
 Changed SessionManager.get_session() to raise SessionError if the
 client supplied an invalid session ID cookie, rather than silently
 creating a new session. This lets us tell people nicely when their
 session has expired, rather than have strange and confusing behaviour
 that results when a non-empty (eg. user logged in) session is replaced
 with a brand-new session. Remove unused argument from
 SessionManager.revoke_session_cookie(), and change value of revoked
 cookie from "*del*" to "".
] 
[.: changeset 10463
gward**20010705011743
 Factored format_error() out of finish_interrupted_request() -- this
 isolates the if/elif/.../else that formats a single exception so
 subclasses can easily add new exception types. Added
 format_session_error() and extended format_error() to call it when
 passed a SessionError. Cosmetic/comment tweaks.
] 
[.: changeset 10564
akuchlin**20010712031954
 Add line pointing to doc/INSTALL
] 
[.: changeset 10614
akuchlin**20010716203430
 Remove no-longer-existing parameter to revoke_session_cookie()
] 
[.: changeset 11347
nascheme**20010822193711
 Moved here from mems.ui.form.
] 
[.: changeset 11349
nascheme**20010822193802
 Little functions for dealing with HTML. Created from code in
 mems.ui.lib.
] 
[.: changeset 11357
nascheme**20010822203603
 Generate session cookies using better random data.
] 
[.: changeset 11358
akuchlin**20010822221128
 Add action items from today's meeting
] 
[.: changeset 11376
nascheme**20010823023754
 Allow functions to appear inside PTL modules.
] 
[.: changeset 11390
nascheme**20010824000844
 Simplify TemplateIO object. Use __iadd__ method instead of write
 method.
] 
[.: changeset 11394
nascheme**20010824001822
 Use __iadd__ method instead of write method to collect template
 output. Call str() before returning the output. Templates now always
 return a string object instead of a TemplateIO object.
] 
[.: changeset 11395
nascheme**20010824001856
 Add crappy version of randlong() for platforms that don't have
 /dev/urandom.
] 
[.: changeset 11396
nascheme**20010824001922
 Templates now return strings.
] 
[.: changeset 11450
nascheme**20010824235348
 Simplify OptionSelectWidget. Use a single select box with a bit of
 javascript to automatically submit the form on changes. People without
 javascript will have hit an "apply" button after changing an option.
] 
[.: changeset 11462
nascheme**20010827202036
 Make __in_template a stack (think nested functions). We really should
 have a unit test for PTL.
] 
[.: changeset 11470
gward**20010828003153
 Add a debug print to demonstrate debug printing. Fixed HTML.
] 
[.: changeset 11471
gward**20010828003225
 Added debug prints, stderr-writing, and exception raising to
 demonstrate how Quixote handles them.
] 
[.: changeset 11472
gward**20010828003803
 Use gward@mems-exchange.org, not gward@python.net -- I work in Quixote
 on company time.
] 
[.: changeset 11474
nascheme**20010828021244
 Remove BaseRequest and more useless code.
] 
[.: changeset 11475
nascheme**20010828021258
 Remove BaseResponse and more useless code.
] 
[.: changeset 11476
nascheme**20010828021314
 Now unused.
] 
[.: changeset 11477
gward**20010828022050
 Renamed quixote.fcgi -> demo.fcgi.
] 
[.: changeset 11478
nascheme**20010828022803
 *** empty log message ***
] 
[.: changeset 11480
gward**20010828025607
 Removed obsolete module -- install_imphooks() can now be imported from
 publish.py.
] 
[.: changeset 11481
gward**20010828025954
 Import install_imphooks from quixote.publish -- quixote.init is dead.
] 
[.: changeset 11482
gward**20010828031134
 Make install_imphooks() a module-level function, not a method of
 Publisher, and added a docstring. Removed unused
 '_get_module_filename()'. Renamed 'get_module()' to '_get_module()'.
] 
[.: changeset 11491
gward**20010828064528
 Drop Python 1.5.2 compatibility, ie. delete the FixedModuleImporter
 class. Keep the check for Python >= 2.0b1 alive as an assert at
 module-level, though.
] 
[.: changeset 11492
gward**20010828174634
 Removed 'quixote.util' package -- moving quixote.util.fcgi to
 quixote.fcgi.
] 
[.: changeset 11494
gward**20010828174932
 quixote.util.fcgi is now quixote.fcgi.
] 
[.: changeset 11495
gward**20010828174944
 quixote.util package is dead.
] 
[.: changeset 11499
gward**20010828233735
 Provides a version of the Distutils "build_py" command that knows
 about PTL files. This is installed with Quixote so other Quixote apps
 can use it in their setup scripts.
] 
[.: changeset 11500
gward**20010828233758
 Use the qx_build_py command from qx_distutils.
] 
[.: changeset 11501
gward**20010828233830
 Tools for sending mail from Quixote applications.
] 
[.: changeset 11502
gward**20010828233929
 Added the config variables needed by the quixote.sendmail module:
 MAIL_FROM, MAIL_SERVER, MAIL_DEBUG_ADDR.
] 
[.: changeset 11503
gward**20010828234204
 Renamed demo.fcgi -> demo.cgi.
] 
[.: changeset 11511
gward**20010829033144
 - Fixed bug 63, so accesses to a bare driver script (eg. "/cgi-
   bin/demo.cgi") are redirected (eg. to "/cgi-bin/demo.cgi/").
   Details:
 
 - add specific check for empty path to traverse_url(), and do the
   redirect if fix_trailing_slash is true
 
 - loosened up try_publish() so traverse_url() is allowed to return
   None if it does a redirect
 
 - simplify the other "fix trailing slash" redirect in traverse_url()
   so it just does the redirect and returns None, rather than returning
   a little function to do the redirect
 
 - changed publish() to do os.environ.get('PATH_INFO', '') -- ie. don't
   assume PATH_INFO is always in the environment Various cosmetic
   tweaks to comments and error messages.
] 
[.: changeset 11512
gward**20010829033307
 Config file for the Quixote demo. Specifies log files and insecure
 (ie. useful) errors.
] 
[.: changeset 11513
gward**20010829033348
 Read the demo.conf config file. Setup the log files, so the debug
 prints in the demo app don't crash the whole thing.
] 
[.: changeset 11514
gward**20010829033409
 Fix broken factorial algorithm (oops).
] 
[.: changeset 11515
gward**20010829034751
 Removed install_imphooks() -- it's now enable_ptl() in __init__.py.
] 
[.: changeset 11516
gward**20010829034818
 Import Publisher class. Added enable_ptl() (was install_imphooks() in
 publish.py).
] 
[.: changeset 11520
gward**20010829062259
 Use enable_ptl(), not install_imphooks().
] 
[.: changeset 11521
gward**20010829062448
 Don't bother with main() or PACKAGE_NAME -- make this script as simple
 as possible.
] 
[.: changeset 11522
gward**20010829062532
 Comment tweak.
] 
[.: changeset 11523
gward**20010829062601
 Terminology: 'driver script' not 'FCGI/CGI script'.
] 
[.: changeset 11541
gward**20010829215217
 Renamed other() to simple(). Moved IntegerUI and fact() to
 integer_ui.py.
] 
[.: changeset 11542
gward**20010829215235
 New module for the IntegerUI code taken from __init__.py.
] 
[.: changeset 11543
gward**20010829215344
 Make _q_index() return a valid HTML page. Add a paragraph about where
 this page comes from. Improved the text in the bullet list of links.
] 
[.: changeset 11544
gward**20010829215459
 Insanely detailed explanation of how to get the Quixote demo running
 and how it works. This might be the "gentle introduction" document
 that Quixote needs. Initial revision is more-or-less complete, but
 needs some tying-up text at the end.
] 
[.: changeset 11545
gward**20010829224614
 Bumped version to 0.4; it's getting close! Rearranged/reworded list of
 design goals. Fixed URL for Robin Dunn's fcgi.py, and state that ours
 is derived from his. Added "Quick start" and "Documentation" sections
 for easy reference.
] 
[.: changeset 11546
gward**20010829225235
 Renamed compile_template.py -> ptl_compile.py.
] 
[.: changeset 11547
gward**20010829225258
 Renamed imphooks.py -> ptl_import.py.
] 
[.: changeset 11548
gward**20010829225322
 Renamed dumpptlc.py -> ptlc_dump.py.
] 
[.: changeset 11554
nascheme**20010830014151
 Change get_widget_class() so that it just returns widget_type if it
 can't find a registered widget by that name. This makes the error
 reporting a little worse but allows the use of locally defined
 widgets.
] 
[.: changeset 11555
gward**20010830014753
 quixote.zope package is dead -- moving quixote.zope.HTTPRequest and
 quixote.zope.HTTPResponse modules to quixote.http_request and
 quixote.http_response.
] 
[.: changeset 11556
gward**20010830014927
 Moved quixote.zope.HTTP{Request,Response} modules to
 quixote.http_{request,response}.
] 
[.: changeset 11559
dbinger**20010830015521
 Spell license the way it appears in doc/ZPL.txt
] 
[.: changeset 11560
gward**20010830021106
 - First pass at making code conform to MX coding standards:
 
 - module docstrings
 
 - __revision__ string
 
 - method names (setFoo() -> set_foo())
 
 - whitespace on def line: "def foo(...)" -> "def foo (...)"
] 
[.: changeset 11567
nascheme**20010830023121
 zope package is dead, update import list.
] 
[.: changeset 11569
gward**20010830023251
 - Getting serious about ripping out Zope cruft now:
 
 - removed _authUserPW() -- not used anywhere
 
 - removed html_quote() (we have our own)
 
 - removed str_field()
 
 - removed isCGI_NAME -- not sure what purpose it served, but I suspect
   it was a consequence of Zope's conflation of environment variables,
   form variables, and cookies (shudder)
 
 - removed hide_key -- it's only used by dump() and dump_html(), and
   Quixote doesn't hide anything from its users (Quixote is more
   trusting than Zope)
 
 - make _file an instance attribute, not a hybrid instance/class attr.
   Not sure what purpose this serves; it's assigned once and never
   referenced. Renamed browser_version() to guess_browser_version() --
   method names should have a verb! Improved coding standards
   conformance here. More coding standards conformance:
 
 - "a=b" -> "a = b" in standalone assignments
 
 - remove leading backslash from docstrings; who really cares if
   docstrings start with a newline!
 
 - break one-line if statements up Moved the two REs used by
   parse_cookie() out of the argument list (ugh) to globals.
] 
[.: changeset 11571
gward**20010830023810
 "a=b" -> "a = b", and "a==b" -> "a == b".
] 
[.: changeset 11572
nascheme**20010830024015
 Rename HTTPResponse and HTTPRequest methods.
] 
[.: changeset 11573
nascheme**20010830024328
 Rename imphooks to ptl_import.
] 
[.: changeset 11574
nascheme**20010830024337
 Rename compile_template to ptl_compile.
] 
[.: changeset 11576
nascheme**20010830024700
 Rename HTTPRequest and HTTPResponse methods.
] 
[.: changeset 11579
nascheme**20010830030002
 OptionSelectWidget always needs to have a value, None is not allowed.
] 
[.: changeset 11580
gward**20010830030005
 Kill the status_codes dictionary -- it was only used as a crutch for
 lazy Zope programmers to do stuff like "response.setStatus('not
 found')" and still get a proper 404 response. Blecchhh. set_status()
 now requires that the status code be an integer in the range 100 ..
 599. Also, if the status code is unknown, it doesn't use "Unknown" for
 the reason: it rounds the code down to the nearest x00 and uses that,
 eg. "set_status(452)" (non-standard status code) will use the failure
 reason for 400, "Bad Request". Indent the contents of the
 status_reason dictionary. Use string methods everywhere, and kill
 imports of/from 'string'. Remove quoteHTML() -- I mean, how many do we
 *need*?!? Remove the silly code in __str__() that mutilated all-lower-
 case header names ("foo-bar-baz") to mixed case ("Foo-Bar-Baz"). Just
 emit all headers the way they were set. Sheesh!
] 
[.: changeset 11584
gward**20010830200329
 Use string methods, drop imports of/from 'string' module. Some minor
 reformatting.
] 
[.: changeset 11587
gward**20010830202334
 Deleted the special treatment of HTTP_AUTHORIZATION in constructor.
 Still need to add a get_authorization() method! Changed
 parse_cookie()'s interface: now it always creates a new dictionary and
 returns it, rather than modifying an existing dictionary (or maybe
 creating a new one) and return None (or sometimes the dictionary).
 Changed constructor accordingly. Added get_cookie() and get_form_var()
 methods.
] 
[.: changeset 11588
gward**20010830204826
 Removed the 'get()' method. Any code doing "request.get(...)" must
 change to either "request.get_form_var(...)" or
 "request.get_environ(...)". Reformatted, improved, clarified, and
 fixed lots of docstrings.
] 
[.: changeset 11597
gward**20010830235905
 - Renamed _cookie_list() method to _gen_cookie_headers(), because
   that's that it does. (OK, OK, it really generates "Set-Cookie"
   headers -- so sue me.) Also rewrote it to build up a list of chunks
   that are then .join()'d together, rather than accreting by repeated
   string concatenation. Changed __str__() to write(): now takes a
   'file' argument and writes headers and body to that file, rather
   than building up a list of strings and .join()'ing them at the end.
   Removed the whole notion of "accumulated headers" -- I suspect that
   was historical cruft to handle cookies before 'set_cookie()' and
   '_cookie_list()' were added. Deleted the following:
 
 - accumulate_header global
 
 - accumulated_headers class/instance attribute
 
 - special-casing of accumulated headers in set_header()
 
 - entire add_header() method
 
 - handling of accumulated headers in __str__()/write() Simplified
   set_body(): now requires that a body be passed and that it be a
   string. No longer returns self.
] 
[.: changeset 11598
gward**20010830235945
 Use HTTPResponse's write() method to write the response.
] 
[.: changeset 11600
gward**20010831003143
 Reformatted, cleaned up, expanded, aand otherwise improved many
 docstrings. Removed 'body' class attribute; 'body' is now always an
 instance attribute that defaults to None. Fixed write() so it prints
 no body (headers + blank line only) if body is None. Fixed set_body()
 so it actually sets the 'body' attribute (oops!). Added comment about
 maybe supporting "non-parsed header output" mode to write(). Removed
 append_cookie() method -- seems completely pointless to me. Removed
 append_header() method -- if we want to support multiple instances of
 the same header in general, I think we should do it by making the
 'headers' attribute a list of (name, value) tuples, not by munging
 individual header values. But that's just me. Are there any HTTP
 response headers apart from "Set-Cookie" that need to be repeated?
 Simplified expire_cookie() by using dict.update, "**" syntax in
 function call. Fixed so it uses the correct date syntax for the
 "expires" cookie attribute. Renamed 'kw' argument to 'attrs' for both
 expire_cookie() and set_cookie().
] 
[.: changeset 11601
gward**20010831004434
 Tore up the constructor: 'headers' keyword arg is gone; 'body' now
 defaults to None; 'status' comes first. Also, don't duplicate
 set_status() here, use it whatever the status is. Renamed the 'status
 attribute to 'status_code', and 'errmsg' to 'reason_phrase'. This
 matches the terminology of RFC 2616 (HTTP 1.1). Don't carry the status
 code and reason phrase around redundantly in a "Status" header;
 set_status() now just sets the two attributes, and write() generates a
 "Status" header on the fly.
] 
[.: changeset 11604
gward**20010831005923
 Documented write() method. Ripped out Zope-specific stuff from class
 docstring; added Grouch-style "Instance attributes" list. Fixed
 set_header() so we lower() the header name before storing it. Can't
 easily decide if a given header is already set without this.
] 
[.: changeset 11613
dbinger**20010831032544
 Attribute name changed.
] 
[.: changeset 11616
gward**20010831183605
 setHeader() -> set_header().
] 
[.: changeset 11617
gward**20010831183631
 Set content-type in factorial() method.
] 
[.: changeset 11618
gward**20010831184446
 Next version will be 0.4. The "basic form and widget framework" is the
 Quixote Form Library. Mention quixote.sendmail module. Mention
 renaming of FastCGI and PTL modules. Explain the death of quixote.zope
 and birth of the HTTP{Request,Response} classes.
] 
[.: changeset 11621
gward**20010831212457
 - Pretty thorough overhaul -- not quite a rewrite though. Major
   changes:
 
 - use "driver script" terminology
 
 - make the examples CGI scripts, because that's a lot easier to get
   working than FastCGI
 
 - reduce the amount of text in the initial list of the "three major
   components" -- go into detail later
 
 - update all the code to current Quixote interfaces
 
 - fixed up lots of formatting/indentation for (hopefully) improved
   readability
 
 - expunged some MX-specific code and examples; tried to explain
   context better for the rest
 
 - lots and lots of scattered wording improvements
] 
[.: changeset 11635
gward**20010905015217
 Changed default value of COOKIE_NAME from "Qsession" to "QX_session".
 Renamed Config.read_default() method to read_defaults(). Changed
 Config constructor so it automatically calls read_defaults() (can be
 overridden with an optional keyword arg). Comment tweaks.
] 
[.: changeset 11636
gward**20010905015240
 Don't have to all read_default() on the Config object anymore -- it's
 done automatically by the constructor.
] 
[.: changeset 11637
gward**20010905030411
 How to configure your web server for Quixote. Currently very Apache-
 centric.
] 
[.: changeset 11641
gward**20010905185026
 Don't insult newbies quite so much.
] 
[.: changeset 11673
nascheme**20010906210631
 Add support for "form tokens".
] 
[.: changeset 11674
nascheme**20010906210709
 Add support for "form tokens". Hidden widgets are now rendered by
 _render_start().
] 
[.: changeset 11675
nascheme**20010906211033
 Moved setstate method to persist_session.py.
] 
[.: changeset 11704
abenard**20010907203049
 added element_name to list widget
] 
[.: changeset 11713
nascheme**20010910203302
 Move verification of form token to handle() method. It's now called
 right before the action() method is called. This allows to forms to be
 created using an initial query string.
] 
[.: changeset 11715
gward**20010911181611
 Changed signature of sendmail(): it's now sendmail(subject, body,
 to_addrs, ...). Added extra_headers argument, and removed hard-coded
 setting of "Precedence" and "X-No-Archive" headers. Docstring tweaks.
] 
[.: changeset 11751
gward**20010913231936
 Don't re-open the error log every time we log an error. Just open it
 once, in setup_logs(), save the file object in self.error_log, and
 write to that in finish_failed_request(). Should make things a bit
 more robust. Changed shutdown_logs() to close the access log and error
 log (if a separate access log was opened). Fix finish_failed_request()
 so it doesn't write the str() of the original response, but calls its
 write() method instead. Rewrote docstrings for setup_logs() and
 shutdown_logs().
] 
[.: changeset 11752
gward**20010913232943
 Added class docstring. Reformatted lots of method docstrings.
] 
[.: changeset 11754
gward**20010913234111
 Correct docstring for get_path().
] 
[.: changeset 11762
gward**20010914013341
 Pulled the _http_*_re variables (used for parsing Accept-Encoding) out
 of class scope and made them globals. Don't think subclasses will need
 to override HTTP's syntax. Overhauled guess_browser_version() -- now
 handles many more perversions of the "User-Agent" header inspired by
 Microsoft's "compatible" brain-damage. Respects simplified RFC 2616
 syntax outside of comments, and makes some decent heuristic guesses
 when it sees a comment with "compatible; " in it. Added a bunch more
 global regexes for support.
] 
[.: changeset 11763
gward**20010914013655
 Simple, non-automated test for HTTPRequest.guess_browser_version().
 Reads real-life User-Agent strings on stdin, prints what
 guess_browser_version() makes of them on stdout.
] 
[.: changeset 11792
nascheme**20010917233635
 Fix missed variable rename.
] 
[.: changeset 11814
nascheme**20010918205508
 Ensure that error_log always points to a file object.
] 
[.: changeset 11846
gward**20010919192107
 Reformatted, removed useless prune command.
] 
[.: changeset 11847
gward**20010919192123
 Added docstring, __revision__, __version__.
] 
[.: changeset 11848
gward**20010919192219
 Updated version to 0.4a1. Changed description. Updated package list.
] 
[.: changeset 11849
gward**20010919192323
 mod_python handler for Quixote. Contributed by Erno Kuusela
 <erno@iki.fi>, with adaptations by me.
] 
[.: changeset 11850
gward**20010919192826
 Mention quixote.mod_python module.
] 
[.: changeset 11851
nascheme**20010919194901
 Type check url parameter passed to add_cancel_button().
] 
[.: changeset 11852
nascheme**20010919195132
 Type check location argument passed to redirect().
] 
[.: changeset 11855
gward**20010919200435
 Changed _render_widget_row() so it does not render hidden widgets.
 (They should not be included in a form table.)
] 
[.: changeset 11856
gward**20010919200623
 More sanity-checking of the cancel URL.
] 
[.: changeset 11857
akuchlin**20010919202107
 Add list of acks
] 
[.: changeset 11858
akuchlin**20010919202327
 Add URLs for home page and mailing list
] 
[.: changeset 11859
gward**20010919202336
 Removed now-pointless assert in handle(). Typo fix.
] 
[.: changeset 11860
akuchlin**20010919202352
 Add ACKS file
] 
[.: changeset 11863
gward**20010919213815
 Fix sample rewrite rules.
] 
[.: changeset 11864
gward**20010919213906
 Fix regex for LocationMatch in documentation.
] 
[.: changeset 11865
gward**20010919214950
 Documented mod_python interface.
] 
[.: changeset 11866
gward**20010919215005
 Removed most of docstring -- it's now in doc/web-server.txt.
] 
[.: changeset 11867
gward**20010919215209
 Added Anton for form library contribs.
] 
[.: changeset 11877
gward**20010920233018
 Added "* = required field" text to _render_start().
] 
[.: changeset 11989
gward**20010928194630
 Revised descriptions of HTTP{Request,Response} classes.
] 
[.: changeset 11990
gward**20010928194658
 Whitespace tweaks.
] 
[.: changeset 11993
nascheme**20010929002221
 Add optional name keyword to link().
] 
[.: changeset 11998
akuchlin**20010929003632
 Add demo CGI and configuration to manifest
] 
[.: changeset 11999
akuchlin**20010929004255
 Add person who reported missing demo.{cgi,conf} files
] 
[.: changeset 12004
gward**20010929020218
 Renamed quixote.mod_python module to quixote.mod_python_handler.
 Necessary because mod_python installs a 'mod_python' top-level
 package, which quixote.mod_python_handler needs to import.
] 
[.: changeset 12005
gward**20010929020322
 Reflect rename in module docstring.
] 
[.: changeset 12006
gward**20010929020658
 Update to reflect mod_python -> mod_python_handler renaming.
 Rearranged some text in "FastCGI configuration" section.
] 
[.: changeset 12007
gward**20010929020832
 demo.fcgi no longer exists.
] 
[.: changeset 12029
gward**20011002211150
 Added some last-minute assertions to make sure we don't pass bogus
 sender/ recipient addresses to smtplib. Docstring fixes.
] 
[.: changeset 12042
gward**20011003200520
 Bump version to 0.4.
] 
[.: changeset 12043
gward**20011003201027
 Revised license -- now the same as Grouch.
] 
[.: changeset 12113
akuchlin**20011009194441
 Add work-around for IIS's broken PATH_INFO
] 
[.: changeset 12114
akuchlin**20011009194631
 Note the IIS work-around, and add Mikhail to ACKS
] 
[.: changeset 12115
akuchlin**20011009203259
 Add Johann, who's added Quixote to the FreeBSD ports tree
] 
[.: changeset 12116
akuchlin**20011009234932
 Patch from Mikhail Sobolev for another bit of IIS weirdness: "it looks
 like the following patch needs to be applied. As the environment dump
 (which I sent earlier) shows, SERVER_PORT_SECURE is there even if the
 connection was not made over SSL."
] 
[.: changeset 12118
gward**20011010003019
 Make log_request() a little more portable, ie. don't rely on
 REQUEST_URI being set, as it's not in the CGI spec. Instead use
 SCRIPT_NAME + PATH_INFO.
] 
[.: changeset 12119
gward**20011010004042
 Add a comment explaining the SERVER_PORT_SECURE handling.
] 
[.: changeset 12120
gward**20011010005605
 Next release will be 0.4.1. Mention the SERVER_SECURE_PORT workaround.
] 
[.: changeset 12134
abenard**20011010020710
 improved list widget render
] 
[.: changeset 12135
gward**20011010023815
 - Bug 275: make the application's stderr go to the Quixote error log,
   just as stdout goes to the Quixote debug log. Details:
 
 - re-assign sys.stderr in setup_logs()
 
 - change shutdown_logs() to refer to sys.__stderr__ to find out if
   error_log was set, and set sys.stderr back to sys.__stderr__
 
 - change debug() to write to sys.__stderr__, and hacked up docstring
 
 - various comment/docstring tweaks
] 
[.: changeset 12136
gward**20011010023859
 Bug 275: application stderr now goes to Quixote's error log.
] 
[.: changeset 12137
gward**20011010023931
 Note sys.stderr reassignment.
] 
[.: changeset 12152
nascheme**20011010193445
 Import tools written in C.
] 
[.: changeset 12153
nascheme**20011010193714
 Remove todo items (imputil is not better than ihooks). Use cimport
 module if available to speed up import hook.
] 
[.: changeset 12156
nascheme**20011010204956
 Comment out debug print.
] 
[.: changeset 12175
gward**20011010230141
 Bump version to 0.4.1.
] 
[.: changeset 12176
gward**20011010230204
 Noted change to access logging.
] 
[.: changeset 12177
gward**20011010230431
 Update version number to 0.4.1.
] 
[.: changeset 12224
nascheme**20011011205501
 Instead of passing the loader function as an argument keep it as a
 module global. This lets import_module be used as a direct replacement
 for __import__. Add reload_module function.
] 
[.: changeset 12225
nascheme**20011011205625
 Use new features of cimport. reload should now work.
] 
[.: changeset 12252
gward**20011015180338
 Added docstring for RFC822Mailbox constructor. Added optional 'config'
 argument to sendmail(), so it can be used in an environment where no
 Quixote publisher has been setup (eg. SPLAT!'s splat_mail script).
 Give smtp_{sender,recipient} args the same type flexibility as
 to_addrs, from_addr, and cc_addrs. Fix type error in assert
 statements.
] 
[.: changeset 12253
gward**20011015180717
 Clarified how email addresses are specified in the sendmail()
 docstring.
] 
[.: changeset 12254
gward**20011015181527
 When DEBUG_LOG is None, use "/dev/null" on Unix and "NUL" on Windows.
 Will blow up on other platforms (but what about Mac OS X?).
] 
[.: changeset 12255
gward**20011015184145
 The standard URL prefix for the Quixote demo is now "/qdemo".
] 
[.: changeset 12256
gward**20011015190233
 Added calls to setup_logs() in sample driver scripts. Added "Logging"
 section to explain setup_logs() and the *_LOG configuration variables.
] 
[.: changeset 12266
gward**20011016190843
 Removed old way of installing import hook -- now use enable_ptl().
] 
[.: changeset 12267
gward**20011016190919
 Fixed __all__ -- forgot to change it when compile_template and
 imphooks modules renamed to ptl_compile and ptl_import.
] 
[.: changeset 12268
gward**20011016191005
 Add Ray Drew -- he's spotted lots of little bugs.
] 
[.: changeset 12298
dbinger**20011018000425
 Removed unused imports.
] 
[.: changeset 12450
nascheme**20011024041722
 Update doc string.
] 
[.: changeset 12511
akuchlin**20011030003458
 Fix grammar in a docstring
] 
[.: changeset 12538
gward**20011101045442
 Added standard interface for checking the validity of user-supplied
 configuration variables: check_values() method, called from
 set_from_dict() (ie. each time we read from a module or a file).
 Initial implementation is empty, just for subclasses to override.
 Added optional 'source' parameter to set_from_dict(), and supply it in
 read_file() and read_from_module(). It's passed to check_values(),
 which passes it to the ConfigError constructor to help generate useful
 error messages. Added ConfigError exception, to be raised by
 check_values() implementations in subclasses.
] 
[.: changeset 12553
gward**20011102000302
 Collapse some redundant logic in RadiobuttonWidget.render().
] 
[.: changeset 12571
nascheme**20011102021227
 Don't make paths relative before passing them to the code generator.
 That ends up making co_filename relative when sometimes it should be
 absolute. Without this change tracebacks from PTL code sometimes had
 the source information missing.
] 
[.: changeset 12602
nascheme**20011102212900
 Don't try to import "_q_index". It does not have to be in the exports
 list. This fixes a bug where accessing a module without a _q_index
 raised an ImportError instead of a TraversalError.
] 
[.: changeset 12603
nascheme**20011102213110
 Remove redundant 'type == "hidden"' test, _render_widget_row does it
 too.
] 
[.: changeset 12609
gward**20011102230120
 Add 'config' parameter to SessionPublisher constructor (for
 consistency with Publisher). Fix
 SessionPublisher.finish_failed_request() so it doesn't call
 session_mgr.abort() if session_mgr is None.
] 
[.: changeset 12613
nascheme**20011102235254
 Add clear_app_state() method to Session.
] 
[.: changeset 12626
abenard**20011103025505
 fix bug in select widgets for bad value data
] 
[.: changeset 12659
abenard**20011106005042
 - use .set_value() method in widget __init__
 
 - fix bug in .set_value() for multiple_select
] 
[.: changeset 12664
gward**20011106013314
 Use "Cc" email header, not "CC".
] 
[.: changeset 12702
abenard**20011108010247
 fix .set_value() for NumberWidget
] 
[.: changeset 12703
nascheme**20011108010443
 compile_template was renamed as ptl_compile
] 
[.: changeset 12718
nascheme**20011108231539
 Cleanup handling of environment information. request.environ is always
 used now instead of sometimes using os.environ.
] 
[.: changeset 12719
nascheme**20011108231737
 Cleanup environment information handling. Untested.
] 
[.: changeset 12752
nascheme**20011112200055
 Add _render_visible_widgets and _render_body methods. _render_start
 now just opens the form tag and renders the hidden widgets. The widget
 table is created by _render_body which creates the widget table,
 renders the visible widgets and the submit buttons.
] 
[.: changeset 12757
nascheme**20011112214548
 Add _render_body _render_visible_widgets methods.
] 
[.: changeset 12760
gward**20011112232859
 Oops, sorted_keys() really should sort the list it returns. Spotted by
 Jeff Rush.
] 
[.: changeset 12768
gward**20011113212643
 Changes for Quixote 0.4.2.
] 
[.: changeset 12769
gward**20011113212831
 Fixed so we call setup_logs() on a new ModPythonPublisher object.
 Still need to add a bunch of mod_python options to let people do in
 the Apache config file what they would normally do in the (Fast)CGI
 driver script: publisher class, session manager, ... ?
] 
[.: changeset 12770
gward**20011113213115
 Typo fix.
] 
[.: changeset 12771
gward**20011113214554
 Bumped version 0.4.2
] 
[.: changeset 12779
abenard**20011113231555
 .set_name() needs to be before .set_allowed_values()
] 
[.: changeset 12780
gward**20011114004923
 Note Neil's recent changes to form/form_templates.ptl and
 form/form.py.
] 
[.: changeset 12781
gward**20011114005117
 Don't distribute the test directory; there are no tests there, just
 test infrastructure.
] 
[.: changeset 12782
gward**20011114013332
 Note removal of test dir from distribution.
] 
[.: changeset 12784
abenard**20011114014805
 check for widgets name in request.form before parsing it, this
 prevents values being erased when they are added to a form that has
 already been submitted
] 
[.: changeset 12793
nascheme**20011114224509
 Revert last change. It doesn't work for browsers that send no
 information for multiple select widgets with no values selected.
 Mozilla is one browser that does this but there are probably others.
] 
[.: changeset 12794
abenard**20011114224748
 value of multiple select should always be a list or None
] 
[.: changeset 12795
gward**20011115005032
 Put the "* = required field" text back on the left, where it belongs.
] 
[.: changeset 12871
gward**20011121201145
 Rewrote dump_html() so it generates decent output. Added missing
 import (caught by Jeff Rush).
] 
[.: changeset 12872
gward**20011121201209
 Added Jeff Rush.
] 
[.: changeset 12887
gward**20011122210702
 Scattered spelling/formatting fixes.
] 
[.: changeset 12894
gward**20011124045207
 Demonstrate the Widget classes by building a simple form
 (render_widgets()) and processing it (process_widgets()).
] 
[.: changeset 12895
gward**20011124045255
 Added a link to the "widgets" demo page. Added a paragraph urging the
 user to go read demo/doc.txt. Added comment header and CVS ID string.
] 
[.: changeset 12896
gward**20011124045507
 Added set_content_type() method. Update docstring for set_body().
 Removed vestigial, unused 'literal' keyword argument to set_header().
] 
[.: changeset 12897
gward**20011124045546
 Changed simple() to use set_content_type() method instead of
 set_header(). Import/export "widgets" page.
] 
[.: changeset 12898
gward**20011124045736
 Rewrote __all__: now it just includes symbols that are explicitly
 defined in __init__.py, rather than all Quixote modules. (The full
 list is getting too long, and only including some of them is just
 arbitrary.)
] 
[.: changeset 12899
gward**20011124045800
 Typo fix in comment,.
] 
[.: changeset 12900
gward**20011124045854
 Fix broken set_value() call in RadiobuttonsWidget constructor.
] 
[.: changeset 12901
gward**20011124045949
 Reference docs for the Widget class hierarchy in quixote.form.widget.
] 
[.: changeset 12902
gward**20011124050104
 Added "Lesson 5: widgets" to explain the widget demo in
 demo/widgets.ptl. Use 'set_content_type(..)' instead of 'set_header
 ("Content-type", ...)'. Wording tweaks.
] 
[.: changeset 12947
nascheme**20011128015137
 Remove URL_PREFIX config variable.
] 
[.: changeset 12971
nascheme**20011128200938
 Add FORM_TOKENS option (disabled by default).
] 
[.: changeset 12972
nascheme**20011128201003
 Only use tokens if FORM_TOKENS option is enabled.
] 
[.: changeset 13186
gward**20011211073130
 Documented MultipleSelectWidget, SubmitButtonWidget, HiddenWidget,
 IntWidget, and FloatWidget. Wording/formatting tweaks.
] 
[.: changeset 13300
nascheme**20011215025210
 Support Python 2.2.
] 
[.: changeset 13315
gward**20011218012119
 Documented OptionSelectWidget. SubmitButtonWidget has changed
 slightly: name and value are both optional. Scattered wording
 improvements.
] 
[.: changeset 13316
gward**20011218012308
 Don't give the submit button a name. It's no longer required, and form
 elements named "submit" are bad because they cause a name-clash in
 Javascript. Duhh.
] 
[.: changeset 13317
gward**20011218012342
 Changed SubmitButtonWidget so the name is optional.
] 
[.: changeset 13318
gward**20011218012434
 Bump version to 0.4.3.
] 
[.: changeset 13319
gward**20011218012615
 Don't include the src/ directory or the snapshot_setup.py script.
] 
[.: changeset 13320
gward**20011218013315
 Added entry for 0.4.3.
] 
[.: changeset 13322
gward**20011218024039
 Completely reformatted. (No content changes.)
] 
[.: changeset 13323
gward**20011218024329
 Added release dates (where I could find them from Google's USENET
 archive).
] 
[.: changeset 13324
gward**20011218030449
 Set Quixote 0.4.3 release date (today).
] 
[.: changeset 13325
gward**20011218030531
 Bump version to 0.4.3.
] 
[.: changeset 13354
abenard**20011218220021
 remove debug print
] 
[.: changeset 13468
akuchlin**20020115221325
 Avoid consuming the contents of stdin for XML-RPC requests
] 
[.: changeset 13538
gward**20020118195503
 Removing unused, redundant files.
] 
[.: changeset 13549
akuchlin**20020118230736
 Updated
] 
[.: changeset 13629
nascheme**20020124045915
 Add form demo code.
] 
[.: changeset 13630
nascheme**20020124045933
 Fix call to SubmitButtonWidget constructor.
] 
[.: changeset 13631
nascheme**20020124050503
 Simplify munging of SCRIPT_NAME variable. This fixes a bug. Depending
 on how Quixote was called, the path could have been appended to
 SCRIPT_NAME without a separating slash. Hmm, why does SCRIPT_NAME need
 to modified anyhow?
] 
[.: changeset 13632
nascheme**20020124050826
 Fix docstring. An empty _q_exports makes sense if the module contains
 _q_index or _q_getname.
] 
[.: changeset 13633
nascheme**20020124052755
 Demonstrate that selection widget values don't have to be strings.
] 
[.: changeset 13634
gward**20020124202537
 Fix spelling error.
] 
[.: changeset 13636
nascheme**20020124210853
 On windows, set mode of sys.stdout to binary. This is important
 because responses may contain binary data. Also, EOL translation can
 throw off content length calculations.
] 
[.: changeset 13719
akuchlin**20020129225058
 Add two names
] 
[.: changeset 13720
akuchlin**20020129225117
 Bump version to 0.4.4
] 
[.: changeset 13721
akuchlin**20020129225233
 Updated the change log
] 
[.: changeset 13722
nascheme**20020129225857
 Remove name on submit button (Greg wins the wrestling match). Don't
 provide a size for the "size of pizza" widget.
] 
[.: changeset 13725
akuchlin**20020130004013
 Bump version number to 0.4.4
] 
[.: changeset 13737
gward**20020130194125
 Fixed SessionManager.expire_session() method so it actually works.
] 
[.: changeset 13738
gward**20020130194207
 Remove incorrect item from 0.4.4 changelog; the test directory was
 actually removed from the distribution (but not the source) back in
 0.4.2.
] 
[.: changeset 13739
gward**20020130194300
 Docstring/comment/error message tweaks.
] 
[.: changeset 13740
gward**20020130194508
 Complicate instructions for installing the compiler package, since
 doing so is only necessary for 2.0 <= Python < 2.2. Simplify
 installation instructions for Quixote itself.
] 
[.: changeset 13741
gward**20020130194541
 Don't mention URL_PREFIX. Do mention DISPLAY_EXCEPTIONS and
 SECURE_ERRORS up front.
] 
[.: changeset 13742
gward**20020130194557
 Don't mention URL_PREFIX.
] 
[.: changeset 13743
gward**20020130194634
 Started entries for next release (presumably 0.4.5).
] 
[.: changeset 13744
nascheme**20020130211316
 Create form tokens in render() instead of on __init__(). This prevents
 useless tokens being created while the form is processed. Reported by
 Robin Wohler <robin.woehler@nortelnetworks.com>. Also, if the token is
 invalid, suggest that the user review the form data.
] 
[.: changeset 13764
nascheme**20020131033615
 Pass filename properly to parse() function. The fixes funny looking
 SyntaxError exceptions (probably fixes David Ascher's problem).
] 
[.: changeset 13775
gward**20020131203835
 Fix example rewrite rule.
] 
[.: changeset 13776
gward**20020131203907
 Fix example rewrite rule. Formatting tweak.
] 
[.: changeset 13777
gward**20020131204155
 More changes for 0.4.5.
] 
[.: changeset 13782
akuchlin**20020131212346
 Change meaning of DISPLAY_EXCEPTIONS; it can now be None, 'plain', or
 'html'
] 
[.: changeset 13783
nascheme**20020131215757
 Add entry for form token change.
] 
[.: changeset 13805
gward**20020201192641
 Document the dependence on the ".cgi" extension in these docs, and the
 "AddHandler" Apache directive to account for that. Added "Which
 operating system?" section.
] 
[.: changeset 13852
nascheme**20020206220310
 Change format of session cookies. There's no need to keep the IP
 address and creation time in the cookie itself. Fix del_sessions
 method. It looks like it never did work! Note that calling
 del_sessions with no arguments deletes all the sessions.
] 
[.: changeset 13857
nascheme**20020207015058
 Set Date and Expires header instead of using "Pragma: no-cache". The
 cache attribute now specifies the number of seconds to cache the
 response.
] 
[.: changeset 13867
nascheme**20020207032045
 Show QUERY_STRING on Quxiote log.
] 
[.: changeset 13993
rmasse**20020216020833
 Fix typo in docstring and some line wrappage.
] 
[.: changeset 14044
nascheme**20020221042429
 Oops, the cgitb exception change caused the same formatted exception
 to be displayed, stored in the log and emailed to the administrator.
 This change restores to old behavior (plain text formatted exceptions
 are logged and mailed).
] 
[.: changeset 14277
dbinger**20020301204346
 Removed stray '</p>'.
] 
[.: changeset 14303
nascheme**20020305044846
 Add method keyword option to Form.__init__.
] 
[.: changeset 14304
nascheme**20020305044925
 Cleanup HTML and add method argument to Form.__init__.
] 
[.: changeset 14307
nascheme**20020305045303
 HTML cleanups with an eye on XHTML compliance.
] 
[.: changeset 14308
nascheme**20020305045401
 XHTML doesn't have valueless attributes.
] 
[.: changeset 14309
nascheme**20020305045423
 Add get_header() method.
] 
[.: changeset 14431
akuchlin**20020309013223
 Factor out parsing of HTTP accept and accept-encoding headers into a
 private method, _parse_pref_header Add a get_accepted_types() that
 returns the content-types a client will accept
] 
[.: changeset 14437
akuchlin**20020309065639
 Be stricter, and only parse stdin if the content-type is one of the
 two I know of that are used for form data. (But are there other MIME
 types used for this purpose?)
] 
[.: changeset 14450
akuchlin**20020312010051
 Fix typo
] 
[.: changeset 14464
nascheme**20020312021828
 Small cleanups.
] 
[.: changeset 14467
nascheme**20020312022412
 On Windows, set sys.__stdout__ to binary instead of sys.stdout.
] 
[.: changeset 14469
nascheme**20020312022919
 Remove DEBUG_LOG option and send debugging output to ERROR_LOG
 instead.
] 
[.: changeset 14470
nascheme**20020312023336
 - Remove DEBUG_LOG option and send debugging output to ERROR_LOG
   instead.
 
 - Cleanup exception dumps.
 
 - Move import statements out of commonly called functions. Import
   hooks are slow.
] 
[.: changeset 14483
nascheme**20020312233715
 - Restore DEBUG_LOG config option but make it default to ERROR_LOG.
 
 - Rename the debug() method to log(). It's confusing to have a method
   named debug that writes messages to the error log instead of the
   debug log. Also, the comment that ERROR_LOG is for debugging Quixote
   and not Quixote applications is bogus. Application exceptions end up
   in ERROR_LOG.
] 
[.: changeset 14484
nascheme**20020312233730
 Restore DEBUG_LOG config option but make it default to ERROR_LOG.
] 
[.: changeset 14637
nascheme**20020319220301
 Process requests that with CONTENT_TYPE = "multipart/form-data;
 boundary=blahblah"
] 
[.: changeset 14698
nascheme**20020321195343
 Bug fix from Neal M. Holtz <nholtz@docuweb.ca>.
] 
[.: changeset 14699
nascheme**20020321195430
 small bug fix
] 
[.: changeset 14741
nascheme**20020322033525
 Add ACCESS_TIME_RESOLUTION parameter on SessionManager. Remove
 app_creation_time and app_access_time. We don't use them anywhere and
 their of dubious value, IMHO.
] 
[.: changeset 14854
abenard**20020328231737
 Changed the default render for widget rows in forms.
] 
[.: changeset 14855
abenard**20020328233139
 Fixed bug in single select and radio widgets when value is None.
] 
[.: changeset 14934
gward**20020405000937
 Add a newline for readability.
] 
[.: changeset 14991
gward**20020406015026
 Added 'xml_end' keyword arg to render_tag(), to make it close the tag
 with " />" instead of ">".
] 
[.: changeset 14992
gward**20020406015337
 Pass xml_end=1 to render_tag() for most <input> tags, rather than
 tacking on "</input>" -- doing that seems to violate HTML 4.
] 
[.: changeset 15042
akuchlin**20020409001014
 Add module for misc. utility functions
] 
[.: changeset 15043
akuchlin**20020409001719
 Updated file
] 
[.: changeset 15146
gward**20020411202138
 Bump version to 0.4.5.
] 
[.: changeset 15147
gward**20020411202203
 Formatting tweaks. Set date for 0.4.5 release (today!).
] 
[.: changeset 15149
gward**20020411204157
 A few more entries based on cvschanges output.
] 
[.: changeset 15150
gward**20020411204535
 The filenames-in-tracebacks fix only affected syntax errors (Neil
 thinks).
] 
[.: changeset 15151
akuchlin**20020411205850
 Changed escape hatch for XML-RPC handlers; standard input will only be
 consumed when the HTTP method is POST and the Content-Type is either
 application/x-www-form-urlencoded or multipart/form-data. Greg, this
 is in CHANGES, but I forgot to check in the actual patch! Sorry...
] 
[.: changeset 15167
nascheme**20020412080133
 Undo last change. It breaks forms that use GET.
] 
[.: changeset 15169
gward**20020412201125
 Update for 0.4.6.
] 
[.: changeset 15188
nascheme**20020415183332
 Move ACCESS_TIME_RESOLUTION to SessionManager class where it should
 be.
] 
[.: changeset 15207
nascheme**20020416212828
 Make test that prevents stdin from being consumed less restrictive
 (e.g. for PUT methods).
] 
[.: changeset 15233
nascheme**20020418232508
 Update list of changes for 0.4.7 release.
] 
[.: changeset 15234
nascheme**20020418232528
 Update for 0.4.7 release.
] 
[.: changeset 15235
dbinger**20020418233005
 Add sort keyword option to SelectWidget constructor and
 set_allowed_values() method. If the sort argument is true, the
 allowed_values and descriptions lists are sorted in case_insensitive
 lexicographic order, except that None values (and corresponding
 descriptions) always appear first.
] 
[.: changeset 15419
akuchlin**20020429210118
 Use os.curdir instead of '' in setup.py
] 
[.: changeset 15431
nascheme**20020430001404
 Align widget titles left. We didn't notice it because of our site
 style sheet.
] 
[.: changeset 15432
nascheme**20020430001652
 Don't hardcode module names and paths. This is gives a nice example of
 how to use vars(). Idea from Patrick K. O'Brien.
] 
[.: changeset 15433
nascheme**20020430002027
 Allow form tokens to be disabled on a per-form basis.
] 
[.: changeset 15452
akuchlin**20020430015218
 We have two ACKS files; merge them. (And I created both of them :) )
] 
[.: changeset 15453
akuchlin**20020430015309
 Remove extra ACKS file
] 
[.: changeset 15501
rmasse**20020503220614
 Allow the specification of a css class in the quixote widget rendering
 machinery
] 
[.: changeset 15502
rmasse**20020503220720
 Allow the specification of a css class in the quixote submit button
 widget
] 
[.: changeset 15519
rmasse**20020504010409
 Anton cleverly observed that my version of render_tag was WRONG!
] 
[.: changeset 15574
nascheme**20020508235805
 URL quote action_url when creating it from the path. People who
 provide their own action_url need to still quote it.
] 
[.: changeset 15607
akuchlin**20020509193820
 Fix typo
] 
[.: changeset 15615
akuchlin**20020509202052
 Add header
] 
[.: changeset 15618
akuchlin**20020509211609
 Script to make HTML versions of the docs (This wasn't added to
 MANIFEST.in, so it won't appear in the public distribution of
 Quixote.)
] 
[.: changeset 15619
akuchlin**20020509211705
 Reformatting and re-indenting to make the HTML come out nicer
] 
[.: changeset 15626
akuchlin**20020509214548
 Reformatting and re-indenting to make the HTML come out nicer
] 
[.: changeset 15696
nascheme**20020514192235
 Add CHECK_SESSION_ADDR option (submitted by Jonathan Corbet).
] 
[.: changeset 15697
nascheme**20020514192354
 If CHECK_SESSION_ADDR is set, verify that the remote IP matches the IP
 that created the session.
] 
[.: changeset 15698
nascheme**20020514201933
 Remove ERROR_HANDLER config option.
] 
[.: changeset 15699
nascheme**20020514202312
 Make PublishError base class a little more useful. Add 'status_code',
 'title', and 'description' as class attributes to exceptions. It makes
 writing error handlers easier. Add default_exception_handler function
 that's used if no _q_exception_handler is found.
] 
[.: changeset 15700
nascheme**20020514203827
 - Overhaul PublishError exception handling. PublishError exceptions
   are handled by the nearest _q_exception_handler function. Remove all
   the format_*error methods.
 
 - Tweak TraversalError exception messages raised by the publisher.
   They are now a little more consistent and useful.
 
 - Create a SessionManager when creating the SessionPublisher object.
   This makes it easier to get a Quixote application with sessions
   working.
] 
[.: changeset 15750
gward**20020516004021
 If a cookie is set with (eg.) domain=None or path=None, don't emit
 that parameter at all -- that way we can just leave COOKIE_DOMAIN and
 COOKIE_PATH set to None most of the time, and the browser will Do The
 Right Thing. Fix uncaught typo that would have caused a crash if ever
 anyone had tried to set a cookie with secure=1.
] 
[.: changeset 15751
gward**20020516004119
 Added session_mgr optional keyword arg to SessionPublisher
 constructor, so applications don't have to define their own publisher
 class simply to use a custom session manager.
] 
[.: changeset 15752
gward**20020516004204
 Added session_klass optional keyword arg to SessionManager
 constructor, so applications don't have to define their own session
 manager class merely in order to use a custom session class.
] 
[.: changeset 15753
gward**20020516005642
 Rearranged/redocumented COOKIE_* config variables.
 COOKIE_{DOMAIN,PATH} both default to None now, because there's really
 no need to set them.
] 
[.: changeset 15759
akuchlin**20020516193951
 Docs on writing XML-RPC servers with Quixote
] 
[.: changeset 15760
gward**20020516201847
 Move code around so SessionPublisher is defined right after Publisher,
 and the global variables and functions are at the bottom of the file.
 Comment tweaks/additions.
] 
[.: changeset 15767
gward**20020517000552
 Removed the global singleton SessionManager instance -- we should
 always go through the global singleton Publisher (in publish.py) for
 this. Also removed all related functions: {get,set}_session_manager(),
 get_session(), has_session(), get_app_state().
] 
[.: changeset 15768
gward**20020517000743
 SessionPublisher.set_session_manager() is now a simple modifier method
 -- don't call quixote.session.set_session_manager(). Added
 get_session_manager() global convenience function.
] 
[.: changeset 15769
gward**20020517000907
 Reword SessionError.description -- "sign in" assumes that sessions
 necessarily involve authentication, and anyways a simple reload is
 enough to start a new session. In SessionError.format(), revoke the
 session cookie -- otherwise the user will be caught in an endless loop
 of "Session expired" error pages.
] 
[.: changeset 15770
gward**20020517000924
 Re-export get_session_manager() from publish.py.
] 
[.: changeset 15777
gward**20020517023350
 Change _generate_plaintext_error() so the traceback comes first, since
 it's the first thing I usually look at. Why didn't I think of this
 months ago?
] 
[.: changeset 15778
gward**20020517024218
 Ignore the KeyError that's raised when someone calls expire_session()
 on a session not in the session manager yet.
] 
[.: changeset 15785
gward**20020517211344
 Improved/updated/fixed/added many docstrings. Comment tweaks.
] 
[.: changeset 15801
gward**20020520211434
 Typo fix.
] 
[.: changeset 15802
gward**20020520211509
 Session management docs.
] 
[.: changeset 15803
gward**20020520211544
 DISPLAY_EXCEPTIONS is now a string.
] 
[.: changeset 15804
gward**20020520211646
 Driver script for session management demo. Includes DemoSession to
 demonstrate putting information in a session, and DemoSessionManager
 to demonstrate simple session persistence (subject to change!).
] 
[.: changeset 15805
gward**20020520211705
 Application code for the session management demo.
] 
[.: changeset 15813
gward**20020521220019
 - Adjust to the new session persistence API: DemoSessionManager is now
   DirMapping, a mapping that stores values is pickle files in a
   directory.
 
 - added keys(), values(), items(), has_key()
 
 - added _gen_filename()
 
 - mutated _lookup_session() into __getitem__() and added get()
 
 - mutated save_changes() into __setitem__()
 
 - mutated expire_session() into __delitem__()
 
 - use plain old SessionManager, but pass in a DirMapping instance for
   persistence
] 
[.: changeset 15814
gward**20020521221639
 Add a simple write-through cache to DirMapping.
] 
[.: changeset 15815
gward**20020521221946
 Add a docstring to DirMapping.
] 
[.: changeset 15839
gward**20020522182914
 Be consistent about how we use Apache's RewriteRule syntax.
] 
[.: changeset 15879
nascheme**20020523235150
 - Make html_quote replace " with &quot;. This allows it to be used for
   attribute value data if " characters are used to surround the data.
 
 - Improve module docstring. Remove section on value_quote since
   html_quote can now be used instead.
 
 - Remove _quote helper function and don't use cgi.escape. html_quote
   is called often enough to make it worth the extra code duplication
   in order to avoid two extra function calls.
 
 - Remove css_class kludge from render_tag. You can do the same thing
   with render_tag(..., **{'class': 'something"})
] 
[.: changeset 15880
nascheme**20020523235221
 Remove css_class keyword. It's usually not what you want anyhow.
] 
[.: changeset 15881
nascheme**20020523235308
 - Remove css_class keyword. It's usually not what you want anyhow.
 
 - Remove data_type class attribute. It's not used for anything.
 
 - Add a few words to the OptionSelectWidget docstring.
] 
[.: changeset 15884
gward**20020524011552
 - Subtle but far-reaching change to the publishing algorithm: objects
   found by traverse_url() and get_component() for the terminal
   component of a URL can now be either callables or strings;
   previously they had to be callables. A string substitutes for a
   callable's return value. The immediate reason for this was to allow
   _q_getname() functions to return a string, but a consequence is that
   you can put static text in global variables and simply publish them.
   Details:
 
 - tweak traverse_url() to accept strings the same as it does callables
 
 - tweak try_publish() so it accepts strings as-is, calls callables,
   and barfs on anything else
 
 - added isstring() function to help out
] 
[.: changeset 15885
gward**20020524012014
 Tweak error messages to reflect admissibility of strings.
] 
[.: changeset 15886
gward**20020524012900
 Fix syntax error.
] 
[.: changeset 15932
nascheme**20020528201510
 Allow kwargs to link().
] 
[.: changeset 15933
nascheme**20020528204828
 SCGI driver script for demo.
] 
[.: changeset 15934
nascheme**20020528205022
 Add HTTP_USER_AGENT to the log. I'm not too sure about using repr()
 but people can put wierd crap in that header.
] 
[.: changeset 15935
gward**20020528212000
 is_dirty() renamed to has_info(), and then restored as an alias for
 has_info().
] 
[.: changeset 15951
gward**20020529034010
 Updated the "nutshell" description so it actually describes the way
 things actually work. The session demo now works with a CGI driver
 script. is_dirty() has become has_info(). Documented the whole
 persistence interface, and removed the embryonic "Writing a session
 manager class" section.
] 
[.: changeset 15954
gward**20020529053651
 Add commented-out use of the shelve module as an alternate to
 DirMapping (mainly to convince myself that shelve can actually be used
 as a session persistence mechanism).
] 
[.: changeset 15955
gward**20020529053651
 Merge in session-mgmt-branch.
] 
[.: changeset 15956
gward**20020529053651
 Use keys() instead of values() to iterate over sessions, so the
 persistent mapping interface provided by the shelve module works (it
 doesn't implement values()).
] 
[.: changeset 15958
gward**20020529054746
 Alternate setup script for releasing dated snapshot releases.
] 
[.: changeset 15959
gward**20020529055335
 Notes on upgrading from old, undocumented session management
 interface.
] 
[.: changeset 15960
gward**20020529061245
 Wording tweaks.
] 
[.: changeset 15961
gward**20020529061124
 Document some more of the changes coming in Quixote 0.5.
] 
[.: changeset 15962
gward**20020529061405
 Replace our names with CVS Id string.
] 
[.: changeset 15963
gward**20020529061608
 Add CVS id string.
] 
[.: changeset 15969
gward**20020529204323
 Added "Configuring the session cookie" section.
] 
[.: changeset 15970
gward**20020529204522
 Added "Cookie domains and paths" section.
] 
[.: changeset 15975
gward**20020529233314
 - Suggestions from Patrick O'Brien <pobrien@orbtech.com>:n
 
 - give another example COOKIE_PATH
 
 - give URLs for the RFCs
 
 - be explicit that the COOKIE_* variables only affect the session
   cookie
] 
[.: changeset 15984
akuchlin**20020530191647
 Note that we use 2.2 now Remove version number so we don't have to
 update it
] 
[.: changeset 15985
nascheme**20020530194049
 Fix syntax.
] 
[.: changeset 15987
nascheme**20020530194230
 XHTML cleanups.
] 
[.: changeset 15988
abenard**20020530203417
 - Added .is_submitted() to submit button widget.
 
 - Added .set_current_value() and .get_current_value() to hidden
   widget.
 
 - Changed list widget to use hidden widgets .get_current_value().
] 
[.: changeset 16028
abenard**20020603203759
 Fixed bug in list widget which is triggered by adding a list widget to
 a form that has already been submitted.
] 
[.: changeset 16029
gward**20020603204518
 Change dump() so it accumulates its return value as a list rather than
 a string, and added "Form:" header before the form values.
] 
[.: changeset 16030
gward**20020603204542
 Extra newline in plaintext error.
] 
[.: changeset 16034
gward**20020603221209
 Fix spelling mistakes.
] 
[.: changeset 16035
gward**20020603221937
 Use enable_ptl() in the sample PYTHONSTARTUP code. Indent that sample
 code with 4 spaces (not tabs).
] 
[.: changeset 16036
gward**20020603225934
 - Don't attempt to describe session management, or use session
   persistence as a motivation for subclassing SessionManager -- refer
   to session-mgmt.txt instead. Also, drop the bit about subclassing
   Publisher -- it's a distraction. Access log now includes user-agent
   string. It's no longer necessary to construct a SessionManager
   instance and pass it to SessionPublisher.set_session_manager().
   Overhaul description of _q_getname():
 
 - refer to the second arg as 'name', not 'component'
 
 - can now return a string, which is simpler and easier to understand,
   so describe that first
 
 - replace the use of RunUI (MX-specific) with a hypothetical UserUI,
   which grows on the example of _q_getname() returning a string Minor
   wording tweaks.
] 
[.: changeset 16037
gward**20020603230911
 Typo fix.
] 
[.: changeset 16046
nascheme**20020604183559
 Add sample init.d script.
] 
[.: changeset 16056
gward**20020604200332
 COOKIE_* config variables renamed to SESSION_COOKIE_* for clarity.
] 
[.: changeset 16057
gward**20020604200739
 Mention rename of COOKIE_*.
] 
[.: changeset 16058
gward**20020604200528
 Oops forgot to rename cookie_* in Config.config_vars list.
] 
[.: changeset 16060
gward**20020604200851
 Wording tweaks.
] 
[.: changeset 16061
gward**20020604202130
 Update version.
] 
[.: changeset 16069
gward**20020605011330
 Update reading list.
] 
[.: changeset 16128
gward**20020610200214
 Minor wording tweaks.
] 
[.: changeset 16129
gward**20020610200955
 Title tweak. Update text to reflect COOKIE_* -> SESSION_COOKIE_*
 renaming.
] 
[.: changeset 16130
gward**20020610201028
 Bump version to 0.5.
] 
[.: changeset 16131
gward**20020610201045
 Set release date of 0.5.
] 
[.: changeset 16132
gward**20020610202038
 COOKIE_* renamed to SESSION_COOKIE_*. Minor wording tweaks.
] 
[.: changeset 16136
gward**20020610212223
 Fix _add_recip_headers() so it doesn't crash if passed an empty addrs
 list.
] 
[.: changeset 16151
nascheme**20020611230201
 Hardcode quixote package name. Dynamically computing it does not work
 if ptl_compile.py is used as a script.
] 
[.: changeset 16152
akuchlin**20020612003433
 Fix error noted by Chris Ryland
] 
[.: changeset 16175
akuchlin**20020613183838
 Fix misleading exception description
] 
[.: changeset 16277
nascheme**20020619003748
 Handle empty QUERY_STRING.
] 
[.: changeset 16444
gward**20020710001646
 Docstring grammar fix.
] 
[.: changeset 16465
gward**20020710005558
 Beef up _template_re a bit, so we don't rewrite every line that starts
 with "template" surrounded by whitespace. We now look for something
 like one of the following: template foo ( template foo \ where all
 whitespace is optional, except after "template". This should make it
 easier to PTL-ify code that uses "template" as an identifier.
] 
[.: changeset 16466
gward**20020710005659
 Try to prevent confusing Emacs' syntax highlighting.
] 
[.: changeset 16509
nascheme**20020715195631
 Add two bugs.
] 
[.: changeset 16647
gward**20020723004147
 Remove no-longer-accurate comment about the persistence of session
 data.
] 
[.: changeset 16650
gward**20020723004310
 Add a comment.
] 
[.: changeset 16792
dbinger**20020730002903
 Fix typo.
] 
[.: changeset 16925
akuchlin**20020801232909
 Refactor publish() method: publish() now creates an HTTPRequest object
 and calls process_request(). process_request() does most of the work,
 calling try_publish() and trapping any exceptions it raises. The
 assignment to the _request global was in the parse_request() method;
 calling process_request() directly means that parse_request() might
 never be called if the caller synthesizes a new HTTPRequest object, so
 the assignment has been moved to process_request()
] 
[.: changeset 16926
akuchlin**20020801235129
 Add Medusa HTTP server code
] 
[.: changeset 16927
akuchlin**20020801235201
 Install quixote.server
] 
[.: changeset 16928
akuchlin**20020801235307
 Fix comment typo
] 
[.: changeset 16930
akuchlin**20020802000820
 Updated file
] 
[.: changeset 16968
akuchlin**20020805214157
 Use the HTTPResponse object's write() method, so that we get the Set-
 Cookie and Expires headers. (Yuck, all this generating and parsing of
 text...)
] 
[.: changeset 16980
gward**20020806025620
 Replace redirect() method with a cleaner, more general version
 supplied by Andreas Kostyrka <andreas@kostyrka.priv.at>. In
 particular, redirects to fully relative URLs (no leading slash) now
 work.
] 
[.: changeset 16981
gward**20020806025654
 Added prev() and next() methods to demonstrate redirects, and add a
 paragraph to _q_index()'s output to link to them.
] 
[.: changeset 16990
gward**20020806205657
 Rewrite class docstring.
] 
[.: changeset 16991
gward**20020806210100
 Get rid of the unused '_file' attribute.
] 
[.: changeset 16992
gward**20020806211131
 The ZPL, version 2.0. Taken from current CVS of StandaloneZODB. Needed
 because http_{request,response}.py are both covered by it.
] 
[.: changeset 16993
gward**20020806211221
 Replace the ZPL 1.0 license (full text) with brief disclaimer and
 reference to ZPL 2.0.
] 
[.: changeset 16994
gward**20020806211930
 Added section on authors, copyright, and license.
] 
[.: changeset 17028
gward**20020809064219
 Patch from Jon Corbet, for one way of handling logouts: modify
 SessionManager.maintain_session() so it explicitly removes a session
 if that session used to have useful info (ie. exists in the session
 manager), but no longer does.
] 
[.: changeset 17029
gward**20020809064501
 Document maintain_session() change.
] 
[.: changeset 17219
nascheme**20020819215356
 ADd get_path and redirect methods.
] 
[.: changeset 17241
rmasse**20020820043744
 Update the typechecking to use isinstance rather than concrete types.
 to_addrs and cc_addrs can be subtypes of ListType
] 
[.: changeset 17537
nascheme**20020829025834
 Don't modify SCRIPT_NAME and PATH_INFO.
] 
[.: changeset 17581
gward**20020830192546
 Mention the CVS instructions page. Mention the quixote-checking list.
] 
[.: changeset 17666
akuchlin**20020904184450
 Remove two items
] 
[.: changeset 17753
akuchlin**20020909210623
 Just return xmlrpclib.Fault instances
] 
[.: changeset 17873
nascheme**20020920022226
 Allow widgets to generate bits of Javascript code.
] 
[.: changeset 17891
nascheme**20020921034539
 Change the way javascript code is handled. The generate_javascript()
 method is a pain when widgets are composed. Instead, add a dictionary
 to the response. This is a little hacky, hasattr() is used, but solves
 the problem of functions duplicated between forms. It's also more
 efficient in the case where most widgets don't generate javascript.
 Use '$' to compose widget names. '.' is not valid in a javascript
 identifier.
] 
[.: changeset 17892
nascheme**20020921034619
 Change the way javascript code is handled. The generate_javascript()
 method is a pain when widgets are composed. Instead, add a dictionary
 to the response. This is a little hacky, hasattr() is used, but solves
 the problem of functions duplicated between forms. It's also more
 efficient in the case where most widgets don't generate javascript.
] 
[.: changeset 17995
gward**20020927200820
 Factor add_form_value() out of process_inputs(). Add formiter() method
 to iterate over the (name, value) pairs in the 'form' dictionary.
 Clarify guess_browser_version() docstring.
] 
[.: changeset 18002
gward**20020927221036
 - Rip out the ability to handle HTTP upload requests; they'll be
   handled by HTTPUploadRequest instead. Details:
 
 - make process_inputs() barf if content-type == "multipart/form-data",
 
 - remove the code in process_inputs() that tries to detect if an
   fs.list element represents a file upload -- all form variables are
   now just regular form variables
 
 - remove FileUpload class
 
 - remove FORM_CONTENT_TYPES global
 
 - add get_content_type() -- it's used by Publisher (to decide whether
   to instantiate HTTPRequest or HTTPUploadRequest)
 
 - add 'content_type' instance attribute, and optional 'content_type'
   constructor arg (so Publisher can pass in the value it computes)
] 
[.: changeset 18003
gward**20020928002134
 Typo fix.
] 
[.: changeset 18004
gward**20020928004331
 - Quixote's implementation of HTTP upload. Provides:
 
 - HTTPUploadRequest, a subclass of HTTPRequest dedicated to handling
   requests with Content-Type "multipart/form-data"
 
 - Upload, used to hold the various filenames associated with an
   uploaded file; Upload instances are stored in the request's 'form'
   dictionary for later retrieval
 
 - read_mime_part(), for reading lines from a file up to a MIME
   boundary or EOF (needed to parse multipart/form-data requests)
 
 - make_safe(), for neutralizing potentially "dangerous" characters in
   a filename
] 
[.: changeset 18005
gward**20020928004449
 Added create_request() method, which looks at the Content-Type header
 and creates either an HTTPRequest or HTTPUploadRequest object.
] 
[.: changeset 18006
gward**20020928004525
 Added UPLOAD_DIR and UPLOAD_DIR_MODE config variables.
] 
[.: changeset 18007
gward**20020928005221
 Tweak output of default_exception_handler(): there's no need to wrap
 the exception message in <code> tags (IMHO).
] 
[.: changeset 18009
gward**20020928011558
 Added RequestError. Added __str__() to PublishError, so we get a
 useful error message in a plain vanilla Python traceback.
] 
[.: changeset 18010
gward**20020928011618
 Change all assertions to use RequestError.
] 
[.: changeset 18087
gward**20021001232322
 Remove debug prints.
] 
[.: changeset 18090
gward**20021002022731
 Convert to reStructuredText. A few minor wording tweaks.
] 
[.: changeset 18091
gward**20021002025727
 Convert to reStructuredText.
] 
[.: changeset 18099
gward**20021002194145
 Rewrite first paragraph. Scattered wording tweaks.
] 
[.: changeset 18100
gward**20021002195030
 Convert to reStructuredText.
] 
[.: changeset 18101
gward**20021002195247
 Minor clarifications.
] 
[.: changeset 18103
gward**20021002203222
 Convert to reStructuredText.
] 
[.: changeset 18104
gward**20021002205258
 Convert to reStructuredText.
] 
[.: changeset 18105
gward**20021002220044
 Convert to reStructuredText.
] 
[.: changeset 18106
gward**20021002220847
 Convert to reStructuredText.
] 
[.: changeset 18107
gward**20021003012818
 Fix get_path() so it doesn't crash if PATH_INFO is not defined. I
 suspect this became necessary with rev 1.131 of publish.py, which
 removed munging of SCRIPT_NAME and PATH_INFO. That munging had the
 side-effect of guaranteeing that PATH_INFO was always set; with it
 gone, PATH_INFO won't be defined if someone accesses a Quixote app's
 base URL without a trailing slash.
] 
[.: changeset 18108
gward**20021003020638
 - Rearrange responsibilities a bit:
 
 - publish() now calls create_request() itself, and passes the request
   to parse_request()
 
 - parse_request() now takes an empty request object, rather than a
   (stdin, env) pair
 
 - exception handling is now back in publish(), rather than in
   process_request() and -- more importantly -- we catch exceptions
   from parse_request() as well. This is essential for handling errors
   in processing an HTTP upload request. Docstring tweaks.
] 
[.: changeset 18117
gward**20021003193411
 Documentation for HTTP upload with Quixote.
] 
[.: changeset 18118
gward**20021003193432
 Demonstration of HTTP upload, ie. the HTTPUploadRequest and Upload
 classes.
] 
[.: changeset 18119
gward**20021003193552
 Change parse_request() to not return the request object, since it's
 now created elsewhere.
] 
[.: changeset 18120
gward**20021003193618
 Make the 'source' and 'var' arguments to ConfigError constructor
 optional.
] 
[.: changeset 18121
gward**20021003193820
 If upload_dir is not set, raise ConfigError rather than RuntimeError,
 and only do it when we know we really need upload_dir -- ie. in
 handle_upload(). Change Upload constructor so it sets orig_filename =
 None if an empty filename was supplied. (Now orig_filename is
 base_filename is None means we have no filename.)
] 
[.: changeset 18122
gward**20021003195413
 Clarify add_javascript() docstring.
] 
[.: changeset 18124
gward**20021003200609
 (Nearly) final changelog for 0.5.1.
] 
[.: changeset 18125
gward**20021003200637
 Bump version to 0.5.1.
] 
[.: changeset 18126
gward**20021003200812
 Include doc/*.html in the distribution.
] 
[.: changeset 18127
gward**20021003202117
 Add the 'javascript_code' attribute for real -- set it in the
 constructor, document it. Use "is not None" rather than hasattr() to
 check for it in add_javascript().
] 
[.: changeset 18128
gward**20021003202151
 HTTPResponse always defines the 'javascript_code' attribute, so don't
 use hasattr() to look for it.
] 
[.: changeset 18129
gward**20021003202731
 Makefile for Quixote docs.
] 
[.: changeset 18130
gward**20021003202742
 Obsolete -- replaced by Makefile.
] 
[.: changeset 18131
gward**20021003203620
 Add 'clean' target. Add 'install' target to rsync *.html to staging.
 Avoid processing ZPL.txt.
] 
[.: changeset 18132
gward**20021003205329
 Rename INSTALL to INSTALL.txt and convert it to reStructuredText.
] 
[.: changeset 18135
gward**20021003211708
 Remove debugging output.
] 
[.: changeset 18160
rmasse**20021005031548
 Ensure that the rendering of any javascript code is done in lexical
 ordering according to the code_id key it is filed under. Move the
 logic of constructing the action_url into a separate utitlity method
 so that we can call it from other places.
] 
[.: changeset 18175
akuchlin**20021007183614
 Mention mod_scgi
] 
[.: changeset 18181
akuchlin**20021007190838
 Add section on mod_scgi
] 
[.: changeset 18213
gward**20021008190300
 Stylesheet for Quixote docs. Initial revision copied from Docutils CVS
 (rev 1.25), with comment header rewritten.
] 
[.: changeset 18214
gward**20021008190441
 Remove styles for "a" and "tt" tags.
] 
[.: changeset 18215
gward**20021008191027
 Tweak pre.literal-block formatting.
] 
[.: changeset 18216
gward**20021008192907
 Install default.css too. Remove -n option from rsync. Add local-
 install target.
] 
[.: changeset 18224
gward**20021009004824
 Final changes for 0.5.1.
] 
[.: changeset 18225
gward**20021009005203
 One more change in 0.5.1...
] 
[.: changeset 18226
gward**20021009010533
 Update for 0.5.1
] 
[.: changeset 18227
gward**20021009010847
 Mention HTML docs and online availability. Split documentation section
 into "recommended reading" and "optional reading"; add upload.txt to
 the latter section. Whitespace tweaks.
] 
[.: changeset 18253
gward**20021009233857
 Fix bug introduced when I rewrote session management, which was
 spotted at the time by Jon Corbet and again recently by Mikhail
 Sobolev (oops).
] 
[.: changeset 18277
gward**20021010184741
 Comment fix.
] 
[.: changeset 18304
nascheme**20021015035812
 Add htmltext support.
] 
[.: changeset 18305
nascheme**20021015035907
 Add htmltext class and supporting functions (htmlescape, htmltag,
 href).
] 
[.: changeset 18306
nascheme**20021015040011
 Style cleanups (no behavior changes).
] 
[.: changeset 18307
nascheme**20021015040058
 Support htmltext as a response value.
] 
[.: changeset 18308
nascheme**20021015040639
 Add support for HTML templates. The new syntax for templates is: def
 foo [html] (...) or def foo [plain] (...) If the former is used then
 all string literals are converted to htmltext instances. 'template
 foo(...)' is still supported. Also, for convenience, the htmltext
 constructor is placed into the global namespace of PTL modules.
] 
[.: changeset 18309
nascheme**20021015041918
 Modify form and widget classes to return htmltext instances. This is a
 backards incompatible change.
] 
[.: changeset 18337
nascheme**20021015225012
 Add capitalize method to htmltext.
] 
[.: changeset 18341
nascheme**20021015235401
 Support mappings as arguments to __mod__.
] 
[.: changeset 18342
nascheme**20021015235442
 Basic tests for htmltext and htmlescape.
] 
[.: changeset 18343
nascheme**20021016001843
 Don't call str() on exception value (I'm not 100% sure this is the
 right fix though).
] 
[.: changeset 18346
nascheme**20021016012556
 Make htmltext.__mod__ work is dictionaries for real. The other
 approach could not possibly have worked (think '%(x)s %(x)r' % ...).
] 
[.: changeset 18361
akuchlin**20021016062132
 Return an HTTP 405 if not using a POST; delete commented line
] 
[.: changeset 18362
akuchlin**20021016062353
 Updated file
] 
[.: changeset 18371
nascheme**20021016210213
 Don't return htmltext from format() unless some piece of data is
 already htmltext (for backwards compatibility). Note that: a = str(a)
 b = htmltext(b) a += b does not work while: a = str(a) b = htmltext(b)
 a = a + b IOW, there is no __riadd__ method.
] 
[.: changeset 18379
gward**20021016234219
 Add start_time attribute (moved from Publisher).
] 
[.: changeset 18380
gward**20021016234437
 - Patch from Titus Brown, tweaked by me, to make Quixote a bit more
   friendly to multi-threaded applications:
 
 - move start_time attribute from Publisher to HTTPRequest
 
 - make the current HTTPRequest an attribute of Publisher, and remove
   the '_request' global
 
 - add _set_request, _clear_request(), get_request() to Publisher
 
 - change most of the global convenience get_*() accordingly
] 
[.: changeset 18381
gward**20021016234722
 The next release will almost certainly be 0.6, and I have no idea when
 it will be released. Mention multi-threading-friendly changes.
] 
[.: changeset 18383
gward**20021017001917
 Document the _request attribute, and set it in __init__().
] 
[.: changeset 18420
gward**20021017190603
 How to get Quixote to play nice with threads.
] 
[.: changeset 18422
gward**20021017200810
 Turns out that calling _clear_request() from process_request() was a
 dumb idea, because self._request might be needed later (eg. to emit an
 error page when an exception is caught). Call it from publish()
 instead, as the very last thing -- after we write the response.
] 
[.: changeset 18429
nascheme**20021017220712
 Add nl2br function.
] 
[.: changeset 18445
rmasse**20021018003341
 Fix nl2br function
] 
[.: changeset 18468
akuchlin**20021018232155
 Set .start_time in process_inputs()
] 
[.: changeset 18472
akuchlin**20021018232735
 Don't quote the widget title. (There's an inconsistency here, as the
 hint text will be HTML-escaped. We probably need to make a decision on
 whether HTML tags/entities are allowed in widget hints and titles.)
] 
[.: changeset 18476
akuchlin**20021019002424
 HTML-escape both the widget title and the hint
] 
[.: changeset 18479
nascheme**20021019021623
 Defer the generation of session IDs until it is decided that the
 session should be maintained. Thanks to Jonathan Corbet for the patch.
] 
[.: changeset 18480
akuchlin**20021019044601
 Fix comment grammar
] 
[.: changeset 18482
akuchlin**20021021172126
 Back out my changes
] 
[.: changeset 18499
rmasse**20021021223144
 Add new function 'compile_dir'. Inspired by 'compile_dir' from the
 standard Python module 'compileall.py', compile_dir compiles all PTL
 files in and below the 'dir' argument. There are two optional args
 'maxlevels' controls how many directory levels below dir are traversed
 (default 10) and 'force' forces compilation even if the timestamps are
 up-to-date (default False).
] 
[.: changeset 18503
nascheme**20021021232835
 Eak, fix quoting bug in href() function.
] 
[.: changeset 18504
gward**20021022010438
 It's htmlescape(), not htmlquote().
] 
[.: changeset 18548
gward**20021023184509
 Remove almost everything -- instead, import docutils.css and override
 what I don't like.
] 
[.: changeset 18549
gward**20021023184546
 Update comment.
] 
[.: changeset 18575
gward**20021024005858
 Add constructor and __str__() to FormValueError, so it has a well-
 defined interface.
] 
[.: changeset 18576
gward**20021024012337
 Create form.ptl from merger of form.py (rev 1.22) and
 form_templates.ptl (rev 1.19).
] 
[.: changeset 18577
gward**20021024012504
 Ensure FormValueError.__str__() always returns a string.
] 
[.: changeset 18578
gward**20021024012542
 FormValueError no longer has an 'args' attribute, so we can't treat it
 as a sequence anymore. Just grab the 'msg' attribute directly instead.
] 
[.: changeset 18579
gward**20021024013104
 Note creation of form.ptl.
] 
[.: changeset 18610
nascheme**20021025223139
 Use binascii.hexlify instead of coding our own. Use sha.hexdigest
 instead of sha.digest. Rename randlong() to randbytes() and remove
 packbytes(). Thanks to Jon Dyte for the idea.
] 
[.: changeset 18611
nascheme**20021025223502
 Add Jon Dyte.
] 
[.: changeset 18627
dbinger**20021028211459
 Remove import from types. Use builtin types instead. Use %r in format
 strings. Remove type_name and type_converter attributes from
 NumberWidget classes.
] 
[.: changeset 18628
dbinger**20021028212225
 Fix docstrings.
] 
[.: changeset 18637
dbinger**20021029035455
 Restore python 2.1 compatibility. Don't use builtin types.
] 
[.: changeset 18639
dbinger**20021029195119
 Use types module instead of builtin types so this works in 2.1.
] 
[.: changeset 18644
gward**20021029211759
 In _render_error(), use nl2br() to make multi-line error messages look
 right in the output.
] 
[.: changeset 18647
gward**20021029214402
 Factor _render_required_notice() out of _render_body(). Add
 _render_error_notice() (also called from _render_body()).
] 
[.: changeset 18652
gward**20021030005349
 Docstring tweak to keep Emacs syntax-colouring mode happy.
] 
[.: changeset 18680
nascheme**20021031015910
 minor code cleanup
] 
[.: changeset 18690
dbinger**20021031205656
 Remove 'quote' keyword parameter.
] 
[.: changeset 18692
dbinger**20021031222330
 Fix two more places to use ListType instead of list.
] 
[.: changeset 18709
dbinger**20021101192922
 Changed select widgets to use the description itself as the value
 attribute in the tags instead of the index of the description in the
 list of descriptions. This addresses the problem that happens when the
 submitter's widget has a list of descriptions that is different from
 the parsing widget. Replaced the allowed_values and descriptions
 attributes on select widgets with a single 'options' attribute, which
 holds a list of (description, object) pairs. Outside code that wants
 these separate lists can should use the new get_allowed_values() and
 get_descriptions() methods. Also added a set_options() method to
 select widgets which may be used like set_allowed_values() if you
 already have the list of (description, object) pairs. Updated
 docstrings.
] 
[.: changeset 18719
nascheme**20021101234825
 Whitespace normalization.
] 
[.: changeset 18725
nascheme**20021102015621
 Raise a nicer error message if the widget_type is a string and is not
 a registered name.
] 
[.: changeset 18728
nascheme**20021102024301
 Add "options" keyword to select widgets that can be used instead of
 "allowed_values" and "descriptions". If the "options" list contains
 tuples of length three, then the last element denotes the ``key'' of
 each option. The key is used when rendering the select widget and
 parsing it (useful if the options list can change between rendering
 and parsing). Change format of "options" so that value comes first.
 Don't HTML escape data anywhere except while rendering.
] 
[.: changeset 18744
akuchlin**20021104225157
 Add #! line to medusa_http.py; call setup_logs()
] 
[.: changeset 18751
akuchlin**20021105191331
 Add commented-out call to read_config()
] 
[.: changeset 18787
abenard**20021107224747
 - Fixed .__str__() to not blow up if .orig_filename is None.
 
 - Added .get_size() to Upload() class.
 
 - Check for not filename rather than if filename is None to reduce the
   chance of getting an empty upload.
] 
[.: changeset 18788
abenard**20021107224915
 Added option to specify enctype.
] 
[.: changeset 18789
abenard**20021107224944
 Added FileWidget().
] 
[.: changeset 18790
rmasse**20021107230036
 Revised implementation of 'set_options' method for SelectWidget. In
 the case where 'key' is not provided in the (options, description,
 key) tuple, make 'key' the description (rather than a 'count').
 ...This is to correct the problem of unsorted objects being presented
 in a different order or the length of the list changing. To handle the
 possibility of having duplicate descriptions, add an inner function
 'unique' that ensures key uniqueness.
] 
[.: changeset 18792
nascheme**20021108032917
 Another stab at solving the "keys for selection options" problem. If
 keys are not provided, try using the _p_oid of the allowed values. If
 that doesn't work, check if the descriptions are unique and use them.
 If that fails, raise a ValueError. Explicit keys will have to be
 provided in that case. Using _p_oid works well for us since most of
 our objects have OIDs. I don't expect it to hurt other people either
 since the chance of someone using _p_oid as an attribute is small.
 Share code between SingleSelectWidget.parse and
 MultipleSelectWidget.parse.
] 
[.: changeset 18803
nascheme**20021109001723
 RadioSelectWidget needs to use 'key' for the value attribute too.
] 
[.: changeset 18816
dbinger**20021111222439
 Remove unusual handling of options keyword from OptionSelectWidget.
] 
[.: changeset 18903
gward**20021115212603
 doc/INSTALL was renamed to doc/INSTALL.txt.
] 
[.: changeset 18904
gward**20021115212629
 doc/INSTALL was renamed; also point to online copy.
] 
[.: changeset 18942
gward**20021119032158
 Restore the 'wrap' attribute to TextWidget. It's not standard, but can
 be useful when the browser supports it. Users who want strict XHTML
 compliance should not use it.
] 
[.: changeset 18980
gward**20021120212357
 Get real -- we're not going to rewrite the HTTPRequest/HTTPResponse
 classes.
] 
[.: changeset 18983
gward**20021120212443
 Drop artificial section headings and reformat.
] 
[.: changeset 18984
gward**20021120220606
 Normalize whitespace. Avoid jamming multiple lines of code together
 with ";". Wrap long lines.
] 
[.: changeset 18987
gward**20021120222908
 Add a couple of items.
] 
[.: changeset 18992
gward**20021121003641
 Better error message for non-string list elements in htmltext.join().
] 
[.: changeset 18993
gward**20021121003955
 Use %r in error messages. Tweak "there were errors in your form"
 markup. Rewrite get_widget_class() to improve error reporting: now it
 requires either a callable (which is just returned) or a registered
 widget class name; if given neither, it raises ValueError with a
 sensible error message.
] 
[.: changeset 18994
gward**20021121004323
 Normalize whitespace.
] 
[.: changeset 19120
nascheme**20021127045042
 Use new syntax for PTL.
] 
[.: changeset 19121
nascheme**20021127045412
 Use new PTL syntax.
] 
[.: changeset 19401
akuchlin**20021211213151
 Python 2.2.2 changes the default for Message.get() from '' to None;
 fix from David Edwards to turn None values into ''
] 
[.: changeset 19404
akuchlin**20021211221151
 Update URL
] 
[.: changeset 19429
akuchlin**20021212003437
 Update URL
] 
[.: changeset 19603
nascheme**20021231055526
 Handle nested comments in the User-Agent string. Some versions of MSIE
 use that feature and it's allowed by the specification.
] 
[.: changeset 19606
akuchlin**20030101003540
 New upgrade documentation: this currently only contains session-
 upgrade.txt
] 
[.: changeset 19607
akuchlin**20030101005415
 Use modern PTL syntax
] 
[.: changeset 19608
akuchlin**20030101010650
 Add sections on file uploading and on the Publisher class
] 
[.: changeset 19609
nascheme**20030101011539
 Use [html] template type.
] 
[.: changeset 19627
akuchlin**20030102234817
 Add section on the SelectWidget changes -- please proofread, as I'm
 not sure I understood all of the ramifications of the changes
] 
[.: changeset 19628
akuchlin**20030102234905
 Remove file; the contents are now in upgrading.txt
] 
[.: changeset 19629
akuchlin**20030103000335
 Mention upgrading.txt; bump copyright year
] 
[.: changeset 19630
akuchlin**20030103000536
 Bump version number to 0.6
] 
[.: changeset 19634
akuchlin**20030103003203
 Remove unneeded file
] 
[.: changeset 19636
nascheme**20030103003828
 A first crack at documenting the new PTL syntax.
] 
[.: changeset 19675
akuchlin**20030104003132
 Remove unfinished sentence
] 
[.: changeset 19693
akuchlin**20030107010535
 Various revisions
] 
[.: changeset 19694
nascheme**20030107011316
 Add (too short) note about form framework returning htmltext.
] 
[.: changeset 19695
akuchlin**20030107011434
 Minor tweaks
] 
[.: changeset 19696
nascheme**20030107011443
 Remove extra 'form' in import. The form package makes Form available.
] 
[.: changeset 19707
nascheme**20030107024933
 Update PTL magic for Python 2.3.
] 
[.: changeset 19745
akuchlin**20030107204435
 Add Neil's run_cgi script
] 
[.: changeset 19746
akuchlin**20030107212641
 Mention that the form framework uses HTML templates; re-order changes
] 
[.: changeset 19747
akuchlin**20030107212748
 Add paragraph about mixing HTML and plain templates (I'm not happy
 with the text; please rewrite or offer suggestions) Fix a typo.
] 
[.: changeset 19752
akuchlin**20030107220346
 Mention slight performance hit
] 
[.: changeset 19754
akuchlin**20030107221208
 Tweak
] 
[.: changeset 19766
akuchlin**20030108005949
 Include the demo_scgi startup script
] 
[.: changeset 19787
nascheme**20030109004015
 Use htmlescape. It's simpler and just as fast now that there's a C
 version of it.
] 
[.: changeset 19788
nascheme**20030109004323
 Move the Python implementation of htmltext into it's own module. That
 makes it easy to override it with the C implementation.
] 
[.: changeset 19789
nascheme**20030109004403
 A C implementation of the htmltext type.
] 
[.: changeset 19790
nascheme**20030109004517
 Add _c_htmltext extension (disabled by default).
] 
[.: changeset 19791
nascheme**20030109004607
 Add more tests. Test both the Python and C implementation.
] 
[.: changeset 19793
nascheme**20030109011624
 Add note about htmltext and htmlescape to the docstring. They should
 be preferred over html_quote.
] 
[.: changeset 19794
nascheme**20030109013816
 - Two cleanups for escape_string:
 
 - remove the need for an extra buffer by allocating a PyString
   mutating it. Should be a little faster.
 
 - use post increment when copying escape characters. It's a little
   clearer what's going on.
] 
[.: changeset 19795
akuchlin**20030109013837
 Markup fix
] 
[.: changeset 19796
nascheme**20030109051028
 Moved into _py_htmltext.py.
] 
[.: changeset 19797
nascheme**20030109051224
 Move TemplateIO here. It's intimately tied to the htmltext framework
 now. Simplify TemplateIO since it's no longer user visible (well,
 unless you work hard to find it).
] 
[.: changeset 19798
nascheme**20030109051251
 Import TemplateIO from _py_htmltext or _c_htmltext.
] 
[.: changeset 19799
nascheme**20030109051327
 Import TemplateIO from _py_htmltext or _c_htmltext. Simplify calls to
 TemplateIO object. Update PTLC magic.
] 
[.: changeset 19800
nascheme**20030109051626
 Implement TemplateIO in C. This gives a nice speedup according to a
 silly template intensive benchmark. Real applications probably see a
 few percent speed increase. Use larger integer types in some places to
 prevent overflows.
] 
[.: changeset 19801
akuchlin**20030109190743
 Add more changes for 0.6b1
] 
[.: changeset 19802
akuchlin**20030109191102
 Mention C implementation
] 
[.: changeset 19803
akuchlin**20030109191402
 Add C source to manifest
] 
[.: changeset 19804
akuchlin**20030109191856
 Include stylesheet and Makefile
] 
[.: changeset 19805
akuchlin**20030109191601
 Add missing word and re-fill
] 
[.: changeset 19806
akuchlin**20030109192008
 Include test/ subdirectory in distribution
] 
[.: changeset 19807
nascheme**20030109195611
 Increment magic for older versions of Python.
] 
[.: changeset 19813
nascheme**20030109210908
 Use memcpy instead of open coding it.
] 
[.: changeset 19815
nascheme**20030109213005
 Add missing backquote.
] 
[.: changeset 19818
akuchlin**20030109214224
 Set release date
] 
[.: changeset 19820
akuchlin**20030109224200
 Fix breakage in demo
] 
[.: changeset 19821
akuchlin**20030109225335
 Prep for next release
] 
[.: changeset 19822
akuchlin**20030110192210
 Correct description of change
] 
[.: changeset 20170
akuchlin**20030115140624
 Delete numerous empty directories
] 
[.: changeset 20189
akuchlin**20030116134552
 Fix from David Cooke to make medusa_http work with HTML templates Also
 fixed some whitespace, while I was at it
] 
[.: changeset 20192
akuchlin**20030116141557
 Enable HeadURL and ID keywords; try adding HeadURL to see what it
 looks like
] 
[.: changeset 20211
akuchlin**20030116201239
 Set svn:keywords property
] 
[.: changeset 20217
akuchlin**20030116205153
 Set svn:keywords property
] 
[.: changeset 20241
akuchlin**20030117135144
 Fix _c_htmltext so it builds on Windows
] 
[.: changeset 20250
abenard**20030117165937
 Improved speed of sort code for select widgets.
] 
[.: changeset 20289
nascheme**20030120195441
 A code review found to bugs. Handle broken repr methods when quoting
 format arguments. Expand the unit tests to check this. Fix assert in
 TemplateIO concat function.
] 
[.: changeset 20290
akuchlin**20030120200203
 Add two env. vars to Medusa server
] 
[.: changeset 20291
akuchlin**20030120200411
 Mention bugfixes
] 
[.: changeset 20292
akuchlin**20030120200612
 Add a page to the demo that dumps the contents of the HTTPRequest.
] 
[.: changeset 20294
akuchlin**20030120215011
 Change Medusa server to match Publisher.publish()
] 
[.: changeset 20318
akuchlin**20030121182425
 Use Neil's rearrangement of get_component(), with some minor tweaking
 This makes get_component() clearer, and reduces the level of
 indentation. I've verified that the vfab application still runs with
 this change. Still, please proofread the new code to be sure that I
 haven't changed some subtle semantic. (The unified diffs are
 unfortunately a bit hard to read; you're better off making context
 diffs or just reading the new code.)
] 
[.: changeset 20324
akuchlin**20030121190413
 Fix indentation
] 
[.: changeset 20325
akuchlin**20030121190940
 Remove MX references
] 
[.: changeset 20326
akuchlin**20030121191203
 Add _q_resolve hook
] 
[.: changeset 20327
akuchlin**20030121191304
 Exercise _q_resolve() in the demo pages
] 
[.: changeset 20329
akuchlin**20030121201402
 Add docs for _q_resolve; clarify relation between _q_getname and
 _q_exports
] 
[.: changeset 20330
akuchlin**20030121202124
 Memoize the return value from _q_resolve
] 
[.: changeset 20331
akuchlin**20030121203332
 Add Greg's suggestions; fix markup nits
] 
[.: changeset 20332
akuchlin**20030121203534
 Another markup fix
] 
[.: changeset 20335
akuchlin**20030122024858
 More rewriting; more markup fixes
] 
[.: changeset 20336
akuchlin**20030122145446
 Add _q_resolve
] 
[.: changeset 20400
akuchlin**20030124153817
 Open temp. file for uploaded data in binary mode
] 
[.: changeset 20446
akuchlin**20030127145208
 Rework setup.py so it can specify classifiers when run with Python 2.3
] 
[.: changeset 20447
akuchlin**20030127145244
 Add item
] 
[.: changeset 20449
akuchlin**20030127162032
 Delete debug print
] 
[.: changeset 20464
nascheme**20030127191519
 Fix a serious bug in the htmltext.__mod__ method. Formatting a string
 using a dictionary could result in the dictionary being modified.
] 
[.: changeset 20466
akuchlin**20030127192144
 Add bugfix
] 
[.: changeset 20467
akuchlin**20030127192759
 Use past tense for all the entries Add item for my setup.py change Add
 date of 0.6b2 release (today, I hope)
] 
[.: changeset 20470
akuchlin**20030127194110
 Fix typo
] 
[.: changeset 20480
akuchlin**20030128131601
 Fix demo_scgi.py to actually work (reported by David M. Cooke) Make
 demo_scgi.{sh,py} executable
] 
[.: changeset 20483
akuchlin**20030128133259
 Add item
] 
[.: changeset 20597
akuchlin**20030203145629
 Update docstring (noted by Nicola Larosa)
] 
[.: changeset 20620
akuchlin**20030204151317
 Move update_live to /www/bin
] 
[.: changeset 20690
gward**20030205202534
 Docstring typo fix.
] 
[.: changeset 20703
gward**20030209150613
 One small step towards Python 2.1 compatibility: revert True/False to
 1/0.
] 
[.: changeset 20705
akuchlin**20030210135921
 Add item
] 
[.: changeset 20729
nascheme**20030212220003
 Silence warnings about integer overflow.
] 
[.: changeset 20755
akuchlin**20030220144526
 Add download url for Python 2.3alpha2
] 
[.: changeset 20777
abenard**20030221212146
 - Improved assertions for select widget.
 
 - Added optional verify_selection keyword to select widget which is
   needed if the form has dynamic options list contents.
] 
[.: changeset 20783
akuchlin**20030224140841
 Turn on nested scopes to silence a warning from Python 2.1
] 
[.: changeset 20784
akuchlin**20030224141126
 Bid farewell to Python 2.0 compatibility
] 
[.: changeset 20785
akuchlin**20030224141207
 Update file
] 
[.: changeset 20801
nascheme**20030224185500
 Remove code that unnecessarily uses Python 2.2 features.
] 
[.: changeset 20959
rmasse**20030305171824
 Implement automatic breadcrumb generation in the standard header using
 a new method from dulcinea 'format_crumbs' Remove 'crumbs' and
 'tree_info' keyword arguments from calls to standard.header Add
 'get_crumb' methods and functions in namespaces where a crumb is
 desired
] 
[.: changeset 20963
akuchlin**20030305182000
 Add Hamish Lawson's classes for serving static files and CGI scripts.
 I still need to read through the code more carefully, and also add an
 example to the demo.
] 
[.: changeset 20964
akuchlin**20030305183645
 Improve docstrings Add mime_type argument to StaticFile constructor
 Use htmltext() to avoid XSS in directory listing
] 
[.: changeset 20965
akuchlin**20030305184037
 Add HeadURL and Id
] 
[.: changeset 20966
akuchlin**20030305184220
 Correct filename
] 
[.: changeset 20967
akuchlin**20030305184748
 Rename CGIScript.filepath to .path Check isabs(path) immediately Fix
 except statement
] 
[.: changeset 20968
akuchlin**20030305192407
 Expand symlinks so that the following isdir() and isfile() checks work
] 
[.: changeset 20969
akuchlin**20030305192453
 Add srcdir/ link that lets you browse through the demo source
] 
[.: changeset 20973
akuchlin**20030305194833
 Move import of email inside CGIScript class; it won't work with 2.1,
 but at least 2.1 users can import the module
] 
[.: changeset 20974
nascheme**20030305200723
 Only test _c_htmltext if it is available.
] 
[.: changeset 20985
akuchlin**20030306153027
 Remove CGIScript class
] 
[.: changeset 20986
akuchlin**20030306153928
 Rename StaticFilesFolder to StaticDirectory
] 
[.: changeset 20987
akuchlin**20030306154050
 Since we're publishing the demo directory, we might as well link to
 pages.ptl
] 
[.: changeset 20988
akuchlin**20030306161539
 Remove caching from StaticFile Open static files in binary mode
] 
[.: changeset 21007
akuchlin**20030307135258
 Bump version number
] 
[.: changeset 21008
akuchlin**20030307135921
 Update release date
] 
[.: changeset 21011
akuchlin**20030307194535
 Markup fix
] 
[.: changeset 21016
akuchlin**20030310181016
 Patch from Hamish Lawson: s/folder/directory/ in a few places
] 
[.: changeset 21043
dbinger**20030311190512
 Make the C implementation of htmltext the default.
] 
[.: changeset 21044
akuchlin**20030311191314
 Compile C version of htmltext by default
] 
[.: changeset 21046
akuchlin**20030311191616
 Text tweak
] 
[.: changeset 21048
akuchlin**20030311191732
 Rename list_folder argument to list_directory
] 
[.: changeset 21072
akuchlin**20030312143818
 Use .set_content_type()
] 
[.: changeset 21073
akuchlin**20030312143931
 Sort files in a directory
] 
[.: changeset 21074
akuchlin**20030312144416
 Support setting and guessing the file's encoding
] 
[.: changeset 21082
akuchlin**20030312173315
 Use correct link (noted by Paul Richardson)
] 
[.: changeset 21083
akuchlin**20030312174014
 If _q_index isn't in the current namespace, raise an AccessError
 (which will be mapped to an HTTP 403 Forbidden) Whitespace n11n (Minor
 side effects of this change: _q_index will not be passed to
 _q_resolve, nor will a _q_index.{py,ptl} module be imported. I don't
 expect this to be a problem.)
] 
[.: changeset 21084
akuchlin**20030312174923
 Note a change
] 
[.: changeset 21098
akuchlin**20030313152712
 Factor out traverse_url() and get_component()
] 
[.: changeset 21102
akuchlin**20030313154804
 Add an example _q_exception_handler
] 
[.: changeset 21103
akuchlin**20030313160241
 Mention Medusa server
] 
[.: changeset 21106
akuchlin**20030313163025
 Mention _q_exception_handler
] 
[.: changeset 21107
akuchlin**20030313165342
 Document _q_exception_handler
] 
[.: changeset 21108
akuchlin**20030313165531
 Bump version number
] 
[.: changeset 21109
akuchlin**20030313165555
 Update release date; add a item, and tweak text of another
] 
[.: changeset 21118
nascheme**20030313174035
 Enable _c_htmltext module by default only if Python >= 2.2 is used.
] 
[.: changeset 21131
akuchlin**20030313212754
 Argh! Due to brain error one parameter has the wrong name!
] 
[.: changeset 21141
akuchlin**20030314133935
 Update for b5
] 
[.: changeset 21143
akuchlin**20030314140323
 Use set_content_type()
] 
[.: changeset 21182
gward**20030317214652
 Set svn:executable.
] 
[.: changeset 21183
gward**20030317220104
 Generate temporary filenames for uploaded files in a much more bullet-
 proof way (using random() and os.open() with os.O_EXCL). Factored that
 logic out to Upload._open() method.
] 
[.: changeset 21184
gward**20030317220232
 Reword item that describes when missing _q_index() becomes
 AccessError.
] 
[.: changeset 21185
gward**20030317220339
 Start entry for next release (0.6? 0.6b6?). Mention change to filename
 generation for uploads.
] 
[.: changeset 21221
akuchlin**20030320160241
 Convert HTTP headers to title case
] 
[.: changeset 21276
akuchlin**20030403160618
 Add Graham Fawcett's Twisted server
] 
[.: changeset 21292
akuchlin**20030408164847
 Rename _q_getname to _q_lookup Much of this patch is straightforward
 search-and-replace; the actual change is in publish.py, and is right
 at the bottom of the patch.
] 
[.: changeset 21312
akuchlin**20030409183354
 Translate the quixote.form.form module from PTL into straight Python.
 Please inspect to be sure that I didn't introduce any semantic
 changes. My next checkin will simply move form.ptl to form.py.
] 
[.: changeset 21313
akuchlin**20030409183459
 Rename form.ptl to form.py; no code changes
] 
[.: changeset 21315
akuchlin**20030409190001
 Add warning to delete form.{ptl,ptlc} files before installing
] 
[.: changeset 21316
nascheme**20030409190930
 Use TemplateIO rather than _join(). It has some nice optimizations.
 Also, fix an over-quoting bug in _render_error (remove str() call).
] 
[.: changeset 21353
akuchlin**20030415132602
 Bump version number
] 
[.: changeset 21355
akuchlin**20030415142019
 Mention that we don't use the Twisted code ourselves
] 
[.: changeset 21359
akuchlin**20030415185919
 Add a pass statement
] 
[.: changeset 21421
nascheme**20030424154608
 Shorten the "From" name for traceback email. "Quixote" is already in
 the subject line.
] 
[.: changeset 21461
akuchlin**20030429183931
 Add check() method
] 
[.: changeset 21462
akuchlin**20030429184150
 Oops, didn't mean to check in the previous change
] 
[.: changeset 21463
akuchlin**20030429184225
 Bump version number to final
] 
[.: changeset 21464
akuchlin**20030429184601
 Add recent changes
] 
[.: changeset 21480
akuchlin**20030430134842
 Mention _q_lookup change
] 
[.: changeset 21497
akuchlin**20030501120021
 Fix unfinished sentence
] 
[.: changeset 21526
akuchlin**20030502131451
 Make docs more helpful
] 
[.: changeset 21603
akuchlin**20030509191704
 Fix markup typo
] 
[.: changeset 21662
dbinger**20030516164825
 Make add_widget() return the widget.
] 
[.: changeset 21881
nascheme**20030620153350
 Allow the "Expires" header to be suppressed by setting 'cache' to
 None. Use title case for header names added by set_headers(). Clients
 are not supposed to care about case but it's better to be
 conservative.
] 
[.: changeset 21897
abenard**20030624193612
 - Moved StepResults.history and StepResults.processing_comments to
   Step.
 
 - Moved StepResults.metrology_results to MetrologyStep.
 
 - Changed Step status to be history event based rather than an
   attribute.
 
 - Removed all references to Step.results, StepResults.equipment_time
   and StepResults.personnel_time.
 
 - Removed test_stepresults.py.
 
 - Removed MetrologyResults.dump().
 
 - Removed module_results.py.
 
 - Changed ProcessRun.review_comments and
   ProcessRun.processing_comments from PersistentLists to Lists.
 
 - Removed ProcessRun.dump()
 
 - Restored ProcessRun.try_complete().
 
 - Changed ActiveVersionCollection .absorb() to .update().
 
 - Cleaned up step templates a little and commented out section for
   formatting process diffs since last modification, as it doesn't work
   yet.
 
 - Moved step update from _q_index to its own update url.
 
 - Changed StepUpdateForm to complete one step at a time and restored
   ability to complete runs.
 
 - Removed StepResultsWidget.
 
 - Fixed reports that relied on Step.results.
 
 - Removed FabResource .dump() methods.
 
 - Worked on new style diffs for FabResources but this doesn't work
   properly yet.
 
 - Removed code from modulator that converted generice processes into
   modules.
 
 - Reworked upgrade_runs.py to convert to new style results.
] 
[.: changeset 21939
nascheme**20030626172952
 Fix bug regarding _q_exception_handler. namespace_stack needs to be
 updated while the traversal is occuring. That's to Jason Sibre for
 spotting it and for the fix.
] 
[.: changeset 21940
nascheme**20030626173228
 Another name.
] 
[.: changeset 21999
nascheme**20030714152442
 Remove a bit of harsh sounding text.
] 
[.: changeset 22001
nascheme**20030714181502
 Add If-Modified-Since support for StaticFile objects. Also, don't set
 the Expires header by default. Instead, set the Last-Modified header
 based on the modification time of the file. The Expires header can be
 enabled by providing a value for the 'cache_time' argument.
] 
[.: changeset 22004
nascheme**20030714230708
 Prep for 0.6.1 release.
] 
[.: changeset 22027
nascheme**20030717214351
 Add FormTokenWidget to package __init__.
] 
[.: changeset 22028
nascheme**20030717231244
 By default, don't build _c_htmltext on Win32.
] 
[.: changeset 22029
nascheme**20030718160116
 Propagate 'GATEWAY_INTERFACE', 'SCRIPT_FILENAME', and HTTP headers.
] 
[.: changeset 22134
nascheme**20030801141739
 Add HTTPRequest.get_method().
] 
[.: changeset 22158
dbinger**20030805165103
 Remove broken test from sendmail.
] 
[.: changeset 22195
dbinger**20030807172741
 Add support for keyword attributes on string widget.
] 
[.: changeset 22253
rmasse**20030813201501
 Add a CollapsibleListWidget. CollapsibleListWidget behaves like
 ListWidget except that each element is rendered with an associated
 delete button. Pressing the delete button will cause the associated
 element name to be added to the a hidden widget that remembers all
 deletions until the form is submitted.
] 
[.: changeset 22256
rmasse**20030813204110
 Attempt at additional clarity in the CollapsibleListWidget doc string
] 
[.: changeset 22331
nascheme**20030826162238
 Update to the ZPL 2.0 (the copyright in http_request and http_response
 refer to 2.0, not 1.0).
] 
[.: changeset 22347
nascheme**20030827202514
 Use 4 space idents.
] 
[.: changeset 22348
nascheme**20030827205223
 - Allow HTTPResponse.body to be a Stream object as well as a string.
   Stream objects are useful if the body of the response is very large.
 
 - Refactor HTTPResponse and add generate_headers() method. It makes
   the medusa_http and twisted_http modules simpler.
 
 - Change StaticFile to return Stream objects. Also, fix a minor bug in
   StaticDirectory (_q_lookup should return a namespace).
] 
[.: changeset 22360
nascheme**20030829202922
 Integrate improved instructions (from Greg Ward).
] 
[.: changeset 22388
nascheme**20030903154047
 Add 'Redirector' helper class.
] 
[.: changeset 22389
nascheme**20030903154521
 Oops, Redirector needs a _q_index method too.
] 
[.: changeset 22399
nascheme**20030904162319
 Call _q_lookup(request, "") if _q_index does not exist and _q_lookup
 does exist.
] 
[.: changeset 22403
nascheme**20030904172002
 Strip fragments from URLs (some versions of MSIE incorrectly send them
 at certain times; for example, a redirect includes them). Also, make
 REQUEST_URI contain the URI, not just the path.
] 
[.: changeset 22482
dbinger**20030912152207
 Close ptlc file. This fixes a bug where a subsequent import may go for
 this ptlc file and find it incomplete.
] 
[.: changeset 22539
dbinger**20030917135612
 Add css_class keyword to htmltag so that class attributes can be
 specified easily.
] 
[.: changeset 22540
dbinger**20030917140105
 Add css_class attribute to TextWidget.
] 
[.: changeset 22711
nascheme**20031008221810
 Implement next generation form framework.
] 
[.: changeset 22712
nascheme**20031009135953
 Remove. Snapshot releases are not allowed.
] 
[.: changeset 22713
nascheme**20031009140032
 Prepare for 0.7a1 release. Update changelog and version numbers.
] 
[.: changeset 22720
nascheme**20031009163617
 More release twiddling.
] 
[.: changeset 22724
nascheme**20031009191947
 Fix 'required' check in WidgetRow.
] 
[.: changeset 22728
nascheme**20031010140246
 Allow StaticFile class to be overridden. Also, make it easier to
 subclass StaticDirectory.
] 
[.: changeset 22774
nascheme**20031017001353
 When loading a module, check if it exists in sys.modules. If it does,
 exec the code in that namespace rather than creating a new module.
 This is necessary to make reload() work.
] 
[.: changeset 22785
abenard**20031017195233
 Move HTTPUploadRequest import out of .create_request()
] 
[.: changeset 22786
abenard**20031017195310
 Fix line wrapping.
] 
[.: changeset 22802
nascheme**20031021141749
 Improve docstring.
] 
[.: changeset 22803
nascheme**20031021151945
 Use bool() to force boolean return values where appropriate.
] 
[.: changeset 22893
nascheme**20031027170632
 Make guess_browser_version() more robust.
] 
[.: changeset 22900
nascheme**20031028151302
 Remove 'allowed_values' and 'description' parameters from
 SelectWidget. Set svn:keywords property.
] 
[.: changeset 22957
nascheme**20031103170305
 Remove unused 'request' parameter from render() method of
 RadiobuttonsWidget and OptionSelectWidget. Comment fix.
] 
[.: changeset 22959
nascheme**20031103171609
 Improve WidgetRow docstring. Don't use apply().
] 
[.: changeset 22960
dbinger**20031103181422
 Remove unused imports.
] 
[.: changeset 22963
nascheme**20031103192632
 Add run 'invoices' form. Implement CostValueWidget2 (for form2
 framework).
] 
[.: changeset 23026
dbinger**20031105215013
 Fix name error.
] 
[.: changeset 23054
dbinger**20031106153437
 Add missing imports.
] 
[.: changeset 23070
nascheme**20031106215421
 Set the nb_inplace_add slot of TemplateIO types instead of
 sq_inplace_concat. nb_inplace_add takes precedence over __radd__ on
 instance types while sq_inplace_concat does not. Fix typo in repr of
 TemplateIO.
] 
[.: changeset 23113
nascheme**20031110180807
 Use the quixote.sendmail module to send traceback email.
] 
[.: changeset 23114
nascheme**20031110182427
 Allow negative values to be passed to get_path().
] 
[.: changeset 23115
nascheme**20031110184224
 Implement publish_fcgi(). Don't use fcgi module for publish_cgi()
 since it's not completely portable. If you want to use FastCGI, you
 need to call publish_fcgi() instead of publish_cgi().
] 
[.: changeset 23116
nascheme**20031110184453
 Don't import fcgi unless it will be used since it does stuff at import
 time.
] 
[.: changeset 23125
nascheme**20031111162624
 Add WidgetRow to form2.__init__.
] 
[.: changeset 23126
nascheme**20031111162904
 From gward: widget.py: Factor ButtonWidget out of SubmitWidget; add
 ResetWidget. form.py: Factor _add_button_widget() out of
 Form.add_submit(); add add_button() and add_reset().
 Rename Form.submit_buttons instance attribute to 'button_widgets'. Add
 get_buttons() method.                    Rename
 Form._render_submit_buttons() to _render_button_widgets().
] 
[.: changeset 23130
nascheme**20031111164448
 Prepare for 0.7a2 release.
] 
[.: changeset 23187
nascheme**20031117181620
 longs don't need to be escaped
] 
[.: changeset 23203
abenard**20031120170323
 Improve init for ListWidget. The value of added_elements_widget needs
 to be set in the request if the list widget was added to the form
 after the first form submission.
] 
[.: changeset 23228
nascheme**20031124155340
 Rename Form.WIDGET_ROW_CLASS to COMPONENT_CLASS, since that's what it
 really is. Make it an instance attribute as well as a class attribute,
 so it can be overridden at form construction time.
] 
[.: changeset 23231
nascheme**20031124172416
 Remove 'allowed_values' and 'descriptions' from
 RadiobuttonsWidget.__init__.
] 
[.: changeset 23243
nascheme**20031125162714
 Make htmltag() more efficient by avoiding repeated string
 concatenation.
] 
[.: changeset 23244
dbinger**20031201183916
 Set svn:keywords property.
] 
[.: changeset 23251
dbinger**20031202161241
 Neil's patch that establishes a pattern for way to specify html
 attributes for widget constructors. The attributes may be provided in
 a dictionary using the 'attr' keyword. An html attribute 'foo' may
 also be specified in the widget constructor using using keyword 'foo'
 or 'foo_'.
] 
[.: changeset 23260
dbinger**20031203112953
 Fix ButtonWidget render to use self.attrs.
] 
[.: changeset 23266
nascheme**20031203233630
 Prepare for 0.7a3 release.
] 
[.: changeset 23271
abenard**20031204213741
 Fix CollapsibleListWidget.
] 
[.: changeset 23275
nascheme**20031208162249
 Add get() method.
] 
[.: changeset 23341
dbinger**20040116175455
 Patch from Jason Sibre that makes tracebacks show the correct line
 number.
] 
[.: changeset 23389
nascheme**20040203160433
 Use a simpler version of parse() if using Python >= 2.3.
 Unfortunately, the hacks are still needed for older versions.
] 
[.: changeset 23390
nascheme**20040203172204
 Change the behavior of session cookies if SESSION_COOKIE_PATH is
 unset. The old behavior was to not set the 'path' attribute of the
 session cookie. The new behavior is to use SCRIPT_NAME. Also, set the
 'path' attribute when revoking the session cookie. Some browsers treat
 it as a separate cookie if it has a different path.
] 
[.: changeset 23391
nascheme**20040203173301
 Don't try to compress stream responses.
] 
[.: changeset 23395
rmasse**20040203225448
 Whitespace normalization.
] 
[.: changeset 23491
nascheme**20040217201925
 Add a compile hack for Python >= 2.3; it doesn't set the filename
 attribute of SyntaxError exceptions. Simplify translate_tokens() since
 it doesn't need the 'filename' parameter.
] 
[.: changeset 23532
dbinger**20040220223857
 Remove unused imports
] 
[.: changeset 23565
nascheme**20040225165518
 Refactor PublishError exception handling. Move the try/except/else
 block from publish() to process_request(). That way, requests will be
 logged even if they raise an exception. This also allows some
 simplification to the Medusa and Twisted server code. (thanks to Jason
 Sibre for patch)
] 
[.: changeset 23568
nascheme**20040225171849
 Make get_server() return HTTP_HOST if it is available rather than
 using SERVER_NAME and SERVER_PORT.
] 
[.: changeset 23569
nascheme**20040225172327
 If "Host" header is present, use it to set SERVER_NAME and
 SERVER_PORT.
] 
[.: changeset 23586
nascheme**20040227154427
 Make get_url() escape unsafe characters in the path part of the URL.
] 
[.: changeset 23602
nascheme**20040301160749
 Rename 'klass' to 'component_class' and 'widget_class'.
] 
[.: changeset 23614
dbinger**20040302154731
 Remove unused import.
] 
[.: changeset 23645
nascheme**20040304183405
 Use a simple counter instead of using the 'random' module when trying
 to generate unique names.
] 
[.: changeset 23656
nascheme**20040308180922
 Allow arbitrary mapping objects to be used as the right hand operand
 when formating htmltext objects (i.e. as an argument to the
 htmltext.__mod__ method). The _c_htmltext implemention used to only
 allow 'dict' instances. Change _c_htmltext to allow any mapping. Also,
 instead of accessing every item in the mapping, use PyObject_GetItem()
 (aka __getitem__) to retrieve the values as they are required. That
 matches the behavior of PyString_Format().
] 
[.: changeset 23681
nascheme**20040312151128
 Don't set DEBUG_LOG. Extra logs files are confusing when people are
 starting out.
] 
[.: changeset 23720
nascheme**20040317164559
 - Remove FormComponent and related machinery. It's simpler to add
   'title', 'hint', and 'required' as optional Widget attributes.
 
 - Allow widgets to control how they are rendered within forms (by
   overriding the form_render() method).
 
 - Reorganize rendering code in the form module so that it is easier to
   subclass form and provide a different look.
 
 - Change the parsing behavior of widgets. They no longer parse
   themselves when __init__ is called. That causes lots of other
   problems. Instead, each widget has a parse() method that calls
   _parse(), if it hasn't been called already, and returns the widgets
   value. Change Form.has_errors() to call parse() on all the widgets
   in the form.
 
 - Allow Widget._parse() to raise WidgetValueError in order to signal a
   parsing error. Using an exception is often more convenient than
   setting Widget.error within the _parse() method.
 
 - Add a CompositeWidget class. It has proven to be useful when
   creating widgets that are composed of lower-level widgets.
 
 - Remove Widget.get_value() since parse() seems to be sufficient.
] 
[.: changeset 23724
rmasse**20040317193533
 Remove debug print whitespace normalization
] 
[.: changeset 23726
nascheme**20040317210231
 Remove the Widget._is_submitted() method. It's confusing and probably
 broken.
] 
[.: changeset 23733
nascheme**20040318170946
 Add Form.has_key method. Don't sort select widget options by default.
] 
[.: changeset 23734
nascheme**20040318171748
 Require a list of options for select widgets.
] 
[.: changeset 23735
nascheme**20040318174409
 Fix method name.
] 
[.: changeset 23737
nascheme**20040318174727
 Add subclass of quixote.form2.Form that makes it easier to transition
 form1 forms.
] 
[.: changeset 23744
rmasse**20040318214132
 Whitespace normalization
] 
[.: changeset 23745
rmasse**20040319200003
 'raise' don't 'return' a TypeError when trying to set an error on a
 hidden widget.
] 
[.: changeset 23759
dbinger**20040329153623
 Fix 3 errors and docstring of WidgetList.
] 
[.: changeset 23807
dbinger**20040331202533
 Release preparation.
] 
[.: changeset 23812
rmasse**20040331212500
 Fix a bug in the form2 compatibility form wrapper's handle method.
 Unknown submit buttons in form2 return True and not the empty string.
] 
[.: changeset 23813
rmasse**20040331212706
 Allow errors to be cleared on HiddenWidget and SubmitButton widgets.
 Preserve the semantics of not allowing the setting of errors on these
 widgets however.
] 
[.: changeset 23815
rmasse**20040331213818
 Improve awkward comment
] 
[.: changeset 23843
nascheme**20040402151805
 If any environment variables are None, error pages result in a Quixote
 crash because the code to display env. vars on the error page is
 calling html_quote(value), which raises an exception if value is None.
 The fix in the attached patch is simple: call str(value) before
 passing the value to html_quote().
] 
[.: changeset 23844
nascheme**20040402152119
 Add HTTPS to env.
] 
[.: changeset 23888
nascheme**20040406165113
 Add cimport as a standard Quixote extension.
] 
[.: changeset 23889
nascheme**20040406165236
 Disable FIX_TRAILING_SLASH. It can be confusing when trying to get the
 demo running.
] 
[.: changeset 23893
nascheme**20040406193120
 Allow _q_exports to contain mappings of external names to internal
 names.
] 
[.: changeset 23911
nascheme**20040407143257
 Optimize and inline _lookup_export().
] 
[.: changeset 23940
nascheme**20040408140957
 Twisted does not unquote the path so twisted_http.py has to do it.
] 
[.: changeset 23941
nascheme**20040408141515
 Medusa doesn't unquote the path, do it in medusa_http.py.
] 
[.: changeset 23942
nascheme**20040408142223
 Oops, not ready for this yet.
] 
[.: changeset 23946
nascheme**20040408161315
 Don't use double underscores for Session attributes. The resultant
 name mangling is a pain for subclasses.
] 
[.: changeset 23947
nascheme**20040408162551
 Update changelog.
] 
[.: changeset 23960
nascheme**20040412141615
 Implement error logging for mod_python handler.
] 
[.: changeset 23961
nascheme**20040412155138
 Prepare for release.
] 
[.: changeset 23966
nascheme**20040412214214
 Specify something for 'license' (so it doesn't end up as UNKNOWN).
] 
[.: changeset 23987
nascheme**20040414195725
 Docstring fix.
] 
[.: changeset 24000
nascheme**20040415213826
 Minor fixes from Andrew. Pass along more request headers when using
 twisted_http.py. Fix typos in some comments and docstrings.
] 
[.: changeset 24003
dbinger**20040418001539
 Add an example of using a tuple in _q_exports. This also provides a
 /favicon.ico (a blue 'Q').
] 
[.: changeset 24005
abenard**20040419182415
 - Fix .clear_errors() for form2 Form. Errors can only be reliably
   cleared after the widget has parsed.
 
 - Add .render_title() to make title rendering more consitent with hint
   and error rendering.
 
 - Fix SubmitWidget .__init__() to set the .value to None.
 
 - Fix OptionSelect to always return a value from the options list.
 
 - Fix some bugs in WidgetList.
] 
[.: changeset 24008
abenard**20040419213908
 Whitespace changes.
] 
[.: changeset 24025
dbinger**20040421151505
 Get rid of form_render(). Change Widget.render() to produce output
 that plays well with CSS, and that includes title, hint, error. Widget
 subclasses implement render_content() to produce the elements to which
 the title, hint, and error apply. Remove table element from
 Form.render().
] 
[.: changeset 24042
rmasse**20040422202702
 Very temporary fix for composite widget error rendering (see Anton)
 Pass **kwargs to CompositeWidget.add so that it works like form1
] 
[.: changeset 24045
dbinger**20040423132456
 Fix args in call to read_file().
] 
[.: changeset 24046
dbinger**20040423133718
 Set svn:keywords.
] 
[.: changeset 24047
dbinger**20040423133737
 Remove unused import.
] 
[.: changeset 24052
abenard**20040423163627
 - Add recursive .has_error() and .clear_error() to widgets.
 
 - Make sure widgets are parsed when dealing with errors.
 
 - Make widgets .get_error() non recursive.
 
 - Split up widget .render().
 
 - Add WidgetDict.
] 
[.: changeset 24058
dbinger**20040426131621
 Provide missing items() call.
] 
[.: changeset 24059
abenard**20040426171434
 - Remove incorrect .set_error() method on WidgetList.
 
 - Add element_kwargs key word argument to WidgetList wich is the key
   word argument dict that is passed to the element widgets.
 
 - Add element_key_kwargs and element_value_kwargs key word arguments
   to WidgetDict wich are the key word argument lists that are passed
   to the element key and value widgets.
] 
[.: changeset 24060
rmasse**20040427185917
 - Add render_content methods to WidgetDict and WidgetList (Shouldn't
   these be called DictWidget and ListWidget?)
 
 - Make WidgetDict.render_content render the WidgetDict surrounded in a
   div called WidgetDictItem (so we can pick WidgetDicts off in CSS and
   render them inline AND have a break between each WidgetDict)
 
 - Remove move_widget_to_last and calls to it since control of the
   rendering order for CompositeWidgets can now be explicitly
   controlled in render_content Enhance render_fieldset_start to add
   any specified css_class attributes to what is rendered rather than
   to clobber what's already there.
] 
[.: changeset 24075
dbinger**20040428202537
 Avoid decorating hidden widgets.
] 
[.: changeset 24076
dbinger**20040428212254
 Omit decoration by overriding render, but provide render_content as
 usual.
] 
[.: changeset 24088
rmasse**20040429152425
 Make the 'required' widget error message more informative.
] 
[.: changeset 24121
nascheme**20040504153652
 Make code future division proof.
] 
[.: changeset 24217
dbinger**20040512212427
 Fix docstring typo.
] 
[.: changeset 24226
nascheme**20040513153635
 Add filter_output() hook (as suggested by Thomas Guettler).
] 
[.: changeset 24234
rmasse**20040514143158
 Don't blow up if there is no title for a widget that's required.
] 
[.: changeset 24237
abenard**20040514153837
 - Fix required error for composite widgets.
 
 - Added label methods to SubmitWidget.
] 
[.: changeset 24247
nascheme**20040514175619
 Fix typo.
] 
[.: changeset 24259
rmasse**20040517194608
 Ramblings (and I do mean ramblings) about converting form1 forms to
 form2. PLEASE proofread and do not hesitate to rewrite/tweek/delete
 whatever seems to need it.
] 
[.: changeset 24260
rmasse**20040517212727
 Mention form.add as a more direct way to add widgets using
 compatibility.
] 
[.: changeset 24263
nascheme**20040518165004
 Overhaul rendering of form2 widgets. Forget about using <fieldset>,
 <legend>, <label> and just use <div> tags.
] 
[.: changeset 24265
nascheme**20040518175240
 Basic CSS style for form2.
] 
[.: changeset 24267
nascheme**20040518193304
 Use plain text for the content of redirections. It's extremely
 unlikely that they will be seen anyhow. Use a modern DOCTYPE
 declaration for other pages that Quixote itself generates.
] 
[.: changeset 24268
nascheme**20040518194717
 Repair HTML. <input> tags cannot have separate a closing tag.
] 
[.: changeset 24270
abenard**20040518213037
 - Change Form.has_errors() and CompositeWidget.has_error() to make
   sure all widgets get parsed.
 
 - Added .financials_require_review flag to Step and
   .set_financials_require_review() and .financial_review_required()
   methods.
 
 - Changed ProcessSequence.remove_wafer_ids() to check that the step
   processes the wafer id's being removed before calling
   step.remove_wafer_ids().
 
 - Changed methods that add and remove wafer id's from steps to set the
   financials require review bit on steps that need it.
 
 - Changed .copy() on ProcessRun to mark steps with entered financials
   for financial review rather than clearing the entered financials.
 
 - Added .get_steps_needing_financial_review() to ProcessRun.
 
 - Added check to FabApprovedWorkRequest approval to check for steps
   that require financial review.
 
 - Added checkbox to step_edit_form for admin users to mark entered
   financials as valid.
 
 - Changed step_edit_form to mark steps with entered financials for
   financial review rather than clearing the entered financials when
   edited by a non admin user.
 
 - Reformatted the wafer hint on step_edit_form.
] 
[.: changeset 24271
rmasse**20040518221757
 Update the conversion doc as I gradually learn how form2 really works.
 Specifically, if your form sets errors, then you need to check if the
 form has not been submitted first and render the form if this is the
 case BEFORE doing error checking.
] 
[.: changeset 24272
rmasse**20040518222757
 Fix typo.
] 
[.: changeset 24276
nascheme**20040519144433
 Fix code that handles filename collisions.
] 
[.: changeset 24290
nascheme**20040519205413
 Check form token validity.
] 
[.: changeset 24298
nascheme**20040520155514
 - Convert to reStruturedText. Other changes:
 
 - mention that a stylesheet is desirable
 
 - suggest using Form.__getitem__ instead of Form.get when approprate
 
 - include add_single_select() and add_float() methods in example
 
 - misc wording changes
] 
[.: changeset 24299
nascheme**20040520170456
 Wrap output in a twisted type producer. Use twisted reactor instead of
 Application. Thanks to Jason Sibre for the patch.
] 
[.: changeset 24300
nascheme**20040520174246
 Provide more documentation for the Form class. We still need a longer
 document explaining forms in the 'doc' directory, IMHO.
] 
[.: changeset 24301
nascheme**20040520174449
 Have get() actually return 'default' instead of None.
] 
[.: changeset 24302
nascheme**20040520180047
 Get ready for 1.0b2 release.
] 
[.: changeset 24305
rmasse**20040520182411
 Fix keyword args bug in add_widget
] 
[.: changeset 24317
dbinger**20040525160516
 Use minimal error message when required values are missing. Using the
 title is unnecessarily wordy and sometimes produces ungrammatical
 error messages.
] 
[.: changeset 24327
dbinger**20040526135028
 Add get_action_url() to compatibility Form.
] 
[.: changeset 24349
dbinger**20040528164910
 Don't render a submit div if there are no submit widgets. Render
 submit widgets using render() instead of render_content().
] 
[.: changeset 24350
dbinger**20040528165249
 Remove default style for div submit. Combine FormTokenWidget and
 HiddenWidget selectors.
] 
[.: changeset 24357
dbinger**20040601174227
 Remove component_class keyword arg. Add attrs keyword arg for
 providing form tag attributes.
] 
[.: changeset 24373
nascheme**20040603142646
 Don't use quote_wrapper object for ints, longs, floats, and htmltext
 objects. It's simpler and has the side effect of making the %d code
 work for longs.
] 
[.: changeset 24374
rmasse**20040603162049
 Allow errors to be set on form2 submit widgets. This eliminates the
 kludgyness necessary when you have a form that just has submit widgets
 that may have errors.
] 
[.: changeset 24375
rmasse**20040603162247
 Add a <br /> after the closing form tag so that elements that follow
 the form by default do not flow left (usually mashed up against the
 buttons).
] 
[.: changeset 24381
rmasse**20040603183638
 Remove the need for an explicit <br /> after the closing form tag
 Instead add a br with a class designation after the submit widgets div
 that has associated CSS to make the br "clear left"
] 
[.: changeset 24402
nascheme**20040607222311
 Allow <br> tags that normally follow widgets to be turned off using
 'render_br' keyword. This makes it easier to create complicated
 composite widgets. Set 'class' attribute of form tag to 'quixote' by
 default.
] 
[.: changeset 24403
dbinger**20040608161907
 Remove line-height from br. Add selector to disable top-level brs on
 browsers where we float the form left.
] 
[.: changeset 24460
nascheme**20040614222819
 Adds a 'content_type' attribute to Upload instances, based on the
 'Content-Type' header in the MIME part representing the file. If this
 header is missing from the request, then 'content_type' will be set to
 None.
] 
[.: changeset 24468
nascheme**20040615180617
 Prepare for release.
] 
[.: changeset 24469
nascheme**20040615180744
 Add form2 library to setup.
] 
[.: changeset 24581
nascheme**20040701155717
 Prepare for 1.0 release. Woo hoo.
] 
[.: changeset 24828
nascheme**20040729163525
 Fix example apache directive for SCGI demo.
] 
[.: changeset 24850
nascheme**20040802141624
 On Windows, put both stdin and stdout in binary mode.
] 
[.: changeset 24866
nascheme**20040803223353
 Fix links to mailman lists in README.
] 
[.: changeset 24940
dbinger**20040817224047
 Don't parse empty POSTS. (from Neil)
] 
[.: changeset 24956
nascheme**20040819161403
 Fix a subtle bug in the form2 multiple select widget. If nothing is
 selected then the value should be None, not [None].
] 
[.: changeset 24962
nascheme**20040820160303
 Add 'buffered' flag to HTTPResponse (defaulting to True).
] 
[.: changeset 25031
nascheme**20040901223600
 Restore 'allow_anonymous_registration' option.
] 
[.: changeset 25067
dbinger**20040910165913
 Add more utests. Now every unittest, except for sancho's
 test_unittest.py, has a utest.
] 
[.: changeset 25077
dbinger**20040910213152
 rm unittest files
] 
[.: changeset 25093
dbinger**20040913181138
 Add initial value for globals used in this test script.
] 
[.: changeset 25194
nascheme**20040924180611
 Add get_scheme() method.
] 
[.: changeset 25215
nascheme**20040928153051
 Use os.urandom() function if it is available.
] 
[.: changeset 25217
nascheme**20040928160311
 Move randbytes() function to quixote.util module.
] 
[.: changeset 25234
nascheme**20040930173619
 Normalize whitespace.
] 
[.: changeset 25235
nascheme**20040930181044
 Prepare for 1.1 release.
] 
[.: changeset 25236
nascheme**20040930182552
 Support older versions of mod_python that don't support the per-
 request log_error method.
] 
[.: changeset 25237
nascheme**20040930182831
 Note that htmltext C extension is now mature.
] 
[.: changeset 25240
nascheme**20040930190853
 Fix type (extra comma).
] 
[.: changeset 25244
dbinger**20041001140513
 Add Widget.set_title().
] 
[.: changeset 25256
nascheme**20041005160338
 Simplify propagation of HTTP headers.
] 
[.: changeset 25257
nascheme**20041005162823
 add 'index_filenames' keyword option to StaticDirectory
] 
[.: changeset 25258
nascheme**20041005164054
 Unquote the PATH_INFO environment variable.
] 
[.: changeset 25259
nascheme**20041005164921
 it's go time for 1.1
] 
[.: changeset 25276
nascheme**20041006154653
 Fix Medusa server bug introduced in 1.1. HTTP headers must have
 "HTTP_" prepended to them.
] 
[.: changeset 25278
nascheme**20041006154942
 release 1.2 (brown paper bag in effect)
] 
[.: changeset 25291
nascheme**20041007150834
 Use htmlescape() instead of _escape_string() in htmltag(). This
 prevents attribute values from being double escaped.
] 
[.: changeset 25336
nascheme**20041014170537
 Remove HTTPRequest.dump_html() method and add dump_request to 'util'
 module. Remove obsolete functions html_quote(), value_quote() and
 link() from 'html' module.
] 
[.: changeset 25337
nascheme**20041014170856
 use bool objects where appropriate
] 
[.: changeset 25338
nascheme**20041014171035
 Fix variable names in dump_request().
] 
[.: changeset 25339
nascheme**20041014171751
 Add support for unicode.
] 
[.: changeset 25340
nascheme**20041014171915
 Use builtin types and isinstance().
] 
[.: changeset 25341
nascheme**20041014172205
 Add support to HTTPRequest for multipart/form-data type requests.
 Enhance MIME parsing so that it doesn't read huge lines into memory.
 Also implement parsing of application/x-www-form-urlencoded data
 rather than using the standard cgi.py module. Remove UPLOAD_DIR and
 UPLOAD_DIR_MODE config options. Uploaded files are now created using
 the tempfile module.
] 
[.: changeset 25342
nascheme**20041014172316
 merge missing http_request changes
] 
[.: changeset 25343
nascheme**20041014172541
 Remove backwards compatibility code for StaticDirectory.
] 
[.: changeset 25344
nascheme**20041014172812
 Update changelog for 2.0a1.
] 
[.: changeset 25345
nascheme**20041014172905
 Create HTTPRequest object directly rather than calling
 create_request().
] 
[.: changeset 25346
nascheme**20041014173050
 Use form2 library for demo.
] 
[.: changeset 25347
nascheme**20041014173336
 Rewrite parse_cookie() and rename it to parse_cookies(). When
 generating cookies, escape quote characters that appear in cookie
 values. Remove Zope Public License and Zope license notes. There is
 essentially no Zope code remaining in Quixote.
] 
[.: changeset 25349
nascheme**20041014173711
 use bool value
] 
[.: changeset 25351
nascheme**20041014190643
 Remove DEBUG_LOG configuration option. Having debug output go to the
 error log seems to be preferable.
] 
[.: changeset 25352
nascheme**20041014191035
 Remove form1 library.
] 
[.: changeset 25353
nascheme**20041014191222
 Rename 'form2' to 'form'.
] 
[.: changeset 25354
nascheme**20041014194210
 Fix Python implementation of stringify(). It should get the method
 from the type object, not the instance.
] 
[.: changeset 25356
nascheme**20041014202329
 Fix two bugs in _c_htmltext. First, htmltext_add should not force str
 objects to become unicode. Second, htmltext_join needs to get the
 items from the correct list.
] 
[.: changeset 25357
nascheme**20041014205851
 Prepare for 2.0a1 release.
] 
[.: changeset 25361
nascheme**20041014225128
 Rename HTTPRequest.get_form_var() to get_field(). That matches the
 terminology used by RFCs.
] 
[.: changeset 25365
nascheme**20041015163007
 Stop passing 'request' around.
] 
[.: changeset 25372
nascheme**20041015171054
 Add HTTPResponse.set_expires() method. Perhaps 'cache' should be
 renamed to 'expires'.
] 
[.: changeset 25374
nascheme**20041015171602
 Remove another instance of 'request'.
] 
[.: changeset 25376
nascheme**20041015201937
 Avoid accessing the 'response' attribute of the HTTPRequest object.
 Remove the HTTPRequest.redirect() method.
] 
[.: changeset 25378
nascheme**20041015203527
 Add HTTPRequest.get_query() method. Use it instead of the QUERY_STRING
 environment variable.
] 
[.: changeset 25399
nascheme**20041020205034
 Split error log and access log functionality into a separate class.
 Try to simplify site configuration. Configuration options can now be
 passed as keyword args to the Publisher class. The setup_logs() and
 shutdown_logs() methods are gone. Logs are now opened when the
 publisher is initialized.
] 
[.: changeset 25407
nascheme**20041021150127
 Unicode is somewhat broken in Python <= 2.3. Hack the test to skip
 unicode related stuff.
] 
[.: changeset 25411
dbinger**20041021174851
 Move keyword before *args.
] 
[.: changeset 25414
dbinger**20041021210800
 Initialize and reset globals used in tests. Add coverage tests for
 TemplateIO repr and str.
] 
[.: changeset 25415
nascheme**20041021220311
 Add some tests for the parse_cookies() function.
] 
[.: changeset 25422
nascheme**20041025210408
 Refactor the Publisher object. The new design gives "namespaces" more
 control over traversal. The magic of automatic package imports is
 gone. By default, your namespaces must be 'Directory' instances. The
 _q_access hook is gone. 'namespace_stack' is also gone.
] 
[.: changeset 25429
nascheme**20041025220024
 Remove debug prints. Import cgitb without try/except.
] 
[.: changeset 25432
dbinger**20041026132636
 Add get_directory_path() for obtaining the list of _q_traversed()
 Directories.
] 
[.: changeset 25437
dbinger**20041026135904
 Fix typo.
] 
[.: changeset 25476
nascheme**20041027215459
 Use a common pattern for interfacing with HTTP servers. Simplify and
 cleanup the Medusa and Twisted code. Add a SCGI server module (it
 makes more sense to be part of Quixote rather than in the "scgi"
 package). The main method of the Publisher is now process_request().
 It takes a request object and returns a response object. All the
 server modules use it and it's their job to create requests and deal
 with the responses. Add a 'content_type' attribute to HTTPResponse.
 Refactor to make it harder to screw up the character set of the
 response.
] 
[.: changeset 25513
nascheme**20041102203822
 Don't set the value to None for headers that exist.
] 
[.: changeset 25521
nascheme**20041104181618
 Oops, 'error_log' should default to stderr, not stdout.
] 
[.: changeset 25522
nascheme**20041104181654
 Don't have PATH_INFO default to '/'. That leads to confusion.
] 
[.: changeset 25524
nascheme**20041104201054
 Compile .ptl files to .pyc files. Also, remove 'htmltext' and
 'TemplateIO' from the globals of .ptl modules.
] 
[.: changeset 25526
nascheme**20041104202937
 Remove support for old style templates and support for versions of
 Python older than 2.3.
] 
[.: changeset 25534
nascheme**20041104224100
 Remove unused import.
] 
[.: changeset 25536
nascheme**20041104233044
 Move page compression functionality to http_response module.
] 
[.: changeset 25537
nascheme**20041104234635
 Don't bother trying to compress content that is already likely to be
 compressed.
] 
[.: changeset 25541
nascheme**20041105175736
 Remove useless local var.
] 
[.: changeset 25542
nascheme**20041105181735
 Remove unused imports.
] 
[.: changeset 25544
nascheme**20041105231923
 When loading a .ptl file, check for the existence of a .pyc file and
 use it if possible. For some reason I thought ihooks would do this
 itself.
] 
[.: changeset 25572
dbinger**20041111151200
 Add get_status_code()
] 
[.: changeset 25573
dbinger**20041111151824
 Add demonstrate.py, a script for running a demo on a local port. Add
 demo1.py, a basic traversal demo.
] 
[.: changeset 25574
dbinger**20041111153844
 Don't fail when the value of CONTENT_LENGTH is "".
] 
[.: changeset 25575
nascheme**20041111165644
 Overhaul the demo. Move advanced stuff into 'extras' subdirectory.
] 
[.: changeset 25576
dbinger**20041111185803
 Use the right widget, RadiobuttonsWidget, for eye color.
] 
[.: changeset 25577
dbinger**20041111185830
 set svn:keywords.
] 
[.: changeset 25579
nascheme**20041111205632
 Move the option parser out of the demonstrate.py script and make it
 available to the stand alone HTTP servers. Move the simple HTTP server
 from the demonstrate.py script to server/simple_server.py.
] 
[.: changeset 25580
dbinger**20041111211222
 Move missing trailing slash detection and action to
 Directory.__call__(). Remove fix_trailing_slash configuration option.
 Raise PublishError if PATH_INFO doesn't start with '/'.
] 
[.: changeset 25584
dbinger**20041112001939
 Remove ptlc_dump.py, which appears to be obsolete.
] 
[.: changeset 25585
dbinger**20041112005659
 Adjust docstrings.
] 
[.: changeset 25586
dbinger**20041112111237
 Remove unused local function _get_module() from publish. Modify
 util.import_object() so that it works for names without dots.
] 
[.: changeset 25592
dbinger**20041113204954
 Remove exit_now attribute from Publisher.
] 
[.: changeset 25593
dbinger**20041115143221
 Remove RUN_ONCE configuration variable.
] 
[.: changeset 25594
dbinger**20041115143906
 Remove reference to RUN_ONCE.
] 
[.: changeset 25602
dbinger**20041115225948
 Set svn:executable
] 
[.: changeset 25609
dbinger**20041116191802
 Revise altdemo to show basic session operation.
] 
[.: changeset 25610
dbinger**20041116191939
 Fix typo.
] 
[.: changeset 25612
dbinger**20041116192342
 Fix name error.
] 
[.: changeset 25634
nascheme**20041118000633
 Stop generating 'Status' header for servers that don't need it. Add
 'include_status' keyword to HTTPResponse.write().
] 
[.: changeset 25635
nascheme**20041118001151
 Use tempfile to get the path to a temporary directory.
] 
[.: changeset 25636
dbinger**20041118002305
 Make sure that arg to write() is a str.
] 
[.: changeset 25643
nascheme**20041118213001
 Fix typo.
] 
[.: changeset 25658
dbinger**20041122141620
 Add a unit test for the ptl compiler.
] 
[.: changeset 25659
dbinger**20041122162927
 Support $-substitution in templates, as in python 2.4's
 string.Template class. $-substitution is applied to every
 '$'-containing literal in a template. Templates written before this
 change, if they contain literals containing '$', *must* be converted
 by replacing each '$' with '$$'. Drop support for old-style ("template
 f()") template definitions.
] 
[.: changeset 25662
dbinger**20041122190523
 Update some comments. Fix compile_dir() to look for pyc files.
] 
[.: changeset 25664
nascheme**20041122203507
 Provide a Publisher object that works more like Quixote 1. Also,
 restore the original form framework with the name "form1".
] 
[prepare 2.0a2
nas@mems-exchange.org**20041122230750] 
[compiled PTL now ends with .pyc
nas@mems-exchange.org**20041123152621] 
