예제 #1
0
    def test_json_request_to_view_namespace_returns_view(self):
        obj = self.traverse('/plone/@@folder_contents')
        self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected')

        self.portal[self.portal.invokeFactory('Folder', id='folder1')]
        obj = self.traverse('/plone/folder1/@@folder_contents')
        self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected')
예제 #2
0
    def test_json_request_to_view_namespace_returns_view(self):
        obj = self.traverse('/plone/@@folder_contents')
        self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected')

        self.portal[self.portal.invokeFactory('Folder', id='folder1')]
        obj = self.traverse('/plone/folder1/@@folder_contents')
        self.assertTrue(IBrowserView.providedBy(obj), 'IBrowserView expected')
예제 #3
0
    def test_json_request_to_view_namespace_returns_view(self):
        obj = self.traverse("/plone/@@folder_contents")
        self.assertTrue(IBrowserView.providedBy(obj), "IBrowserView expected")

        self.portal[self.portal.invokeFactory("Folder", id="folder1")]
        obj = self.traverse("/plone/folder1/@@folder_contents")
        self.assertTrue(IBrowserView.providedBy(obj), "IBrowserView expected")
예제 #4
0
 def item_macros(self):
     default_view = self.default_view
     if IBrowserView.providedBy(default_view):
         # IBrowserView
         return default_view.index.macros
     # FSPageTemplate
     return default_view.macros
예제 #5
0
def error(self, error, last_known_obj):
    """Render and log an error."""
    # This is the patch ... in the original IBrowserView is IBrowserPage
    if IBrowserView.providedBy(last_known_obj):
        #of the last obj is a view, use it's context (which should be
        # an IAcquirer)
        last_known_obj = last_known_obj.context
    if not IAcquirer.providedBy(last_known_obj):
        last_known_site = getSite()
        if last_known_site is not None:
            last_known_obj = last_known_site
    context = DefaultError(error)
    if IAcquirer.providedBy(last_known_obj):
        context = context.__of__(last_known_obj)
    error_page = queryMultiAdapter(
        (context, self.request), name='error.html')

    if error_page is not None:
        try:
            error_result = error_page()
            if error_result is not None:
                self.response.setBody(error_result)
        except Exception as error:
            log_last_error(
                self.request, self.response, obj=last_known_obj,
                extra="Error while rendering error message")
            self.response.setStatus(500)
            self.response.setBody(ERROR_WHILE_RENDERING_ERROR_TEMPLATE)
    else:
        logger.error('No action defined for last exception')
        self.response.setStatus(500)
        self.response.setBody(DEFAULT_ERROR_TEMPLATE)
예제 #6
0
 def ultimate_parent(self):
     # Walk the __parent__ chain to find the principal view
     parent = self.__parent__
     while hasattr(parent, '__parent__') and IBrowserView.providedBy(
             parent.__parent__):
         parent = parent.__parent__
     return parent
예제 #7
0
 def item_macros(self):
     default_view = self.default_view
     if IBrowserView.providedBy(default_view):
         # IBrowserView
         return default_view.index.macros
     # FSPageTemplate
     return default_view.macros
예제 #8
0
 def ultimate_parent(self):
     # Walk the __parent__ chain to find the principal view
     parent = self.__parent__
     while (hasattr(parent, '__parent__') and
             IBrowserView.providedBy(parent.__parent__)):
         parent = parent.__parent__
     return parent
예제 #9
0
def error(self, error, last_known_obj):
    """Render and log an error."""
    # This is the patch ... in the original IBrowserView is IBrowserPage
    if IBrowserView.providedBy(last_known_obj):
        #of the last obj is a view, use it's context (which should be
        # an IAcquirer)
        last_known_obj = last_known_obj.context
    if not IAcquirer.providedBy(last_known_obj):
        last_known_site = getSite()
        if last_known_site is not None:
            last_known_obj = last_known_site
    context = DefaultError(error)
    if IAcquirer.providedBy(last_known_obj):
        context = context.__of__(last_known_obj)
    error_page = queryMultiAdapter((context, self.request), name='error.html')

    if error_page is not None:
        try:
            error_result = error_page()
            if error_result is not None:
                self.response.setBody(error_result)
        except Exception as error:
            log_last_error(self.request,
                           self.response,
                           obj=last_known_obj,
                           extra="Error while rendering error message")
            self.response.setStatus(500)
            self.response.setBody(ERROR_WHILE_RENDERING_ERROR_TEMPLATE)
    else:
        logger.error('No action defined for last exception')
        self.response.setStatus(500)
        self.response.setBody(DEFAULT_ERROR_TEMPLATE)
