Beispiel #1
0
 def test_wiki_page_name_non_ascii(self):
     project = ProjectFactory(creator=self.user)
     non_ascii = to_mongo_key('WöRlÐé')
     project.update_node_wiki('WöRlÐé', 'new content', Auth(self.user))
     wv = project.get_wiki_version(non_ascii)
     assert wv.wiki_page.page_name.upper() == non_ascii.decode(
         'utf-8').upper()
Beispiel #2
0
    def rename(self, new_name, auth):
        """
        Rename the wiki page with the new_name. Logs this information to the wiki's node.

        :param new_name: A string, the new page's name, e.g. ``"My Renamed Page"``.
        :param auth: All the auth information including user, API key.
        """
        new_name = (new_name or '').strip()
        existing_wiki_page = WikiPage.objects.get_for_node(self.node, new_name)
        key = wiki_utils.to_mongo_key(self.page_name)
        new_key = wiki_utils.to_mongo_key(new_name)

        if key == 'home':
            raise PageCannotRenameError('Cannot rename wiki home page')
        if (existing_wiki_page and not existing_wiki_page.deleted and key != new_key) or new_key == 'home':
            raise PageConflictError(
                'Page already exists with name {0}'.format(
                    new_name,
                )
            )

        # rename the page first in case we hit a validation exception.
        old_name = self.page_name
        self.page_name = new_name

        # TODO: merge historical records like update (prevents log breaks)
        # transfer the old page versions/current keys to the new name.
        if key != new_key:
            if key in self.node.wiki_private_uuids:
                self.node.wiki_private_uuids[new_key] = self.node.wiki_private_uuids[key]
                del self.node.wiki_private_uuids[key]

        self.node.add_log(
            action=NodeLog.WIKI_RENAMED,
            params={
                'project': self.node.parent_id,
                'node': self.node._primary_key,
                'page': self.page_name,
                'page_id': self._primary_key,
                'old_page': old_name,
                'version': self.current_version_number,
            },
            auth=auth,
            save=True,
        )
        self.save()
        return self
 def test_wiki_page_name_non_ascii(self):
     project = ProjectFactory(creator=self.user)
     non_ascii = to_mongo_key('WöRlÐé')
     self.app.get('/{0}/wiki/{1}/'.format(project._primary_key, non_ascii),
                  auth=self.auth,
                  expect_errors=True)
     project.update_node_wiki(non_ascii, 'new content', Auth(self.user))
     assert_in(non_ascii, project.wiki_pages_current)
Beispiel #4
0
 def test_wiki_page_name_non_ascii(self):
     project = ProjectFactory(creator=self.user)
     non_ascii = to_mongo_key('WöRlÐé')
     self.app.get('/{0}/wiki/{1}/'.format(
         project._primary_key,
         non_ascii
     ), auth=self.auth, expect_errors=True)
     project.update_node_wiki(non_ascii, 'new content', Auth(self.user))
     assert_in(non_ascii, project.wiki_pages_current)
Beispiel #5
0
def project_wiki_validate_name(wname, auth, node, **kwargs):
    wiki_name = wname.strip()
    wiki_key = to_mongo_key(wiki_name)

    if wiki_key in node.wiki_pages_current or wiki_key == 'home':
        raise HTTPError(http.CONFLICT, data=dict(
            message_short='Wiki page name conflict.',
            message_long='A wiki page with that name already exists.'
        ))
    else:
        node.update_node_wiki(wiki_name, '', auth)
    return {'message': wiki_name}
Beispiel #6
0
def _get_wiki_versions(node, name, anonymous=False):
    key = to_mongo_key(name)

    # Skip if wiki_page doesn't exist; happens on new projects before
    # default "home" page is created
    if key not in node.wiki_pages_versions:
        return []

    versions = [
        NodeWikiPage.load(version_wiki_id)
        for version_wiki_id in node.wiki_pages_versions[key]
    ]

    return [
        {
            'version': version.version,
            'user_fullname': privacy_info_handle(version.user.fullname, anonymous, name=True),
            'date': '{} UTC'.format(version.date.replace(microsecond=0).isoformat().replace('T', ' ')),
        }
        for version in reversed(versions)
    ]
