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
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
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
def addon_view_file(auth, node, node_addon, file_guid, extras): render_url = node.api_url_for( 'addon_render_file', path=file_guid.waterbutler_path.lstrip('/'), provider=file_guid.provider, render=True, **extras ) 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 ret.update({ 'provider': file_guid.provider, 'render_url': render_url, 'file_path': file_guid.waterbutler_path, 'files_url': node.web_url_for('collect_file_trees'), 'rendered': get_or_start_render(file_guid), # Note: must be called after get_or_start_render. This is really only for github 'extra': json.dumps(getattr(file_guid, 'extra', {})), #NOTE: get_or_start_render must be called first to populate name 'file_name': getattr(file_guid, 'name', os.path.split(file_guid.waterbutler_path)[1]), }) ret.update(rubeus.collect_addon_assets(node)) return ret
def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update( { "error": "", "provider": "", "file_path": "", "sharejs_uuid": "", "private": "", "urls": { "files": "", "render": "", "sharejs": "", "mfr": "", "gravatar": "", "external": "", "archived_from": "", }, "size": "", "extra": "", "file_name": "", "materialized_path": "", "file_id": "", } ) ret.update(rubeus.collect_addon_assets(self.project)) return ret
def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'error': '', 'provider': '', 'file_path': '', 'sharejs_uuid': '', 'private': '', 'urls': { 'files': '', 'render': '', 'sharejs': '', 'mfr': '', 'profile_image': '', 'external': '', 'archived_from': '', }, 'size': '', 'extra': '', 'file_name': '', 'materialized_path': '', 'file_id': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret
def collect_file_trees(auth, node, **kwargs): """Collect file trees for all add-ons implementing HGrid views, then format data as appropriate. """ serialized = _view_project(node, auth, primary=True) # Add addon static assets serialized.update(rubeus.collect_addon_assets(node)) return serialized
def view_project(auth, node, **kwargs): primary = "/api/v1" not in request.path ret = _view_project(node, auth, primary=primary) ret["addon_capabilities"] = settings.ADDON_CAPABILITIES # Collect the URIs to the static assets for addons that have widgets ret["addon_widget_js"] = list(collect_addon_js(node, filename="widget-cfg.js", config_entry="widget")) ret.update(rubeus.collect_addon_assets(node)) return ret
def collect_timestamp_trees_to_json(auth, node, **kwargs): # admin call project to provider file list serialized = _view_project(node, auth, primary=True) serialized.update(rubeus.collect_addon_assets(node)) uid = Guid.objects.get(_id=serialized['user']['id']).object_id pid = kwargs.get('pid') timestamp.do_verification(uid, pid, node) return {'message': 'OK'}
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
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), '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
def view_project(auth, node, **kwargs): primary = '/api/v1' not in request.path ret = _view_project(node, auth, primary=primary) ret['addon_capabilities'] = settings.ADDON_CAPABILITIES # Collect the URIs to the static assets for addons that have widgets ret['addon_widget_js'] = list( collect_addon_js(node, filename='widget-cfg.js', config_entry='widget')) ret.update(rubeus.collect_addon_assets(node)) return ret
def dataverse_view_file(node_addon, auth, **kwargs): node = node_addon.owner file_id = kwargs.get('path') fail_if_unauthorized(node_addon, auth, file_id) fail_if_private(file_id) # lazily create a file GUID record file_obj, created = DataverseFile.get_or_create(node=node, file_id=file_id) redirect_url = check_file_guid(file_obj) if redirect_url: return redirect(redirect_url) # Get or create rendered file cache_file_name = '{0}.html'.format(file_id) rendered = get_cache_content(node_addon, cache_file_name) if rendered is None: filename, content = scrape_dataverse(file_id) _, ext = os.path.splitext(filename) download_url = node.api_url_for('dataverse_download_file_proxy', path=file_id) rendered = get_cache_content( node_addon, cache_file_name, start_render=True, remote_path=file_obj.file_id + ext, # Include extension for MFR file_content=content, download_url=download_url, ) else: filename, _ = scrape_dataverse(file_id, name_only=True) render_url = node.api_url_for('dataverse_get_rendered_file', path=file_id, render=True) ret = { 'path': filename, 'file_name': filename, 'rendered': rendered, 'render_url': render_url, 'urls': { 'files': node.web_url_for('collect_file_trees'), 'render': render_url, 'download': node.web_url_for('dataverse_download_file', path=file_id), 'info': node.api_url_for('dataverse_get_file_info', path=file_id), } } ret.update(_view_project(node, auth)) ret.update(rubeus.collect_addon_assets(node)) return ret
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
def collect_file_trees(**kwargs): """Collect file trees for all add-ons implementing HGrid views, then format data as appropriate. """ node = kwargs['node'] or kwargs['project'] auth = kwargs['auth'] serialized = _view_project(node, auth) # Add addon static assets serialized.update(rubeus.collect_addon_assets(node)) return serialized
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
def get_init_timestamp_error_data_list(auth, node, **kwargs): """ get timestamp error data list (OSF view) """ ctx = _view_project(node, auth, primary=True) ctx.update(rubeus.collect_addon_assets(node)) pid = kwargs.get('pid') ctx['provider_list'] = timestamp.get_error_list(pid) ctx['project_title'] = node.title ctx['guid'] = pid ctx['web_api_url'] = settings.DOMAIN + node.api_url return ctx
def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'extra': '', 'provider': '', 'rendered': '', 'file_path': '', 'files_url': '', 'file_name': '', 'render_url': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret
def view_project(**kwargs): auth = kwargs['auth'] node = kwargs['node'] or kwargs['project'] primary = '/api/v1' not in request.path ret = _view_project(node, auth, primary=primary) ret['addon_capabilities'] = settings.ADDON_CAPABILITIES # Collect the URIs to the static assets for addons that have widgets ret['addon_widget_js'] = list(collect_addon_js( node, filename='widget-cfg.js', config_entry='widget' )) ret.update(rubeus.collect_addon_assets(node)) return ret
def view_project(auth, node, **kwargs): primary = '/api/v1' not in request.path ret = _view_project(node, auth, primary=primary, embed_contributors=True, embed_descendants=True ) ret['addon_capabilities'] = settings.ADDON_CAPABILITIES # Collect the URIs to the static assets for addons that have widgets ret['addon_widget_js'] = list(collect_addon_js( node, filename='widget-cfg.js', config_entry='widget' )) ret.update(rubeus.collect_addon_assets(node)) access_request = node.requests.filter(creator=auth.user).exclude(machine_state='accepted') ret['user']['access_request_state'] = access_request.get().machine_state if access_request else None addons_widget_data = { 'wiki': None, 'mendeley': None, 'zotero': None, 'forward': None, 'dataverse': None } if 'wiki' in ret['addons']: addons_widget_data['wiki'] = serialize_wiki_widget(node) if 'dataverse' in ret['addons']: addons_widget_data['dataverse'] = serialize_dataverse_widget(node) if 'forward' in ret['addons']: addons_widget_data['forward'] = serialize_forward_widget(node) if 'zotero' in ret['addons']: node_addon = node.get_addon('zotero') zotero_widget_data = ZoteroCitationsProvider().widget(node_addon) addons_widget_data['zotero'] = zotero_widget_data if 'mendeley' in ret['addons']: node_addon = node.get_addon('mendeley') mendeley_widget_data = MendeleyCitationsProvider().widget(node_addon) addons_widget_data['mendeley'] = mendeley_widget_data ret.update({'addons_widget_data': addons_widget_data}) return ret
def view_project(auth, node, **kwargs): primary = '/api/v1' not in request.path ret = _view_project(node, auth, primary=primary, embed_contributors=True, embed_descendants=True) ret['addon_capabilities'] = settings.ADDON_CAPABILITIES # Collect the URIs to the static assets for addons that have widgets ret['addon_widget_js'] = list( collect_addon_js(node, filename='widget-cfg.js', config_entry='widget')) ret.update(rubeus.collect_addon_assets(node)) access_request = node.requests.filter(creator=auth.user).exclude( machine_state='accepted') ret['user']['access_request_state'] = access_request.get( ).machine_state if access_request else None addons_widget_data = { 'wiki': None, 'mendeley': None, 'zotero': None, 'forward': None, 'dataverse': None } if 'wiki' in ret['addons']: addons_widget_data['wiki'] = serialize_wiki_widget(node) if 'dataverse' in ret['addons']: addons_widget_data['dataverse'] = serialize_dataverse_widget(node) if 'forward' in ret['addons']: addons_widget_data['forward'] = serialize_forward_widget(node) if 'zotero' in ret['addons']: node_addon = node.get_addon('zotero') zotero_widget_data = ZoteroCitationsProvider().widget(node_addon) addons_widget_data['zotero'] = zotero_widget_data if 'mendeley' in ret['addons']: node_addon = node.get_addon('mendeley') mendeley_widget_data = MendeleyCitationsProvider().widget(node_addon) addons_widget_data['mendeley'] = mendeley_widget_data ret.update({'addons_widget_data': addons_widget_data}) return ret
def view_project(auth, node, **kwargs): primary = '/api/v1' not in request.path ret = _view_project(node, auth, primary=primary, embed_contributors=True, embed_descendants=True ) ret['addon_capabilities'] = settings.ADDON_CAPABILITIES # Collect the URIs to the static assets for addons that have widgets ret['addon_widget_js'] = list(collect_addon_js( node, filename='widget-cfg.js', config_entry='widget' )) ret.update(rubeus.collect_addon_assets(node)) return ret
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
def get_mako_return(self): ret = serialize_node(self.project, Auth(self.user), primary=True) ret.update({ 'error': '', 'provider': '', 'file_path': '', 'sharejs_uuid': '', 'urls': { 'files': '', 'render': '', 'sharejs': '', 'mfr': '', 'gravatar': '', }, 'size': '', 'extra': '', 'file_name': '', 'materialized_path': '', }) ret.update(rubeus.collect_addon_assets(self.project)) return ret
def addon_view_file(auth, node, node_addon, file_guid, extras): render_url = node.api_url_for('addon_render_file', path=file_guid.waterbutler_path.lstrip('/'), provider=file_guid.provider, render=True, **extras) 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 ret.update({ 'provider': file_guid.provider, 'render_url': render_url, 'file_path': file_guid.waterbutler_path, 'files_url': node.web_url_for('collect_file_trees'), 'rendered': get_or_start_render(file_guid), # Note: must be called after get_or_start_render. This is really only for github 'extra': json.dumps(getattr(file_guid, 'extra', {})), #NOTE: get_or_start_render must be called first to populate name 'file_name': getattr(file_guid, 'name', os.path.split(file_guid.waterbutler_path)[1]), 'materialized_path': getattr(file_guid, 'materialized', file_guid.waterbutler_path), }) ret.update(rubeus.collect_addon_assets(node)) return ret
def addon_view_file(auth, node, node_addon, file_guid, extras): render_url = node.api_url_for( 'addon_render_file', path=file_guid.waterbutler_path.lstrip('/'), provider=file_guid.provider, render=True, **extras ) ret = serialize_node(node, auth, primary=True) ret.update({ 'provider': file_guid.provider, 'render_url': render_url, 'file_path': file_guid.waterbutler_path, 'files_url': node.web_url_for('collect_file_trees'), 'rendered': get_or_start_render(file_guid), # Note: must be called after get_or_start_render. This is really only for github 'extra': json.dumps(getattr(file_guid, 'extra', {})), #NOTE: get_or_start_render must be called first to populate name 'file_name': getattr(file_guid, 'name', os.path.split(file_guid.waterbutler_path)[1]), }) ret.update(rubeus.collect_addon_assets(node)) return ret
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).set(netloc=internal_furl.netloc, args=dict( request.args, **{ 'direct': None, 'mode': 'render', 'action': 'download', 'public_file': node.is_public, })) mfr_url = get_mfr_url(node, file_node.provider) render_url = furl.furl(mfr_url).set(path=['render'], args={'url': download_url.url}) version_names = BaseFileVersionsThrough.objects.filter( basefilenode_id=file_node.id).order_by('-fileversion_id').values_list( 'version_name', flat=True) ret.update({ 'urls': { 'render': render_url.url, 'mfr': mfr_url, 'sharejs': wiki_settings.SHAREJS_URL, 'profile_image': get_profile_image_url(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, 'version_names': list(version_names) }) ret.update(rubeus.collect_addon_assets(node)) return ret
def addon_deleted_file(auth, target, 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, deleted = None, 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' deleted = deleted_on if getattr(file_node, 'suspended', False): error_type = 'FILE_SUSPENDED' elif file_node.deleted_by is None or (auth.private_key and auth.private_link.anonymous): 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), deleted=markupsafe.escape(deleted)) if deleted_by: format_params['deleted_by_guid'] = markupsafe.escape(deleted_by_guid) error_msg = ERROR_MESSAGES[error_type].format(**format_params) if isinstance(target, AbstractNode): error_msg += format_last_known_metadata(auth, target, file_node, error_type) ret = serialize_node(target, auth, primary=True) ret.update(rubeus.collect_addon_assets(target)) ret.update({ 'error': error_msg, 'urls': { 'render': None, 'sharejs': None, 'mfr': get_mfr_url(target, file_node.provider), 'profile_image': get_profile_image_url(auth.user, 25), 'files': target.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, 'target_deleted': getattr(target, 'is_deleted', False), '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(target.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, }) else: # TODO - serialize deleted metadata for future types of deleted file targets ret = {'error': error_msg} return ret, http_status.HTTP_410_GONE
def collect_timestamp_trees_to_json(auth, node, **kwargs): # admin call project to provider file list serialized = _view_project(node, auth, primary=True) serialized.update(rubeus.collect_addon_assets(node)) user_info = OSFUser.objects.get(id=Guid.objects.get(_id=serialized['user']['id']).object_id) api_url = util.api_v2_url(api_url_path(kwargs.get('pid'))) cookie = user_info.get_or_create_cookie() cookies = {settings.COOKIE_NAME: cookie} headers = {'content-type': 'application/json'} provider_json_res = None file_res = requests.get(api_url, headers=headers, cookies=cookies) provider_json_res = file_res.json() file_res.close() provider_list = [] for provider_data in provider_json_res['data']: waterbutler_meta_url = util.waterbutler_api_url_for( kwargs.get('pid'), provider_data['attributes']['provider'], '/', **dict(waterbutler_meta_parameter()) ) waterbutler_json_res = None waterbutler_res = requests.get(waterbutler_meta_url, headers=headers, cookies=cookies) waterbutler_json_res = waterbutler_res.json() waterbutler_res.close() file_list = [] child_file_list = [] for file_data in waterbutler_json_res['data']: if file_data['attributes']['kind'] == 'folder': child_file_list.extend( waterbutler_folder_file_info( kwargs.get('pid'), provider_data['attributes']['provider'], file_data['attributes']['path'], node, cookies, headers ) ) else: file_info = None basefile_node = BaseFileNode.resolve_class( provider_data['attributes']['provider'], BaseFileNode.FILE ).get_or_create( node, file_data['attributes']['path'] ) basefile_node.save() if provider_data['attributes']['provider'] == 'osfstorage': file_info = { 'file_name': file_data['attributes']['name'], 'file_path': file_data['attributes']['materialized'], 'file_kind': file_data['attributes']['kind'], 'file_id': basefile_node._id, 'version': file_data['attributes']['extra']['version'] } else: file_info = { 'file_name': file_data['attributes']['name'], 'file_path': file_data['attributes']['materialized'], 'file_kind': file_data['attributes']['kind'], 'file_id': basefile_node._id, 'version': '' } if file_info: file_list.append(file_info) file_list.extend(child_file_list) if file_list: provider_files = { 'provider': provider_data['attributes']['provider'], 'provider_file_list': file_list } provider_list.append(provider_files) return {'provider_list': provider_list}
def get_init_timestamp_error_data_list(auth, node, **kwargs): """ get timestamp error data list (OSF view) """ ctx = _view_project(node, auth, primary=True) ctx.update(rubeus.collect_addon_assets(node)) data_list = RdmFileTimestamptokenVerifyResult.objects.filter(project_id=kwargs.get('pid')).order_by('provider', 'path') provider_error_list = [] provider = None error_list = [] for data in data_list: if data.inspection_result_status == api_settings.TIME_STAMP_TOKEN_CHECK_SUCCESS: continue if not provider: provider = data.provider elif provider != data.provider: provider_error_list.append({'provider': provider, 'error_list': error_list}) provider = data.provider error_list = [] if data.inspection_result_status in VERIFY_RESULT: verify_result_title = VERIFY_RESULT[data.inspection_result_status] else: # 'FILE missing(Unverify)' verify_result_title = \ api_settings.FILE_NOT_EXISTS_TIME_STAMP_TOKEN_CHECK_FILE_NOT_FOUND_MSG if not data.update_user: operator_user = OSFUser.objects.get(id=data.create_user).fullname operator_date = data.create_date.strftime('%Y/%m/%d %H:%M:%S') else: operator_user = OSFUser.objects.get(id=data.update_user).fullname operator_date = data.update_date.strftime('%Y/%m/%d %H:%M:%S') if provider == 'osfstorage': base_file_data = BaseFileNode.objects.get(_id=data.file_id) error_info = { 'file_name': base_file_data.name, 'file_path': data.path, 'file_kind': 'file', 'project_id': data.project_id, 'file_id': data.file_id, 'version': base_file_data.current_version_number, 'operator_user': operator_user, 'operator_date': operator_date, 'verify_result_title': verify_result_title } else: file_name = os.path.basename(data.path) error_info = { 'file_name': file_name, 'file_path': data.path, 'file_kind': 'file', 'project_id': data.project_id, 'file_id': data.file_id, 'version': '', 'operator_user': operator_user, 'operator_date': operator_date, 'verify_result_title': verify_result_title } error_list.append(error_info) if error_list: provider_error_list.append({'provider': provider, 'error_list': error_list}) ctx['provider_list'] = provider_error_list ctx['project_title'] = node.title ctx['guid'] = kwargs.get('pid') ctx['web_api_url'] = settings.DOMAIN + node.api_url return ctx
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', 'public_file': node.is_public, }) ) mfr_url = get_mfr_url(node, file_node.provider) render_url = furl.furl(mfr_url).set( path=['render'], args={'url': download_url.url} ) ret.update({ 'urls': { 'render': render_url.url, 'mfr': mfr_url, 'sharejs': wiki_settings.SHAREJS_URL, 'profile_image': get_profile_image_url(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
def addon_deleted_file(auth, target, 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 getattr(file_node, 'suspended', False): error_type = 'FILE_SUSPENDED' elif file_node.deleted_by is None or (auth.private_key and auth.private_link.anonymous): 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) error_msg = ERROR_MESSAGES[error_type].format(**format_params) if isinstance(target, AbstractNode): error_msg += format_last_known_metadata(auth, target, file_node, error_type) ret = serialize_node(target, auth, primary=True) ret.update(rubeus.collect_addon_assets(target)) ret.update({ 'error': error_msg, 'urls': { 'render': None, 'sharejs': None, 'mfr': get_mfr_url(target, file_node.provider), 'profile_image': get_profile_image_url(auth.user, 25), 'files': target.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, 'target_deleted': getattr(target, 'is_deleted', False), '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(target.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, }) else: # TODO - serialize deleted metadata for future types of deleted file targets ret = {'error': error_msg} return ret, httplib.GONE
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', 'public_file': node.is_public, })) # Verify file verify_result = {'verify_result': '', 'verify_result_title': ''} cookie = auth.user.get_or_create_cookie() headers = {'content-type': 'application/json'} file_data_request = requests.get(file_node.generate_waterbutler_url( version=version.identifier, meta='', _internal=True), headers=headers, cookies={settings.COOKIE_NAME: cookie}) if file_data_request.status_code == 200: file_data = file_data_request.json().get('data') file_info = { 'provider': file_node.provider, 'file_id': file_node._id, 'file_name': file_data['attributes'].get('name'), 'file_path': file_data['attributes'].get('materialized'), 'size': file_data['attributes'].get('size'), 'created': file_data['attributes'].get('created_utc'), 'modified': file_data['attributes'].get('modified_utc'), 'version': '' } if file_node.provider == 'osfstorage': file_info['version'] = file_data['attributes']['extra'].get( 'version') verify_result = timestamp.check_file_timestamp(auth.user.id, node, file_info) mfr_url = get_mfr_url(node, file_node.provider) render_url = furl.furl(mfr_url).set(path=['render'], args={'url': download_url.url}) ret.update({ 'urls': { 'render': render_url.url, 'mfr': mfr_url, 'sharejs': wiki_settings.SHAREJS_URL, 'profile_image': get_profile_image_url(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), 'timestamp_verify_result': verify_result['verify_result'], 'timestamp_verify_result_title': verify_result['verify_result_title'], }) ret.update(rubeus.collect_addon_assets(node)) return ret
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, '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
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
def view_project(auth, node, **kwargs): primary = '/api/v1' not in request.path ret = _view_project(node, auth, primary=primary, embed_contributors=True, embed_descendants=True ) ret['addon_capabilities'] = settings.ADDON_CAPABILITIES # Collect the URIs to the static assets for addons that have widgets ret['addon_widget_js'] = list(collect_addon_js( node, filename='widget-cfg.js', config_entry='widget' )) ret.update(rubeus.collect_addon_assets(node)) addons_widget_data = { 'wiki': None, 'mendeley': None, 'zotero': None, 'forward': None, 'dataverse': None } if 'wiki' in ret['addons']: wiki = node.get_addon('wiki') wiki_page = node.get_wiki_page('home') # Show "Read more" link if there are multiple pages or has > 400 characters more = len(node.wiki_pages_current.keys()) >= 2 MAX_DISPLAY_LENGTH = 400 rendered_before_update = False if wiki_page and wiki_page.html(node): wiki_html = wiki_page.html(node) if len(wiki_html) > MAX_DISPLAY_LENGTH: wiki_html = BeautifulSoup(wiki_html[:MAX_DISPLAY_LENGTH] + '...', 'html.parser') more = True else: wiki_html = BeautifulSoup(wiki_html) rendered_before_update = wiki_page.rendered_before_update else: wiki_html = None wiki_widget_data = { 'complete': True, 'wiki_content': unicode(wiki_html) if wiki_html else None, 'wiki_content_url': node.api_url_for('wiki_page_content', wname='home'), 'rendered_before_update': rendered_before_update, 'more': more, 'include': False, } wiki_widget_data.update(wiki.config.to_json()) addons_widget_data['wiki'] = wiki_widget_data if 'dataverse' in ret['addons']: node_addon = node.get_addon('dataverse') widget_url = node.api_url_for('dataverse_get_widget_contents') dataverse_widget_data = { 'complete': node_addon.complete, 'widget_url': widget_url, } dataverse_widget_data.update(node_addon.config.to_json()) addons_widget_data['dataverse'] = dataverse_widget_data if 'forward' in ret['addons']: node_addon = node.get_addon('forward') forward_widget_data = serialize_settings(node_addon) forward_widget_data['complete'] = settings_complete(node_addon) forward_widget_data.update(node_addon.config.to_json()) addons_widget_data['forward'] = forward_widget_data if 'zotero' in ret['addons']: node_addon = node.get_addon('zotero') zotero_widget_data = node_addon.config.to_json() zotero_widget_data.update({ 'complete': node_addon.complete, 'list_id': node_addon.list_id, }) addons_widget_data['zotero'] = zotero_widget_data if 'mendeley' in ret['addons']: node_addon = node.get_addon('mendeley') mendeley_widget_data = node_addon.config.to_json() mendeley_widget_data.update({ 'complete': node_addon.complete, 'list_id': node_addon.list_id, }) addons_widget_data['mendeley'] = mendeley_widget_data ret.update({'addons_widget_data': addons_widget_data}) return ret