예제 #10
0
    def getContextHelpTopic(self):
        """Retrieve a help topic based on the context of the
        help namespace.

        If the context is a view, try to find
        a matching help topic for the view and its context.
        If no help topic is found, try to get a help topic for
        the context only.

        If the context is not a view, try to retrieve a help topic
        based on the context.

        If nothing is found, return the onlinehelp root topic
        """
        if self.topic is not None:
            return self.topic

        onlinehelp = self.context
        help_context = onlinehelp.context
        self.topic = None
        if IBrowserView.providedBy(help_context):
            # called from a view
            self.topic = getTopicFor(getParent(help_context),
                                     getName(help_context))
            if self.topic is None:
                # nothing found for view try context only
                self.topic = getTopicFor(getParent(help_context))
        else:
            # called without view
            self.topic = getTopicFor(help_context)

        if self.topic is None:
            self.topic = onlinehelp

        return self.topic
예제 #11
0
 def __call__(self, *args, **kwargs):
     optout_all(self.request, 'false', update=True)
     context = self.context
     if IBrowserView.providedBy(context):
         # This context is also a view, we called something like /foo/bar/@@view/@@reset-optout
         here_url = "%s/@@%s" % (context.context.absolute_url(),
                                 context.__name__)
     else:
         here_url = context.absolute_url()
     back_to = self.request.form.get('came_from') or here_url
     self.request.response.redirect(back_to)
예제 #12
0
 def traverseName(self, request, ob, name):
     result = super(ZopePublicationSansProxy, self).traverseName(
         request, ob, name)
     bare_result = removeSecurityProxy(result)
     if IBrowserView.providedBy(bare_result):
         if IGrokSecurityView.providedBy(bare_result):
             return bare_result
         else:
             return result
     else:
         return bare_result
예제 #13
0
 def traverseName(self, request, ob, name):
     result = super(ZopePublicationSansProxy,
                    self).traverseName(request, ob, name)
     bare_result = removeSecurityProxy(result)
     if IBrowserView.providedBy(bare_result):
         if IGrokSecurityView.providedBy(bare_result):
             return bare_result
         else:
             return result
     else:
         return bare_result
예제 #14
0
 def __call__(self, *args, **kwargs):
     optout_all(self.request, 'false', update=True)
     context = self.context
     if IBrowserView.providedBy(context):
         # This context is also a view, we called something like
         # /foo/bar/@@view/@@reset-optout
         here_url = '{0}/@@{1}'.format(
             context.context.absolute_url(),
             context.__name__)
     else:
         here_url = context.absolute_url()
     back_to = self.request.form.get('came_from') or here_url
     self.request.response.redirect(back_to)
예제 #15
0
 def __call__(self, *args, **kwargs):
     optout_all(self.request, "false", update=True)
     context = self.context
     if IBrowserView.providedBy(context):
         # This context is also a view, we called something like
         # /foo/bar/@@view/@@reset-optout
         here_url = "{0}/@@{1}".format(context.context.absolute_url(),
                                       context.__name__)
     else:
         qs = self.request.QUERY_STRING
         here_url = context.absolute_url()
         # Let's support utm_ and other attributes in redirect.
         if qs != "":
             here_url = unquote_plus("=".join(qs.split("=")[1:]))
     self.request.response.redirect(here_url)
예제 #16
0
def get_view_name(request):
    path = request['PATH_INFO']

    # Short circuit certain common view groups early, and consolidate them
    # under a group name (mainly CSS and JS resources).
    #
    # We don't want to log each individual resource name, since that would
    # blow up the range of possible values for the view name with highly
    # dynamic data, and would negatively affect compression or indexing of
    # these logs in ES.
    for marker in VIEW_GROUP_MARKERS:
        if marker in path:
            return marker

    published = request.get('PUBLISHED')

    # plone.rest service
    if IService.providedBy(published):
        service = published
        # GET_application_json_@named-service
        full_service_name = str(service.__name__)
        service_name = full_service_name.replace(request._rest_service_id, '')

        # Unnamed service
        if service_name == '':
            return 'context'

        return service_name

    if ismethod(published):
        # Handle methods on views published via allowed_attributes.
        parents = request.get('PARENTS')
        if parents and IBrowserView.providedBy(parents[0]):
            view_name = '/'.join(request.steps[-2:])
            return canonicalize_browserview_name(view_name)

    if request.steps:
        # Fall back to looking at the the rightmost path segment
        view_name = request.steps[-1]

        # Probably a legacy publishing mechanism, like DTML templates.
        # Don't attempt to resolve any further.
        if view_name == 'index_html':
            return None

        return canonicalize_browserview_name(view_name)
예제 #17
0
    def add_to_cart(self, path, quantity=1):
        # Attempt to find product relative to current object, fall back to root
        # of site.
        context = self.context
        while IBrowserView.providedBy(context):
            context = aq_parent(context)
        try:
            obj = context.restrictedTraverse(path)
        except (AttributeError, KeyError):
            if not path.startswith('/'):
                path = '/' + path
            obj = api.content.get(path=path)

        if obj:
            add_item_to_cart(
                    request=self.request,
                    uid=obj.UID(),
                    count=quantity
                    )
예제 #18
0
    def getTemplate(self, templateId, context=None):
        """
        traverse/search template
        """

        if not context:
            context = self.context

        template = context.restrictedTraverse(templateId)
        
        if IBrowserView.providedBy(template):
            view = template
            for attr in ('index', 'template', '__call__'):
                template = getattr(view, attr, None)
                if template is not None and hasattr(template, 'macros'):
                    break
            if template is None:
                raise KeyError("Unable to find template for view %s" % templateId)
        return template
예제 #19
0
    def challenge(self, request, response):
        if not IClientSkinLayer.providedBy(request):
            return False

        current_url = request.get("ACTUAL_URL", "")
        query = request.get("QUERY_STRING")
        if query:
            if not query.startswith("?"):
                query = "?" + query
            current_url += query

        context = request.PUBLISHED
        if IBrowserView.providedBy(context):
            context = aq_parent(context)

        login_url = "%s/@@login?%s" % (context.absolute_url(),
                urllib.urlencode(dict(came_from=current_url)))
        response.redirect(login_url, lock=True)
        return True
예제 #20
0
    def challenge(self, request, response):
        """IChallengePlugin implementation"""
        if not IClientSkinLayer.providedBy(request):
            return False

        current_url = request.get("ACTUAL_URL", "")
        query = request.get("QUERY_STRING")
        if query:
            if not query.startswith("?"):
                query = "?" + query
            current_url += query

        context = request.get("PUBLISHED")
        if not context:
            log.error(
                "Refusing to authenticate because no context has been found in %r",  # noqa: E501
                request,
            )
            return False
        if IBrowserView.providedBy(context):
            context = aq_parent(context)

        # In case of a deep link (anything deeper than to the country), open
        # the login form directly.
        deep_link = False
        try:
            webhelpers = api.content.get_view("webhelpers", context, request)
        except Exception:
            pass
        else:
            path = current_url.split(webhelpers.client_url)[-1]
            elems = [item for item in path.split("/") if item]
            if len(elems) > 1:
                deep_link = True

        login_url = "{url}/@@login?{came_from}{fragment}".format(
            url=context.absolute_url(),
            came_from=urlencode(dict(came_from=current_url)),
            fragment="#login" if deep_link else "",
        )
        response.redirect(login_url, lock=True)
        return True
예제 #21
0
    def challenge(self, request, response):
        """IChallengePlugin implementation"""
        if not IClientSkinLayer.providedBy(request):
            return False

        current_url = request.get("ACTUAL_URL", "")
        query = request.get("QUERY_STRING")
        if query:
            if not query.startswith("?"):
                query = "?" + query
            current_url += query

        context = request.PUBLISHED
        if IBrowserView.providedBy(context):
            context = aq_parent(context)

        login_url = "%s/@@login?%s" % (context.absolute_url(),
                urllib.urlencode(dict(came_from=current_url)))
        response.redirect(login_url, lock=True)
        return True
예제 #22
0
    def get_public_view_registrations(self, site_manager):
        from opengever.task.response_syncer import BaseResponseSyncerReceiver

        for reg in self.get_adapter_registrations(site_manager):
            if reg.name == '':
                continue

            if reg.name in ALLOWED_ENDPOINTS:
                continue

            if not IBrowserView.implementedBy(reg.factory):
                continue

            if IBrowserSubMenuItem.implementedBy(reg.factory):
                continue

            if self.get_dottedname(reg) in WHITELIST:
                continue

            if len(reg.required) != 2:
                # Only context/request adapters are published.
                continue

            if issubclass(reg.factory, BaseResponseSyncerReceiver):
                # The BaseResponseSyncerReceiver._check_internal_request
                # makes sure that the request is an internal GEVER request.
                # Those requests must be public.
                continue

            permission_role = getattr(reg.factory, '__roles__', None)
            if permission_role is not None:
                continue

            if not self.get_factory(reg).__module__.startswith('opengever.'):
                continue

            yield reg
