Coverage for webapp/publisher/snaps/settings_views.py: 19%
91 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# Standard library
2from json import loads
4# Packages
5import flask
6import pycountry
7from canonicalwebteam.store_api.dashboard import Dashboard
8from canonicalwebteam.exceptions import (
9 StoreApiResponseErrorList,
10)
12# Local
13from webapp.helpers import api_publisher_session, launchpad
14from webapp.decorators import login_required
15from webapp.publisher.snaps import logic
17dashboard = Dashboard(api_publisher_session)
20@login_required
21def get_settings_json(snap_name):
22 return get_settings(snap_name, return_json=True)
25@login_required
26def get_settings_data(snap_name):
27 snap_details = dashboard.get_snap_info(flask.session, snap_name)
29 if "whitelist_country_codes" in snap_details:
30 whitelist_country_codes = (
31 snap_details["whitelist_country_codes"]
32 if len(snap_details["whitelist_country_codes"]) > 0
33 else []
34 )
35 else:
36 whitelist_country_codes = []
38 if "blacklist_country_codes" in snap_details:
39 blacklist_country_codes = (
40 snap_details["blacklist_country_codes"]
41 if len(snap_details["blacklist_country_codes"]) > 0
42 else []
43 )
44 else:
45 blacklist_country_codes = []
47 countries = []
48 for country in pycountry.countries:
49 countries.append({"key": country.alpha_2, "name": country.name})
51 is_on_lp = False
52 lp_snap = launchpad.get_snap_by_store_name(snap_name)
53 if lp_snap:
54 is_on_lp = True
56 context = {
57 "snap_name": snap_details["snap_name"],
58 "snap_title": snap_details["title"],
59 "snap_id": snap_details["snap_id"],
60 "publisher_name": snap_details["publisher"]["display-name"],
61 "license": snap_details["license"],
62 "private": snap_details["private"],
63 "unlisted": snap_details["unlisted"],
64 "countries": countries,
65 "whitelist_countries": whitelist_country_codes,
66 "blacklist_countries": blacklist_country_codes,
67 "store": snap_details["store"],
68 "keywords": snap_details["keywords"],
69 "status": snap_details["status"],
70 "is_on_lp": is_on_lp,
71 "update_metadata_on_release": snap_details[
72 "update_metadata_on_release"
73 ],
74 "visibility_locked": snap_details["visibility_locked"] | False,
75 }
77 return flask.jsonify({"success": True, "data": context})
80@login_required
81def get_settings(snap_name, return_json=False):
82 snap_details = dashboard.get_snap_info(flask.session, snap_name)
84 if "whitelist_country_codes" in snap_details:
85 whitelist_country_codes = (
86 snap_details["whitelist_country_codes"]
87 if len(snap_details["whitelist_country_codes"]) > 0
88 else []
89 )
90 else:
91 whitelist_country_codes = []
93 if "blacklist_country_codes" in snap_details:
94 blacklist_country_codes = (
95 snap_details["blacklist_country_codes"]
96 if len(snap_details["blacklist_country_codes"]) > 0
97 else []
98 )
99 else:
100 blacklist_country_codes = []
102 countries = []
103 for country in pycountry.countries:
104 countries.append({"key": country.alpha_2, "name": country.name})
106 is_on_lp = False
107 lp_snap = launchpad.get_snap_by_store_name(snap_name)
108 if lp_snap:
109 is_on_lp = True
111 context = {
112 "snap_name": snap_details["snap_name"],
113 "snap_title": snap_details["title"],
114 "snap_id": snap_details["snap_id"],
115 "publisher_name": snap_details["publisher"]["display-name"],
116 "license": snap_details["license"],
117 "private": snap_details["private"],
118 "unlisted": snap_details["unlisted"],
119 "countries": countries,
120 "whitelist_country_codes": whitelist_country_codes,
121 "blacklist_country_codes": blacklist_country_codes,
122 "store": snap_details["store"],
123 "keywords": snap_details["keywords"],
124 "status": snap_details["status"],
125 "is_on_lp": is_on_lp,
126 "update_metadata_on_release": snap_details[
127 "update_metadata_on_release"
128 ],
129 "visibility_locked": snap_details["visibility_locked"] | False,
130 }
132 if return_json:
133 return flask.jsonify(context)
135 return flask.render_template("store/publisher.html", **context)
138@login_required
139def post_settings_data(snap_name):
140 changes = None
141 changed_fields = flask.request.form.get("changes")
143 if changed_fields:
144 changes = loads(changed_fields)
146 if changes:
147 snap_id = flask.request.form.get("snap_id")
148 error_list = []
150 body_json = logic.filter_changes_data(changes)
152 if body_json:
153 try:
154 response = dashboard.snap_metadata(
155 flask.session, snap_id, body_json
156 )
157 return flask.jsonify(response)
158 except StoreApiResponseErrorList as api_response_error_list:
159 if api_response_error_list.status_code == 404:
160 return flask.abort(
161 404, "No snap named {}".format(snap_name)
162 )
163 else:
164 error_list = error_list + api_response_error_list.errors
166 if error_list:
167 try:
168 snap_details = dashboard.get_snap_info(
169 flask.session, snap_name
170 )
171 except StoreApiResponseErrorList as api_response_error_list:
172 if api_response_error_list.status_code == 404:
173 return flask.abort(
174 404, "No snap named {}".format(snap_name)
175 )
176 else:
177 error_list = error_list + api_response_error_list.errors
179 field_errors, other_errors = logic.invalid_field_errors(error_list)
181 countries = []
182 for country in pycountry.countries:
183 countries.append(
184 {"key": country.alpha_2, "name": country.name}
185 )
187 is_on_lp = False
188 lp_snap = launchpad.get_snap_by_store_name(
189 snap_details["snap_name"]
190 )
191 if lp_snap:
192 is_on_lp = True
194 if "whitelist_country_codes" in snap_details:
195 whitelist_country_codes = (
196 snap_details["whitelist_country_codes"]
197 if len(snap_details["whitelist_country_codes"]) > 0
198 else []
199 )
200 else:
201 whitelist_country_codes = []
203 if "blacklist_country_codes" in snap_details:
204 blacklist_country_codes = (
205 snap_details["blacklist_country_codes"]
206 if len(snap_details["blacklist_country_codes"]) > 0
207 else []
208 )
209 else:
210 blacklist_country_codes = []
212 context = {
213 # read-only values from details API
214 "snap_name": snap_details["snap_name"],
215 "snap_title": snap_details["title"],
216 "publisher_name": snap_details["publisher"]["display-name"],
217 "snap_id": snap_details["snap_id"],
218 "private": snap_details["private"],
219 "unlisted": snap_details["unlisted"],
220 "countries": countries,
221 "whitelist_country_codes": whitelist_country_codes,
222 "blacklist_country_codes": blacklist_country_codes,
223 "store": snap_details["store"],
224 "keywords": snap_details["keywords"],
225 "status": snap_details["status"],
226 "is_on_lp": is_on_lp,
227 "update_metadata_on_release": snap_details[
228 "update_metadata_on_release"
229 ],
230 # errors
231 "error_list": error_list,
232 "field_errors": field_errors,
233 "other_errors": other_errors,
234 }
236 return flask.jsonify(context)