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

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 

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 

103 

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 

116 

117 field_errors, other_errors = logic.invalid_field_errors(error_list) 

118 

119 countries = [] 

120 for country in pycountry.countries: 

121 countries.append( 

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

123 ) 

124 

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 

131 

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

140 

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

149 

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 } 

173 

174 return flask.jsonify(context)