1111from textual .screen import ModalScreen
1212from textual .widgets import Button , Input , Static
1313
14+ from datashuttle .utils import rclone_encryption
15+
1416
1517class SetupAwsScreen (ModalScreen ):
1618 """Dialog window that sets up connection to an Amazon Web Service S3 bucket.
@@ -26,7 +28,7 @@ def __init__(self, interface: Interface) -> None:
2628 super (SetupAwsScreen , self ).__init__ ()
2729
2830 self .interface = interface
29- self .stage = 0
31+ self .stage = "init"
3032
3133 def compose (self ) -> ComposeResult :
3234 """Set widgets on the SetupAwsScreen."""
@@ -52,18 +54,35 @@ def on_mount(self) -> None:
5254 self .query_one ("#setup_aws_secret_access_key_input" ).visible = False
5355
5456 def on_button_pressed (self , event : Button .Pressed ) -> None :
55- """Handle button press on the screen."""
57+ """Handle button press on the screen.
58+
59+ The `setup_aws_ok_button` is used for all 'positive' events ('Yes, Ok')
60+ and 'setup_aws_cancel_button' is used for 'negative' events ('No', 'Cancel').
61+ The appropriate action to take on the button press is determined by the
62+ current stage.
63+
64+ """
5665 if event .button .id == "setup_aws_cancel_button" :
57- self .dismiss ()
66+ if self .stage == "ask_rclone_encryption" :
67+ message = "AWS Connection Successful!" #
68+ self .query_one ("#setup_aws_messagebox_message" ).update (message )
69+ self .query_one ("#setup_aws_ok_button" ).label = "Finish"
70+ self .query_one ("#setup_aws_cancel_button" ).remove ()
71+ self .stage = "finished"
72+ else :
73+ self .dismiss ()
5874
59- if event .button .id == "setup_aws_ok_button" :
60- if self .stage == 0 :
75+ elif event .button .id == "setup_aws_ok_button" :
76+ if self .stage == "init" :
6177 self .prompt_user_for_aws_secret_access_key ()
6278
63- elif self .stage == 1 :
79+ elif self .stage == "use_secret_access_key" :
6480 self .use_secret_access_key_to_setup_aws_connection ()
6581
66- elif self .stage == 2 :
82+ elif self .stage == "ask_rclone_encryption" :
83+ self .set_rclone_encryption ()
84+
85+ elif self .stage == "finished" :
6786 self .dismiss ()
6887
6988 def prompt_user_for_aws_secret_access_key (self ) -> None :
@@ -73,10 +92,15 @@ def prompt_user_for_aws_secret_access_key(self) -> None:
7392 self .query_one ("#setup_aws_messagebox_message" ).update (message )
7493 self .query_one ("#setup_aws_secret_access_key_input" ).visible = True
7594
76- self .stage += 1
95+ self .query_one ("#setup_aws_ok_button" )
96+
97+ self .stage = "use_secret_access_key"
7798
7899 def use_secret_access_key_to_setup_aws_connection (self ) -> None :
79- """Set up the AWS connection and inform user of success or failure."""
100+ """Set up the AWS connection and failure.
101+
102+ If success, move onto the rclone_encryption screen.
103+ """
80104 secret_access_key = self .query_one (
81105 "#setup_aws_secret_access_key_input"
82106 ).value
@@ -86,11 +110,13 @@ def use_secret_access_key_to_setup_aws_connection(self) -> None:
86110 )
87111
88112 if success :
89- message = "AWS Connection Successful!"
90- self .query_one (
91- "#setup_aws_secret_access_key_input"
92- ).visible = False
113+ message = f"{ rclone_encryption .get_explanation_message (self .interface .project .cfg )} "
114+ self .query_one ("#setup_aws_messagebox_message" ).update (message )
93115
116+ self .query_one ("#setup_aws_secret_access_key_input" ).remove ()
117+ self .query_one ("#setup_aws_ok_button" ).label = "Yes"
118+ self .query_one ("#setup_aws_cancel_button" ).label = "No"
119+ self .stage = "ask_rclone_encryption"
94120 else :
95121 message = (
96122 f"AWS setup failed. Please check your configs and secret access key"
@@ -100,7 +126,23 @@ def use_secret_access_key_to_setup_aws_connection(self) -> None:
100126 "#setup_aws_secret_access_key_input"
101127 ).disabled = True
102128
103- self .query_one ("#setup_aws_ok_button" ).label = "Finish"
104- self .query_one ("#setup_aws_messagebox_message" ).update (message )
105- self .query_one ("#setup_aws_cancel_button" ).disabled = True
106- self .stage += 1
129+ self .query_one ("#setup_aws_ok_button" ).label = "Retry"
130+ self .query_one ("#setup_aws_messagebox_message" ).update (message )
131+
132+ def set_rclone_encryption (self ):
133+ """Try and encrypt the Rclone config file and inform the user of success / failure."""
134+ success , output = self .interface .try_setup_rclone_encryption ()
135+
136+ if success :
137+ message = (
138+ "The rclone_encryption was successfully set. Setup complete!"
139+ )
140+ self .query_one ("#setup_aws_messagebox_message" ).update (message )
141+ self .query_one ("#setup_aws_ok_button" ).label = "Finish"
142+ self .query_one ("#setup_aws_cancel_button" ).remove ()
143+ self .stage = "finished"
144+ else :
145+ message = (
146+ f"The rclone_encryption set up failed. Exception: { output } "
147+ )
148+ self .query_one ("#setup_aws_messagebox_message" ).update (message )
0 commit comments