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

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_data(snap_name): 

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

23 

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

32 

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

41 

42 countries = [] 

43 for country in pycountry.countries: 

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

45 

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 

50 

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 } 

71 

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

73 

74 

75@login_required 

76def post_settings_data(snap_name): 

77 changes = None 

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

79 

80 if changed_fields: 

81 changes = loads(changed_fields) 

82 

83 if changes: 

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

85 error_list = [] 

86 

87 body_json = logic.filter_changes_data(changes) 

88 

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 

102 

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 

115 

116 field_errors, other_errors = logic.invalid_field_errors(error_list) 

117 

118 countries = [] 

119 for country in pycountry.countries: 

120 countries.append( 

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

122 ) 

123 

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 

130 

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

139 

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

148 

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 } 

172 

173 return flask.jsonify(context)