Example #1
0
 def __iter__(self):
     path = self.environ.get('PATH_INFO', '/')
     tree = maybe_async(safe_async(self.page_tree))
     while is_async(tree):
         yield b''
         tree = maybe_async(tree)
     if is_failure(tree):
         request = self.bad_request(tree, route=path)
     else:
         try:
             node = tree.resolve(path)
         except Exception as e:
             request = self.bad_request(as_failure(e), tree=tree)
         else:
             request = maybe_async(
                 safe_async(make_request, (self.environ, node)))
             while is_async(request):
                 yield b''
                 request = maybe_async(request)
             if is_failure(request):
                 request = self.bad_request(request, node=node)
     for processor in self.site.request_processors:
         try:
             processor(request)
         except:
             pass
     for response in self.response(request):
         if response is not None:
             break
         yield b''
     for c in self.start(response):
         yield c
Example #2
0
 def __iter__(self):
     path = self.environ.get('PATH_INFO','/')
     tree = maybe_async(safe_async(self.page_tree))
     while is_async(tree):
         yield b''
         tree = maybe_async(tree)
     if is_failure(tree):
         request = self.bad_request(tree, route=path)
     else:
         try:
             node = tree.resolve(path)
         except Exception as e:
             request = self.bad_request(as_failure(e), tree=tree)
         else:
             request = maybe_async(safe_async(make_request,
                                              (self.environ, node)))
             while is_async(request):
                 yield b''
                 request = maybe_async(request)
             if is_failure(request):
                 request = self.bad_request(request, node=node)
     for processor in self.site.request_processors:
         try:
             processor(request)
         except:
             pass
     for response in self.response(request):
         if response is not None:
             break
         yield b''
     for c in self.start(response):
         yield c
Example #3
0
def submit_form(request, force_redirect=None, **kw):
    '''Comprehensive save method for forms.
This method try to deal with all possible events occurring after a form
has been submitted, including possible asynchronous behaviour.'''
    view = request.view
    if force_redirect is None:
        force_redirect = view.force_redirect
    fhtml = view.get_form(request, **kw)
    f = fhtml.form
    data = f.rawdata
    # The form has been aborted
    if forms.CANCEL_KEY in data:
        url = get_redirect(request, data, f.instance)
        raise HttpRedirect(url)
    # Save as new
    if forms.SAVE_AS_NEW_KEY in data and f.instance and f.instance.id:
        f.instance = view.mapper.save_as_new(f.instance, commit=False)
    # The form is valid. Invoke the submit_form method in the view
    if f.is_valid():
        editing = bool(f.instance and f.instance.id)
        response = view.submit_form(request, f)
        if is_async(response):
            return response.add_callback(partial(_finish, request, editing,
                                                 fhtml, force_redirect))
        else:
            return _finish(request, editing, fhtml, force_redirect, response)
    else:
        if request.is_xhr:
            return fhtml.maker.json_messages(f)
        else:
            return view.get_response(request)
Example #4
0
def submit_form(request, force_redirect=None, **kw):
    '''Comprehensive save method for forms.
This method try to deal with all possible events occurring after a form
has been submitted, including possible asynchronous behaviour.'''
    view = request.view
    if force_redirect is None:
        force_redirect = view.force_redirect
    fhtml = view.get_form(request, **kw)
    f = fhtml.form
    data = f.rawdata
    # The form has been aborted
    if forms.CANCEL_KEY in data:
        url = get_redirect(request, data, f.instance)
        raise HttpRedirect(url)
    # Save as new
    if forms.SAVE_AS_NEW_KEY in data and f.instance and f.instance.id:
        f.instance = view.mapper.save_as_new(f.instance, commit=False)
    # The form is valid. Invoke the submit_form method in the view
    if f.is_valid():
        editing = bool(f.instance and f.instance.id)
        response = view.submit_form(request, f)
        if is_async(response):
            return response.add_callback(
                partial(_finish, request, editing, fhtml, force_redirect))
        else:
            return _finish(request, editing, fhtml, force_redirect, response)
    else:
        if request.is_xhr:
            return fhtml.maker.json_messages(f)
        else:
            return view.get_response(request)
Example #5
0
 def render(self, request=None, **kwargs):
     '''Serialize ``self`` as a ``JSON`` string'''
     elem = maybe_async(self.serialize(request))
     if is_async(elem):
         return elem.add_callback(self.dump)
     else:
         return self.dump(elem)
Example #6
0
 def testSimple(self):
     s = Deferred()
     elem = w('div', s)
     self.assertEqual(len(elem), 1)
     text = elem.render()
     self.assertTrue(is_async(text))
     self.assertFalse(text.called)
     s.callback('ciao')
     self.assertTrue(text.called)
     text = text.result
     self.assertEqual(text,'<div>ciao</div>')
Example #7
0
 def testSimple(self):
     s = Deferred()
     elem = w('div', s)
     self.assertEqual(len(elem), 1)
     text = elem.render()
     self.assertTrue(is_async(text))
     self.assertFalse(text.called)
     s.callback('ciao')
     self.assertTrue(text.called)
     text = text.result
     self.assertEqual(text, '<div>ciao</div>')
