def get_languages(): language_paginator = utils.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 utils.standardize_response(status_code=500) return utils.standardize_response( payload=dict(data=language_list, **pagination_details))
def get_categories(): try: category_paginator = utils.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 utils.standardize_response(status_code=500) return utils.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 = utils.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 utils.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 utils.standardize_response(status_code=500) return utils.standardize_response( payload=dict(data=resource_list, **pagination_details))
def get_resources(): """ Gets a paginated list of resources. If the URL parameters `languages` or `category` are found in the request, the list will be filtered by these parameters. The filters are case insensitive. """ resource_paginator = utils.Paginator(Config.RESOURCE_PAGINATOR, request) # Fetch the filter params from the url, if they were provided. languages = request.args.getlist('languages') category = request.args.get('category') updated_after = request.args.get('updated_after') paid = request.args.get('paid') q = Resource.query # Filter on languages if languages: # Take the list of languages they pass in, join them all with OR q = q.filter( or_(*map(Resource.languages.any, map(Language.name.ilike, languages)))) # 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 = {"errors": {"unprocessable-entity": {"message": message}}} return utils.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) and paid.lower() in ['true', 'false']: paidAsBool = paid.lower() == 'true' q = q.filter(Resource.paid == paidAsBool) # Order by "getting started" category if not languages and not category and paid is None: show_first = Category.query.filter( Category.name == "Getting Started").first() clause = (f" CASE resource.category_id" f" WHEN {show_first.id} THEN 1" f" ELSE 2" f" END, id") q = q.order_by(text(clause)) 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 ] details = resource_paginator.details(paginated_resources) except Exception as e: logger.exception(e) return utils.standardize_response(status_code=500) return utils.standardize_response(payload=dict(data=resource_list, **details), datatype="resources")