# 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('.')]