예제 #23
0
    def get_public_view_registrations(self, site_manager):
        from opengever.task.response_syncer import BaseResponseSyncerReceiver

        for reg in self.get_adapter_registrations(site_manager):
            if reg.name == '':
                continue

            if reg.name in ALLOWED_ENDPOINTS:
                continue

            if not IBrowserView.implementedBy(reg.factory):
                continue

            if IBrowserSubMenuItem.implementedBy(reg.factory):
                continue

            if self.get_dottedname(reg) in WHITELIST:
                continue

            if len(reg.required) != 2:
                # Only context/request adapters are published.
                continue

            if issubclass(reg.factory, BaseResponseSyncerReceiver):
                # The BaseResponseSyncerReceiver._check_internal_request
                # makes sure that the request is an internal GEVER request.
                # Those requests must be public.
                continue

            permission_role = getattr(reg.factory, '__roles__', None)
            if permission_role is not None:
                continue

            if not self.get_factory(reg).__module__.startswith('opengever.'):
                continue

            yield reg
예제 #24
0
 def test_default_views(self):
     view = self.occ_traverser_1.publishTraverse(self.request, 'event_view')
     self.assertTrue(IBrowserView.providedBy(view))
예제 #25
0
 def test_default_views(self):
     view = self.at_traverser.publishTraverse(
         self.layer['request'], 'event_view')
     self.assertTrue(IBrowserView.providedBy(view))
예제 #26
0
def page(_context, name, permission,
         for_=Interface, layer=interfaces.IFlourishLayer,
         title=None, subtitle=None,
         template=None, page_template=None, content_template=None,
         class_=Page,
         update='update', render='render',
         allowed_interface=(), allowed_attributes=(),
         **kwargs
         ):

    forward_methods = {
        'update': update,
        'render': render,
        }

    # BBB: add index to ease porting from old style views
    if (IBrowserView.implementedBy(class_) and
        getattr(class_, 'index', None) is None):
        forward_methods['index'] = render

    if not interfaces.IPage.implementedBy(class_):
        class_ = type(class_.__name__, (class_, Page), {})

    allowed_interface = (tuple(allowed_interface) +
                         (interfaces.IPage, ))

    class_dict = dict(kwargs)
    class_dict['__name__'] = name

    if title is not None:
        class_dict['title'] = title
    if subtitle is not None:
        class_dict['subtitle'] = subtitle

    # XXX: raise ConfigurationError if class_ is Page and
    #      no templates specified

    templates = template_specs({
        'template': template,
        'page_template': page_template,
        'content_template': content_template,
        }, content_type='html')

    class_ = subclass_content(
        class_, name,
        forward_methods,
        templates,
        class_dict,
        )

    handle_interfaces(_context, (for_,))
    handle_interfaces(_context, allowed_interface)

    handle_security(class_, permission,
                    allowed_interface, allowed_attributes)

    _context.action(
        discriminator=('view', for_, name, IBrowserRequest, layer),
        callable=zope.component.zcml.handler,
        args=('registerAdapter',
              class_, (for_, layer), Interface, name, _context.info),
        )
