def folder_list(request): folder_list = [] folder_qs = Developer.objects.all() for obj in folder_qs: if obj.developer_path not in folder_list: folder_list.append(obj.developer_path) folders = get_next_folders('/devs', folder_list) return_dict = { "folders": folders } return Response(return_dict, status=status.HTTP_200_OK)
def file_list(request, folder='/devs'): """ List all files in the file index, paginated. Supports an optional 'search' query parameter, that filters the results by the search terms, an optional 'items' parameter that allows the end-user to specify how many items per page, and a 'page' parameter to get a specific page number from the results. """ if request.method == 'GET': # We only want to show items that are 'active' if folder == None: queryset = File.objects.all().filter(status=1) else: # Add leading slash to match database folder = '/' + folder if folder[-1] == '/': folder = folder[:-1] queryset = File.objects.filter(status=1, folder=folder) folder_qs = File.objects.filter(folder__startswith=folder + '/') if not queryset.exists() and not folder_qs.exists(): return file_detail(request, path=folder) # Set optional search terms # search_terms = request.QUERY_PARAMS.get('search') # if search_terms: # Equivalent to "SELECT * from files WHERE MATCH(files, filename) # AGAINST (search_terms IN BOOLEAN MODE) OR MATCH(files, description) # AGAINST (search_terms IN BOOLEAN MODE)" # queryset = queryset.filter(Q(filename__search=search_terms) | # Q(description__search=search_terms)) # Sort queryset by modified date (descending), # removing any duplicate entries # queryset = queryset.order_by('-modified').distinct() # Allow API end-users to specify a custom amount of items per page # items_per_page = request.QUERY_PARAMS.get('items') # if not items_per_page or not isinstance(items_per_page, int): # items_per_page = 10 # paginator = Paginator(queryset, items_per_page) # page = request.QUERY_PARAMS.get('page') # try: # files = paginator.page(page) # except PageNotAnInteger: # If page is not an integer, deliver first page # files = paginator.page(1) # except EmptyPage: # If page is out of range # deliver last page of results # files = paginator.page(paginator.num_pages) # serializer_context = {'request': request} serializer = FileSerializer(queryset) # folder_qs = File.objects.filter(folder__startswith=folder + '/') folder_list = [] for obj in folder_qs: if obj.folder not in folder_list: folder_list.append(obj.folder) folders = get_next_folders(folder, folder_list) return_dict = { "folders": folders, "files": serializer.data } return Response(return_dict, status=status.HTTP_200_OK) if request.method == 'POST': serializer = FileSerializer(data=request.DATA) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)