From 8ed2120a470cf97e6480fa62474a4665cafe41e0 Mon Sep 17 00:00:00 2001
From: Stavros Sachtouris <saxtouri@admin.grnet.gr>
Date: Fri, 24 Apr 2015 13:02:28 +0300
Subject: [PATCH] Create and save settings is they are missing

If some settings are missing (e.g., not found in the configuration
file), agkyra GUI will run and let the user complete them through
the "setting" menu option. If the default_sync, sync or cloud
options are missing, they are created automatically.

Settings are saved only if the user opens the "settings" window.
---
 agkyra/gui/settings.html | 22 +++-------------
 agkyra/protocol.py       | 56 +++++++++++++++++++++++++++++++++-------
 2 files changed, 51 insertions(+), 27 deletions(-)

diff --git a/agkyra/gui/settings.html b/agkyra/gui/settings.html
index 85596c6..c85cad4 100644
--- a/agkyra/gui/settings.html
+++ b/agkyra/gui/settings.html
@@ -45,7 +45,6 @@
                 var removed_at_least_one = false
                 win.cookies.getAll({url: url}, function(cookies) {
                     $.each(cookies, function(i, cookie) {
-                        console.log('I have a cookie to remove ' + cookie.name + ', ' + cookie.domain);
                         win.cookies.remove({url: url, name: cookie.name} );
                         removed_at_least_one = true;
                     });
@@ -56,9 +55,7 @@
             var gui = require('nw.gui');
             var cred_win = null;
             var logout_win = null;
-            var can_close_cred = false;
             var got_cookie = false;
-            var can_close_logout = false;
             var show_creds = true;
             function get_credentials() {
                 var cookie_name = '_pithos2_a';
@@ -80,7 +77,7 @@
                     }
                 });
                 cred_win.on('loaded', function() {
-                    if (got_cookie) can_close_cred = true;
+                    if (got_cookie) cred_win.close();
                 });
 
                 cred_win.on('closed', function() {
@@ -89,10 +86,9 @@
                         {focus: true, width:20, height: 20 });
                     logout_win.hide();
                     logout_win.on('loaded', function() {
-                        while(
-                            remove_cookies(logout_win, get_account_ui()) ||
-                            remove_cookies(logout_win, get_pithos_ui())) {}
-                        can_close_logout = true;
+                        while(remove_cookies(logout_win, get_pithos_ui())) {}
+                        logout_win.close();
+                        show_creds = true;
                     });
                 });
             }
@@ -103,16 +99,6 @@
                 if (get_pithos_ui() && show_creds) {
                     $('#get_creds').show();
                 } else {$('#get_creds').hide(); }
-                // Garbage collector
-                if (can_close_logout) {
-                    can_close_logout = false;
-                    logout_win.close();
-                    show_creds = true;
-                }
-                else if (can_close_cred) {
-                    can_close_cred = false;
-                    cred_win.close();
-                }
             }, 500);
         </script>
     </head>
diff --git a/agkyra/protocol.py b/agkyra/protocol.py
index 1641bd3..c358c01 100644
--- a/agkyra/protocol.py
+++ b/agkyra/protocol.py
@@ -64,15 +64,42 @@ class WebSocketProtocol(WebSocket):
     settings = dict(
         token=None, url=None,
         container=None, directory=None,
-        exclude=None, pithos_ui=None)
+        exclude=None)
     status = dict(progress=0, paused=True)
     file_syncer = None
     cnf = AgkyraConfig()
 
+    def _get_default_sync(self):
+        """Get global.default_sync or pick the first sync as default
+        If there are no syncs, create a 'default' sync.
+        """
+        sync = self.cnf.get('global', 'default_sync')
+        if not sync:
+            for sync in self.cnf.keys('sync'):
+                break
+            self.cnf.set('global', 'default_sync', sync or 'default')
+        return sync or 'default'
+
+    def _get_sync_cloud(self, sync):
+        """Get the <sync>.cloud or pick the first cloud and use it
+        In case of cloud picking, set the cloud as the <sync>.cloud for future
+        sessions.
+        If no clouds are found, create a 'default' cloud, with an empty url.
+        """
+        try:
+            cloud = self.cnf.get_sync(sync, 'cloud')
+        except KeyError:
+            cloud = None
+        if not cloud:
+            for cloud in self.cnf.keys('cloud'):
+                break
+            self.cnf.set_sync(sync, 'cloud', cloud or 'default')
+        return cloud or 'default'
+
     def _load_settings(self):
         LOG.debug('Start loading settings')
-        sync = self.cnf.get('global', 'default_sync')
-        cloud = self.cnf.get_sync(sync, 'cloud')
+        sync = self._get_default_sync()
+        cloud = self._get_sync_cloud(sync)
 
         try:
             self.settings['url'] = self.cnf.get_cloud(cloud, 'url')
@@ -84,16 +111,27 @@ class WebSocketProtocol(WebSocket):
             self.settings['url'] = None
 
         for option in ('container', 'directory', 'exclude'):
-            self.settings[option] = self.cnf.get_sync(sync, option)
+            try:
+                self.settings[option] = self.cnf.get_sync(sync, option)
+            except KeyError:
+                LOG.debug('No %s is set' % option)
 
         LOG.debug('Finished loading settings')
 
     def _dump_settings(self):
         LOG.debug('Saving settings')
-        sync = self.cnf.get('global', 'default_sync')
-        cloud = self.cnf.get_sync(sync, 'cloud')
+        if not self.settings.get('url', None):
+            LOG.debug('No settings to save')
+            return
+
+        sync = self._get_default_sync()
+        cloud = self._get_sync_cloud(sync)
+
+        try:
+            old_url = self.cnf.get_cloud(cloud, 'url') or ''
+        except KeyError:
+            old_url = self.settings['url']
 
-        old_url = self.cnf.get_cloud(cloud, 'url') or ''
         while old_url != self.settings['url']:
             cloud = '%s_%s' % (cloud, sync)
             try:
@@ -102,11 +140,11 @@ class WebSocketProtocol(WebSocket):
                 break
 
         self.cnf.set_cloud(cloud, 'url', self.settings['url'])
-        self.cnf.set_cloud(cloud, 'token', self.settings['token'])
+        self.cnf.set_cloud(cloud, 'token', self.settings['token'] or '')
         self.cnf.set_sync(sync, 'cloud', cloud)
 
         for option in ('directory', 'container', 'exclude'):
-            self.cnf.set_sync(sync, option, self.settings[option])
+            self.cnf.set_sync(sync, option, self.settings[option] or '')
 
         self.cnf.write()
         LOG.debug('Settings saved')
-- 
GitLab