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

49 statements  

« prev     ^ index     » next       coverage.py v7.10.5, created at 2025-08-26 22:06 +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 

13 

14dashboard = Dashboard(api_session) 

15publisher_gateway = PublisherGW("snap", api_publisher_session) 

16device_gateway = DeviceGW("snap", api_session) 

17 

18admin = flask.Blueprint( 

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

20) 

21 

22SNAPSTORE_DASHBOARD_API_URL = os.getenv( 

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

24) 

25 

26context = {"api_url": SNAPSTORE_DASHBOARD_API_URL} 

27 

28 

29def get_brand_id(session, store_id): 

30 store = dashboard.get_store(session, store_id) 

31 return store["brand-id"] 

32 

33 

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

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

36@login_required 

37@exchange_required 

38def get_admin(path): 

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

40 

41 

42# -------------------- FEATURED SNAPS AUTOMATION ------------------ 

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

44@login_required 

45@exchange_required 

46def post_featured_snaps(): 

47 """ 

48 In this view, we do three things: 

49 1. Fetch all currently featured snaps 

50 2. Delete the currently featured snaps 

51 3. Update featured snaps to be newly featured 

52 

53 Args: 

54 None 

55 

56 Returns: 

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

58 """ 

59 

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

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

62 

63 if not featured_snaps: 

64 response = { 

65 "success": False, 

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

67 } 

68 return make_response(response, 500) 

69 new_featured_snaps = featured_snaps.split(",") 

70 

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

72 currently_featured_snaps = [] 

73 

74 next = True 

75 while next: 

76 featured_snaps = device_gateway.get_featured_snaps() 

77 currently_featured_snaps.extend( 

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

79 ) 

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

81 

82 currently_featured_snap_ids = [ 

83 snap["snap_id"] for snap in currently_featured_snaps 

84 ] 

85 

86 delete_response = publisher_gateway.delete_featured_snaps( 

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

88 ) 

89 if delete_response.status_code != 201: 

90 response = { 

91 "success": False, 

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

93 } 

94 return make_response(response, 500) 

95 snap_ids = [ 

96 dashboard.get_snap_id(flask.session, snap_name) 

97 for snap_name in new_featured_snaps 

98 ] 

99 

100 update_response = publisher_gateway.update_featured_snaps( 

101 flask.session, snap_ids 

102 ) 

103 if update_response.status_code != 201: 

104 response = { 

105 "success": False, 

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

107 } 

108 return make_response(response, 500) 

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