コード例 #1
0
ファイル: views.py プロジェクト: kms6bn/osf.io
def addon_deleted_file(auth, node, **kwargs):
    """Shows a nice error message to users when they try to view
    a deleted file
    """
    # Allow file_node to be passed in so other views can delegate to this one
    trashed = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id'))
    if not trashed:
        raise HTTPError(httplib.NOT_FOUND, {
            'message_short': 'Not Found',
            'message_long': 'This file does not exist'
        })

    ret = serialize_node(node, auth, primary=True)
    ret.update(rubeus.collect_addon_assets(node))
    ret.update({
        'urls': {
            'render': None,
            'sharejs': None,
            'mfr': settings.MFR_SERVER_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'files': node.web_url_for('collect_file_trees'),
        },
        'extra': {},
        'size': 9966699,  # Prevent file from being editted, just in case
        'sharejs_uuid': None,
        'file_name': trashed.name,
        'file_path': trashed.path,
        'provider': trashed.provider,
        'materialized_path': trashed.materialized_path,
        'error': FILE_GONE_ERROR_MESSAGE.format(file_name=trashed.name),
        'private': getattr(node.get_addon(trashed.provider), 'is_private', False),
    })

    return ret, httplib.GONE
コード例 #2
0
ファイル: views.py プロジェクト: caspinelli/osf.io
def addon_view_file(auth, node, file_node, version):
    # TODO: resolve circular import issue
    from website.addons.wiki import settings as wiki_settings

    if isinstance(version, tuple):
        version, error = version
        error = error.replace('\n', '').strip()
    else:
        error = None

    ret = serialize_node(node, auth, primary=True)

    if file_node._id + '-' + version._id not in node.file_guid_to_share_uuids:
        node.file_guid_to_share_uuids[file_node._id + '-' + version._id] = uuid.uuid4()
        node.save()

    if ret['user']['can_edit']:
        sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id + '-' + version._id])
    else:
        sharejs_uuid = None

    download_url = furl.furl(request.url.encode('utf-8')).set(args=dict(request.args, **{
        'direct': None,
        'mode': 'render',
        'action': 'download',
    }))

    render_url = furl.furl(settings.MFR_SERVER_URL).set(
        path=['render'],
        args={'url': download_url.url}
    )

    ret.update({
        'urls': {
            'render': render_url.url,
            'mfr': settings.MFR_SERVER_URL,
            'sharejs': wiki_settings.SHAREJS_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'files': node.web_url_for('collect_file_trees'),
            'archived_from': get_archived_from_url(node, file_node) if node.is_registration else None,
        },
        'error': error,
        'file_name': file_node.name,
        'file_name_title': os.path.splitext(file_node.name)[0],
        'file_name_ext': os.path.splitext(file_node.name)[1],
        'file_path': file_node.path,
        'sharejs_uuid': sharejs_uuid,
        'provider': file_node.provider,
        'materialized_path': file_node.materialized_path,
        'extra': version.metadata.get('extra', {}),
        'size': version.size if version.size is not None else 9966699,
        'private': getattr(node.get_addon(file_node.provider), 'is_private', False),
        'file_tags': [tag._id for tag in file_node.tags],
        'file_guid': file_node.get_guid()._id,
        'file_id': file_node._id,
        'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE
    })

    ret.update(rubeus.collect_addon_assets(node))
    return ret
コード例 #3
0
ファイル: views.py プロジェクト: mattspitzer/osf.io
def addon_deleted_file(auth, node, **kwargs):
    """Shows a nice error message to users when they try to view
    a deleted file
    """
    # Allow file_node to be passed in so other views can delegate to this one
    trashed = kwargs.get("file_node") or TrashedFileNode.load(kwargs.get("trashed_id"))
    if not trashed:
        raise HTTPError(httplib.NOT_FOUND, {"message_short": "Not Found", "message_long": "This file does not exist"})

    ret = serialize_node(node, auth, primary=True)
    ret.update(rubeus.collect_addon_assets(node))
    ret.update(
        {
            "urls": {
                "render": None,
                "sharejs": None,
                "mfr": settings.MFR_SERVER_URL,
                "gravatar": get_gravatar(auth.user, 25),
                "files": node.web_url_for("collect_file_trees"),
            },
            "extra": {},
            "size": 9966699,  # Prevent file from being editted, just in case
            "sharejs_uuid": None,
            "file_name": trashed.name,
            "file_path": trashed.path,
            "provider": trashed.provider,
            "materialized_path": trashed.materialized_path,
            "error": FILE_GONE_ERROR_MESSAGE.format(file_name=trashed.name),
            "private": getattr(node.get_addon(trashed.provider), "is_private", False),
        }
    )

    return ret, httplib.GONE
コード例 #4
0
ファイル: views.py プロジェクト: mattspitzer/osf.io
def addon_deleted_file(auth, node, **kwargs):
    """Shows a nice error message to users when they try to view
    a deleted file
    """
    # Allow file_node to be passed in so other views can delegate to this one
    trashed = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id'))
    if not trashed:
        raise HTTPError(httplib.NOT_FOUND, {
            'message_short': 'Not Found',
            'message_long': 'This file does not exist'
        })

    ret = serialize_node(node, auth, primary=True)
    ret.update(rubeus.collect_addon_assets(node))
    ret.update({
        'urls': {
            'render': None,
            'sharejs': None,
            'mfr': settings.MFR_SERVER_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'files': node.web_url_for('collect_file_trees'),
        },
        'extra': {},
        'size': 9966699,  # Prevent file from being editted, just in case
        'sharejs_uuid': None,
        'file_name': trashed.name,
        'file_path': trashed.path,
        'provider': trashed.provider,
        'materialized_path': trashed.materialized_path,
        'error': FILE_GONE_ERROR_MESSAGE.format(file_name=trashed.name),
        'private': getattr(node.get_addon(trashed.provider), 'is_private', False),
    })

    return ret, httplib.GONE
コード例 #5
0
ファイル: views.py プロジェクト: mattspitzer/osf.io
def addon_view_file(auth, node, file_node, version):
    # TODO: resolve circular import issue
    from website.addons.wiki import settings as wiki_settings

    if isinstance(version, tuple):
        version, error = version
        error = error.replace('\n', '').strip()
    else:
        error = None

    ret = serialize_node(node, auth, primary=True)

    if file_node._id not in node.file_guid_to_share_uuids:
        node.file_guid_to_share_uuids[file_node._id] = uuid.uuid4()
        node.save()

    if ret['user']['can_edit']:
        sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id])
    else:
        sharejs_uuid = None

    download_url = furl.furl(request.url.encode('utf-8')).set(args=dict(request.args, **{
        'direct': None,
        'mode': 'render',
        'action': 'download',
    }))

    render_url = furl.furl(settings.MFR_SERVER_URL).set(
        path=['render'],
        args={'url': download_url.url}
    )

    ret.update({
        'urls': {
            'render': render_url.url,
            'mfr': settings.MFR_SERVER_URL,
            'sharejs': wiki_settings.SHAREJS_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'files': node.web_url_for('collect_file_trees'),
        },
        'error': error,
        'file_name': file_node.name,
        'file_name_title': os.path.splitext(file_node.name)[0],
        'file_name_ext': os.path.splitext(file_node.name)[1],
        'file_path': file_node.path,
        'sharejs_uuid': sharejs_uuid,
        'provider': file_node.provider,
        'materialized_path': file_node.materialized_path,
        'extra': version.metadata.get('extra', {}),
        'size': version.size if version.size is not None else 9966699,
        'private': getattr(node.get_addon(file_node.provider), 'is_private', False),
        'file_tags': [tag._id for tag in file_node.tags],
    })

    ret.update(rubeus.collect_addon_assets(node))
    return ret
