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

1# Standard library 

2from json import loads 

3 

4# Packages 

5import flask 

6import pycountry 

7from canonicalwebteam.store_api.dashboard import Dashboard 

8from canonicalwebteam.exceptions import ( 

9 StoreApiResponseErrorList, 

10) 

11 

12# Local 

13from webapp.helpers import api_publisher_session, launchpad 

14from webapp.decorators import login_required 

15from webapp.publisher.snaps import logic 

16 

17dashboard = Dashboard(api_publisher_session) 

18 

19 

20@login_required 

21def get_settings_json(snap_name): 

22 return get_settings(snap_name, return_json=True) 

23 

24 

25@login_required 

26def get_settings_data(snap_name): 

27 snap_details = dashboard.get_snap_info(flask.session, snap_name) 

28 

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 = [] 

37 

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 = [] 

46 

47 countries = [] 

48 for country in pycountry.countries: 

49 countries.append({"key": country.alpha_2, "name": country.name}) 

50 

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 

55 

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 } 

76 

77 return flask.jsonify({"success": True, "data": context}) 

78 

79 

80@login_required 

81def get_settings(snap_name, return_json=False): 

82 snap_details = dashboard.get_snap_info(flask.session, snap_name) 

83 

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 = [] 

92 

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 = [] 

101 

102 countries = [] 

103 for country in pycountry.countries: 

104 countries.append({"key": country.alpha_2, "name": country.name}) 

105 

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 

110 

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 } 

131 

132 if return_json: 

133 return flask.jsonify(context) 

134 

135 return flask.render_template("store/publisher.html", **context) 

136 

137 

138@login_required 

139def post_settings_data(snap_name): 

140 changes = None 

141 changed_fields = flask.request.form.get("changes") 

142 

143 if changed_fields: 

144 changes = loads(changed_fields) 

145 

146 if changes: 

147 snap_id = flask.request.form.get("snap_id") 

148 error_list = [] 

149 

150 body_json = logic.filter_changes_data(changes) 

151 

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 

165 

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 

178 

179 field_errors, other_errors = logic.invalid_field_errors(error_list) 

180 

181 countries = [] 

182 for country in pycountry.countries: 

183 countries.append( 

184 {"key": country.alpha_2, "name": country.name} 

185 ) 

186 

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 

193 

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 = [] 

202 

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 = [] 

211 

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 } 

235 

236 return flask.jsonify(context)