From 65940eac4fd4fe2e15d8f7cf3fbc0def1b264824 Mon Sep 17 00:00:00 2001
From: Stavros Sachtouris <saxtouri@admin.grnet.gr>
Date: Wed, 8 Jul 2015 15:15:23 +0300
Subject: [PATCH] Support GUI control of language and sync_on_start

---
 agkyra/config.py                           |   2 +
 agkyra/nwgui/menu.html                     |   4 +-
 agkyra/nwgui/protocol.js                   |   4 +-
 agkyra/nwgui/settings.html                 |  77 +++++++++++++++++----
 agkyra/nwgui/static/images/language/el.png | Bin 0 -> 1282 bytes
 agkyra/nwgui/static/images/language/en.png | Bin 0 -> 3943 bytes
 agkyra/protocol.py                         |  19 ++++-
 agkyra/scripts/cli.py                      |   2 +-
 agkyra/scripts/gui.py                      |   2 +-
 agkyra/scripts/server.py                   |   2 +-
 agkyra/ui_data/common_el.json              |   2 +
 agkyra/ui_data/common_en.json              |   2 +
 agkyra/ui_data/languages.json              |  10 +++
 13 files changed, 103 insertions(+), 23 deletions(-)
 create mode 100644 agkyra/nwgui/static/images/language/el.png
 create mode 100644 agkyra/nwgui/static/images/language/en.png
 create mode 100644 agkyra/ui_data/languages.json