コード例 #6
0
ファイル: views.py プロジェクト: jlcohoon/osf.io
def addon_view_file(auth, node, node_addon, guid_file, extras):
    # TODO: resolve circular import issue
    from website.addons.wiki import settings as wiki_settings

    ret = serialize_node(node, auth, primary=True)

    # Disable OSF Storage file deletion in DISK_SAVING_MODE
    if settings.DISK_SAVING_MODE and node_addon.config.short_name == 'osfstorage':
        ret['user']['can_edit'] = False

    try:
        guid_file.enrich()
    except exceptions.AddonEnrichmentError as e:
        error = e.as_html()
    else:
        error = None

    if guid_file._id not in node.file_guid_to_share_uuids:
        node.file_guid_to_share_uuids[guid_file._id] = uuid.uuid4()
        node.save()

    if ret['user']['can_edit']:
        sharejs_uuid = str(node.file_guid_to_share_uuids[guid_file._id])
    else:
        sharejs_uuid = None

    size = getattr(guid_file, 'size', None)
    if size is None:  # Size could be 0 which is a falsey value
        size = 9966699  # if we dont know the size assume its to big to edit

    ret.update({
        'error': error.replace('\n', '') if error else None,
        'provider': guid_file.provider,
        'file_path': guid_file.waterbutler_path,
        'panels_used': ['edit', 'view'],
        'private': getattr(node_addon, 'is_private', False),
        'sharejs_uuid': sharejs_uuid,
        'urls': {
            'files': node.web_url_for('collect_file_trees'),
            'render': guid_file.mfr_render_url,
            'sharejs': wiki_settings.SHAREJS_URL,
            'mfr': settings.MFR_SERVER_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'external': getattr(guid_file, 'external_url', None)
        },
        # Note: must be called after get_or_start_render. This is really only for github
        'size': size,
        'extra': getattr(guid_file, 'extra', {}),
        #NOTE: get_or_start_render must be called first to populate name
        'file_name': getattr(guid_file, 'name', os.path.split(guid_file.waterbutler_path)[1]),
        'materialized_path': getattr(guid_file, 'materialized', guid_file.waterbutler_path),
    })

    ret.update(rubeus.collect_addon_assets(node))
    return ret
コード例 #7
0
ファイル: views.py プロジェクト: XTech2K/osf.io
def addon_view_file(auth, node, node_addon, guid_file, extras):
    # TODO: resolve circular import issue
    from website.addons.wiki import settings as wiki_settings

    ret = serialize_node(node, auth, primary=True)

    # Disable OSF Storage file deletion in DISK_SAVING_MODE
    if settings.DISK_SAVING_MODE and node_addon.config.short_name == 'osfstorage':
        ret['user']['can_edit'] = False

    try:
        guid_file.enrich()
    except exceptions.AddonEnrichmentError as e:
        error = e.as_html()
    else:
        error = None

    if guid_file._id not in node.file_guid_to_share_uuids:
        node.file_guid_to_share_uuids[guid_file._id] = uuid.uuid4()
        node.save()

    if ret['user']['can_edit']:
        sharejs_uuid = str(node.file_guid_to_share_uuids[guid_file._id])
    else:
        sharejs_uuid = None

    size = getattr(guid_file, 'size', None)
    if size is None:  # Size could be 0 which is a falsey value
        size = 9966699  # if we dont know the size assume its to big to edit

    ret.update({
        'error': error.replace('\n', '') if error else None,
        'provider': guid_file.provider,
        'file_path': guid_file.waterbutler_path,
        'panels_used': ['edit', 'view'],
        'private': getattr(node_addon, 'is_private', False),
        'sharejs_uuid': sharejs_uuid,
        'urls': {
            'files': node.web_url_for('collect_file_trees'),
            'render': guid_file.mfr_render_url,
            'sharejs': wiki_settings.SHAREJS_URL,
            'mfr': settings.MFR_SERVER_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'external': getattr(guid_file, 'external_url', None)
        },
        # Note: must be called after get_or_start_render. This is really only for github
        'size': size,
        'extra': getattr(guid_file, 'extra', {}),
        #NOTE: get_or_start_render must be called first to populate name
        'file_name': getattr(guid_file, 'name', os.path.split(guid_file.waterbutler_path)[1]),
        'materialized_path': getattr(guid_file, 'materialized', guid_file.waterbutler_path),
    })

    ret.update(rubeus.collect_addon_assets(node))
    return ret
