def get_page_data(self, queryset, request): """ Return data for an API page based on the given queryset and request. """ page = self.paginate_queryset(queryset, request) self._cached_page = None page_data = OrderedDict() page_data['totalCount'] = page['total'] if page['offset'] is not None: page_data['startRow'] = page['offset'] if page['end_row'] is not None: page_data['endRow'] = page['end_row'] url = request.build_absolute_uri() page_data['_links'] = OrderedDict() page_data['_links']['self'] = {'href': url} prev_page = self.get_prev_page_url(url, page) if prev_page is not None: page_data['_links']['previous'] = {'href': prev_page} next_page = self.get_next_page_url(url, page) if next_page is not None: page_data['_links']['next'] = {'href': next_page} resource_name = render.underscoreToCamel(self.resource_name) resource_list = self.get_serializer(instance=page['results'], force_refresh=True, context={ 'request': request, 'view': self }).data if resource_list: page_data['_embedded'] = {resource_name: resource_list} return page_data
def render_field_name(self, field_name): ret_val = field_name if field_name[0] != '_': ret_val = render.underscoreToCamel(field_name) return ret_val
def paginate(self, queryset, request): # first get paging parameters. limit_p = settings.REST_FRAMEWORK.get('PAGINATE_BY_PARAM', 'limit') offset_p = settings.REST_FRAMEWORK.get('PAGINATE_PARAM', 'offset') max_limit = settings.REST_FRAMEWORK.get('MAX_PAGINATE_BY', 500) default_limit = settings.REST_FRAMEWORK.get('PAGINATE_BY', 10) offset = int(request.QUERY_PARAMS.get(offset_p, 0)) limit = int(request.QUERY_PARAMS.get(limit_p, default_limit)) limit = max_limit if limit > max_limit else limit page = queryset[offset:offset+limit] # make sure the end row num is not > the total count of the queryset total_count = queryset.count() if total_count > 0: end_row = offset + limit - 1 end_row = total_count - 1 if end_row > total_count - 1 else end_row else: end_row = None offset = None url = request.build_absolute_uri() # determine the previous and next offsets for the previous and next # pages of results if offset is None or offset == 0: prev_offset = None else: prev_offset = offset - limit if offset - limit >= 0 else 0 if offset is None or end_row == total_count - 1: next_offset = None else: next_offset = offset + limit prev_page = None if prev_offset is not None: prev_page = urllib.unquote(replace_query_param(url, offset_p, prev_offset)) next_page = None if next_offset is not None: next_page = urllib.unquote(replace_query_param(url, offset_p, next_offset)) resource_name = render.underscoreToCamel(self.resource_name) resource_list = self.get_serializer(instance=page, force_refresh=True, context={'request': request, 'view': self}).data # page_data elements dictate what shows up in the API for page-level # metadata page_data = OrderedDict() page_data['totalCount'] = total_count if offset is not None: page_data['startRow'] = offset if end_row is not None: page_data['endRow'] = end_row page_data['_links'] = OrderedDict() page_data['_links']['self'] = {'href': url} if prev_page is not None: page_data['_links']['previous'] = {'href': prev_page} if next_page is not None: page_data['_links']['next'] = {'href': next_page} if resource_list: page_data['_embedded'] = {resource_name: resource_list} return page_data
def paginate(self, queryset, request): # first get paging parameters. limit_p = settings.REST_FRAMEWORK.get('PAGINATE_BY_PARAM', 'limit') offset_p = settings.REST_FRAMEWORK.get('PAGINATE_PARAM', 'offset') max_limit = settings.REST_FRAMEWORK.get('MAX_PAGINATE_BY', 500) default_limit = settings.REST_FRAMEWORK.get('PAGINATE_BY', 10) offset = int(request.QUERY_PARAMS.get(offset_p, 0)) limit = int(request.QUERY_PARAMS.get(limit_p, default_limit)) limit = max_limit if limit > max_limit else limit page = queryset[offset:offset + limit] # make sure the end row num is not > the total count of the queryset total_count = queryset.count() if total_count > 0: end_row = offset + limit - 1 end_row = total_count - 1 if end_row > total_count - 1 else end_row else: end_row = None offset = None url = request.build_absolute_uri() # determine the previous and next offsets for the previous and next # pages of results if offset is None or offset == 0: prev_offset = None else: prev_offset = offset - limit if offset - limit >= 0 else 0 if offset is None or end_row == total_count - 1: next_offset = None else: next_offset = offset + limit prev_page = None if prev_offset is not None: prev_page = urllib.unquote( replace_query_param(url, offset_p, prev_offset)) next_page = None if next_offset is not None: next_page = urllib.unquote( replace_query_param(url, offset_p, next_offset)) resource_name = render.underscoreToCamel(self.resource_name) resource_list = self.get_serializer(instance=page, force_refresh=True, context={ 'request': request, 'view': self }).data # page_data elements dictate what shows up in the API for page-level # metadata page_data = OrderedDict() page_data['totalCount'] = total_count if offset is not None: page_data['startRow'] = offset if end_row is not None: page_data['endRow'] = end_row page_data['_links'] = OrderedDict() page_data['_links']['self'] = {'href': url} if prev_page is not None: page_data['_links']['previous'] = {'href': prev_page} if next_page is not None: page_data['_links']['next'] = {'href': next_page} if resource_list: page_data['_embedded'] = {resource_name: resource_list} return page_data