Coverage for webapp/admin/views.py: 94%

49 statements  

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

1# Packages 

2import os 

3import flask 

4from flask import make_response 

5from canonicalwebteam.store_api.dashboard import Dashboard 

6from canonicalwebteam.store_api.publishergw import PublisherGW 

7from canonicalwebteam.store_api.devicegw import DeviceGW 

8 

9# Local 

10from webapp.decorators import login_required, exchange_required 

11from webapp.helpers import api_publisher_session, api_session 

12 

13dashboard = Dashboard(api_session) 

14publisher_gateway = PublisherGW("snap", api_publisher_session) 

15device_gateway = DeviceGW("snap", api_session) 

16 

17admin = flask.Blueprint( 

18 "admin", __name__, template_folder="/templates", static_folder="/static" 

19) 

20 

21SNAPSTORE_DASHBOARD_API_URL = os.getenv( 

22 "SNAPSTORE_DASHBOARD_API_URL", "https://dashboard.snapcraft.io/" 

23) 

24 

25context = {"api_url": SNAPSTORE_DASHBOARD_API_URL} 

26 

27 

28def get_brand_id(session, store_id): 

29 store = dashboard.get_store(session, store_id) 

30 return store["brand-id"] 

31 

32 

33@admin.route("/admin", defaults={"path": ""}) 

34@admin.route("/admin/<path:path>") 

35@login_required 

36@exchange_required 

37def get_admin(path): 

38 return flask.render_template("admin/admin.html", **context) 

39 

40 

41# -------------------- FEATURED SNAPS AUTOMATION ------------------ 

42@admin.route("/admin/featured", methods=["POST"]) 

43@login_required 

44@exchange_required 

45def post_featured_snaps(): 

46 """ 

47 In this view, we do three things: 

48 1. Fetch all currently featured snaps 

49 2. Delete the currently featured snaps 

50 3. Update featured snaps to be newly featured 

51 

52 Args: 

53 None 

54 

55 Returns: 

56 dict: A dictionary containing the response message and success status. 

57 """ 

58 

59 # new_featured_snaps is the list of featured snaps to be updated 

60 featured_snaps = flask.request.form.get("snaps") 

61 

62 if not featured_snaps: 

63 response = { 

64 "success": False, 

65 "message": "Snaps cannot be empty", 

66 } 

67 return make_response(response, 500) 

68 new_featured_snaps = featured_snaps.split(",") 

69 

70 # currently_featured_snap is the list of featured snaps to be deleted 

71 currently_featured_snaps = [] 

72 

73 next = True 

74 while next: 

75 featured_snaps = device_gateway.get_featured_snaps() 

76 currently_featured_snaps.extend( 

77 featured_snaps.get("_embedded", {}).get("clickindex:package", []) 

78 ) 

79 next = featured_snaps.get("_links", {}).get("next", False) 

80 

81 currently_featured_snap_ids = [ 

82 snap["snap_id"] for snap in currently_featured_snaps 

83 ] 

84 

85 delete_response = publisher_gateway.delete_featured_snaps( 

86 flask.session, {"packages": currently_featured_snap_ids} 

87 ) 

88 if delete_response.status_code != 201: 

89 response = { 

90 "success": False, 

91 "message": "An error occurred while deleting featured snaps", 

92 } 

93 return make_response(response, 500) 

94 snap_ids = [ 

95 dashboard.get_snap_id(flask.session, snap_name) 

96 for snap_name in new_featured_snaps 

97 ] 

98 

99 update_response = publisher_gateway.update_featured_snaps( 

100 flask.session, snap_ids 

101 ) 

102 if update_response.status_code != 201: 

103 response = { 

104 "success": False, 

105 "message": "An error occured while updating featured snaps", 

106 } 

107 return make_response(response, 500) 

108 return make_response({"success": True}, 200)