Example #8
0
 def page_tree(self):
     site = self.site
     Page = site.Page
     tree = site.tree
     if Page:
         pages = Page.query().all()
         if is_async(pages):
             return pages.add_callback(lambda pg: DjpcmsTree(tree, pg))
         else:
             return DjpcmsTree(tree, pages)
     else:
         return DjpcmsTree(tree)
Example #9
0
 def page_tree(self):
     site = self.site
     Page = site.Page
     tree = site.tree
     if Page:
         pages = Page.query().all()
         if is_async(pages):
             return pages.add_callback(lambda pg: DjpcmsTree(tree, pg))
         else:
             return DjpcmsTree(tree, pages)
     else:
         return DjpcmsTree(tree)
Example #10
0
 def response(self, request):
     '''Generate the Response'''
     self.content_type, response = request.content_type, None
     if not request.exc_info:
         try:
             if request.method not in request.methods():
                 raise HttpException(status=405)
             perm = maybe_async(request.has_permission())
             while is_async(perm):
                 yield None
                 perm = maybe_async(perm)
             if is_failure(perm):
                 request.exc_info = perm.trace
             elif not perm:
                 raise PermissionDenied()
             else:
                 content = request.view(request)
         except Exception as e:
             request.exc_info = sys.exc_info()
     if request.exc_info is None:
         content = self.safe_render(request, content)
         while is_async(content):
             yield
             content = self.safe_render(request, content)
         if is_failure(content):
             request.exc_info = content.trace
             content = b''
         elif isinstance(content, WsgiResponse):
             response = content
     # Response not yet available, build it from content or exc_info
     if response is None:
         response = Response(content_type=self.content_type,
                             encoding=request.encoding)
         if request.exc_info is not None:
             content = self.website.handle_error(request, response)
         if response.content_type == 'text/html' and not request.is_xhr:
             content = '\n'.join(html_doc_stream(request, content,
                                                 response.status_code))
         response.content = (to_bytes(content, response.encoding),)
     yield self.cache(request, response)
Example #11
0
 def response(self, request):
     '''Generate the Response'''
     self.content_type, response = request.content_type, None
     if not request.exc_info:
         try:
             if request.method not in request.methods():
                 raise HttpException(status=405)
             perm = maybe_async(request.has_permission())
             while is_async(perm):
                 yield None
                 perm = maybe_async(perm)
             if is_failure(perm):
                 request.exc_info = perm.trace
             elif not perm:
                 raise PermissionDenied()
             else:
                 content = request.view(request)
         except Exception as e:
             request.exc_info = sys.exc_info()
     if request.exc_info is None:
         content = self.safe_render(request, content)
         while is_async(content):
             yield
             content = self.safe_render(request, content)
         if is_failure(content):
             request.exc_info = content.trace
             content = b''
         elif isinstance(content, WsgiResponse):
             response = content
     # Response not yet available, build it from content or exc_info
     if response is None:
         response = Response(content_type=self.content_type,
                             encoding=request.encoding)
         if request.exc_info is not None:
             content = self.website.handle_error(request, response)
         if response.content_type == 'text/html' and not request.is_xhr:
             content = '\n'.join(
                 html_doc_stream(request, content, response.status_code))
         response.content = (to_bytes(content, response.encoding), )
     yield self.cache(request, response)
Example #12
0
def underlying_response(request, page):
    urlargs = dict(request_get_data(request).items())
    if page:
        route = page.route
        try:
            url = route.url(**urlargs)
        except KeyError as e:
            url = route.path
        underlying = request.for_path(url, urlargs={})
        if is_async(underlying):
            return underlying.add_callback(
                lambda r: _underlying_response(request, r))
        else:
            return _underlying_response(request, underlying)
Example #13
0
def underlying_response(request, page):
    urlargs = dict(request_get_data(request).items())
    if page:
        route = page.route
        try:
            url = route.url(**urlargs)
        except KeyError as e:
            url = route.path
        underlying = request.for_path(url, urlargs={})
        if is_async(underlying):
            return underlying.add_callback(
                                lambda r: _underlying_response(request, r))
        else:
            return _underlying_response(request, underlying)
Example #14
0
def make_request(environ, node, instance=None, cache=True):
    '''Internal method for creating a :class:`Request` instance.'''
    instance = orms.orm_instance(instance)
    if not node.error:
        view = node.view
        model = view.model
        if isclass(model):
            if not isinstance(instance, model):
                try:
                    # get the instance of model if any
                    instance = view.instance_from_variables(environ,
                                                            node.urlargs)
                    if is_async(instance):
                        callback = partial(build_request, environ, node, cache)
                        return instance.addBoth(
                                partial(build_request, environ, node, cache))
                except Exception as e:
                    instance = as_failure(e)
        else:
            instance = None
    return build_request(environ, node, cache, instance)
Example #15
0
def make_request(environ, node, instance=None, cache=True):
    '''Internal method for creating a :class:`Request` instance.'''
    instance = orms.orm_instance(instance)
    if not node.error:
        view = node.view
        model = view.model
        if isclass(model):
            if not isinstance(instance, model):
                try:
                    # get the instance of model if any
                    instance = view.instance_from_variables(
                        environ, node.urlargs)
                    if is_async(instance):
                        callback = partial(build_request, environ, node, cache)
                        return instance.addBoth(
                            partial(build_request, environ, node, cache))
                except Exception as e:
                    instance = as_failure(e)
        else:
            instance = None
    return build_request(environ, node, cache, instance)