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