Coverage for webapp / endpoints / publisher / settings.py: 60%
68 statements
« prev ^ index » next coverage.py v7.13.1, created at 2025-12-29 22:06 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2025-12-29 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 )
95 return flask.jsonify(response)
96 except StoreApiResponseErrorList as api_response_error_list:
97 if api_response_error_list.status_code == 404:
98 return flask.abort(
99 404, "No snap named {}".format(snap_name)
100 )
101 else:
102 error_list = error_list + api_response_error_list.errors
104 if error_list:
105 try:
106 snap_details = dashboard.get_snap_info(
107 flask.session, snap_name
108 )
109 except StoreApiResponseErrorList as api_response_error_list:
110 if api_response_error_list.status_code == 404:
111 return flask.abort(
112 404, "No snap named {}".format(snap_name)
113 )
114 else:
115 error_list = error_list + api_response_error_list.errors
117 field_errors, other_errors = logic.invalid_field_errors(error_list)
119 countries = []
120 for country in pycountry.countries:
121 countries.append(
122 {"key": country.alpha_2, "name": country.name}
123 )
125 is_on_lp = False
126 lp_snap = launchpad.get_snap_by_store_name(
127 snap_details["snap_name"]
128 )
129 if lp_snap:
130 is_on_lp = True
132 if "whitelist_country_codes" in snap_details:
133 whitelist_country_codes = (
134 snap_details["whitelist_country_codes"]
135 if len(snap_details["whitelist_country_codes"]) > 0
136 else []
137 )
138 else:
139 whitelist_country_codes = []
141 if "blacklist_country_codes" in snap_details:
142 blacklist_country_codes = (
143 snap_details["blacklist_country_codes"]
144 if len(snap_details["blacklist_country_codes"]) > 0
145 else []
146 )
147 else:
148 blacklist_country_codes = []
150 context = {
151 # read-only values from details API
152 "snap_name": snap_details["snap_name"],
153 "snap_title": snap_details["title"],
154 "publisher_name": snap_details["publisher"]["display-name"],
155 "snap_id": snap_details["snap_id"],
156 "private": snap_details["private"],
157 "unlisted": snap_details["unlisted"],
158 "countries": countries,
159 "whitelist_country_codes": whitelist_country_codes,
160 "blacklist_country_codes": blacklist_country_codes,
161 "store": snap_details["store"],
162 "keywords": snap_details["keywords"],
163 "status": snap_details["status"],
164 "is_on_lp": is_on_lp,
165 "update_metadata_on_release": snap_details[
166 "update_metadata_on_release"
167 ],
168 # errors
169 "error_list": error_list,
170 "field_errors": field_errors,
171 "other_errors": other_errors,
172 }
174 return flask.jsonify(context)