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