diff --git a/agkyra/config.py b/agkyra/config.py
index 9f35d25..d1de923 100644
--- a/agkyra/config.py
+++ b/agkyra/config.py
@@ -59,6 +59,8 @@ SYNC_PREFIX = 'sync'
 config.DEFAULTS = {
     'global': {
         'agkyra_dir': AGKYRA_DIR,
+        'sync_on_start': 'on',
+        'language': 'en'
     },
     CLOUD_PREFIX: {
         # <cloud>: {
diff --git a/agkyra/nwgui/menu.html b/agkyra/nwgui/menu.html
index eed7d93..50bb6e1 100644
--- a/agkyra/nwgui/menu.html
+++ b/agkyra/nwgui/menu.html
@@ -117,10 +117,10 @@ var settings_menu = new gui.MenuItem({
     $.each(globals.settings, function(key, val) {old_settings[key]=val;});
     windows['settings'] = gui.Window.open("settings.html", {
       toolbar: false, focus: true,
-      width: 860, height: 620
+      width: 860, height: 860
     });
     windows['settings'].on('closed', function() {
-      log_debug('Settings windows is closed');
+    log_debug('Settings windows is closed');
     globals.settings_are_open = false;
       var new_settings = import_settings();
       $.each(new_settings, function(key, setting) {
diff --git a/agkyra/nwgui/protocol.js b/agkyra/nwgui/protocol.js
index 9e9b4b9..a75b717 100644
--- a/agkyra/nwgui/protocol.js
+++ b/agkyra/nwgui/protocol.js
@@ -37,7 +37,9 @@ var globals = {
     url: null,
     container: null,
     directory: null,
-    exclude: null
+    exclude: null,
+    language: 'en',
+    sync_on_start: true
   },
   status: {synced: 0, unsynced: 0, failed: 0, code: STATUS['UNINITIALIZED']},
   authenticated: false,
diff --git a/agkyra/nwgui/settings.html b/agkyra/nwgui/settings.html
index 7622a04..c8b35de 100644
--- a/agkyra/nwgui/settings.html
+++ b/agkyra/nwgui/settings.html
@@ -24,9 +24,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
         <script type="text/javascript">
             var path = require('path');
             var fs = require('fs');
-            var COMMON = JSON.parse(
-                fs.readFileSync(path.join('..', 'ui_data/common_en.json')));
-            var SETTINGS = COMMON.SETTINGS;
+            var LANG = JSON.parse(fs.readFileSync(path.join('..', 'ui_data/languages.json')));
 
             var errors = {
                 cloud_url_empty: 'Provide a Cloud Authentication URL',
@@ -41,6 +39,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
             var fs = require('fs');
             var exclude = null;
+            var cur_lang = 'en';
             $(document).ready(function() {
                 var url = get_setting('url')
                 if (url) {
@@ -62,7 +61,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
                     $('#exclude').val(
                         fs.readFileSync(exclude, encoding='utf-8'));
                 } catch (err) {console.log(err);}
+                if (!get_setting('language')) set_setting('language', cur_lang);
+                if (get_setting('sync_on_start')) $('#start_sync_box').click();
+
             });
+            cur_lang = get_setting('language');
+
             function update_exclude(new_content) {
                 if (exclude) fs.writeFile(exclude, new_content);
             }
@@ -192,6 +196,42 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
                 return cloud && token && container && directory;
             }
 
+            function check_start_sync() {
+                settings['sync_on_start'] = $('#start_sync_box').is(':checked');
+            }
+
+            function localize() {
+                settings['language'] = cur_lang;
+                var COMMON = JSON.parse(
+                fs.readFileSync(path.join('..', 'ui_data/common_' + cur_lang + '.json')));
+                var SETTINGS = COMMON.SETTINGS;
+                document.getElementById('title').innerHTML = SETTINGS.TITLE;
+                document.getElementById('appearance_label').innerHTML = SETTINGS.APPEARANCE;
+                document.getElementById('language_label').innerHTML = SETTINGS.LANGUAGE;
+                document.getElementById('cloud_label').innerHTML = SETTINGS.CLOUD;
+                document.getElementById('url_label').innerHTML = SETTINGS.URL;
+                document.getElementById('token_label').innerHTML = SETTINGS.TOKEN;
+                document.getElementById('get_creds').innerHTML = SETTINGS.RETRIEVE;
+                document.getElementById('sync_label').innerHTML = SETTINGS.SYNC;
+                document.getElementById('container_label').innerHTML = SETTINGS.CONTAINER;
+                document.getElementById('directory_label').innerHTML = SETTINGS.DIRECTORY;
+                document.getElementById('dirdialogue_label').innerHTML = SETTINGS.DIRDIALOGUE;
+                document.getElementById('sync_button').innerHTML = SETTINGS.SAVE;
+
+                var lang_code = '';
+                for (key in LANG) {
+                    var lang = LANG[key];
+                    var checked = ''
+                    if (key === cur_lang) checked = 'checked'
+                    lang_code += '<div class="small-1 columns">'
+                        + '<input type="radio" name="language" value="' + key + '" '
+                        + checked
+                        + ' onclick="cur_lang=\'' + key + '\'; localize();">'
+                        + lang.name + '<img src="' + lang.icon + '"/></input></div>';
+                }
+                document.getElementById('language_space').innerHTML = lang_code;
+            }
+
             window.setInterval(function() {
                 // Refresh get_creds visibility, until refresh_endpoints
                 // changes are in effect
@@ -209,12 +249,30 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
                 <h2><img src="static/images/about.png"/> <span id="title">User Settings</span></h2>
             </header>
             <form>
+                <fieldset>
+                    <legend id="appearance_label">Appearance</legend>
+                    <div class="clearfix">
+                        <div class="small-3 columns">
+                            <label id="language_label" for="language_space" class="right inline">Language</label>
+                        </div>
+                        <div class="small-9 columns" id="language_space">
+                        <!-- This will be filled by scripts -->
+                        </div>
+                    </div>
+                    <div class="clearfix">
+                        <div class="small-3 columns">
+                            <label id="start_sync_label" for="start_sync" class="right inline">Sync on start up</label>
+                        </div>
+                        <div class="small-9 columns" id="start_sync">
+                            <input type="checkbox" name="start_sync_box" id="start_sync_box" onchange="check_start_sync();"/>
+                        </div>
+                    </div>
+                </fieldset>
                 <fieldset>
                     <legend id="cloud_label">Cloud</legend>
                     <div class="clearfix">
                         <div class="small-3 columns">
                             <label id="url_label" for="cloud-url" class="right inline">Cloud URL</label>
-
                         </div>
                         <div class="small-9 columns" id="cloud-error">
                             <input type="text" id="cloud-url" placeholder="Authentication URL"
@@ -294,16 +352,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
             </form>
         </div>
         <script type="text/javascript">
-            document.getElementById('title').innerHTML = SETTINGS.TITLE;
-            document.getElementById('cloud_label').innerHTML = SETTINGS.CLOUD;
-            document.getElementById('url_label').innerHTML = SETTINGS.URL;
-            document.getElementById('token_label').innerHTML = SETTINGS.TOKEN;
-            document.getElementById('get_creds').innerHTML = SETTINGS.RETRIEVE;
-            document.getElementById('sync_label').innerHTML = SETTINGS.SYNC;
-            document.getElementById('container_label').innerHTML = SETTINGS.CONTAINER;
-            document.getElementById('directory_label').innerHTML = SETTINGS.DIRECTORY;
-            document.getElementById('dirdialogue_label').innerHTML = SETTINGS.DIRDIALOGUE;
-            document.getElementById('sync_button').innerHTML = SETTINGS.SAVE;
+            localize();
         </script>
     </body>
 </html>
diff --git a/agkyra/nwgui/static/images/language/el.png b/agkyra/nwgui/static/images/language/el.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d630715a32389edfccb3d1eac7f9715fbf7b892
GIT binary patch
literal 1282
zcmV+d1^xPoP)<h;3K|Lk000e1NJLTq000yK000yS1^@s6jfou%00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-v<T_9UNOiB$faG1dmBX
zK~y-)eUyD@)nydNKhN)Z?(cWE-R*karpBC8GtjgbEGsBqCu-$ODOnOlRFJ(W6;xD2
z8AVhuQz|7Rqi8`1C5f1sB}InW%F4=oY17Tk?e5;Y?f&lD@8$HzW>$t@cz8Gm&X;q(
z=kSI9;PH(cnR4abN<`E@(lMaobRZ&X)WyryqBWcTTaG#_!*B&Dfr`2r55DlpvKf~)
zjIK>Meh_fDqo=rI{~t%cUVHz1AkF_k#eu$|;LDanYSz?=qu%^r`&-vsG<Lx;H{$(t
zyjQfgEZZ0ws>{QwvWRuGquaEf=-9gEo@IAze0_cY%KKJ_0M0)<ysc@g_3pan+9#g5
ztLvuA>Pj_<xV@(}ho=<fwv7NwCfAVne0;A+|A1R;ZSOR5@7*xs<MnrDZfKkx0;n-_
z@8I~Zw*e|wzOtp?i^Sxq#Z%PqVO4y4JV%J4%r*#cRYRPT@8kPE`Fx(7n`Qs6$BHW!
zHdX*Z*(KMZnDZO!8{c<=QIp<SJbmiT)rm^SlvUw44#t>&>GQ>r6e5tx7D)~i=*jfa
z-j&R^w*J}N{qx>cE!#Hdtw-nY)~la<ws`*N5w~lj9H+bj$F|X0pCx$2vanDnt<hSe
zw2iTyvZ6%pYT33qUw{2-J*eT;cRoA$idj#o@?lg|4db)bS5X;_u<c-yFcjkDhW<jp
zwUeqb)|tZyi#alxG@hGb{L(cK<PLoJngw8DwaenMs9#eVr8?$dslg(n6)0#=7ueU<
z$3Vd+TMTeZ!Qd}Y@Py8kD=V&_wj96!h&Jb?-BMU-hbT{wA;P0QIl8kYL=?udcy4Da
zeFcwH&Lf%i=*hSwQ@!NU-G2U5@A$t7<BswpDkKa;Qf`qj6aWGd0s&)zh+rFwm~8-s
zR^Z@JDN$S%Rh=1?O`j&5QK!FoY}te*H6uq+T~kAOL?HtAU0shLXRcMwEGP&=^0_?8
zWDlvHgn4Yk&wKX(MviQ;)P#p#T0HaeB_qQqwSi467UD!AD5X#qs3ArX5QHEQN}fk{
zpr77kA1B(A?0KhY-AB#OYo(idRQPahwVL;6iwqw#T31%9vWhs-vM9FE*xEvCYp|;z
zpcDv2&!>>jQ*a0H`@6$Lq3iI#_NJM>Up%Gd)0biFv_P_%^mz^AmIPR$jaHVWu`GoE
zp+FE0ju`|2L8%B{4y(`?PE1%<+paCE!f4r#xV^z?Z&HAD<2{cz|Nh;V(skruP)eT^
zDfEd*UPOvRFDFvSNGWwvx{mzfANu}lnSIO3SEoU=(nN=pwhUN?@za+oAYR{i+uAQa
z-zlxX?Dvyxhr~VACZ$w|6jL4Io@$ex*5Bmtfqnk&-Mgh~>cXdicw+K&g{48;7(##0
z1uvK=?U{M~i#p$Za(3gE9bCBl5o+riablqL(53}SE~LA5@%^S3Z=HK#%X=fI^vg91
zgo9rJ!Py2IuSuvr*N)(rIGGMZY{WEGf9XYnz_GnQP|O}siF!|5H%%$!aZXtOHUu+g
sm5z?POxvKVKvzwgsm+{K`dk!$0g)mh25c!kM*si-07*qoM6N<$f)qe@0{{R3

literal 0
HcmV?d00001

diff --git a/agkyra/nwgui/static/images/language/en.png b/agkyra/nwgui/static/images/language/en.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d6ff425b5aa46118dbf89dc3811c0774a2eeed9
GIT binary patch
literal 3943
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
BSKt5u

literal 0
HcmV?d00001

diff --git a/agkyra/protocol.py b/agkyra/protocol.py
index 4ccf689..4987932 100644
--- a/agkyra/protocol.py
+++ b/agkyra/protocol.py
@@ -234,7 +234,9 @@ class WebSocketProtocol(WebSocket):
             "url": <auth url>,
             "container": <container>,
             "directory": <local directory>,
-            "exclude": <file path>
+            "exclude": <file path>,
+            "language": <en|el>,
+            "sync_on_start": <true|false>
         } or {<ERROR>: <ERROR CODE>}
 
     -- PUT SETTINGS --
@@ -244,7 +246,9 @@ class WebSocketProtocol(WebSocket):
             "url": <auth url>,
             "container": <container>,
             "directory": <local directory>,
-            "exclude": <file path>
+            "exclude": <file path>,
+            "language": <en|el>,
+            "sync_on_start": <true|false>
         }
     HELPER: {"CREATED": 201, "action": "put settings",} or
         {<ERROR>: <ERROR CODE>, "action": "get settings",}
@@ -266,7 +270,7 @@ class WebSocketProtocol(WebSocket):
     settings = dict(
         token=None, url=None,
         container=None, directory=None,
-        exclude=None)
+        exclude=None, sync_on_start=True, language="en")
     cnf = AgkyraConfig()
     essentials = ('url', 'token', 'container', 'directory')
 
@@ -380,6 +384,10 @@ class WebSocketProtocol(WebSocket):
             self.settings['url'] = None
             self.set_status(code=STATUS['SETTINGS MISSING'])
 
+        self.settings['sync_on_start'] = (
+            self.cnf.get('global', 'sync_on_start') == 'on')
+        self.settings['language'] = self.cnf.get('global', 'language')
+
         # for option in ('container', 'directory', 'exclude'):
         for option in ('container', 'directory'):
             try:
@@ -425,6 +433,11 @@ class WebSocketProtocol(WebSocket):
             self.cnf.set_sync(sync, option, self.settings[option] or '')
             changes = True
 
+        self.cnf.set('global', 'language', self.settings.get('language', 'en'))
+        sync_on_start = self.settings.get('sync_on_start', False)
+        self.cnf.set(
+            'global', 'sync_on_start', 'on' if sync_on_start else 'off')
+
         if changes:
             self.cnf.write()
             LOG.debug('Settings saved')
diff --git a/agkyra/scripts/cli.py b/agkyra/scripts/cli.py
index 8f59589..45ec8c2 100755
--- a/agkyra/scripts/cli.py
+++ b/agkyra/scripts/cli.py
@@ -34,7 +34,7 @@ FORMATTER = logging.Formatter(
     "%(name)s:%(lineno)s %(levelname)s:%(asctime)s:%(message)s")
 HANDLER.setFormatter(FORMATTER)
 LOGGER.addHandler(HANDLER)
-LOGGER.setLevel(logging.DEBUG)
+LOGGER.setLevel(logging.INFO)
 
 
 def main():
diff --git a/agkyra/scripts/gui.py b/agkyra/scripts/gui.py
index f826d36..ddc6953 100755
--- a/agkyra/scripts/gui.py
+++ b/agkyra/scripts/gui.py
@@ -34,7 +34,7 @@ FORMATTER = logging.Formatter(
     "%(name)s:%(lineno)s %(levelname)s:%(asctime)s:%(message)s")
 HANDLER.setFormatter(FORMATTER)
 LOGGER.addHandler(HANDLER)
-LOGGER.setLevel(logging.DEBUG)
+LOGGER.setLevel(logging.INFO)
 
 
 def main():
diff --git a/agkyra/scripts/server.py b/agkyra/scripts/server.py
index 6096a46..fd86a13 100644
--- a/agkyra/scripts/server.py
+++ b/agkyra/scripts/server.py
@@ -26,7 +26,7 @@ FORMATTER = logging.Formatter(
     "%(name)s:%(lineno)s %(levelname)s:%(asctime)s:%(message)s")
 HANDLER.setFormatter(FORMATTER)
 LOGGER.addHandler(HANDLER)
-LOGGER.setLevel(logging.DEBUG)
+LOGGER.setLevel(logging.INFO)
 
 
 def main():
diff --git a/agkyra/ui_data/common_el.json b/agkyra/ui_data/common_el.json
index 2d97b77..ed37091 100644
--- a/agkyra/ui_data/common_el.json
+++ b/agkyra/ui_data/common_el.json
@@ -48,6 +48,8 @@
     },
     "SETTINGS": {
         "TITLE": "ΑυθμίσΡις χρΞ�στη",
+        "APPEARANCE": "Εμφάνιση",
+        "LANGUAGE": "Ξ“Ξ»ΟŽΟƒΟƒΞ±",
         "CLOUD": "Απομακρυσμένο σύστημα (νέφος)",
         "URL": "URL νέφους",
         "TOKEN": "ΚλΡιδί token",
diff --git a/agkyra/ui_data/common_en.json b/agkyra/ui_data/common_en.json
index a05f75f..7c67bd0 100644
--- a/agkyra/ui_data/common_en.json
+++ b/agkyra/ui_data/common_en.json
@@ -48,6 +48,8 @@
     },
     "SETTINGS": {
         "TITLE": "User Settings",
+        "APPEARANCE": "Appearance",
+        "LANGUAGE": "Language",
         "CLOUD": "Cloud",
         "URL": "Cloud URL",
         "TOKEN": "User Token",
diff --git a/agkyra/ui_data/languages.json b/agkyra/ui_data/languages.json
new file mode 100644
index 0000000..c32b5b9
--- /dev/null
+++ b/agkyra/ui_data/languages.json
@@ -0,0 +1,10 @@
+{
+    "en": {
+        "name": "English",
+        "icon": "static/images/language/en.png"
+    },
+    "el": {
+        "name": "Ελληνικά",
+        "icon": "static/images/language/el.png"
+    }
+}
\ No newline at end of file
-- 
GitLab