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)
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