Skip to content

Instantly share code, notes, and snippets.

@idan
Created September 2, 2009 14:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save idan/179730 to your computer and use it in GitHub Desktop.
Save idan/179730 to your computer and use it in GitHub Desktop.
def since(fn):
def decorated(self, request, **kwargs):
since = request.GET.get('since', None)
since_id = request.GET.get('since_id', None)
#if not since and not since_id:
# return fn(self, request, **kwargs)
if since and since_id:
# overconstrained
return rc.BAD_REQUEST
try:
if since_id:
since_id = int(since_id)
except ValueError:
return rc.BAD_REQUEST
if since:
try:
# validate date
since = iso8601.parse_date(since)
except iso8601.ParseError:
return rc.BAD_REQUEST
qs = fn(self, request, **kwargs)
if isinstance(qs, QuerySet):
if since:
qs = qs.filter(timestamp__gte=since)
elif since_id:
qs = qs.filter(id__gte=since_id)
return qs
return decorated
def paginated(default_count=50):
def decorated(fn):
def wrap(self, request, **kwargs):
page = request.GET.get('page', 1)
count = request.GET.get('count', default_count)
try:
# validate numbers
page = int(page)
count = int(count)
except ValueError:
return rc.BAD_REQUEST
qs = fn(self, request, **kwargs)
if isinstance(qs, QuerySet):
startindex = (page-1)*count
endindex = page*count
return qs[startindex:endindex]
else:
return qs
return wrap
return decorated
def argcheck(fn_arg, get_param, argtype=None, required=True):
def decorated(fn):
def wrap(self, request, **kwargs):
arg = kwargs.get(fn_arg, None)
param = request.GET.get(get_param, arg)
if required and not arg and not param:
return rc.BAD_REQUEST
if arg and param and arg != param:
return rc.BAD_REQUEST
if argtype and param:
try:
param = argtype(param)
except ValueError:
return rc.BAD_REQUEST
return fn(self, request, **kwargs)
return wrap
return decorated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment