from trac.core import Component, implements from trac.web import IRequestHandler from trac.web.api import HTTPBadRequest, HTTPUnauthorized from iface import TracFormDBUser, TracPasswordStoreUser import urllib class TracFormUpdater(TracFormDBUser, TracPasswordStoreUser): implements(IRequestHandler) def match_request(self, req): return req.path_info.endswith('/formdata/update') def process_request(self, req): try: self.log.debug('UPDATE ARGS:' + str(req.args)) args = dict(req.args) backpath = args.pop('__backpath__', None) context = args.pop('__context__', None) basever = args.pop('__basever__', None) keep_history = args.pop('__keep_history__', None) track_fields = args.pop('__track_fields__', None) args.pop('__FORM_TOKEN', None) # Ignore. if context is None: raise HTTPBadRequest('__context__ is required') who = req.authname result = [] for name, value in args.iteritems(): name = urllib.quote(str(name)) if isinstance(value, (list, tuple)): for item in value: item = str(item) result.append('%s=%s' % (name, urllib.quote(item))) else: value = str(value) result.append('%s=%s' % (name, urllib.quote(value))) self.save_tracform(context, '&'.join(result), who, basever, keep_history=keep_history, track_fields=track_fields) if backpath is not None: req.send_response(302) req.send_header('Content-type', 'text/plain') req.send_header('Location', backpath) req.end_headers() req.write('OK') else: req.send_response(200) req.send_header('Content-type', 'text/plain') req.end_headers() req.write('OK') except Exception, e: req.send_response(500) req.send_header('Content-type', 'text/plain') req.end_headers() req.write(str(e))