Example #1
0
    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
Example #2
0
 def render_field_name(self, field_name):
     ret_val = field_name
     if field_name[0] != '_':
         ret_val = render.underscoreToCamel(field_name)
     return ret_val
Example #3
0
    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
Example #4
0
    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
Example #5
0
 def render_field_name(self, field_name):
     ret_val = field_name
     if field_name[0] != '_':
         ret_val = render.underscoreToCamel(field_name)
     return ret_val