ffe4371710
Default sorting is not good enough, since it alphabetically sorts numbers, as in 11 < 2 instead of 11 > 10. Change-Id: Iaa575cf4ba0fe76524ba2823ce50de30a5b931d9 Closes-Bug: #1707204
85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
# Copyright (c) 2016 Mirantis Inc.
|
|
#
|
|
# 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.
|
|
|
|
import base64
|
|
import copy
|
|
import six
|
|
from six.moves.urllib import parse
|
|
|
|
|
|
def serialize(obj):
|
|
"""Serialize the given object
|
|
:param obj: string representation of the object
|
|
:return: encoded object (its type is unicode string)
|
|
"""
|
|
result = base64.urlsafe_b64encode(obj)
|
|
# this workaround is needed because in case of python 3 the
|
|
# urlsafe_b64encode method returns string of 'bytes' class.
|
|
if six.PY3:
|
|
result = result.decode()
|
|
return result
|
|
|
|
|
|
def deserialize(obj):
|
|
"""Deserialize the given object
|
|
:param obj: string representation of the encoded object
|
|
:return: decoded object (its type is unicode string)
|
|
"""
|
|
result = base64.urlsafe_b64decode(obj)
|
|
# this workaround is needed because in case of python 3 the
|
|
# urlsafe_b64decode method returns string of 'bytes' class
|
|
if six.PY3:
|
|
result = result.decode()
|
|
return result
|
|
|
|
|
|
def delete_pagination_params_from_request(request, save_limit=None):
|
|
"""Delete marker and limit parameters from GET requests
|
|
:param request: instance of GET request
|
|
:param save_limit: if True, 'limit' will not be deleted
|
|
:return: instance of GET request without marker or limit
|
|
"""
|
|
request = copy.copy(request)
|
|
request.GET = request.GET.copy()
|
|
|
|
params = ['marker']
|
|
if not save_limit:
|
|
params.append('limit')
|
|
|
|
for param in ['marker', 'limit']:
|
|
if param in request.GET:
|
|
del(request.GET[param])
|
|
query_string = request.META.get('QUERY_STRING', '')
|
|
query_dict = parse.parse_qs(query_string)
|
|
if param in query_dict:
|
|
del(query_dict[param])
|
|
|
|
query_string = parse.urlencode(query_dict, doseq=True)
|
|
request.META['QUERY_STRING'] = query_string
|
|
return request
|
|
|
|
|
|
def smart_sort_helper(version):
|
|
"""Allows intelligent sorting of plugin versions, for example when
|
|
minor version of a plugin is 11, sort numerically so that 11 > 10,
|
|
instead of alphabetically so that 2 > 11
|
|
"""
|
|
def _safe_cast_to_int(obj):
|
|
try:
|
|
return int(obj)
|
|
except ValueError:
|
|
return obj
|
|
return [_safe_cast_to_int(part) for part in version.split('.')]
|