Coverage for webapp/publisher/snaps/release_views.py: 84%
93 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-28 22:05 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-28 22:05 +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_release_history_data(snap_name):
22 release_history = dashboard.snap_release_history(flask.session, snap_name)
24 channel_map = dashboard.snap_channel_map(flask.session, snap_name)
26 snap = channel_map.get("snap", {})
28 context = {
29 "snap_name": snap_name,
30 "snap_title": snap.get("title"),
31 "publisher_name": snap.get("publisher", {}).get("display-name", {}),
32 "release_history": release_history,
33 "private": snap.get("private"),
34 "default_track": (
35 snap.get("default-track")
36 if snap.get("default-track") is not None
37 else "latest"
38 ),
39 "channel_map": channel_map.get("channel-map"),
40 "tracks": snap.get("tracks"),
41 }
43 return flask.jsonify({"success": True, "data": context})
46@login_required
47def get_releases(snap_name):
48 # If this fails, the page will 404
49 dashboard.get_snap_info(flask.session, snap_name)
50 return flask.render_template("store/publisher.html")
53@login_required
54def redirect_post_release(snap_name):
55 return flask.redirect(
56 flask.url_for(".post_release", snap_name=snap_name), 307
57 )
60@login_required
61def get_release_history_json(snap_name):
62 page = flask.request.args.get("page", default=1, type=int)
64 try:
65 release_history = dashboard.snap_release_history(
66 flask.session, snap_name, page
67 )
68 except StoreApiResponseErrorList as api_response_error_list:
69 if api_response_error_list.status_code == 404:
70 return flask.abort(404, "No snap named {}".format(snap_name))
71 else:
72 return flask.jsonify(api_response_error_list.errors), 400
74 return flask.jsonify(release_history)
77@login_required
78def post_release(snap_name):
79 data = flask.request.json
81 if not data:
82 response = {"errors": ["No changes were submitted"]}
83 return flask.jsonify(response), 400
85 try:
86 response = dashboard.post_snap_release(flask.session, data)
87 except StoreApiResponseErrorList as api_response_error_list:
88 if api_response_error_list.status_code == 404:
89 return flask.abort(404, "No snap named {}".format(snap_name))
90 else:
91 response = {
92 "errors": api_response_error_list,
93 }
94 return flask.jsonify(response), 400
96 return flask.jsonify(response)
99@login_required
100def redirect_post_close_channel(snap_name):
101 return flask.redirect(
102 flask.url_for(".post_close_channel", snap_name=snap_name), 307
103 )
106@login_required
107def post_close_channel(snap_name):
108 data = flask.request.json
110 if not data:
111 return flask.jsonify({}), 400
113 try:
114 snap_id = dashboard.get_snap_id(flask.session, snap_name)
115 except StoreApiResponseErrorList as api_response_error_list:
116 if api_response_error_list.status_code == 404:
117 return flask.abort(404, "No snap named {}".format(snap_name))
118 else:
119 return flask.jsonify(api_response_error_list.errors), 400
121 try:
122 response = dashboard.post_close_channel(flask.session, snap_id, data)
123 except StoreApiResponseErrorList as api_response_error_list:
124 if api_response_error_list.status_code == 404:
125 return flask.abort(404, "No snap named {}".format(snap_name))
126 else:
127 response = {
128 "errors": api_response_error_list.errors,
129 "success": False,
130 }
131 return flask.jsonify(response), 400
133 response["success"] = True
134 return flask.jsonify(response)
137@login_required
138def post_default_track(snap_name):
139 data = flask.request.json
141 if not data:
142 return flask.jsonify({}), 400
144 try:
145 snap_id = dashboard.get_snap_id(flask.session, snap_name)
146 except StoreApiResponseErrorList as api_response_error_list:
147 if api_response_error_list.status_code == 404:
148 return flask.abort(404, "No snap named {}".format(snap_name))
149 else:
150 return flask.jsonify(api_response_error_list.errors), 400
152 try:
153 dashboard.snap_metadata(flask.session, snap_id, data)
154 except StoreApiResponseErrorList as api_response_error_list:
155 if api_response_error_list.status_code == 404:
156 return flask.abort(404, "No snap named {}".format(snap_name))
157 else:
158 response = {
159 "errors": api_response_error_list.errors,
160 "success": False,
161 }
162 return flask.jsonify(response), 400
164 return flask.jsonify({"success": True})
167@login_required
168def get_snap_revision_json(snap_name, revision):
169 """
170 Return JSON object from the publisher API
171 """
172 revision = dashboard.get_snap_revision(flask.session, snap_name, revision)
174 return flask.jsonify(revision)