def get_languages(): language_paginator = Paginator(Config.LANGUAGE_PAGINATOR, request) query = Language.query try: paginated_languages = language_paginator.paginated_data(query) if not paginated_languages: return redirect('/404') language_list = [ language.serialize for language in paginated_languages.items ] pagination_details = language_paginator.pagination_details( paginated_languages) except Exception as e: logger.exception(e) return standardize_response(status_code=500) return standardize_response( payload=dict(data=language_list, **pagination_details))
def get_categories(): try: category_paginator = Paginator(Config.CATEGORY_PAGINATOR, request) query = Category.query paginated_categories = category_paginator.paginated_data(query) if not paginated_categories: return redirect('/404') category_list = [ category.serialize for category in paginated_categories.items ] pagination_details = category_paginator.pagination_details( paginated_categories) except Exception as e: logger.exception(e) return standardize_response(status_code=500) return standardize_response( payload=dict(data=category_list, **pagination_details))
def get_resources(): """ Gets a paginated list of resources. If the URL parameters `language` or `category` are found in the request, the list will be filtered by these parameters. The filters are case insensitive. """ resource_paginator = Paginator(Config.RESOURCE_PAGINATOR, request) # Fetch the filter params from the url, if they were provided. language = request.args.get('language') category = request.args.get('category') updated_after = request.args.get('updated_after') paid = request.args.get('paid') q = Resource.query # Filter on language if language: q = q.filter(Resource.languages.any(Language.name.ilike(language))) # Filter on category if category: q = q.filter( Resource.category.has( func.lower(Category.name) == category.lower())) # Filter on updated_after if updated_after: try: uaDate = parser.parse(updated_after) if uaDate > datetime.now(): raise Exception("updated_after greater than today's date") uaDate = uaDate.strftime("%Y-%m-%d") except Exception as e: logger.exception(e) message = 'The value for "updated_after" is invalid' res = dict(errors=[{ 'code': 'unprocessable-entity', 'message': message }]) return standardize_response(payload=res, status_code=422) q = q.filter( or_(Resource.created_at >= uaDate, Resource.last_updated >= uaDate)) # Filter on paid if isinstance(paid, str): paidAsBool = paid.lower() == 'true' q = q.filter(Resource.paid == paidAsBool) try: paginated_resources = resource_paginator.paginated_data(q) if not paginated_resources: return redirect('/404') resource_list = [ resource.serialize for resource in paginated_resources.items ] pagination_details = resource_paginator.pagination_details( paginated_resources) except Exception as e: logger.exception(e) return standardize_response(status_code=500) return standardize_response( payload=dict(data=resource_list, **pagination_details))