예제 #27
0
def GrayscaleTransformations(event):
    """
    Changing the response body by converting
    the images to grayscale and changing the
    css colors definitions to colors from gray
    shades palette
    """
    request = event.request
    response = request.response
    context = request.get('PUBLISHED')
    resp_body = response.getBody()
    resp_body = getattr(context, 'GET', lambda: '')()

    if hasattr(context, 'im_self'):
        context = context.im_self
    if isinstance(context, ImageScale):
        context = context.data
    if hasattr(context, 'context'):
        context = context.context

    content_type = getattr(context, 'content_type', '')
    if callable(content_type):
        content_type = content_type() or ''
    if not content_type:
        content_type = response.headers.get('content-type') or ''

    if isinstance(context, FilesystemFile):
        resp_body = context().read()
        content_type = context.getContentType().split(';')[0]

    filename = getattr(context, 'getId', lambda: False)()
    filename = getattr(context, 'filename', filename)
    if not filename:
        try:
            filename = context.__name__
        except AttributeError:
            return

    images_content_types = ['image/png', 'image/jpg', 'image/jpeg', 'image/gif']

    browser_resource_image = False
    if isinstance(context, browserresourcefile) and \
       context.content_type.split(';')[0] in images_content_types:
        browser_resource_image = True

    if content_type:
        content_type = content_type.split(';')[0].strip()

    if 'javascript' in content_type:
        return

    if isinstance(context, FSImage) or \
       IOFSImage.providedBy(context) or \
       IATImage.providedBy(context) or \
       content_type in images_content_types or \
       browser_resource_image:

        try:
            path = '/'.join(context.getPhysicalPath())
        except AttributeError:
            path = filename

        try:
            resp_body = utils.get_resource(request, response, path)
        except NotFound:
            image_body = resp_body
            if not image_body:
                if hasattr(context, 'data'):
                    image_body = context.data
                elif isinstance(context, FSImage):
                    image_body = context._readFile(True)

            if image_body:
                resp_body = utils.image_to_grayscale(image_body, path)
            else:
                log.debug('Image doesn\'t contain any data: %s' % (path))

            if queryUtility(IResourceDirectory, name=u''):
                utils.store_resource(path, resp_body)

    elif IBrowserView.providedBy(request.get('PUBLISHED')) or \
        content_type in ['text/html', 'text/css'] or \
        isinstance(context, (File, FSFile, ATFile, FSPageTemplate)) and \
            context.content_type.split(';')[0] in ['text/html', 'text/css']:

        if hasattr(aq_base(context), 'data'):
            resp_body = context.data
            if hasattr(resp_body, 'data'):
                resp_body = resp_body.data

        if isinstance(context, FSFile):
            resp_body = context._readFile(0)

        if content_type == 'text/css' or \
           isinstance(context, (File, FSFile, ATFile, FSPageTemplate)) and \
           context.content_type.split(';')[0] == 'text/css':

            try:
                resp_body = utils.get_resource(request, response, filename)
            except (NotFound, AttributeError):
                resp_body = utils.transform_style_properties(resp_body)
                resp_body = utils.transform_css_url(resp_body)
                if queryUtility(IResourceDirectory, name=u''):
                    utils.store_resource(filename, resp_body)
        else:
            if not resp_body:
                rendered_body = utils.render_object_html(context, request)
                if rendered_body:
                    resp_body = rendered_body
            resp_body = utils.add_bodyclass(resp_body)
            resp_body = utils.transform_style_properties(resp_body)
            resp_body = utils.transform_css_url(resp_body)
            resp_body = utils.transform_img_src(resp_body)

    response.setBody(resp_body)
예제 #28
0
 def test_default_views(self):
     view = self.traverser.publishTraverse(self.request, 'event_view')
     self.assertTrue(IBrowserView.providedBy(view))
예제 #29
0
파일: zcml.py 프로젝트: l1ph0x/schooltool-2
def page(_context,
         name,
         permission,
         for_=Interface,
         layer=interfaces.IFlourishLayer,
         title=None,
         subtitle=None,
         template=None,
         page_template=None,
         content_template=None,
         class_=Page,
         update='update',
         render='render',
         allowed_interface=(),
         allowed_attributes=(),
         **kwargs):

    forward_methods = {
        'update': update,
        'render': render,
    }

    # BBB: add index to ease porting from old style views
    if (IBrowserView.implementedBy(class_)
            and getattr(class_, 'index', None) is None):
        forward_methods['index'] = render

    if not interfaces.IPage.implementedBy(class_):
        class_ = type(class_.__name__, (class_, Page), {})

    allowed_interface = (tuple(allowed_interface) + (interfaces.IPage, ))

    class_dict = dict(kwargs)
    class_dict['__name__'] = name

    if title is not None:
        class_dict['title'] = title
    if subtitle is not None:
        class_dict['subtitle'] = subtitle

    # XXX: raise ConfigurationError if class_ is Page and
    #      no templates specified

    templates = template_specs(
        {
            'template': template,
            'page_template': page_template,
            'content_template': content_template,
        },
        content_type='html')

    class_ = subclass_content(
        class_,
        name,
        forward_methods,
        templates,
        class_dict,
    )

    handle_interfaces(_context, (for_, ))
    handle_interfaces(_context, allowed_interface)

    handle_security(class_, permission, allowed_interface, allowed_attributes)

    _context.action(
        discriminator=('view', for_, name, IBrowserRequest, layer),
        callable=zope.component.zcml.handler,
        args=('registerAdapter', class_, (for_, layer), Interface, name,
              _context.info),
    )