Beispiel #7
0
def project_wiki_view(auth, wname, path=None, **kwargs):
    node = kwargs['node'] or kwargs['project']
    anonymous = has_anonymous_link(node, auth)
    wiki_name = (wname or '').strip()
    wiki_key = to_mongo_key(wiki_name)
    wiki_page = node.get_wiki_page(wiki_name)
    wiki_version = node.get_wiki_version(wiki_name)
    wiki_settings = node.get_addon('wiki')
    can_edit = (auth.logged_in and not node.is_registration
                and (node.has_permission(auth.user, 'write')
                     or wiki_settings.is_publicly_editable))
    versions = _get_wiki_versions(node, wiki_name, anonymous=anonymous)

    # Determine panels used in view
    panels = {'view', 'edit', 'compare', 'menu'}
    if request.args and set(request.args).intersection(panels):
        panels_used = [panel for panel in request.args if panel in panels]
        num_columns = len(
            set(panels_used).intersection({'view', 'edit', 'compare'}))
        if num_columns == 0:
            panels_used.append('view')
            num_columns = 1
    else:
        panels_used = ['view', 'menu']
        num_columns = 1

    try:
        view = wiki_utils.format_wiki_version(
            version=request.args.get('view'),
            num_versions=len(versions),
            allow_preview=True,
        )
        compare = wiki_utils.format_wiki_version(
            version=request.args.get('compare'),
            num_versions=len(versions),
            allow_preview=False,
        )
    except InvalidVersionError:
        raise WIKI_INVALID_VERSION_ERROR

    # ensure home is always lower case since it cannot be renamed
    if wiki_name.lower() == 'home':
        wiki_name = 'home'

    if wiki_version:
        version = wiki_version.identifier
        is_current = wiki_version.is_current
        content = wiki_version.html(node)
        rendered_before_update = wiki_version.rendered_before_update
    else:
        version = 'NA'
        is_current = False
        content = ''
        rendered_before_update = False

    if can_edit:
        if wiki_key not in node.wiki_private_uuids:
            wiki_utils.generate_private_uuid(node, wiki_name)
        sharejs_uuid = wiki_utils.get_sharejs_uuid(node, wiki_name)
    else:
        if not wiki_page and wiki_key != 'home':
            raise WIKI_PAGE_NOT_FOUND_ERROR
        if 'edit' in request.args:
            if wiki_settings.is_publicly_editable:
                raise HTTPError(http.UNAUTHORIZED)
            if node.can_view(auth):
                return redirect(
                    node.web_url_for('project_wiki_view',
                                     wname=wname,
                                     _guid=True))
            raise HTTPError(http.FORBIDDEN)
        sharejs_uuid = None

    # Opens 'edit' panel when home wiki is empty
    if not content and can_edit and wiki_name == 'home':
        panels_used.append('edit')

    # Default versions for view and compare
    version_settings = {
        'view': view or ('preview' if 'edit' in panels_used else 'current'),
        'compare': compare or 'previous',
    }

    ret = {
        'wiki_id': wiki_page._primary_key if wiki_page else None,
        'wiki_name': wiki_page.page_name if wiki_page else wiki_name,
        'wiki_content': content,
        'rendered_before_update': rendered_before_update,
        'page': wiki_page,
        'version': version,
        'versions': versions,
        'sharejs_uuid': sharejs_uuid or '',
        'sharejs_url': settings.SHAREJS_URL,
        'is_current': is_current,
        'version_settings': version_settings,
        'pages_current': _get_wiki_pages_latest(node),
        'category': node.category,
        'panels_used': panels_used,
        'num_columns': num_columns,
        'urls': {
            'api':
            _get_wiki_api_urls(
                node, wiki_name, {
                    'content':
                    node.api_url_for('wiki_page_content', wname=wiki_name),
                    'draft':
                    node.api_url_for('wiki_page_draft', wname=wiki_name),
                }),
            'web':
            _get_wiki_web_urls(node, wiki_name),
            'profile_image':
            get_profile_image_url(auth.user, 25),
        },
    }
    ret.update(_view_project(node, auth, primary=True))
    ret['user']['can_edit_wiki_body'] = can_edit
    return ret
Beispiel #8
0
 def is_deleted(self):
     key = wiki_utils.to_mongo_key(self.page_name)
     return key not in self.node.wiki_pages_current
Beispiel #9
0
 def is_current(self):
     key = wiki_utils.to_mongo_key(self.page_name)
     if key in self.node.wiki_pages_current:
         return self.node.wiki_pages_current[key] == self._id
     else:
         return False
Beispiel #10
0
 def is_current(self):
     key = wiki_utils.to_mongo_key(self.page_name)
     if key in self.node.wiki_pages_current:
         return self.node.wiki_pages_current[key] == self._id
     else:
         return False
Beispiel #11
0
 def is_deleted(self):
     key = wiki_utils.to_mongo_key(self.page_name)
     return key not in self.node.wiki_pages_current
