def url_for(endpoint, *targets, **values): """Wrapper for Flask's url_for() function. Instead of an endpoint you can also pass an URLHandler - in this case **only** its _endpoint will be used. However, there is usually no need to do so. This is just so you can use it in places where sometimes a UH might be passed instead. The `target` argument allows you to pass some object having a `locator` property or `getLocator` method returning a dict. This should be used e.g. when generating an URL for an event since ``getLocator()`` provides the ``{'confId': 123}`` dict instead of you having to pass ``confId=event.getId()`` as a kwarg. For details on Flask's url_for, please see its documentation. Anyway, the important arguments you can put in `values` besides actual arguments are: _external: if set to `True`, an absolute URL is generated _secure: if True/False, set _scheme to https/http if possible (only with _external) _scheme: a string specifying the desired URL scheme (only with _external) - use _secure if possible! _anchor: if provided this is added as #anchor to the URL. """ if hasattr(endpoint, '_endpoint'): endpoint = endpoint._endpoint secure = values.pop('_secure', None) if secure is not None: from indico.core.config import Config if secure and Config.getInstance().getBaseSecureURL(): values['_scheme'] = 'https' elif not secure: values['_scheme'] = 'http' if targets: locator = {} for target in targets: if target: # don't fail on None or mako's Undefined locator.update(get_locator(target)) intersection = set(locator.iterkeys()) & set(values.iterkeys()) if intersection: raise ValueError('url_for kwargs collide with locator: %s' % ', '.join(intersection)) values.update(locator) static_site_mode = bool(ContextManager.get('offlineMode')) values.setdefault('_external', static_site_mode) for key, value in values.iteritems(): # Avoid =True and =False in the URL if isinstance(value, bool): values[key] = int(value) url = _url_for(endpoint, **values) if static_site_mode and not values['_external']: # for static sites we assume all relative urls need to be # mangled to a filename # we should really fine a better way to handle anything # related to offline site urls... from indico.modules.events.static.util import url_to_static_filename url = url_to_static_filename(url) return url
def url_for(endpoint, *targets, **values): """Wrapper for Flask's url_for() function. Instead of an endpoint you can also pass an URLHandler - in this case **only** its _endpoint will be used. However, there is usually no need to do so. This is just so you can use it in places where sometimes a UH might be passed instead. The `target` argument allows you to pass some object having a `locator` property or `getLocator` method returning a dict. This should be used e.g. when generating an URL for an event since ``getLocator()`` provides the ``{'confId': 123}`` dict instead of you having to pass ``confId=event.getId()`` as a kwarg. For details on Flask's url_for, please see its documentation. Anyway, the important arguments you can put in `values` besides actual arguments are: _external: if set to `True`, an absolute URL is generated _secure: if True/False, set _scheme to https/http if possible (only with _external) _scheme: a string specifying the desired URL scheme (only with _external) - use _secure if possible! _anchor: if provided this is added as #anchor to the URL. """ if hasattr(endpoint, '_endpoint'): endpoint = endpoint._endpoint secure = values.pop('_secure', None) if secure is not None: from indico.core.config import Config if secure and Config.getInstance().getBaseSecureURL(): values['_scheme'] = 'https' elif not secure: values['_scheme'] = 'http' if targets: locator = {} for target in targets: if target: # don't fail on None or mako's Undefined locator.update(get_locator(target)) intersection = set(locator.iterkeys()) & set(values.iterkeys()) if intersection: raise ValueError('url_for kwargs collide with locator: %s' % ', '.join(intersection)) values.update(locator) static_site_mode = bool(ContextManager.get('offlineMode')) values.setdefault('_external', static_site_mode) for key, value in values.iteritems(): # Avoid =True and =False in the URL if isinstance(value, bool): values[key] = int(value) url = _url_for(endpoint, **values) if static_site_mode and not values['_external']: # for static sites we assume all relative urls need to be # mangled to a filename # we should really fine a better way to handle anything # related to offline site urls... from indico.modules.events.static.util import url_to_static_filename url = url_to_static_filename(url) return url
def url_for(endpoint, *targets, **values): """Wrapper for Flask's url_for() function. The `target` argument allows you to pass some object having a `locator` property returning a dict. For details on Flask's url_for, please see its documentation. The important special arguments you can put in `values` are: _external: if set to `True`, an absolute URL is generated _scheme: a string specifying the desired URL scheme (only with _external) - use _secure if possible! _anchor: if provided this is added as #anchor to the URL. """ if targets: locator = {} for target in targets: if target: # don't fail on None or mako's Undefined locator.update(get_locator(target)) intersection = set(locator.keys()) & set(values.keys()) if intersection: raise ValueError('url_for kwargs collide with locator: %s' % ', '.join(intersection)) values.update(locator) for key, value in values.items(): # Avoid =True and =False in the URL if isinstance(value, bool): values[key] = int(value) values.setdefault('_external', False) values = dict(sorted(values.items())) url = _url_for(endpoint, **values) if g.get('static_site' ) and 'custom_manifests' in g and not values.get('_external'): # for static sites we assume all relative urls need to be # mangled to a filename # we should really fine a better way to handle anything # related to offline site urls... from indico.modules.events.static.util import url_to_static_filename url = url_to_static_filename(endpoint, url) # mark asset as used so that generator can include it g.used_url_for_assets.add(url) return url
def url_for(endpoint, *targets, **values): """Wrapper for Flask's url_for() function. The `target` argument allows you to pass some object having a `locator` property returning a dict. For details on Flask's url_for, please see its documentation. The important special arguments you can put in `values` are: _external: if set to `True`, an absolute URL is generated _scheme: a string specifying the desired URL scheme (only with _external) - use _secure if possible! _anchor: if provided this is added as #anchor to the URL. """ if targets: locator = {} for target in targets: if target: # don't fail on None or mako's Undefined locator.update(get_locator(target)) intersection = set(locator.iterkeys()) & set(values.iterkeys()) if intersection: raise ValueError('url_for kwargs collide with locator: %s' % ', '.join(intersection)) values.update(locator) for key, value in values.iteritems(): # Avoid =True and =False in the URL if isinstance(value, bool): values[key] = int(value) url = _url_for(endpoint, **values) if g.get('static_site') and 'custom_manifests' in g and not values.get('_external'): # for static sites we assume all relative urls need to be # mangled to a filename # we should really fine a better way to handle anything # related to offline site urls... from indico.modules.events.static.util import url_to_static_filename url = url_to_static_filename(endpoint, url) # mark asset as used so that generator can include it g.used_url_for_assets.add(url) return url