コード例 #8
0
ファイル: views.py プロジェクト: mattspitzer/osf.io
def addon_view_file(auth, node, file_node, version):
    # TODO: resolve circular import issue
    from website.addons.wiki import settings as wiki_settings

    if isinstance(version, tuple):
        version, error = version
        error = error.replace("\n", "").strip()
    else:
        error = None

    ret = serialize_node(node, auth, primary=True)

    if file_node._id not in node.file_guid_to_share_uuids:
        node.file_guid_to_share_uuids[file_node._id] = uuid.uuid4()
        node.save()

    if ret["user"]["can_edit"]:
        sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id])
    else:
        sharejs_uuid = None

    download_url = furl.furl(request.url.encode("utf-8")).set(
        args=dict(request.args, **{"direct": None, "mode": "render", "action": "download"})
    )

    render_url = furl.furl(settings.MFR_SERVER_URL).set(path=["render"], args={"url": download_url.url})

    ret.update(
        {
            "urls": {
                "render": render_url.url,
                "mfr": settings.MFR_SERVER_URL,
                "sharejs": wiki_settings.SHAREJS_URL,
                "gravatar": get_gravatar(auth.user, 25),
                "files": node.web_url_for("collect_file_trees"),
            },
            "error": error,
            "file_name": file_node.name,
            "file_name_title": os.path.splitext(file_node.name)[0],
            "file_name_ext": os.path.splitext(file_node.name)[1],
            "file_path": file_node.path,
            "sharejs_uuid": sharejs_uuid,
            "provider": file_node.provider,
            "materialized_path": file_node.materialized_path,
            "extra": version.metadata.get("extra", {}),
            "size": version.size if version.size is not None else 9966699,
            "private": getattr(node.get_addon(file_node.provider), "is_private", False),
            "file_tags": [tag._id for tag in file_node.tags],
        }
    )

    ret.update(rubeus.collect_addon_assets(node))
    return ret
コード例 #9
0
ファイル: views.py プロジェクト: 545zhou/osf.io
def addon_deleted_file(auth, node, **kwargs):
    """Shows a nice error message to users when they try to view
    a deleted file
    """
    # Allow file_node to be passed in so other views can delegate to this one
    trashed = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id'))
    if not trashed:
        raise HTTPError(httplib.NOT_FOUND, {
            'message_short': 'Not Found',
            'message_long': 'This file does not exist'
        })

    ret = serialize_node(node, auth, primary=True)
    ret.update(rubeus.collect_addon_assets(node))

    error_template = FILE_SUSPENDED_ERROR_MESSAGE if getattr(trashed, 'suspended', False) else FILE_GONE_ERROR_MESSAGE
    error = error_template.format(file_name=trashed.name)
    ret.update({
        'urls': {
            'render': None,
            'sharejs': None,
            'mfr': settings.MFR_SERVER_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'files': node.web_url_for('collect_file_trees'),
        },
        'extra': {},
        'size': 9966699,  # Prevent file from being editted, just in case
        'sharejs_uuid': None,
        'file_name': trashed.name,
        'file_path': trashed.path,
        'provider': trashed.provider,
        'materialized_path': trashed.materialized_path,
        'error': error,
        'private': getattr(node.get_addon(trashed.provider), 'is_private', False),

        'file_id': trashed._id,
        # For the off chance that there is no GUID
        'file_guid': getattr(trashed.get_guid(create=False), '_id', None),
        'file_tags': [tag._id for tag in trashed.tags],
        'file_name_ext': os.path.splitext(trashed.name)[1],
        'file_name_title': os.path.splitext(trashed.name)[0],
        'allow_comments': trashed.provider in settings.ADDONS_COMMENTABLE,
    })

    return ret, httplib.GONE
