Пример #1
0
def get_person_favs(request, *args, **kwargs):
    """ Returns list of materials which are selected as favorite of person
    """
    pid = kwargs.get('pk', None)
    # get paging infomation
    per_page = settings.REST_FRAMEWORK['PAGINATE_BY']
    page = int(request.GET.get('page', 1))
    start_on = (page-1)*per_page

    # get the favs
    qset = models.MaterialFavorite.objects.filter(person_id=pid).order_by('id')
    fav_count = qset.count()
    qset = qset[start_on:start_on+per_page].values_list('material_id')
    res = [item[0] for item in qset]
   
    # now extract material info in list
    mats = models.Material.objects.filter(id__in=res).values(*MAT_BASIC_FIELDS)
    for material in mats:
        material['categories'] = models.restoreAssignedCategory(
            material['categories']) 
        # get related persons
        mroles = models.getMaterialPersons(material['id'])
        material['author'] = mroles.get('author', None)
        del material['id']

    # build the result page 
    page_total = math.ceil(fav_count*1.0/per_page)
    page_prev, page_next = buildPageURLs(request, page_total) 
    # alter serialization data
    page_result = {
        'next': page_next,
        'previous': page_prev,
        'results': mats,
        'count': fav_count,
        }

    return Response(page_result)
Пример #2
0
    def list(self, request, *args, **kwargs):
        """docstring for list"""
        keywords = request.GET.get('kw', '')
        try:
            limit = request.GET.get('on', '')
            material_type = request.GET.get('type', '')
            query = {'content': keywords}

            # branching for the person case
            if limit.lower() == 'p':  
                self.serializer_class = serializers.IndexPersonSerializer
                allow_models = [models.Person,]                                
            else: 
                if limit.lower() == 'm':
                    allow_models = [models.Material]
                else:
                    allow_models = [models.Material, models.Person]
                    
                self.serializer_class = serializers.IndexCommonSerializer
                try:
                    material_type = int(material_type)
                    query['material_type'] = material_type
                except ValueError:
                    pass    

            # get paging infomation
            pg_size = settings.REST_FRAMEWORK['PAGINATE_BY']
            pg_at = int(request.GET.get('page', 1))
            pg_start = (pg_at-1)*pg_size

            # perform search
            res = SearchQuerySet().models(*allow_models).filter(**query)
            result_count = res.count()
            self.object_list = [_ for _ in res[pg_start:pg_start+pg_size]]
        except:
            raise
            raise404(request)

        # Default is to allow empty querysets.  This can be altered by setting
        # `.allow_empty = False`, to raise 404 errors on empty querysets.
        allow_empty = self.get_allow_empty()
        if not allow_empty and len(self.object_list) == 0:
            error_args = {'class_name': self.__class__.__name__}
            raise404(self.empty_error % error_args)

        # build the next and previous pages
        page_prev, page_next = buildPageURLs(request) 
        if pg_at <= 1:
            page_prev = None
        if pg_size * pg_at >= result_count:
            page_next = None
        serializer = self.get_serializer(self.object_list)

        # alter serialization data
        new_data = {
            'next': page_next,
            'previous': page_prev,
            'results': serializer.data,
            'count': result_count,
            }
        serializer._data = new_data

        response = Response(serializer.data) 
        return response