def search(self): response = self._response.copy() try: url = urlparse(self.request.params['url']) path = url.path if path.startswith('/admin'): path = path.replace('/admin', '', 1) if path.endswith('.html'): path = path.replace('.html', '', 1) pageinfo = PageInfo.get_by_url(self.session, path) self.log.debug('Found %s using %s', pageinfo, path) pageinfo = pageinfo.dictify(excludes=('__class__', 'meta_description', 'title', 'head_content', '_parent_url', 'label', 'content', 'url_part', 'discriminator')) except KeyError as e: self.log.exception('Not URL param in the request.') self.session.rollback() self.request.response.status = 400 response['msg'] = self.request.translate("Missing parameter: 'url'.") except NoResultFound as e: self.log.exception('No PageInfo: %s.', path) self.session.rollback() self.request.response.status = 404 response['msg'] = self.request.translate("No PageInfo found.") except Exception as e: self.log.exception('Uknown error.') self.session.rollback() self.request.response.status = 500 response['msg'] = str(e) else: self.session.commit() response['success'] = True response['dataset'] = [pageinfo] response['dataset_length'] = len(response['dataset']) response['msg'] = self.request.translate("PageInfo found.") finally: return response
def get_root_resource(request): path_info = request.path_info log.debug('get_root_resource: %s', path_info) # Getting url_parts and for each part associating a Resource # On request.path_info applying strip('/') remove the initial / so # with the following split('/') we obtain a list just with parts url_parts = [UrlPart(part=url_part, resource=Resource()) for url_part in path_info.strip('/').split('/') if url_part] log.debug('url_parts: %s', url_parts) if not url_parts: # URL is '/'. log.debug('Return NoLanguage context.') return NoLanguage() need_auth = False if url_parts[0].part == 'admin': log.debug("Admin Panel Request: removing admin.") url_parts = url_parts[1:] path_info = path_info.replace('/admin', '') need_auth = True language = Language.get_by_lang(request.db_session, url_parts[0].part) if language is None: # language not found, return a 404 log.debug("No language found.") raise HTTPNotFound() else: request.language = language if len(url_parts) == 1: # URL is like '/{lang}'. log.debug('Get Context by Language %s.', url_parts[0].part) url_parts[0] = UrlPart(part=url_parts[0].part, resource=request.language) else: # URL is like '/{lang}/{node}/[...]/{page}[.ext] # Get the NodeInfo from database using path_info. log.debug('Get Context by NodeInfo %s.', path_info) try: # Remove '.ext' from the url. url_parts[-1] = url_parts[-1].part resource = PageInfo.get_by_url(request.db_session, path_info.rsplit('.', 1)[0]) url_parts[-1] = UrlPart(part=url_parts[-1], resource=resource) except NoResultFound: raise HTTPNotFound() else: log.debug('Found: %s', url_parts[-1]) log.debug('UrlParts: %s', url_parts) # Create the resources tree. # The last element in resources tree is the request context. tmp = root = Resource() parent = None acl = [(Allow, Everyone, ALL_PERMISSIONS)] if need_auth: acl = Authenticated.__acl__ for url_part, resource in url_parts: log.debug('Urlpart: %s, Resource: %s', url_part, resource) resource.__parent__ = parent resource.__acl__ = acl parent = resource tmp[url_part] = resource tmp = tmp[url_part] log.debug("Resource: %s, acl: %s, parent: %s", resource, resource.__acl__, resource.__parent__) log.debug(root) return root
def test_get_by_url(self): self.populate(self.session) url = u'/it/index' self.assertEqual(PageInfo.get_by_url(self.session, url).url, url) url = u'/en/index' self.assertEqual(PageInfo.get_by_url(self.session, url).url, url)