Coverage for webapp/publisher/snaps/release_views.py: 90%

99 statements  

« prev     ^ index     » next       coverage.py v7.14.1, created at 2026-06-15 22:43 +0000

1# Packages 

2import flask 

3from canonicalwebteam.store_api.dashboard import Dashboard 

4from canonicalwebteam.exceptions import StoreApiResponseErrorList 

5 

6# Local 

7from webapp.helpers import api_publisher_session 

8from webapp.decorators import login_required 

9 

10dashboard = Dashboard(api_publisher_session) 

11 

12 

13@login_required 

14def redirect_get_release_history(snap_name): 

15 return flask.redirect( 

16 flask.url_for(".get_release_history", snap_name=snap_name) 

17 ) 

18 

19 

20@login_required 

21def get_releases(snap_name): 

22 # If this fails, the page will 404 

23 dashboard.get_snap_info(flask.session, snap_name) 

24 return flask.render_template("store/publisher.html") 

25 

26 

27@login_required 

28def get_release_status(snap_name): 

29 try: 

30 history = dashboard.snap_release_history(flask.session, snap_name, 1) 

31 except StoreApiResponseErrorList as api_response_error_list: 

32 if api_response_error_list.status_code == 404: 

33 return flask.abort(404, "No snap named {}".format(snap_name)) 

34 return flask.jsonify(api_response_error_list.errors), 400 

35 

36 revisions = [] 

37 if isinstance(history, dict): 

38 revisions = history.get("revisions") or [] 

39 elif isinstance(history, list): 

40 revisions = history 

41 

42 return flask.jsonify({"has_releases": bool(revisions)}) 

43 

44 

45@login_required 

46def redirect_post_release(snap_name): 

47 return flask.redirect( 

48 flask.url_for(".post_release", snap_name=snap_name), 307 

49 ) 

50 

51 

52@login_required 

53def get_release_history_json(snap_name): 

54 page = flask.request.args.get("page", default=1, type=int) 

55 

56 try: 

57 release_history = dashboard.snap_release_history( 

58 flask.session, snap_name, page 

59 ) 

60 except StoreApiResponseErrorList as api_response_error_list: 

61 if api_response_error_list.status_code == 404: 

62 return flask.abort(404, "No snap named {}".format(snap_name)) 

63 else: 

64 return flask.jsonify(api_response_error_list.errors), 400 

65 

66 return flask.jsonify(release_history) 

67 

68 

69@login_required 

70def post_release(snap_name): 

71 data = flask.request.json 

72 

73 if not data: 

74 response = {"errors": ["No changes were submitted"]} 

75 return flask.jsonify(response), 400 

76 

77 try: 

78 response = dashboard.post_snap_release(flask.session, data) 

79 except StoreApiResponseErrorList as api_response_error_list: 

80 if api_response_error_list.status_code == 404: 

81 return flask.abort(404, "No snap named {}".format(snap_name)) 

82 else: 

83 return ( 

84 flask.jsonify( 

85 { 

86 "errors": api_response_error_list.errors, 

87 } 

88 ), 

89 400, 

90 ) 

91 

92 return flask.jsonify(response) 

93 

94 

95@login_required 

96def redirect_post_close_channel(snap_name): 

97 return flask.redirect( 

98 flask.url_for(".post_close_channel", snap_name=snap_name), 307 

99 ) 

100 

101 

102@login_required 

103def post_close_channel(snap_name): 

104 data = flask.request.json 

105 

106 if not data: 

107 return flask.jsonify({}), 400 

108 

109 try: 

110 snap_id = dashboard.get_snap_id(flask.session, snap_name) 

111 except StoreApiResponseErrorList as api_response_error_list: 

112 if api_response_error_list.status_code == 404: 

113 return flask.abort(404, "No snap named {}".format(snap_name)) 

114 else: 

115 return flask.jsonify(api_response_error_list.errors), 400 

116 

117 try: 

118 response = dashboard.post_close_channel(flask.session, snap_id, data) 

119 except StoreApiResponseErrorList as api_response_error_list: 

120 if api_response_error_list.status_code == 404: 

121 return flask.abort(404, "No snap named {}".format(snap_name)) 

122 else: 

123 response = { 

124 "errors": api_response_error_list.errors, 

125 "success": False, 

126 } 

127 return flask.jsonify(response), 400 

128 

129 response["success"] = True 

130 return flask.jsonify(response) 

131 

132 

133@login_required 

134def post_default_track(snap_name): 

135 data = flask.request.json 

136 

137 if not data: 

138 return flask.jsonify({}), 400 

139 

140 try: 

141 snap_id = dashboard.get_snap_id(flask.session, snap_name) 

142 except StoreApiResponseErrorList as api_response_error_list: 

143 if api_response_error_list.status_code == 404: 

144 return flask.abort(404, "No snap named {}".format(snap_name)) 

145 else: 

146 return flask.jsonify(api_response_error_list.errors), 400 

147 

148 try: 

149 dashboard.snap_metadata(flask.session, snap_id, data) 

150 except StoreApiResponseErrorList as api_response_error_list: 

151 if api_response_error_list.status_code == 404: 

152 return flask.abort(404, "No snap named {}".format(snap_name)) 

153 else: 

154 response = { 

155 "errors": api_response_error_list.errors, 

156 "success": False, 

157 } 

158 return flask.jsonify(response), 400 

159 

160 return flask.jsonify({"success": True}) 

161 

162 

163@login_required 

164def get_snap_revision_json(snap_name, revision): 

165 """ 

166 Return JSON object from the publisher API 

167 """ 

168 revision = dashboard.get_snap_revision(flask.session, snap_name, revision) 

169 

170 return flask.jsonify(revision)