コード例 #10
0
ファイル: views.py プロジェクト: cwisecarver/osf.io
def get_gravatar(uid, size=None):
    return {"gravatar_url": profile_utils.get_gravatar(User.load(uid), size=size)}
コード例 #11
0
ファイル: views.py プロジェクト: BRosenblatt/osf.io
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_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_page:
        version = wiki_page.version
        is_current = wiki_page.is_current
        content = wiki_page.html(node)
        rendered_before_update = wiki_page.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 wiki_key not in node.wiki_pages_current 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)
            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_current(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),
            'gravatar': get_gravatar(auth.user, 25),
        },
    }
    ret.update(_view_project(node, auth, primary=True))
    ret['user']['can_edit_wiki_body'] = can_edit
    return ret
コード例 #12
0
def get_gravatar(uid, size=None):
    return {
        'gravatar_url': profile_utils.get_gravatar(User.load(uid), size=size)
    }
コード例 #13
0
ファイル: views.py プロジェクト: baylee-d/osf.io
def addon_deleted_file(auth, node, error_type='BLAME_PROVIDER', **kwargs):
    """Shows a nice error message to users when they try to view a deleted file
    """
    # Allow file_node to be passed in so other views can delegate to this one
    file_node = kwargs.get('file_node') or TrashedFileNode.load(kwargs.get('trashed_id'))

    deleted_by, deleted_on = None, None
    if isinstance(file_node, TrashedFileNode):
        deleted_by = file_node.deleted_by
        deleted_by_guid = file_node.deleted_by._id if deleted_by else None
        deleted_on = file_node.deleted_on.strftime('%c') + ' UTC'
        if file_node.suspended:
            error_type = 'FILE_SUSPENDED'
        elif file_node.deleted_by is None:
            if file_node.provider == 'osfstorage':
                error_type = 'FILE_GONE_ACTOR_UNKNOWN'
            else:
                error_type = 'BLAME_PROVIDER'
        else:
            error_type = 'FILE_GONE'
    else:
        error_type = 'DONT_KNOW'

    file_path = kwargs.get('path', file_node.path)
    file_name = file_node.name or os.path.basename(file_path)
    file_name_title, file_name_ext = os.path.splitext(file_name)
    provider_full = settings.ADDONS_AVAILABLE_DICT[file_node.provider].full_name
    try:
        file_guid = file_node.get_guid()._id
    except AttributeError:
        file_guid = None

    format_params = dict(
        file_name=markupsafe.escape(file_name),
        deleted_by=markupsafe.escape(deleted_by),
        deleted_on=markupsafe.escape(deleted_on),
        provider=markupsafe.escape(provider_full)
    )
    if deleted_by:
        format_params['deleted_by_guid'] = markupsafe.escape(deleted_by_guid)

    ret = serialize_node(node, auth, primary=True)
    ret.update(rubeus.collect_addon_assets(node))
    ret.update({
        'error': ERROR_MESSAGES[error_type].format(**format_params),
        'urls': {
            'render': None,
            'sharejs': None,
            'mfr': settings.MFR_SERVER_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'files': node.web_url_for('collect_file_trees'),
        },
        'extra': {},
        'size': 9966699,  # Prevent file from being edited, just in case
        'sharejs_uuid': None,
        'file_name': file_name,
        'file_path': file_path,
        'file_name_title': file_name_title,
        'file_name_ext': file_name_ext,
        'version_id': None,
        'file_guid': file_guid,
        'file_id': file_node._id,
        'provider': file_node.provider,
        'materialized_path': file_node.materialized_path or file_path,
        'private': getattr(node.get_addon(file_node.provider), 'is_private', False),
        'file_tags': [tag._id for tag in file_node.tags],
        'allow_comments': file_node.provider in settings.ADDONS_COMMENTABLE,
    })

    return ret, httplib.GONE
