Coverage for webapp/publisher/snaps/release_views.py: 90%
99 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 flask
3from canonicalwebteam.store_api.dashboard import Dashboard
4from canonicalwebteam.exceptions import StoreApiResponseErrorList
6# Local
7from webapp.helpers import api_publisher_session
8from webapp.decorators import login_required
10dashboard = Dashboard(api_publisher_session)
13@login_required
14def redirect_get_release_history(snap_name):
15 return flask.redirect(
16 flask.url_for(".get_release_history", snap_name=snap_name)
17 )
20@login_required
21def get_releases(snap_name):
22 # If this fails, the page will 404
23 dashboard.get_snap_info(flask.session, snap_name)
24 return flask.render_template("store/publisher.html")
27@login_required
28def get_release_status(snap_name):
29 try:
30 history = dashboard.snap_release_history(flask.session, snap_name, 1)
31 except StoreApiResponseErrorList as api_response_error_list:
32 if api_response_error_list.status_code == 404:
33 return flask.abort(404, "No snap named {}".format(snap_name))
34 return flask.jsonify(api_response_error_list.errors), 400
36 revisions = []
37 if isinstance(history, dict):
38 revisions = history.get("revisions") or []
39 elif isinstance(history, list):
40 revisions = history
42 return flask.jsonify({"has_releases": bool(revisions)})
45@login_required
46def redirect_post_release(snap_name):
47 return flask.redirect(
48 flask.url_for(".post_release", snap_name=snap_name), 307
49 )
52@login_required
53def get_release_history_json(snap_name):
54 page = flask.request.args.get("page", default=1, type=int)
56 try:
57 release_history = dashboard.snap_release_history(
58 flask.session, snap_name, page
59 )
60 except StoreApiResponseErrorList as api_response_error_list:
61 if api_response_error_list.status_code == 404:
62 return flask.abort(404, "No snap named {}".format(snap_name))
63 else:
64 return flask.jsonify(api_response_error_list.errors), 400
66 return flask.jsonify(release_history)
69@login_required
70def post_release(snap_name):
71 data = flask.request.json
73 if not data:
74 response = {"errors": ["No changes were submitted"]}
75 return flask.jsonify(response), 400
77 try:
78 response = dashboard.post_snap_release(flask.session, data)
79 except StoreApiResponseErrorList as api_response_error_list:
80 if api_response_error_list.status_code == 404:
81 return flask.abort(404, "No snap named {}".format(snap_name))
82 else:
83 return (
84 flask.jsonify(
85 {
86 "errors": api_response_error_list.errors,
87 }
88 ),
89 400,
90 )
92 return flask.jsonify(response)
95@login_required
96def redirect_post_close_channel(snap_name):
97 return flask.redirect(
98 flask.url_for(".post_close_channel", snap_name=snap_name), 307
99 )
102@login_required
103def post_close_channel(snap_name):
104 data = flask.request.json
106 if not data:
107 return flask.jsonify({}), 400
109 try:
110 snap_id = dashboard.get_snap_id(flask.session, snap_name)
111 except StoreApiResponseErrorList as api_response_error_list:
112 if api_response_error_list.status_code == 404:
113 return flask.abort(404, "No snap named {}".format(snap_name))
114 else:
115 return flask.jsonify(api_response_error_list.errors), 400
117 try:
118 response = dashboard.post_close_channel(flask.session, snap_id, data)
119 except StoreApiResponseErrorList as api_response_error_list:
120 if api_response_error_list.status_code == 404:
121 return flask.abort(404, "No snap named {}".format(snap_name))
122 else:
123 response = {
124 "errors": api_response_error_list.errors,
125 "success": False,
126 }
127 return flask.jsonify(response), 400
129 response["success"] = True
130 return flask.jsonify(response)
133@login_required
134def post_default_track(snap_name):
135 data = flask.request.json
137 if not data:
138 return flask.jsonify({}), 400
140 try:
141 snap_id = dashboard.get_snap_id(flask.session, snap_name)
142 except StoreApiResponseErrorList as api_response_error_list:
143 if api_response_error_list.status_code == 404:
144 return flask.abort(404, "No snap named {}".format(snap_name))
145 else:
146 return flask.jsonify(api_response_error_list.errors), 400
148 try:
149 dashboard.snap_metadata(flask.session, snap_id, data)
150 except StoreApiResponseErrorList as api_response_error_list:
151 if api_response_error_list.status_code == 404:
152 return flask.abort(404, "No snap named {}".format(snap_name))
153 else:
154 response = {
155 "errors": api_response_error_list.errors,
156 "success": False,
157 }
158 return flask.jsonify(response), 400
160 return flask.jsonify({"success": True})
163@login_required
164def get_snap_revision_json(snap_name, revision):
165 """
166 Return JSON object from the publisher API
167 """
168 revision = dashboard.get_snap_revision(flask.session, snap_name, revision)
170 return flask.jsonify(revision)