Move helpers/request.py to helper/requests.py to avoid conflict with common
local variable name "request".
Patch by: Todd Larsen
Review by: to-be-reviewed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/views/helper/requests.py Fri Oct 03 22:17:05 2008 +0000
@@ -0,0 +1,179 @@
+#!/usr/bin/python2.5
+#
+# Copyright 2008 the Melange authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Helpers for manipulating HTTP requests.
+"""
+
+__authors__ = [
+ '"Todd Larsen" <tlarsen@google.com>',
+ ]
+
+import urlparse
+
+
+def getSingleIndexedParamValue(request, param_name, values=()):
+ """Returns a value indexed by a query parameter in the HTTP request.
+
+ Args:
+ request: the Django HTTP request object
+ param_name: name of the query parameter in the HTTP request
+ values: list (or tuple) of ordered values; one of which is
+ retrieved by the index value of the param_name argument in
+ the HTTP request
+
+ Returns:
+ None if the query parameter was not present, was not an integer, or
+ was an integer that is not a valid [0..len(values)-1] index into
+ the values list.
+ Otherwise, returns values[int(param_name value)]
+ """
+ value_idx = request.GET.get(param_name)
+
+ if isinstance(value_idx, (tuple, list)):
+ # keep only the first argument if multiple are present
+ value_idx = value_idx[0]
+
+ try:
+ # GET parameter 'param_name' should be an integer value index
+ value_idx = int(value_idx)
+ except:
+ # ignore bogus or missing parameter values, so return None (no message)
+ return None
+
+ if value_idx < 0:
+ # value index out of range, so return None (no value)
+ return None
+
+ if value_idx >= len(values):
+ # value index out of range, so return None (no value)
+ return None
+
+ # return value associated with valid value index
+ return values[value_idx]
+
+
+def getSingleIndexedParamValueIfMissing(value, request, param_name,
+ values=()):
+ """Returns missing value indexed by a query parameter in the HTTP request.
+
+ Args:
+ value: an existing value, or a "False" value such as None
+ request, param_name, values: see getSingleIndexParamValue()
+
+ Returns:
+ value, if value is "non-False"
+ Otherwise, returns getSingleIndexedParamValue() result.
+ """
+ if value:
+ # value already present, so return it
+ return value
+
+ return getSingleIndexedParamValue(request, param_name, values=values)
+
+
+# TODO(tlarsen): write getMultipleIndexParamValues() that returns a
+# list of values if present, omitting those values that are
+# out of range
+
+
+def isReferrerSelf(request,
+ expected_prefix=None, suffix=None):
+ """Returns True if HTTP referrer path starts with the HTTP request path.
+
+ Args:
+ request: the Django HTTP request object; request.path is used if
+ expected_path is not supplied (the most common usage)
+ expected_prefix: optional HTTP path to use instead of the one in
+ request.path; default is None (use request.path)
+ suffix: suffix to remove from the HTTP request path before comparing
+ it to the HTTP referrer path in the HTTP request object headers
+ (this is often an link name, for example, that may be changing from
+ a POST referrer to a GET redirect target)
+
+ Returns:
+ True if HTTP referrer path begins with the HTTP request path (either
+ request.path or expected_prefix instead if it was supplied), after
+ any suffix was removed from that request path
+ False otherwise
+
+ """
+ http_from = request.META.get('HTTP_REFERER')
+
+ if not http_from:
+ # no HTTP referrer, so cannot possibly start with expected prefix
+ return False
+
+ from_path = urlparse.urlparse(http_from).path
+
+ if not expected_prefix:
+ # use HTTP request path, since expected_prefix was not supplied
+ expected_prefix = request.path
+
+ if suffix:
+ # remove suffix (such as a link name) before comparison
+ chars_to_remove = len(suffix)
+
+ if not suffix.startswith('/'):
+ chars_to_remove = chars_to_remove + 1
+
+ expected_prefix = expected_prefix[:-chars_to_remove]
+
+ if not from_path.startswith(expected_prefix):
+ # expected prefix did not match first part of HTTP referrer path
+ return False
+
+ # HTTP referrer started with (possibly truncated) expected prefix
+ return True
+
+
+def replaceSuffix(path, old_suffix, new_suffix=None, params=None):
+ """Replace the last part of a URL path with something else.
+
+ Also appends an optional list of query parameters. Used for
+ replacing, for example, one link name at the end of a relative
+ URL path with another.
+
+ Args:
+ path: HTTP request relative URL path (with no query arguments)
+ old_suffix: expected suffix at the end of request.path component;
+ if any False value (such as None), the empty string '' is used
+ new_suffix: if non-False, appended to request.path along with a
+ '/' separator (after removing old_suffix if necessary)
+ params: an optional dictionary of query parameters to append to
+ the redirect target; appended as ?<key1>=<value1>&<key2>=...
+
+ Returns:
+ /path/with/new_suffix?a=1&b=2
+ """
+ if not old_suffix:
+ old_suffix = ''
+
+ old_suffix = '/' + old_suffix
+
+ if path.endswith(old_suffix):
+ # also removes any trailing '/' if old_suffix was empty
+ path = path[:-len(old_suffix)]
+
+ if new_suffix:
+ # if present, appends new_suffix, after '/' separator
+ path = '%s/%s' % (path, new_suffix)
+
+ if params:
+ # appends any query parameters, after a '?' and separated by '&'
+ path = '%s?%s' % (path, '&'.join(
+ ['%s=%s' % (p,v) for p,v in params.iteritems()]))
+
+ return path
--- a/app/soc/views/helpers/request.py Fri Oct 03 22:09:32 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,179 +0,0 @@
-#!/usr/bin/python2.5
-#
-# Copyright 2008 the Melange authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Helpers for manipulating HTTP requests.
-"""
-
-__authors__ = [
- '"Todd Larsen" <tlarsen@google.com>',
- ]
-
-import urlparse
-
-
-def getSingleIndexedParamValue(request, param_name, values=()):
- """Returns a value indexed by a query parameter in the HTTP request.
-
- Args:
- request: the Django HTTP request object
- param_name: name of the query parameter in the HTTP request
- values: list (or tuple) of ordered values; one of which is
- retrieved by the index value of the param_name argument in
- the HTTP request
-
- Returns:
- None if the query parameter was not present, was not an integer, or
- was an integer that is not a valid [0..len(values)-1] index into
- the values list.
- Otherwise, returns values[int(param_name value)]
- """
- value_idx = request.GET.get(param_name)
-
- if isinstance(value_idx, (tuple, list)):
- # keep only the first argument if multiple are present
- value_idx = value_idx[0]
-
- try:
- # GET parameter 'param_name' should be an integer value index
- value_idx = int(value_idx)
- except:
- # ignore bogus or missing parameter values, so return None (no message)
- return None
-
- if value_idx < 0:
- # value index out of range, so return None (no value)
- return None
-
- if value_idx >= len(values):
- # value index out of range, so return None (no value)
- return None
-
- # return value associated with valid value index
- return values[value_idx]
-
-
-def getSingleIndexedParamValueIfMissing(value, request, param_name,
- values=()):
- """Returns missing value indexed by a query parameter in the HTTP request.
-
- Args:
- value: an existing value, or a "False" value such as None
- request, param_name, values: see getSingleIndexParamValue()
-
- Returns:
- value, if value is "non-False"
- Otherwise, returns getSingleIndexedParamValue() result.
- """
- if value:
- # value already present, so return it
- return value
-
- return getSingleIndexedParamValue(request, param_name, values=values)
-
-
-# TODO(tlarsen): write getMultipleIndexParamValues() that returns a
-# list of values if present, omitting those values that are
-# out of range
-
-
-def isReferrerSelf(request,
- expected_prefix=None, suffix=None):
- """Returns True if HTTP referrer path starts with the HTTP request path.
-
- Args:
- request: the Django HTTP request object; request.path is used if
- expected_path is not supplied (the most common usage)
- expected_prefix: optional HTTP path to use instead of the one in
- request.path; default is None (use request.path)
- suffix: suffix to remove from the HTTP request path before comparing
- it to the HTTP referrer path in the HTTP request object headers
- (this is often an link name, for example, that may be changing from
- a POST referrer to a GET redirect target)
-
- Returns:
- True if HTTP referrer path begins with the HTTP request path (either
- request.path or expected_prefix instead if it was supplied), after
- any suffix was removed from that request path
- False otherwise
-
- """
- http_from = request.META.get('HTTP_REFERER')
-
- if not http_from:
- # no HTTP referrer, so cannot possibly start with expected prefix
- return False
-
- from_path = urlparse.urlparse(http_from).path
-
- if not expected_prefix:
- # use HTTP request path, since expected_prefix was not supplied
- expected_prefix = request.path
-
- if suffix:
- # remove suffix (such as a link name) before comparison
- chars_to_remove = len(suffix)
-
- if not suffix.startswith('/'):
- chars_to_remove = chars_to_remove + 1
-
- expected_prefix = expected_prefix[:-chars_to_remove]
-
- if not from_path.startswith(expected_prefix):
- # expected prefix did not match first part of HTTP referrer path
- return False
-
- # HTTP referrer started with (possibly truncated) expected prefix
- return True
-
-
-def replaceSuffix(path, old_suffix, new_suffix=None, params=None):
- """Replace the last part of a URL path with something else.
-
- Also appends an optional list of query parameters. Used for
- replacing, for example, one link name at the end of a relative
- URL path with another.
-
- Args:
- path: HTTP request relative URL path (with no query arguments)
- old_suffix: expected suffix at the end of request.path component;
- if any False value (such as None), the empty string '' is used
- new_suffix: if non-False, appended to request.path along with a
- '/' separator (after removing old_suffix if necessary)
- params: an optional dictionary of query parameters to append to
- the redirect target; appended as ?<key1>=<value1>&<key2>=...
-
- Returns:
- /path/with/new_suffix?a=1&b=2
- """
- if not old_suffix:
- old_suffix = ''
-
- old_suffix = '/' + old_suffix
-
- if path.endswith(old_suffix):
- # also removes any trailing '/' if old_suffix was empty
- path = path[:-len(old_suffix)]
-
- if new_suffix:
- # if present, appends new_suffix, after '/' separator
- path = '%s/%s' % (path, new_suffix)
-
- if params:
- # appends any query parameters, after a '?' and separated by '&'
- path = '%s?%s' % (path, '&'.join(
- ['%s=%s' % (p,v) for p,v in params.iteritems()]))
-
- return path
--- a/app/soc/views/helpers/response_helpers.py Fri Oct 03 22:09:32 2008 +0000
+++ b/app/soc/views/helpers/response_helpers.py Fri Oct 03 22:17:05 2008 +0000
@@ -41,8 +41,8 @@
from soc.logic import system
from soc.logic.site import id_user
from soc.logic.site import sidebar
-from soc.views import helpers
-import soc.views.helpers.request
+from soc.views import helper
+import soc.views.helper.requests
from soc.views.helpers import html_menu
@@ -142,11 +142,11 @@
Args:
request: the Django HTTP request object; redirect path is derived from
request.path
- old_suffix, new_suffix, params: see helpers.request.replaceSuffix()
+ old_suffix, new_suffix, params: see helper.requests.replaceSuffix()
Returns:
a Django HTTP redirect response pointing to the altered path
"""
- path = helpers.request.replaceSuffix(request.path, old_suffix, new_suffix,
+ path = helper.requests.replaceSuffix(request.path, old_suffix, new_suffix,
params=params)
return http.HttpResponseRedirect(path)
--- a/app/soc/views/site/docs/edit.py Fri Oct 03 22:09:32 2008 +0000
+++ b/app/soc/views/site/docs/edit.py Fri Oct 03 22:17:05 2008 +0000
@@ -32,8 +32,8 @@
from soc.logic import out_of_band
from soc.logic import path_linkname
from soc.logic.site import id_user
-from soc.views import helpers
-import soc.views.helpers.request
+from soc.views import helper
+import soc.views.helper.requests
from soc.views import simple
from soc.views.helpers import custom_widgets
from soc.views.helpers import forms_helpers
@@ -163,14 +163,14 @@
# is 'Profile saved' parameter present, but referrer was not ourself?
# (e.g. someone bookmarked the GET that followed the POST submit)
if (request.GET.get(profile.SUBMIT_MSG_PARAM_NAME)
- and (not helpers.request.isReferrerSelf(request, suffix=path))):
+ and (not helper.requests.isReferrerSelf(request, suffix=path))):
# redirect to aggressively remove 'Profile saved' query parameter
return http.HttpResponseRedirect(request.path)
# referrer was us, so select which submit message to display
# (may display no message if ?s=0 parameter is not present)
context['submit_message'] = (
- helpers.request.getSingleIndexedParamValue(
+ helper.requests.getSingleIndexedParamValue(
request, profile.SUBMIT_MSG_PARAM_NAME,
values=profile.SUBMIT_MESSAGES))
--- a/app/soc/views/site/sponsor/profile.py Fri Oct 03 22:09:32 2008 +0000
+++ b/app/soc/views/site/sponsor/profile.py Fri Oct 03 22:17:05 2008 +0000
@@ -31,8 +31,8 @@
from soc.logic import out_of_band
from soc.logic import sponsor
from soc.logic.site import id_user
-from soc.views import helpers
-import soc.views.helpers.request
+from soc.views import helper
+import soc.views.helper.requests
from soc.views import simple
from soc.views.helpers import custom_widgets
from soc.views.helpers import forms_helpers
@@ -159,14 +159,14 @@
# is 'Profile saved' parameter present, but referrer was not ourself?
# (e.g. someone bookmarked the GET that followed the POST submit)
if (request.GET.get(profile.SUBMIT_MSG_PARAM_NAME)
- and (not helpers.request.isReferrerSelf(request, suffix=linkname))):
+ and (not helper.requests.isReferrerSelf(request, suffix=linkname))):
# redirect to aggressively remove 'Profile saved' query parameter
return http.HttpResponseRedirect(request.path)
# referrer was us, so select which submit message to display
# (may display no message if ?s=0 parameter is not present)
context['submit_message'] = (
- helpers.request.getSingleIndexedParamValue(
+ helper.requests.getSingleIndexedParamValue(
request, profile.SUBMIT_MSG_PARAM_NAME,
values=profile.SUBMIT_MESSAGES))
--- a/app/soc/views/site/user/profile.py Fri Oct 03 22:09:32 2008 +0000
+++ b/app/soc/views/site/user/profile.py Fri Oct 03 22:17:05 2008 +0000
@@ -34,8 +34,7 @@
from soc.views import simple
from soc.views import helper
import soc.views.helper.lists
-from soc.views import helpers
-import soc.views.helpers.request
+import soc.views.helper.requests
from soc.views.helpers import forms_helpers
from soc.views.helpers import response_helpers
from soc.views.user import profile
@@ -170,7 +169,7 @@
if request.path.endswith('lookup'):
# convert /lookup path into /profile/link_name path
- context['edit_link'] = helpers.request.replaceSuffix(
+ context['edit_link'] = helper.requests.replaceSuffix(
request.path, 'lookup', 'profile/%s' % user.link_name)
# else: URL is not one that was expected, so do not display edit link
elif not form:
@@ -297,7 +296,7 @@
# is 'Profile saved' parameter present, but referrer was not ourself?
# (e.g. someone bookmarked the GET that followed the POST submit)
if (request.GET.get(profile.SUBMIT_MSG_PARAM_NAME)
- and (not helpers.request.isReferrerSelf(request,
+ and (not helper.requests.isReferrerSelf(request,
suffix=linkname))):
# redirect to aggressively remove 'Profile saved' query parameter
return http.HttpResponseRedirect(request.path)
@@ -305,7 +304,7 @@
# referrer was us, so select which submit message to display
# (may display no message if ?s=0 parameter is not present)
context['submit_message'] = (
- helpers.request.getSingleIndexedParamValue(
+ helper.requests.getSingleIndexedParamValue(
request, profile.SUBMIT_MSG_PARAM_NAME,
values=profile.SUBMIT_MESSAGES))
--- a/app/soc/views/user/profile.py Fri Oct 03 22:09:32 2008 +0000
+++ b/app/soc/views/user/profile.py Fri Oct 03 22:17:05 2008 +0000
@@ -31,8 +31,8 @@
from soc.logic import validate
from soc.logic import out_of_band
from soc.logic.site import id_user
-from soc.views import helpers
-import soc.views.helpers.request
+from soc.views import helper
+import soc.views.helper.requests
from soc.views import simple
from soc.views.helpers import forms_helpers
from soc.views.helpers import response_helpers
@@ -140,7 +140,7 @@
# is 'Profile saved' parameter present, but referrer was not ourself?
# (e.g. someone bookmarked the GET that followed the POST submit)
if (request.GET.get(SUBMIT_MSG_PARAM_NAME)
- and (not helpers.request.isReferrerSelf(request,
+ and (not helper.requests.isReferrerSelf(request,
suffix=linkname))):
# redirect to aggressively remove 'Profile saved' query parameter
return http.HttpResponseRedirect(request.path)
@@ -148,7 +148,7 @@
# referrer was us, so select which submit message to display
# (may display no message if ?s=0 parameter is not present)
context['submit_message'] = (
- helpers.request.getSingleIndexedParamValue(
+ helper.requests.getSingleIndexedParamValue(
request, SUBMIT_MSG_PARAM_NAME, values=SUBMIT_MESSAGES))
# populate form with the existing User entity