コード例 #14
0
ファイル: views.py プロジェクト: rdhyee/osf.io
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_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

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

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

    if wiki_page:
        version = wiki_page.version
        is_current = wiki_page.is_current
        content = wiki_page.html(node)
        use_python_render = wiki_page.rendered_before_update
    else:
        version = "NA"
        is_current = False
        content = ""
        use_python_render = 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 wiki_key not in node.wiki_pages_current 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)
            raise HTTPError(http.FORBIDDEN)
        sharejs_uuid = None

    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,
        "use_python_render": use_python_render,
        "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_current(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),
            "gravatar": get_gravatar(auth.user, 25),
        },
    }
    ret.update(_view_project(node, auth, primary=True))
    ret["user"]["can_edit_wiki_body"] = can_edit
    return ret
コード例 #15
0
ファイル: views.py プロジェクト: erichilarysmithsr/osf.io
def addon_view_file(auth, node, file_node, version):
    # TODO: resolve circular import issue
    from addons.wiki import settings as wiki_settings

    if isinstance(version, tuple):
        version, error = version
        error = error.replace('\n', '').strip()
    else:
        error = None

    ret = serialize_node(node, auth, primary=True)

    if file_node._id + '-' + version._id not in node.file_guid_to_share_uuids:
        node.file_guid_to_share_uuids[file_node._id + '-' +
                                      version._id] = uuid.uuid4()
        node.save()

    if ret['user']['can_edit']:
        sharejs_uuid = str(node.file_guid_to_share_uuids[file_node._id + '-' +
                                                         version._id])
    else:
        sharejs_uuid = None

    internal_furl = furl.furl(settings.INTERNAL_DOMAIN)
    download_url = furl.furl(request.url.encode('utf-8')).set(
        netloc=internal_furl.netloc,
        args=dict(request.args, **{
            'direct': None,
            'mode': 'render',
            'action': 'download',
        }))

    render_url = furl.furl(settings.MFR_SERVER_URL).set(
        path=['render'], args={'url': download_url.url})

    ret.update({
        'urls': {
            'render':
            render_url.url,
            'mfr':
            settings.MFR_SERVER_URL,
            'sharejs':
            wiki_settings.SHAREJS_URL,
            'gravatar':
            get_gravatar(auth.user, 25),
            'files':
            node.web_url_for('collect_file_trees'),
            'archived_from':
            get_archived_from_url(node, file_node)
            if node.is_registration else None,
        },
        'error':
        error,
        'file_name':
        file_node.name,
        'file_name_title':
        os.path.splitext(file_node.name)[0],
        'file_name_ext':
        os.path.splitext(file_node.name)[1],
        'version_id':
        version.identifier,
        'file_path':
        file_node.path,
        'sharejs_uuid':
        sharejs_uuid,
        'provider':
        file_node.provider,
        'materialized_path':
        file_node.materialized_path,
        'extra':
        version.metadata.get('extra', {}),
        'size':
        version.size if version.size is not None else 9966699,
        'private':
        getattr(node.get_addon(file_node.provider), 'is_private', False),
        'file_tags':
        list(
            file_node.tags.filter(system=False).values_list('name', flat=True))
        if not file_node._state.adding else
        [],  # Only access ManyRelatedManager if saved
        'file_guid':
        file_node.get_guid()._id,
        'file_id':
        file_node._id,
        'allow_comments':
        file_node.provider in settings.ADDONS_COMMENTABLE,
        'checkout_user':
        file_node.checkout._id if file_node.checkout else None,
        'pre_reg_checkout':
        is_pre_reg_checkout(node, file_node),
    })

    ret.update(rubeus.collect_addon_assets(node))
    return ret