Beispiel #12
0
def project_wiki_view(auth, wname, path=None, **kwargs):
    node = kwargs['node'] or kwargs['project']
    anonymous = has_anonymous_link(node, auth)
    wiki_name = (wname or '').strip()
    wiki_key = to_mongo_key(wiki_name)
    wiki_page = WikiPage.objects.get_for_node(node, wiki_name)
    wiki_version = WikiVersion.objects.get_for_node(node, wiki_name)
    wiki_settings = node.get_addon('wiki')
    can_edit = (
        auth.logged_in and not
        node.is_registration and (
            node.has_permission(auth.user, 'write') or
            wiki_settings.is_publicly_editable
        )
    )
    versions = _get_wiki_versions(node, wiki_name, anonymous=anonymous)

    # Determine panels used in view
    panels = {'view', 'edit', 'compare', 'menu'}
    if request.args and set(request.args).intersection(panels):
        panels_used = [panel for panel in request.args if panel in panels]
        num_columns = len(set(panels_used).intersection({'view', 'edit', 'compare'}))
        if num_columns == 0:
            panels_used.append('view')
            num_columns = 1
    else:
        panels_used = ['view', 'menu']
        num_columns = 1

    try:
        view = wiki_utils.format_wiki_version(
            version=request.args.get('view'),
            num_versions=len(versions),
            allow_preview=True,
        )
        compare = wiki_utils.format_wiki_version(
            version=request.args.get('compare'),
            num_versions=len(versions),
            allow_preview=False,
        )
    except InvalidVersionError:
        raise WIKI_INVALID_VERSION_ERROR

    # ensure home is always lower case since it cannot be renamed
    if wiki_name.lower() == 'home':
        wiki_name = 'home'

    if wiki_version:
        version = wiki_version.identifier
        is_current = wiki_version.is_current
        content = wiki_version.html(node)
        rendered_before_update = wiki_version.rendered_before_update
    else:
        version = 'NA'
        is_current = False
        content = ''
        rendered_before_update = False

    if can_edit:
        if wiki_key not in node.wiki_private_uuids:
            wiki_utils.generate_private_uuid(node, wiki_name)
        sharejs_uuid = wiki_utils.get_sharejs_uuid(node, wiki_name)
    else:
        if not wiki_page and wiki_key != 'home':
            raise WIKI_PAGE_NOT_FOUND_ERROR
        if 'edit' in request.args:
            if wiki_settings.is_publicly_editable:
                raise HTTPError(http.UNAUTHORIZED)
            if node.can_view(auth):
                return redirect(node.web_url_for('project_wiki_view', wname=wname, _guid=True))
            raise HTTPError(http.FORBIDDEN)
        sharejs_uuid = None

    # Opens 'edit' panel when home wiki is empty
    if not content and can_edit and wiki_name == 'home':
        panels_used.append('edit')

    # Default versions for view and compare
    version_settings = {
        'view': view or ('preview' if 'edit' in panels_used else 'current'),
        'compare': compare or 'previous',
    }

    ret = {
        'wiki_id': wiki_page._primary_key if wiki_page else None,
        'wiki_name': wiki_page.page_name if wiki_page else wiki_name,
        'wiki_content': content,
        'rendered_before_update': rendered_before_update,
        'page': wiki_page,
        'version': version,
        'versions': versions,
        'sharejs_uuid': sharejs_uuid or '',
        'sharejs_url': settings.SHAREJS_URL,
        'is_current': is_current,
        'version_settings': version_settings,
        'pages_current': _get_wiki_pages_latest(node),
        'category': node.category,
        'panels_used': panels_used,
        'num_columns': num_columns,
        'urls': {
            'api': _get_wiki_api_urls(node, wiki_name, {
                'content': node.api_url_for('wiki_page_content', wname=wiki_name),
                'draft': node.api_url_for('wiki_page_draft', wname=wiki_name),
            }),
            'web': _get_wiki_web_urls(node, wiki_name),
            'profile_image': get_profile_image_url(auth.user, 25),
        },
    }
    ret.update(_view_project(node, auth, primary=True))
    ret['user']['can_edit_wiki_body'] = can_edit
    return ret
Beispiel #13
0
 def test_wiki_page_name_non_ascii(self):
     project = ProjectFactory(creator=self.user)
     non_ascii = to_mongo_key('WöRlÐé')
     project.update_node_wiki('WöRlÐé', 'new content', Auth(self.user))
     wv = project.get_wiki_version(non_ascii)
     assert wv.wiki_page.page_name.upper() == non_ascii.decode('utf-8').upper()
Beispiel #14
0
 def test_wiki_page_name_non_ascii(self):
     project = ProjectFactory(creator=self.user)
     non_ascii = to_mongo_key('WöRlÐé')
     WikiPage.objects.create_for_node(project, 'WöRlÐé', 'new content', Auth(self.user))
     wv = WikiVersion.objects.get_for_node(project, non_ascii)
     assert wv.wiki_page.page_name.upper() == non_ascii.decode('utf-8').upper()