Coverage for webapp/admin/views.py: 94%
49 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-15 22:43 +0000
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-15 22:43 +0000
1# Packages
2import os
3import flask
4from flask import make_response
5from canonicalwebteam.store_api.dashboard import Dashboard
6from canonicalwebteam.store_api.publishergw import PublisherGW
7from canonicalwebteam.store_api.devicegw import DeviceGW
9# Local
10from webapp.decorators import login_required, exchange_required
11from webapp.helpers import api_publisher_session, api_session
13dashboard = Dashboard(api_session)
14publisher_gateway = PublisherGW("snap", api_publisher_session)
15device_gateway = DeviceGW("snap", api_session)
17admin = flask.Blueprint(
18 "admin", __name__, template_folder="/templates", static_folder="/static"
19)
21SNAPSTORE_DASHBOARD_API_URL = os.getenv(
22 "SNAPSTORE_DASHBOARD_API_URL", "https://dashboard.snapcraft.io/"
23)
25context = {"api_url": SNAPSTORE_DASHBOARD_API_URL}
28def get_brand_id(session, store_id):
29 store = dashboard.get_store(session, store_id)
30 return store["brand-id"]
33@admin.route("/admin", defaults={"path": ""})
34@admin.route("/admin/<path:path>")
35@login_required
36@exchange_required
37def get_admin(path):
38 return flask.render_template("admin/admin.html", **context)
41# -------------------- FEATURED SNAPS AUTOMATION ------------------
42@admin.route("/admin/featured", methods=["POST"])
43@login_required
44@exchange_required
45def post_featured_snaps():
46 """
47 In this view, we do three things:
48 1. Fetch all currently featured snaps
49 2. Delete the currently featured snaps
50 3. Update featured snaps to be newly featured
52 Args:
53 None
55 Returns:
56 dict: A dictionary containing the response message and success status.
57 """
59 # new_featured_snaps is the list of featured snaps to be updated
60 featured_snaps = flask.request.form.get("snaps")
62 if not featured_snaps:
63 response = {
64 "success": False,
65 "message": "Snaps cannot be empty",
66 }
67 return make_response(response, 500)
68 new_featured_snaps = featured_snaps.split(",")
70 # currently_featured_snap is the list of featured snaps to be deleted
71 currently_featured_snaps = []
73 next = True
74 while next:
75 featured_snaps = device_gateway.get_featured_snaps()
76 currently_featured_snaps.extend(
77 featured_snaps.get("_embedded", {}).get("clickindex:package", [])
78 )
79 next = featured_snaps.get("_links", {}).get("next", False)
81 currently_featured_snap_ids = [
82 snap["snap_id"] for snap in currently_featured_snaps
83 ]
85 delete_response = publisher_gateway.delete_featured_snaps(
86 flask.session, {"packages": currently_featured_snap_ids}
87 )
88 if delete_response.status_code != 201:
89 response = {
90 "success": False,
91 "message": "An error occurred while deleting featured snaps",
92 }
93 return make_response(response, 500)
94 snap_ids = [
95 dashboard.get_snap_id(flask.session, snap_name)
96 for snap_name in new_featured_snaps
97 ]
99 update_response = publisher_gateway.update_featured_snaps(
100 flask.session, snap_ids
101 )
102 if update_response.status_code != 201:
103 response = {
104 "success": False,
105 "message": "An error occured while updating featured snaps",
106 }
107 return make_response(response, 500)
108 return make_response({"success": True}, 200)