コード例 #16
0
ファイル: routes.py プロジェクト: adlius/osf.io
def get_globals():
    """Context variables that are available for every template rendered by
    OSFWebRenderer.
    """
    user = _get_current_user()
    user_institutions = [{'id': inst._id, 'name': inst.name, 'logo_path': inst.logo_path_rounded_corners} for inst in user.affiliated_institutions.all()] if user else []
    location = geolite2.lookup(request.remote_addr) if request.remote_addr else None
    if request.host_url != settings.DOMAIN:
        try:
            inst_id = (Institution.find_one(Q('domains', 'eq', request.host.lower())))._id
            request_login_url = '{}institutions/{}'.format(settings.DOMAIN, inst_id)
        except NoResultsFound:
            request_login_url = request.url.replace(request.host_url, settings.DOMAIN)
    else:
        request_login_url = request.url
    return {
        'private_link_anonymous': is_private_link_anonymous_view(),
        'user_name': user.username if user else '',
        'user_full_name': user.fullname if user else '',
        'user_id': user._id if user else '',
        'user_locale': user.locale if user and user.locale else '',
        'user_timezone': user.timezone if user and user.timezone else '',
        'user_url': user.url if user else '',
        'user_gravatar': get_gravatar(user=user, size=25) if user else '',
        'user_email_verifications': user.unconfirmed_email_info if user else [],
        'user_api_url': user.api_url if user else '',
        'user_entry_point': metrics.get_entry_point(user) if user else '',
        'user_institutions': user_institutions if user else None,
        'display_name': get_display_name(user.fullname) if user else '',
        'anon': {
            'continent': getattr(location, 'continent', None),
            'country': getattr(location, 'country', None),
        },
        'use_cdn': settings.USE_CDN_FOR_CLIENT_LIBS,
        'sentry_dsn_js': settings.SENTRY_DSN_JS if sentry.enabled else None,
        'dev_mode': settings.DEV_MODE,
        'allow_login': settings.ALLOW_LOGIN,
        'cookie_name': settings.COOKIE_NAME,
        'status': status.pop_status_messages(),
        'prev_status': status.pop_previous_status_messages(),
        'domain': settings.DOMAIN,
        'api_domain': settings.API_DOMAIN,
        'disk_saving_mode': settings.DISK_SAVING_MODE,
        'language': language,
        'noteworthy_links_node': settings.NEW_AND_NOTEWORTHY_LINKS_NODE,
        'popular_links_node': settings.POPULAR_LINKS_NODE,
        'web_url_for': util.web_url_for,
        'api_url_for': util.api_url_for,
        'api_v2_url': util.api_v2_url,  # URL function for templates
        'api_v2_base': util.api_v2_url(''),  # Base url used by JS api helper
        'sanitize': sanitize,
        'sjson': lambda s: sanitize.safe_json(s),
        'webpack_asset': paths.webpack_asset,
        'waterbutler_url': settings.WATERBUTLER_URL,
        'login_url': cas.get_login_url(request_login_url),
        'reauth_url': util.web_url_for('auth_logout', redirect_url=request.url, reauth=True),
        'profile_url': cas.get_profile_url(),
        'enable_institutions': settings.ENABLE_INSTITUTIONS,
        'keen': {
            'public': {
                'project_id': settings.KEEN['public']['project_id'],
                'write_key': settings.KEEN['public']['write_key'],
            },
            'private': {
                'project_id': settings.KEEN['private']['project_id'],
                'write_key': settings.KEEN['private']['write_key'],
            },
        },
        'maintenance': maintenance.get_maintenance(),
        'recaptcha_site_key': settings.RECAPTCHA_SITE_KEY,
        'custom_citations': settings.CUSTOM_CITATIONS
    }
コード例 #17
0
ファイル: test_utils.py プロジェクト: adlius/osf.io
 def test_get_other_user_gravatar_default_size(self):
     gravitar = profile_utils.get_gravatar(self.user)
     assert_true(gravitar)
コード例 #18
0
 def test_get_other_user_gravatar_specific_size(self):
     gravitar = profile_utils.get_gravatar(self.user, size=25)
     assert_true(gravitar)
コード例 #19
0
 def test_get_other_user_gravatar_default_size(self):
     gravitar = profile_utils.get_gravatar(self.user)
     assert_true(gravitar)
コード例 #20
0
ファイル: test_utils.py プロジェクト: adlius/osf.io
 def test_get_other_user_gravatar_specific_size(self):
     gravitar = profile_utils.get_gravatar(self.user, size=25)
     assert_true(gravitar)
