def processResponse(self, request, res): if not isinstance(res, response.Response): if res == None: return response.Response(status=200) request.profile.stopResponse() startConvert = time.time() text = converter.toText(request.responseType, res, self.controller, request) convertTime = time.time() - startConvert if False and request.contentType == 'text/plain': import gc class Results(modellib.Model): profile = fields.ModelField(profile.ProfileData) results = fields.ModelField(res.__class__, displayName=res._meta.name) request.profile.otherTimes.sort(key = lambda x: x.time) request.profile.convertTime = convertTime gc.collect() request.profile.references = len(gc.get_objects()) res = Results(profile=request.profile, results=res) text = converter.toText(request.responseType, res, self.controller, request) res = response.Response(text, content_type=request.contentType) res.headers['Cache-Control'] = 'private, must-revalidate, max-age=0' request.rootController.db.reset() return res
def processException(self, request, excClass, exception, tb): message = '%s: %s' % (excClass.__name__, exception) if hasattr(exception, 'status'): status = exception.status else: status = 500 self.logError(request, excClass, exception, tb, doEmail=True) # Only send the traceback information if it's an unintentional # exception (i.e. a 500) if status == 500: tbString = 'Traceback:\n' + ''.join(traceback.format_tb(tb)) text = [message + '\n', tbString] else: tbString = None text = [message + '\n'] isFlash = 'HTTP_X_FLASH_VERSION' in request.headers or 'X-Wrap-Response-Codes' in request.headers if not getattr(request, 'contentType', None): request.contentType = 'text/xml' request.responseType = 'xml' if isFlash or request.contentType != 'text/plain': # for text/plain, just print out the traceback in the easiest to read # format. code = status if isFlash: # flash ignores all data sent with a non-200 error status = 200 error = models.Fault(code=code, message=message, traceback=tbString) text = converter.toText(request.responseType, error, self.controller, request) return response.Response(text, content_type=request.contentType, status=status)
def testImageFileURL(self): xml = """\ <image> <name>my image</name> <files> <file> <title>image title</title> <size>1234</size> <sha1>abc</sha1> <fileName>file name</fileName> <url urlType="0">http://localhost:1234</url> <url>http://localhost:12345</url> <url urlType="1"/> </file> </files> <imageId>1</imageId> </image> """ image = converter.fromText("xml", xml, models.Image, None, None) self.failUnlessEqual(image.name, "my image") self.failUnlessEqual([ x.title for x in image.files.files ], ['image title']) self.failUnlessEqual([ x.size for x in image.files.files ], [1234]) self.failUnlessEqual([ x.sha1 for x in image.files.files ], ['abc']) self.failUnlessEqual([ x.fileName for x in image.files.files ], ['file name']) self.failUnlessEqual( [ [ (y.url, y.urlType) for y in x.urls ] for x in image.files.files ], [ [ ('http://localhost:1234', 0), ('http://localhost:12345', None), (None, 1), ] ], ) class Controller(object): def url(slf, request, *args, **kwargs): return args[0] class Request(object): def __init__(slf, baseUrl): slf.baseUrl = baseUrl # Need to set the file ID counter = 42 for f in image.files.files: for url in f.urls: url.urlType = 0 url.fileId = counter counter += 1 # Now make sure we can dump the data back in xml, and the url # attribute/text field doesn't cause problems. newxml = converter.toText("xml", image, Controller(), Request("irc://goo/")) tmpl = '<url urlType="0">irc://goo/downloadImage?fileId=%s&urlType=0</url>' for fileId in [42, 43, 44]: self.assertIn(tmpl % fileId, newxml)
def toString(self, item): controller = _Controller() txt = converter.toText('json', item, controller, None) return re.sub('\n *', '', txt)
def toString(self, item): controller = _Controller() return converter.toText('xml', item, controller, None)
def convert(self, type, request, object): return converter.toText(type, object, self.controller, request)