Coverage for webapp/endpoints/publisher/settings.py: 60%
68 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# 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_data(snap_name):
22 snap_details = dashboard.get_snap_info(flask.session, snap_name)
24 if "whitelist_country_codes" in snap_details:
25 whitelist_country_codes = (
26 snap_details["whitelist_country_codes"]
27 if len(snap_details["whitelist_country_codes"]) > 0
28 else []
29 )
30 else:
31 whitelist_country_codes = []
33 if "blacklist_country_codes" in snap_details:
34 blacklist_country_codes = (
35 snap_details["blacklist_country_codes"]
36 if len(snap_details["blacklist_country_codes"]) > 0
37 else []
38 )
39 else:
40 blacklist_country_codes = []
42 countries = []
43 for country in pycountry.countries:
44 countries.append({"key": country.alpha_2, "name": country.name})
46 is_on_lp = False
47 lp_snap = launchpad.get_snap_by_store_name(snap_name)
48 if lp_snap:
49 is_on_lp = True
51 context = {
52 "snap_name": snap_details["snap_name"],
53 "snap_title": snap_details["title"],
54 "snap_id": snap_details["snap_id"],
55 "publisher_name": snap_details["publisher"]["display-name"],
56 "license": snap_details["license"],
57 "private": snap_details["private"],
58 "unlisted": snap_details["unlisted"],
59 "countries": countries,
60 "whitelist_countries": whitelist_country_codes,
61 "blacklist_countries": blacklist_country_codes,
62 "store": snap_details["store"],
63 "keywords": snap_details["keywords"],
64 "status": snap_details["status"],
65 "is_on_lp": is_on_lp,
66 "update_metadata_on_release": snap_details[
67 "update_metadata_on_release"
68 ],
69 "visibility_locked": bool(snap_details["visibility_locked"]),
70 }
72 return flask.jsonify({"success": True, "data": context})
75@login_required
76def post_settings_data(snap_name):
77 changes = None
78 changed_fields = flask.request.form.get("changes")
80 if changed_fields:
81 changes = loads(changed_fields)
83 if changes:
84 snap_id = flask.request.form.get("snap_id")
85 error_list = []
87 body_json = logic.filter_changes_data(changes)
89 if body_json:
90 try:
91 response = dashboard.snap_metadata(
92 flask.session, snap_id, body_json
93 )
94 return flask.jsonify(response)
95 except StoreApiResponseErrorList as api_response_error_list:
96 if api_response_error_list.status_code == 404:
97 return flask.abort(
98 404, "No snap named {}".format(snap_name)
99 )
100 else:
101 error_list = error_list + api_response_error_list.errors
103 if error_list:
104 try:
105 snap_details = dashboard.get_snap_info(
106 flask.session, snap_name
107 )
108 except StoreApiResponseErrorList as api_response_error_list:
109 if api_response_error_list.status_code == 404:
110 return flask.abort(
111 404, "No snap named {}".format(snap_name)
112 )
113 else:
114 error_list = error_list + api_response_error_list.errors
116 field_errors, other_errors = logic.invalid_field_errors(error_list)
118 countries = []
119 for country in pycountry.countries:
120 countries.append(
121 {"key": country.alpha_2, "name": country.name}
122 )
124 is_on_lp = False
125 lp_snap = launchpad.get_snap_by_store_name(
126 snap_details["snap_name"]
127 )
128 if lp_snap:
129 is_on_lp = True
131 if "whitelist_country_codes" in snap_details:
132 whitelist_country_codes = (
133 snap_details["whitelist_country_codes"]
134 if len(snap_details["whitelist_country_codes"]) > 0
135 else []
136 )
137 else:
138 whitelist_country_codes = []
140 if "blacklist_country_codes" in snap_details:
141 blacklist_country_codes = (
142 snap_details["blacklist_country_codes"]
143 if len(snap_details["blacklist_country_codes"]) > 0
144 else []
145 )
146 else:
147 blacklist_country_codes = []
149 context = {
150 # read-only values from details API
151 "snap_name": snap_details["snap_name"],
152 "snap_title": snap_details["title"],
153 "publisher_name": snap_details["publisher"]["display-name"],
154 "snap_id": snap_details["snap_id"],
155 "private": snap_details["private"],
156 "unlisted": snap_details["unlisted"],
157 "countries": countries,
158 "whitelist_country_codes": whitelist_country_codes,
159 "blacklist_country_codes": blacklist_country_codes,
160 "store": snap_details["store"],
161 "keywords": snap_details["keywords"],
162 "status": snap_details["status"],
163 "is_on_lp": is_on_lp,
164 "update_metadata_on_release": snap_details[
165 "update_metadata_on_release"
166 ],
167 # errors
168 "error_list": error_list,
169 "field_errors": field_errors,
170 "other_errors": other_errors,
171 }
173 return flask.jsonify(context)