コード例 #21
0
ファイル: views.py プロジェクト: 545zhou/osf.io
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_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

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

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

    if wiki_page:
        version = wiki_page.version
        is_current = wiki_page.is_current
        content = wiki_page.html(node)
        use_python_render = wiki_page.rendered_before_update
    else:
        version = 'NA'
        is_current = False
        content = ''
        use_python_render = 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 wiki_key not in node.wiki_pages_current 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)
            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')

    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,
        'use_python_render': use_python_render,
        '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_current(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),
            'gravatar': get_gravatar(auth.user, 25),
        },
    }
    ret.update(_view_project(node, auth, primary=True))
    ret['user']['can_edit_wiki_body'] = can_edit
    return ret
コード例 #22
0
ファイル: views.py プロジェクト: erichilarysmithsr/osf.io
def addon_deleted_file(auth, node, error_type='BLAME_PROVIDER', **kwargs):
    """Shows a nice error message to users when they try to view a deleted file
    """
    # Allow file_node to be passed in so other views can delegate to this one
    file_node = kwargs.get('file_node') or TrashedFileNode.load(
        kwargs.get('trashed_id'))

    deleted_by, deleted_on = None, None
    if isinstance(file_node, TrashedFileNode):
        deleted_by = file_node.deleted_by
        deleted_by_guid = file_node.deleted_by._id if deleted_by else None
        deleted_on = file_node.deleted_on.strftime('%c') + ' UTC'
        if file_node.suspended:
            error_type = 'FILE_SUSPENDED'
        elif file_node.deleted_by is None:
            if file_node.provider == 'osfstorage':
                error_type = 'FILE_GONE_ACTOR_UNKNOWN'
            else:
                error_type = 'BLAME_PROVIDER'
        else:
            error_type = 'FILE_GONE'
    else:
        error_type = 'DONT_KNOW'

    file_path = kwargs.get('path', file_node.path)
    file_name = file_node.name or os.path.basename(file_path)
    file_name_title, file_name_ext = os.path.splitext(file_name)
    provider_full = settings.ADDONS_AVAILABLE_DICT[
        file_node.provider].full_name
    try:
        file_guid = file_node.get_guid()._id
    except AttributeError:
        file_guid = None

    format_params = dict(file_name=markupsafe.escape(file_name),
                         deleted_by=markupsafe.escape(
                             getattr(deleted_by, 'fullname', None)),
                         deleted_on=markupsafe.escape(deleted_on),
                         provider=markupsafe.escape(provider_full))
    if deleted_by:
        format_params['deleted_by_guid'] = markupsafe.escape(deleted_by_guid)

    ret = serialize_node(node, auth, primary=True)
    ret.update(rubeus.collect_addon_assets(node))
    ret.update({
        'error':
        ERROR_MESSAGES[error_type].format(**format_params),
        'urls': {
            'render': None,
            'sharejs': None,
            'mfr': settings.MFR_SERVER_URL,
            'gravatar': get_gravatar(auth.user, 25),
            'files': node.web_url_for('collect_file_trees'),
        },
        'extra': {},
        'size':
        9966699,  # Prevent file from being edited, just in case
        'sharejs_uuid':
        None,
        'file_name':
        file_name,
        'file_path':
        file_path,
        'file_name_title':
        file_name_title,
        'file_name_ext':
        file_name_ext,
        'version_id':
        None,
        'file_guid':
        file_guid,
        'file_id':
        file_node._id,
        'provider':
        file_node.provider,
        'materialized_path':
        file_node.materialized_path or file_path,
        'private':
        getattr(node.get_addon(file_node.provider), 'is_private', False),
        'file_tags':
        list(
            file_node.tags.filter(system=False).values_list('name', flat=True))
        if not file_node._state.adding else
        [],  # Only access ManyRelatedManager if saved
        'allow_comments':
        file_node.provider in settings.ADDONS_COMMENTABLE,
    })

    return ret, httplib.GONE