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} for inst in user.affiliated_institutions] if user else [] all_institutions = [{'id': inst._id, 'name': inst.name, 'logo_path': inst.logo_path} for inst in Institution.find().sort('name')] 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._primary_key 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': profile_views.current_user_gravatar(size=25)['gravatar_url'] 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, 'all_institutions': all_institutions, 'display_name': get_display_name(user.fullname) if user else '', 'use_cdn': settings.USE_CDN_FOR_CLIENT_LIBS, 'piwik_host': settings.PIWIK_HOST, 'piwik_site_id': settings.PIWIK_SITE_ID, '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(), '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_project_id': settings.KEEN_PROJECT_ID, 'keen_write_key': settings.KEEN_WRITE_KEY, 'maintenance': maintenance.get_maintenance(), }
def update(self, revision, data, save=True, user=None): """Note: Dataverse only has psuedo versions, pass None to not save them Call super to update _history and last_touched anyway. Dataverse requires a user for the weird check below """ version = super(DataverseFile, self).update(None, data, user=user, save=save) version.identifier = revision user = user or _get_current_user() if not user or not self.node.can_edit(user=user): try: # Users without edit permission can only see published files if not data['extra']['hasPublishedVersion']: # Blank out name and path for the render # Dont save because there's no reason to persist the change self.name = '' self.materialized_path = '' return ( version, '<div class="alert alert-info" role="alert">This file does not exist.</div>' ) except (KeyError, IndexError): pass return version
def update(self, revision, data, save=True, user=None): """Note: Dataverse only has psuedo versions, don't save them Dataverse requires a user for the weird check below """ self.name = data['name'] self.materialized_path = data['materialized'] if save: self.save() version = FileVersion(identifier=revision) version.update_metadata(data, save=False) user = user or _get_current_user() if not user or not self.node.can_edit(user=user): try: # Users without edit permission can only see published files if not data['extra']['hasPublishedVersion']: # Blank out name and path for the render # Dont save because there's no reason to persist the change self.name = '' self.materialized_path = '' return ( version, '<div class="alert alert-info" role="alert">This file does not exist.</div>' ) except (KeyError, IndexError): pass return version
def get_globals(): """Context variables that are available for every template rendered by OSFWebRenderer. """ user = _get_current_user() return { 'user_name': user.username if user else '', 'user_full_name': user.fullname if user else '', 'user_id': user._primary_key if user else '', 'user_url': user.url if user else '', 'user_gravatar': profile_views.current_user_gravatar(size=25)['gravatar_url'] if user else '', 'user_api_url': user.api_url if user else '', 'display_name': get_display_name(user.fullname) if user else '', 'use_cdn': settings.USE_CDN_FOR_CLIENT_LIBS, 'piwik_host': settings.PIWIK_HOST, 'piwik_site_id': settings.PIWIK_SITE_ID, '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(), 'domain': settings.DOMAIN, 'disk_saving_mode': settings.DISK_SAVING_MODE, 'language': language, 'web_url_for': util.web_url_for, 'api_url_for': util.api_url_for, 'sanitize': sanitize, 'js_str': lambda x: x.replace("'", r"\'").replace('"', r'\"'), 'webpack_asset': paths.webpack_asset, 'waterbutler_url': settings.WATERBUTLER_URL, 'login_url': cas.get_login_url(request.url, auto=True), 'access_token': session.data.get('auth_user_access_token') or '', }
def update(self, revision, data, user=None): """Note: Dataverse only has psuedo versions, don't save them Dataverse requires a user for the weird check below and Django dies when _get_current_user is called """ self.name = data['name'] self.materialized_path = data['materialized'] self.save() version = FileVersion(identifier=revision) version.update_metadata(data, save=False) user = user or _get_current_user() if not user or not self.node.can_edit(user=user): try: # Users without edit permission can only see published files if not data['extra']['hasPublishedVersion']: # Blank out name and path for the render # Dont save because there's no reason to persist the change self.name = '' self.materialized_path = '' return (version, '<div class="alert alert-info" role="alert">This file does not exist.</div>') except (KeyError, IndexError): pass return version
def get_globals(): """Context variables that are available for every template rendered by OSFWebRenderer. """ user = _get_current_user() return { 'user_name': user.username if user else '', 'user_full_name': user.fullname if user else '', 'user_id': user._primary_key if user else '', 'user_url': user.url if user else '', 'user_gravatar': profile_views.current_user_gravatar(size=25)['gravatar_url'] if user else '', 'user_api_url': user.api_url if user else '', 'display_name': get_display_name(user.fullname) if user else '', 'use_cdn': settings.USE_CDN_FOR_CLIENT_LIBS, 'piwik_host': settings.PIWIK_HOST, 'piwik_site_id': settings.PIWIK_SITE_ID, '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(), 'domain': settings.DOMAIN, 'disk_saving_mode': settings.DISK_SAVING_MODE, 'language': language, '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, 'js_str': lambda x: x.replace("'", r"\'").replace('"', r'\"'), 'webpack_asset': paths.webpack_asset, 'waterbutler_url': settings.WATERBUTLER_URL, 'login_url': cas.get_login_url(request.url, auto=True), 'access_token': session.data.get('auth_user_access_token') or '', }
def wrapped(*args, **kwargs): # Waffle does not enjoy NoneTypes as user values. request.user = _get_current_user() or MockUser() if waffle.flag_is_active(request, flag_name): return use_ember_app() else: return func(*args, **kwargs)
def get_globals(): """Context variables that are available for every template rendered by OSFWebRenderer. """ user = _get_current_user() if request.host_url != settings.DOMAIN: try: inst_id = (Institution.find_one(Q('domains', 'eq', request.host.lower())))._id login_url = '{}institutions/{}'.format(settings.DOMAIN, inst_id) except NoResultsFound: login_url = request.url.replace(request.host_url, settings.DOMAIN) else: 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._primary_key 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': profile_views.current_user_gravatar(size=25)['gravatar_url'] if user else '', 'user_api_url': user.api_url if user else '', 'display_name': get_display_name(user.fullname) if user else '', 'use_cdn': settings.USE_CDN_FOR_CLIENT_LIBS, 'piwik_host': settings.PIWIK_HOST, 'piwik_site_id': settings.PIWIK_SITE_ID, '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(), '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, 'js_str': lambda x: x.replace("'", r"\'").replace('"', r'\"'), 'sjson': lambda s: sanitize.safe_json(s), 'webpack_asset': paths.webpack_asset, 'waterbutler_url': settings.WATERBUTLER_URL, 'login_url': cas.get_login_url(login_url, auto=True), '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_project_id': settings.KEEN_PROJECT_ID, 'keen_write_key': settings.KEEN_WRITE_KEY, }
def flag_is_active(request, flag_name): """ This function changes the typical flask request object so it can be used by django-waffle. Other modifications for django-waffle can be found in the __call__ method of OsfWebRenderer. :param flask request object: :return flask request object: """ # Waffle does not enjoy NoneTypes as user values. request.user = _get_current_user() or MockUser() request.COOKIES = getattr(request, 'cookies', None) return waffle.flag_is_active(request, flag_name)
def enrich(self, save=True): super(DataverseFile, self).enrich(save) # Check permissions user = _get_current_user() if not user or not self.node.can_edit(user=user): try: # Users without edit permission can only see published files if not self._metadata_cache['extra']['hasPublishedVersion']: raise exceptions.FileDoesntExistError except (KeyError, IndexError): pass
def get_globals(): """Context variables that are available for every template rendered by OSFWebRenderer. """ user = _get_current_user() 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._primary_key if user else '', 'user_url': user.url if user else '', 'user_gravatar': profile_views.current_user_gravatar(size=25)['gravatar_url'] if user else '', 'user_api_url': user.api_url if user else '', 'display_name': get_display_name(user.fullname) if user else '', 'use_cdn': settings.USE_CDN_FOR_CLIENT_LIBS, 'piwik_host': settings.PIWIK_HOST, 'piwik_site_id': settings.PIWIK_SITE_ID, '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(), 'domain': settings.DOMAIN, 'api_domain': settings.API_DOMAIN, 'disk_saving_mode': settings.DISK_SAVING_MODE, 'language': language, '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, 'js_str': lambda x: x.replace("'", r"\'").replace('"', r'\"'), 'sjson': lambda s: sanitize.safe_json(s), 'webpack_asset': paths.webpack_asset, 'waterbutler_url': settings.WATERBUTLER_URL, 'login_url': cas.get_login_url(request.url, auto=True), '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_project_id': settings.KEEN_PROJECT_ID, 'keen_write_key': settings.KEEN_WRITE_KEY, }
def update(self, revision, data, save=True, user=None): """Note: Dataverse only has psuedo versions, pass None to not save them Call super to update _history and last_touched anyway. Dataverse requires a user for the weird check below """ version = super(DataverseFile, self).update(None, data, user=user, save=save) version.identifier = revision user = user or _get_current_user() if not user or not self.node.can_edit(user=user): try: # Users without edit permission can only see published files if not data['extra']['hasPublishedVersion']: # Blank out name and path for the render # Dont save because there's no reason to persist the change self.name = '' self.materialized_path = '' return (version, '<div class="alert alert-info" role="alert">This file does not exist.</div>') except (KeyError, IndexError): pass return version
def get_globals(): """Context variables that are available for every template rendered by OSFWebRenderer. """ user = _get_current_user() return { "user_name": user.username if user else "", "user_full_name": user.fullname if user else "", "user_id": user._primary_key if user else "", "user_url": user.url if user else "", "user_gravatar": profile_views.current_user_gravatar(size=25)["gravatar_url"] if user else "", "user_api_url": user.api_url if user else "", "display_name": get_display_name(user.fullname) if user else "", "use_cdn": settings.USE_CDN_FOR_CLIENT_LIBS, "piwik_host": settings.PIWIK_HOST, "piwik_site_id": settings.PIWIK_SITE_ID, "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(), "domain": settings.DOMAIN, "disk_saving_mode": settings.DISK_SAVING_MODE, "language": language, "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, "js_str": lambda x: x.replace("'", r"\'").replace('"', r"\""), "sjson": lambda s: sanitize.safe_json(s), "webpack_asset": paths.webpack_asset, "waterbutler_url": settings.WATERBUTLER_URL, "login_url": cas.get_login_url(request.url, auto=True), "access_token": session.data.get("auth_user_access_token") or "", "auth_url": cas.get_login_url(request.url), "profile_url": cas.get_profile_url(), }
def storage_i18n_flag_active(): request.user = _get_current_user() or MockUser() return waffle.flag_is_active(request, 'storage_i18n')
def goodbye(): # Redirect to dashboard if logged in if _get_current_user(): return redirect(util.web_url_for('dashboard')) status.push_status_message(language.LOGOUT, 'info') return {}
def goodbye(): # Redirect to dashboard if logged in if _get_current_user(): return redirect(util.web_url_for('index')) status.push_status_message(language.LOGOUT, kind='success', trust=False) return {}
def goodbye(): # Redirect to dashboard if logged in if _get_current_user(): return redirect(util.web_url_for('dashboard')) status.push_status_message(language.LOGOUT, 'success') return {}
def resolve_guid(guid, suffix=None): """Load GUID by primary key, look up the corresponding view function in the routing table, and return the return value of the view function without changing the URL. :param str guid: GUID primary key :param str suffix: Remainder of URL after the GUID :return: Return value of proxied view function """ try: # Look up guid_object = Guid.load(guid) except KeyError as e: if e.message == 'osfstorageguidfile': # Used when an old detached OsfStorageGuidFile object is accessed raise HTTPError(http.NOT_FOUND) else: raise e if guid_object: # verify that the object implements a GuidStoredObject-like interface. If a model # was once GuidStoredObject-like but that relationship has changed, it's # possible to have referents that are instances of classes that don't # have a deep_url attribute or otherwise don't behave as # expected. if not hasattr(guid_object.referent, 'deep_url'): sentry.log_message('Guid resolved to an object with no deep_url', dict(guid=guid)) raise HTTPError(http.NOT_FOUND) referent = guid_object.referent if referent is None: logger.error('Referent of GUID {0} not found'.format(guid)) raise HTTPError(http.NOT_FOUND) if not referent.deep_url: raise HTTPError(http.NOT_FOUND) # Handle file `/download` shortcut with supported types. if suffix and suffix.rstrip('/').lower() == 'download': file_referent = None if isinstance(referent, PreprintService) and referent.primary_file: if not referent.is_published: # TODO: Ideally, permissions wouldn't be checked here. # This is necessary to prevent a logical inconsistency with # the routing scheme - if a preprint is not published, only # admins and moderators should be able to know it exists. auth = Auth.from_kwargs(request.args.to_dict(), {}) # Check if user isn't a nonetype or that the user has admin/moderator/superuser permissions if auth.user is None or not (auth.user.has_perm( 'view_submissions', referent.provider) or referent.node.has_permission( auth.user, permissions.ADMIN)): raise HTTPError(http.NOT_FOUND) file_referent = referent.primary_file elif isinstance(referent, BaseFileNode) and referent.is_file: file_referent = referent if file_referent: # Extend `request.args` adding `action=download`. request.args = request.args.copy() request.args.update({'action': 'download'}) # Do not include the `download` suffix in the url rebuild. url = _build_guid_url(urllib.unquote(file_referent.deep_url)) return proxy_url(url) # Handle Ember Applications if isinstance(referent, PreprintService): if referent.provider.domain_redirect_enabled: # This route should always be intercepted by nginx for the branded domain, # w/ the exception of `<guid>/download` handled above. return redirect(referent.absolute_url, http.MOVED_PERMANENTLY) if PROXY_EMBER_APPS: resp = requests.get(EXTERNAL_EMBER_APPS['preprints']['server'], stream=True, timeout=EXTERNAL_EMBER_SERVER_TIMEOUT) return Response(stream_with_context(resp.iter_content()), resp.status_code) return send_from_directory(preprints_dir, 'index.html') if isinstance(referent, BaseFileNode ) and referent.is_file and referent.target.is_quickfiles: if referent.is_deleted: raise HTTPError(http.GONE) if PROXY_EMBER_APPS: resp = requests.get( EXTERNAL_EMBER_APPS['ember_osf_web']['server'], stream=True, timeout=EXTERNAL_EMBER_SERVER_TIMEOUT) return Response(stream_with_context(resp.iter_content()), resp.status_code) return send_from_directory(ember_osf_web_dir, 'index.html') if isinstance(referent, Registration) and not suffix: if waffle.flag_is_active(request, 'ember_registries_detail_page'): # Route only the base detail view to ember if PROXY_EMBER_APPS: resp = requests.get( EXTERNAL_EMBER_APPS['registries']['server'], stream=True, timeout=EXTERNAL_EMBER_SERVER_TIMEOUT) return Response(stream_with_context(resp.iter_content()), resp.status_code) return send_from_directory(registries_dir, 'index.html') if isinstance(referent, Node) and not referent.is_registration and suffix: page = suffix.strip('/').split('/')[0] flag_name = 'ember_project_{}_page'.format(page) request.user = _get_current_user() or MockUser() if waffle.flag_is_active(request, flag_name): use_ember_app() url = _build_guid_url(urllib.unquote(referent.deep_url), suffix) return proxy_url(url) # GUID not found; try lower-cased and redirect if exists guid_object_lower = Guid.load(guid.lower()) if guid_object_lower: return redirect(_build_guid_url(guid.lower(), suffix)) # GUID not found raise HTTPError(http.NOT_FOUND)
def resolve_guid(guid, suffix=None): """Load GUID by primary key, look up the corresponding view function in the routing table, and return the return value of the view function without changing the URL. :param str guid: GUID primary key :param str suffix: Remainder of URL after the GUID :return: Return value of proxied view function """ try: # Look up guid_object = Guid.load(guid) except KeyError as e: if e.message == 'osfstorageguidfile': # Used when an old detached OsfStorageGuidFile object is accessed raise HTTPError(http.NOT_FOUND) else: raise e if guid_object: # verify that the object implements a GuidStoredObject-like interface. If a model # was once GuidStoredObject-like but that relationship has changed, it's # possible to have referents that are instances of classes that don't # have a deep_url attribute or otherwise don't behave as # expected. if not hasattr(guid_object.referent, 'deep_url'): sentry.log_message( 'Guid resolved to an object with no deep_url', dict(guid=guid) ) raise HTTPError(http.NOT_FOUND) referent = guid_object.referent if referent is None: logger.error('Referent of GUID {0} not found'.format(guid)) raise HTTPError(http.NOT_FOUND) if not referent.deep_url: raise HTTPError(http.NOT_FOUND) # Handle file `/download` shortcut with supported types. if suffix and suffix.rstrip('/').lower() == 'download': file_referent = None if isinstance(referent, PreprintService) and referent.primary_file: if not referent.is_published: # TODO: Ideally, permissions wouldn't be checked here. # This is necessary to prevent a logical inconsistency with # the routing scheme - if a preprint is not published, only # admins and moderators should be able to know it exists. auth = Auth.from_kwargs(request.args.to_dict(), {}) group_helper = GroupHelper(referent.provider) admin_group = group_helper.get_group('admin') mod_group = group_helper.get_group('moderator') # Check if user isn't a nonetype or that the user has admin/moderator permissions if auth.user is None or not (referent.node.has_permission(auth.user, permissions.ADMIN) or (mod_group.user_set.all() | admin_group.user_set.all()).filter(id=auth.user.id).exists()): raise HTTPError(http.NOT_FOUND) file_referent = referent.primary_file elif isinstance(referent, BaseFileNode) and referent.is_file: file_referent = referent if file_referent: # Extend `request.args` adding `action=download`. request.args = request.args.copy() request.args.update({'action': 'download'}) # Do not include the `download` suffix in the url rebuild. url = _build_guid_url(urllib.unquote(file_referent.deep_url)) return proxy_url(url) # Handle Ember Applications if isinstance(referent, PreprintService): if referent.provider.domain_redirect_enabled: # This route should always be intercepted by nginx for the branded domain, # w/ the exception of `<guid>/download` handled above. return redirect(referent.absolute_url, http.MOVED_PERMANENTLY) if PROXY_EMBER_APPS: resp = requests.get(EXTERNAL_EMBER_APPS['preprints']['server'], stream=True, timeout=EXTERNAL_EMBER_SERVER_TIMEOUT) return Response(stream_with_context(resp.iter_content()), resp.status_code) return send_from_directory(preprints_dir, 'index.html') if isinstance(referent, BaseFileNode) and referent.is_file and referent.node.is_quickfiles: if referent.is_deleted: raise HTTPError(http.GONE) if PROXY_EMBER_APPS: resp = requests.get(EXTERNAL_EMBER_APPS['ember_osf_web']['server'], stream=True, timeout=EXTERNAL_EMBER_SERVER_TIMEOUT) return Response(stream_with_context(resp.iter_content()), resp.status_code) return send_from_directory(ember_osf_web_dir, 'index.html') if isinstance(referent, Node) and not referent.is_registration and suffix: page = suffix.strip('/').split('/')[0] flag_name = 'ember_project_{}_page'.format(page) request.user = _get_current_user() or MockUser() if waffle.flag_is_active(request, flag_name): use_ember_app() url = _build_guid_url(urllib.unquote(referent.deep_url), suffix) return proxy_url(url) # GUID not found; try lower-cased and redirect if exists guid_object_lower = Guid.load(guid.lower()) if guid_object_lower: return redirect( _build_guid_url(guid.lower(), suffix) ) # GUID not found raise HTTPError(http.NOT_FOUND)
def storage_i18n_flag_active(): request.user = _get_current_user() or MockUser() return waffle.flag_is_active(request, features.STORAGE_I18N)
def storage_usage_flag_active(): request.user = _get_current_user() or MockUser() return waffle.flag_is_active(request, features.STORAGE_USAGE)