def store_view(): error_info = {} status_code = 200 try: categories_results = api.get_categories() except ApiError as api_error: categories_results = [] status_code, error_info = _handle_errors(api_error) categories = logic.get_categories(categories_results) try: featured_snaps_results = api.get_searched_snaps( snap_searched="", category="featured", size=24, page=1 ) except ApiError: featured_snaps_results = [] featured_snaps = logic.get_searched_snaps(featured_snaps_results) return ( flask.render_template( "store/store.html", categories=categories, featured_snaps=featured_snaps, error_info=error_info, ), status_code, )
def store_category(category): status_code = 200 error_info = {} category_results = [] try: category_results = api.get_category_items( category=category, size=10, page=1 ) except (StoreApiError, ApiError) as api_error: status_code, error_info = _handle_error(api_error) snaps_results = logic.get_searched_snaps(category_results) # if the first snap (banner snap) doesn't have an icon, remove the last # snap from the list to avoid a hanging snap (grid of 9) if len(snaps_results) == 10 and snaps_results[0]["icon_url"] == "": snaps_results = snaps_results[:-1] for index in range(len(snaps_results)): snaps_results[index] = logic.get_snap_banner_url( snaps_results[index] ) context = { "category": category, "has_featured": True, "snaps": snaps_results, "error_info": error_info, } return ( flask.render_template("store/_category-partial.html", **context), status_code, )
def snap_distro_install(snap_name, distro): filename = f"store/content/distros/{distro}.yaml" distro_data = helpers.get_yaml(filename) if not distro_data: flask.abort(404) context = _get_context_snap_details(snap_name) context.update({ "distro": distro, "distro_name": distro_data["name"], "distro_logo": distro_data["logo"], "distro_logo_mono": distro_data["logo-mono"], "distro_color_1": distro_data["color-1"], "distro_color_2": distro_data["color-2"], "distro_install_steps": distro_data["install"], }) try: featured_snaps_results = api.get_searched_snaps( snap_searched="", category="featured", size=12, page=1) except ApiError: featured_snaps_results = [] featured_snaps = logic.get_searched_snaps(featured_snaps_results) context.update({"featured_snaps": featured_snaps}) return flask.render_template("store/snap-distro-install.html", **context)
def store_category(category): status_code = 200 error_info = {} category_results = [] try: category_results = api.get_searched_snaps(snap_searched="", category=category, size=24, page=1) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) snaps_results = logic.get_searched_snaps(category_results) context = { "category": category, "snaps": snaps_results, "error_info": error_info, } return ( flask.render_template("store/_category-partial.html", **context), status_code, )
def store_view(): error_info = {} status_code = 200 try: categories_results = api.get_categories() except ApiError as api_error: categories_results = [] status_code, error_info = _handle_errors(api_error) categories = logic.get_categories(categories_results) try: featured_snaps_results = api.get_searched_snaps( snap_searched="", category="featured", size=24, page=1) except ApiError: featured_snaps_results = [] featured_snaps = logic.get_searched_snaps(featured_snaps_results) return ( flask.render_template( "store/store.html", categories=categories, featured_snaps=featured_snaps, error_info=error_info, ), status_code, )
def publisher_details(publisher): """ A view to display the publisher details page for specific publisher. """ publisher_content_path = flask.current_app.config["CONTENT_DIRECTORY"][ "PUBLISHER_PAGES" ] context = helpers.get_yaml( publisher_content_path + publisher + ".yaml", typ="safe" ) if not context: flask.abort(404) if "publishers" in context: context["snaps"] = [] for publisher in context["publishers"]: searched_results = [] try: searched_results = api.get_publisher_items( publisher, size=500, page=1 ) except StoreApiError: pass snaps_results = logic.get_searched_snaps(searched_results) context["snaps"].extend( [snap for snap in snaps_results if snap["apps"]] ) if "snaps" not in context: snaps = helpers.get_yaml( publisher_content_path + publisher + "-snaps.yaml", typ="safe" ) context["snaps"] = snaps["snaps"] featured_snaps = [ snap["package_name"] for snap in context["featured_snaps"] ] context["snaps"] = [ snap for snap in context["snaps"] if snap["package_name"] not in featured_snaps ] return flask.render_template("store/publisher-details.html", **context)
def brand_store_view(): error_info = {} status_code = 200 try: snaps_results = api.get_all_snaps(size=12) except ApiError as api_error: snaps_results = [] status_code, error_info = _handle_errors(api_error) snaps = logic.get_searched_snaps(snaps_results) return flask.render_template('brand-store/store.html', snaps=snaps, error_info=error_info), status_code
def homepage(): featured_snaps = [] error_info = {} status_code = 200 try: featured_snaps = logic.get_searched_snaps( api.get_featured_snaps() ) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) return flask.render_template( 'index.html', featured_snaps=featured_snaps, error_info=error_info ), status_code
def brand_search_snap(): status_code = 200 snap_searched = flask.request.args.get("q", default="", type=str) if not snap_searched: return flask.redirect(flask.url_for(".homepage")) size = flask.request.args.get("limit", default=25, type=int) offset = flask.request.args.get("offset", default=0, type=int) try: page = floor(offset / size) + 1 except ZeroDivisionError: size = 10 page = floor(offset / size) + 1 error_info = {} searched_results = [] try: searched_results = api.search( quote_plus(snap_searched), size=size, page=page ) except StoreApiError as api_error: status_code, error_info = _handle_error(api_error) snaps_results = logic.get_searched_snaps(searched_results) links = logic.get_pages_details( flask.request.base_url, ( searched_results["_links"] if "_links" in searched_results else [] ), ) context = { "query": snap_searched, "snaps": snaps_results, "links": links, "error_info": error_info, } return ( flask.render_template("brand-store/search.html", **context), status_code, )
def brand_search_snap(): status_code = 200 snap_searched = flask.request.args.get("q", default="", type=str) if not snap_searched: return flask.redirect(flask.url_for(".homepage")) size = flask.request.args.get("limit", default=25, type=int) offset = flask.request.args.get("offset", default=0, type=int) try: page = floor(offset / size) + 1 except ZeroDivisionError: size = 10 page = floor(offset / size) + 1 error_info = {} searched_results = [] try: searched_results = api.get_searched_snaps( quote_plus(snap_searched), size=size, page=page ) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) snaps_results = logic.get_searched_snaps(searched_results) links = logic.get_pages_details( flask.request.base_url, ( searched_results["_links"] if "_links" in searched_results else [] ), ) context = { "query": snap_searched, "snaps": snaps_results, "links": links, "error_info": error_info, } return ( flask.render_template("brand-store/search.html", **context), status_code, )
def store_view(): error_info = {} status_code = 200 try: categories_results = api.get_categories() except ApiError as api_error: categories_results = [] status_code, error_info = _handle_errors(api_error) categories = logic.get_categories(categories_results) try: featured_snaps_results = api.get_searched_snaps( snap_searched="", category="featured", size=10, page=1) except ApiError: featured_snaps_results = [] featured_snaps = logic.get_searched_snaps(featured_snaps_results) # if the first snap (banner snap) doesn't have an icon, remove the last # snap from the list to avoid a hanging snap (grid of 9) if len(featured_snaps) == 10 and featured_snaps[0]["icon_url"] == "": featured_snaps = featured_snaps[:-1] featured_banners_enabled = flask.current_app.config.get( "FEATURED_BANNERS_ENABLED") if featured_banners_enabled: for index in range(len(featured_snaps)): featured_snaps[index] = logic.get_snap_banner_url( featured_snaps[index]) livestream = snapcraft_logic.get_livestreams() return ( flask.render_template( "store/store.html", categories=categories, has_featured=True, featured_snaps=featured_snaps, error_info=error_info, livestream=livestream, ), status_code, )
def featured_snaps_in_category(category): category_results = [] try: category_results = api.get_category_items( category=category, size=3, page=1 ) except (StoreApiError, ApiError) as api_error: status_code, error_info = _handle_error(api_error) return ( flask.jsonify({"error": error_info}), status_code, ) snaps_results = logic.get_searched_snaps(category_results) return flask.jsonify(snaps_results)
def store_view(): error_info = {} status_code = 200 try: categories_results = api.get_categories() except StoreApiError: categories_results = [] categories = logic.get_categories(categories_results) try: featured_snaps_results = api.get_featured_items() except (StoreApiError, ApiError) as api_error: status_code, error_info = _handle_error(api_error) return flask.abort(status_code) featured_snaps = logic.get_searched_snaps(featured_snaps_results) if not featured_snaps: return flask.abort(503) # if the first snap (banner snap) doesn't have an icon, remove the last # snap from the list to avoid a hanging snap (grid of 9) if len(featured_snaps) == 10 and featured_snaps[0]["icon_url"] == "": featured_snaps = featured_snaps[:-1] for index in range(len(featured_snaps)): featured_snaps[index] = logic.get_snap_banner_url( featured_snaps[index] ) livestream = snapcraft_logic.get_livestreams() return ( flask.render_template( "store/store.html", categories=categories, has_featured=True, featured_snaps=featured_snaps, error_info=error_info, livestream=livestream, ), status_code, )
def brand_store_view(): error_info = {} status_code = 200 try: snaps_results = api.get_all_items(size=16) except (StoreApiError, ApiError) as api_error: snaps_results = [] status_code, error_info = _handle_error(api_error) snaps = logic.get_searched_snaps(snaps_results) return ( flask.render_template( "brand-store/store.html", snaps=snaps, error_info=error_info ), status_code, )
def brand_store_view(): error_info = {} status_code = 200 try: snaps_results = api.get_all_snaps(size=12) except ApiError as api_error: snaps_results = [] status_code, error_info = _handle_errors(api_error) snaps = logic.get_searched_snaps(snaps_results) return ( flask.render_template( "brand-store/store.html", snaps=snaps, error_info=error_info ), status_code, )
def snap_distro_install(snap_name, distro): filename = f"store/content/distros/{distro}.yaml" distro_data = helpers.get_yaml(filename) if not distro_data: flask.abort(404) context = _get_context_snap_details(snap_name) if distro == "raspbian": if ( "armhf" not in context["channel_map"] and "arm64" not in context["channel_map"] ): return flask.render_template("404.html"), 404 context.update( { "distro": distro, "distro_name": distro_data["name"], "distro_logo": distro_data["logo"], "distro_logo_mono": distro_data["logo-mono"], "distro_color_1": distro_data["color-1"], "distro_color_2": distro_data["color-2"], "distro_install_steps": distro_data["install"], } ) try: featured_snaps_results = api.get_featured_items(size=13, page=1) except StoreApiError: featured_snaps_results = [] featured_snaps = [ snap for snap in logic.get_searched_snaps(featured_snaps_results) if snap["package_name"] != snap_name ][:12] context.update({"featured_snaps": featured_snaps}) return flask.render_template( "store/snap-distro-install.html", **context )
def brand_search_snap(): status_code = 200 snap_searched = flask.request.args.get('q', default='', type=str) if not snap_searched: return flask.redirect(flask.url_for('.homepage')) size = flask.request.args.get('limit', default=25, type=int) offset = flask.request.args.get('offset', default=0, type=int) try: page = floor(offset / size) + 1 except ZeroDivisionError: size = 10 page = floor(offset / size) + 1 error_info = {} searched_results = [] try: searched_results = api.get_searched_snaps( quote_plus(snap_searched), size=size, page=page) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) snaps_results = logic.get_searched_snaps(searched_results) links = logic.get_pages_details(flask.request.base_url, (searched_results['_links'] if '_links' in searched_results else [])) context = { "query": snap_searched, "snaps": snaps_results, "links": links, "error_info": error_info } return flask.render_template('brand-store/search.html', **context), status_code
def store_category(category): status_code = 200 error_info = {} category_results = [] try: category_results = api.get_searched_snaps( snap_searched="", category=category, size=24, page=1 ) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) snaps_results = logic.get_searched_snaps(category_results) context = { "category": category, "snaps": snaps_results, "error_info": error_info, } return ( flask.render_template("store/_category-partial.html", **context), status_code, )
def store_view(): error_info = {} status_code = 200 try: categories_results = api.get_categories() except ApiError as api_error: categories_results = [] status_code, error_info = _handle_errors(api_error) categories = logic.get_categories(categories_results) try: featured_snaps_results = api.get_featured_snaps() except ApiError as api_error: featured_snaps_results = [] status_code, error_info = _handle_errors(api_error) featured_snaps = logic.get_searched_snaps(featured_snaps_results) return flask.render_template('store/store.html', featured_snaps=featured_snaps, categories=categories, error_info=error_info), status_code
def search_snap(): status_code = 200 snap_searched = flask.request.args.get("q", default="", type=str) snap_category = flask.request.args.get( "category", default="", type=str ) if snap_category: snap_category_display = snap_category.capitalize().replace( "-", " " ) else: snap_category_display = None if not snap_searched and not snap_category: return flask.redirect(flask.url_for(".homepage")) size = flask.request.args.get("limit", default=24, type=int) offset = flask.request.args.get("offset", default=0, type=int) try: page = floor(offset / size) + 1 except ZeroDivisionError: size = 10 page = floor(offset / size) + 1 error_info = {} categories_results = [] searched_results = [] try: categories_results = api.get_categories() except ApiError as api_error: status_code, error_info = _handle_errors(api_error) categories = logic.get_categories(categories_results) try: searched_results = api.get_searched_snaps( quote_plus(snap_searched), category=snap_category, size=size, page=page, ) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) total_results_count = searched_results["total"] snaps_results = logic.get_searched_snaps(searched_results) links = logic.get_pages_details( flask.request.base_url, ( searched_results["_links"] if "_links" in searched_results else [] ), ) context = { "query": snap_searched, "category": snap_category, "category_display": snap_category_display, "categories": categories, "snaps": snaps_results, "total": total_results_count, "links": links, "error_info": error_info, } return ( flask.render_template("store/search.html", **context), status_code, )
def search_snap(): status_code = 200 snap_searched = flask.request.args.get("q", default="", type=str) snap_category = flask.request.args.get("category", default="", type=str) if snap_category: snap_category_display = snap_category.capitalize().replace( "-", " ") else: snap_category_display = None if not snap_searched and not snap_category: return flask.redirect(flask.url_for(".homepage")) size = flask.request.args.get("limit", default=24, type=int) offset = flask.request.args.get("offset", default=0, type=int) try: page = floor(offset / size) + 1 except ZeroDivisionError: size = 10 page = floor(offset / size) + 1 error_info = {} categories_results = [] searched_results = [] try: categories_results = api.get_categories() except ApiError as api_error: status_code, error_info = _handle_errors(api_error) categories = logic.get_categories(categories_results) try: searched_results = api.get_searched_snaps( quote_plus(snap_searched), category=snap_category, size=size, page=page, ) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) if "total" in searched_results: total_results_count = searched_results["total"] else: total_results_count = None snaps_results = logic.get_searched_snaps(searched_results) links = logic.get_pages_details( flask.request.base_url, (searched_results["_links"] if "_links" in searched_results else []), ) context = { "query": snap_searched, "category": snap_category, "category_display": snap_category_display, "categories": categories, "snaps": snaps_results, "total": total_results_count, "links": links, "error_info": error_info, } return ( flask.render_template("store/search.html", **context), status_code, )
def search_snap(): status_code = 200 snap_searched = flask.request.args.get("q", default="", type=str) snap_category = flask.request.args.get( "category", default="", type=str ) page = flask.request.args.get("page", default=1, type=int) if snap_category: snap_category_display = snap_category.capitalize().replace( "-", " " ) else: snap_category_display = None if not snap_searched and not snap_category: return flask.redirect(flask.url_for(".homepage")) # The default size is 44 # (11 rows of 4) - on search results pages # or (1 + 5 rows of 3 + 7 rows of 4) - on category page 1 size = 44 error_info = {} searched_results = [] try: searched_results = api.search( snap_searched, category=snap_category, size=size, page=page, ) except (StoreApiError, ApiError) as api_error: status_code, error_info = _handle_error(api_error) total_pages = None if "total" in searched_results: total_results_count = searched_results["total"] total_pages = ceil(total_results_count / size) else: total_results_count = None snaps_results = logic.get_searched_snaps(searched_results) links = {} if page > 1: links["first"] = logic.build_pagination_link( snap_searched=snap_searched, snap_category=snap_category, page=1, ) links["prev"] = logic.build_pagination_link( snap_searched=snap_searched, snap_category=snap_category, page=page - 1, ) if not total_pages or page < total_pages: links["next"] = logic.build_pagination_link( snap_searched=snap_searched, snap_category=snap_category, page=page + 1, ) if total_pages: links["last"] = logic.build_pagination_link( snap_searched=snap_searched, snap_category=snap_category, page=total_pages, ) featured_snaps = [] # These are the hand-selected "featured snaps" in each category. # We don't have this information on the API, so it's hardcoded. number_of_featured_snaps = 16 if snap_category_display and page == 1: if snaps_results and snaps_results[0]: if snaps_results[0]["icon_url"] == "": snaps_results = logic.promote_snap_with_icon(snaps_results) snaps_results[0] = logic.get_snap_banner_url(snaps_results[0]) if ( snap_category == "featured" or len(snaps_results) < number_of_featured_snaps ): featured_snaps = snaps_results snaps_results = [] else: featured_snaps = snaps_results[:number_of_featured_snaps] snaps_results = snaps_results[number_of_featured_snaps:] context = { "query": snap_searched, "category": snap_category, "category_display": snap_category_display, "searched_snaps": snaps_results, "featured_snaps": featured_snaps, "total": total_results_count, "links": links, "page": page, "error_info": error_info, } return ( flask.render_template("store/search.html", **context), status_code, )
def search_snap(): status_code = 200 snap_searched = flask.request.args.get('q', default='', type=str) snap_category = flask.request.args.get('category', default='', type=str) if snap_category: snap_category_display = snap_category.capitalize().replace( '-', ' ') else: snap_category_display = None if not snap_searched and not snap_category: return flask.redirect(flask.url_for('.homepage')) size = flask.request.args.get('limit', default=25, type=int) offset = flask.request.args.get('offset', default=0, type=int) try: page = floor(offset / size) + 1 except ZeroDivisionError: size = 10 page = floor(offset / size) + 1 error_info = {} featured_snaps = [] categories_results = [] searched_results = [] try: categories_results = api.get_categories() except ApiError as api_error: status_code, error_info = _handle_errors(api_error) categories = logic.get_categories(categories_results) try: searched_results = api.get_searched_snaps( quote_plus(snap_searched), category=snap_category, size=size, page=page) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) snaps_results = logic.get_searched_snaps(searched_results) links = logic.get_pages_details(flask.request.base_url, (searched_results['_links'] if '_links' in searched_results else [])) if not snaps_results: featured_snaps_results = [] try: featured_snaps_results = api.get_featured_snaps() except ApiError as api_error: status_code, error_info = _handle_errors(api_error) featured_snaps = logic.get_searched_snaps(featured_snaps_results) context = { "query": snap_searched, "category": snap_category, "category_display": snap_category_display, "categories": categories, "snaps": snaps_results, "links": links, "featured_snaps": featured_snaps, "error_info": error_info } return flask.render_template('store/search.html', **context), status_code
def search_snap(): status_code = 200 snap_searched = flask.request.args.get("q", default="", type=str) snap_category = flask.request.args.get( "category", default="", type=str ) page = flask.request.args.get("page", default=1, type=int) if snap_category: snap_category_display = snap_category.capitalize().replace( "-", " " ) else: snap_category_display = None if not snap_searched and not snap_category: return flask.redirect(flask.url_for(".homepage")) # The default size should be 44 (rows of 4) # it's important that this is smaller than the category page 1 size # below otherwise snaps can be missed out of results size = 44 # Page 1 has a snap at the top, and a few rows of 3, followed by rows # of 4 - so we need to offset to ensure there's no hanging snap if snap_category and page == 1: size = 47 error_info = {} searched_results = [] try: searched_results = api.get_searched_snaps( quote_plus(snap_searched), category=snap_category, size=size, page=page, ) except ApiError as api_error: status_code, error_info = _handle_errors(api_error) total_pages = None if "total" in searched_results: total_results_count = searched_results["total"] total_pages = ceil(total_results_count / size) else: total_results_count = None snaps_results = logic.get_searched_snaps(searched_results) links = {} if page > 1: links["first"] = logic.build_pagination_link( snap_searched=snap_searched, snap_category=snap_category, page=1, ) links["prev"] = logic.build_pagination_link( snap_searched=snap_searched, snap_category=snap_category, page=page - 1, ) if not total_pages or page < total_pages: links["next"] = logic.build_pagination_link( snap_searched=snap_searched, snap_category=snap_category, page=page + 1, ) if total_pages: links["last"] = logic.build_pagination_link( snap_searched=snap_searched, snap_category=snap_category, page=total_pages, ) featured_snaps = [] # These are the hand-selected "featured snaps" in each category. # We don't have this information on the API, so it's hardcoded. number_of_featured_snaps = 19 if snap_category_display and page == 1: if snaps_results and snaps_results[0]: if snaps_results[0]["icon_url"] == "": snaps_results = logic.promote_snap_with_icon(snaps_results) snaps_results[0] = logic.get_snap_banner_url(snaps_results[0]) if ( snap_category == "featured" or len(snaps_results) < number_of_featured_snaps ): featured_snaps = snaps_results snaps_results = [] else: featured_snaps = snaps_results[:number_of_featured_snaps] snaps_results = snaps_results[number_of_featured_snaps:] context = { "query": snap_searched, "category": snap_category, "category_display": snap_category_display, "searched_snaps": snaps_results, "featured_snaps": featured_snaps, "total": total_results_count, "links": links, "page": page, "error_info": error_info, } return ( flask.render_template("store/search.html", **context), status_code, )