Example #1
0
    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
Example #2
0
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
Example #3
0
 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)