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')
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")
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
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)
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
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
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)
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
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)
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
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
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)
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)
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)
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 )
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
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
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
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
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
def test_default_views(self): view = self.occ_traverser_1.publishTraverse(self.request, 'event_view') self.assertTrue(IBrowserView.providedBy(view))
def test_default_views(self): view = self.at_traverser.publishTraverse( self.layer['request'], 'event_view') self.assertTrue(IBrowserView.providedBy(view))
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), )
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)
def test_default_views(self): view = self.traverser.publishTraverse(self.request, 'event_view') self.assertTrue(IBrowserView.providedBy(view))
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), )