From 1e97d03807bd893152bf2cbd0f20102af9c8f80d Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Thu, 12 Dec 2013 14:21:41 -0500 Subject: [PATCH] Initial user preferences infrastructure Signed-off-by: Simo Sorce --- examples/ipsilon.conf | 1 + src/root.py | 61 ++++++++++++++++++++++++++++++++++++++++++- src/util/data.py | 49 +++++++++++++++++++++++++++++++++- templates/index.html | 27 ++++++++++++++----- 4 files changed, 129 insertions(+), 9 deletions(-) diff --git a/examples/ipsilon.conf b/examples/ipsilon.conf index dc45a1b..17cf5e9 100644 --- a/examples/ipsilon.conf +++ b/examples/ipsilon.conf @@ -2,3 +2,4 @@ log.screen = True base.dir = "../" admin.config.db = "/var/lib/ipsilon/adminconfig.sqlite" +user.prefs.db = "/var/lib/ipsilon/userprefs.sqlite" diff --git a/src/root.py b/src/root.py index d4cd900..0c6cd41 100755 --- a/src/root.py +++ b/src/root.py @@ -17,8 +17,67 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +from util import data import cherrypy +class Site(object): + def __init__(self, value): + # implement lookup of sites id for link/name + self.link = value + self.name = value + +class User(object): + def __init__(self, username): + if username is None: + self.name = None + self._userdata = dict() + else: + self._userdata = self._get_user_data(username) + self.name = username + + def _get_user_data(self, username): + store = data.Store() + return store._get_user_preferences(username) + + @property + def is_admin(self): + if 'is_admin' in self._userdata: + if self._userdata['is_admin'] == '1': + return True + return False + + @is_admin.setter + def is_admin(self, value): + if value is True: + self._userdata['is_admin'] = '1' + else: + self._userdata['is_admin'] = '0' + + @property + def fullname(self): + if 'fullname' in self._userdata: + return self._userdata['fullname'] + else: + return self.name + + @fullname.setter + def fullname(self, value): + self._userdata['fullname'] = value + + @property + def sites(self): + if 'sites' in self._userdata: + d = [] + for site in self._userdata['sites']: + d.append(Site(site)) + else: + return [] + + @sites.setter + def sites(self): + #TODO: implement setting sites via the user object ? + raise AttributeError + class Root(object): def __init__(self, template_env): @@ -27,7 +86,7 @@ class Root(object): @cherrypy.expose def index_html(self): tmpl = self._env.get_template('index.html') - return tmpl.render(title='Root', content='Awesome!') + return tmpl.render(title='Root', user=User(None)) @cherrypy.expose def index(self): diff --git a/src/util/data.py b/src/util/data.py index 871f991..ec64588 100755 --- a/src/util/data.py +++ b/src/util/data.py @@ -51,7 +51,15 @@ class Store(object): conf = {} for row in rows: - conf[row[0]] = row[1] + if row[0] in conf: + # multivalued + if conf[row[0]] is list: + conf[row[0]].append(row[1]) + else: + v = conf[row[0]] + conf[row[0]] = [v, row[1]] + else: + conf[row[0]] = row[1] return conf @@ -63,3 +71,42 @@ class Store(object): path = os.path.join(self._path, 'adminconfig.sqlite') return self._load_config(path) + + def _load_user_prefs(self, dbname, user): + con = None + rows = [] + try: + con = sqlite3.connect(dbname) + cur = con.cursor() + cur.executescript(""" + CREATE TABLE IF NOT EXISTS users(name TEXT, + option TEXT, + value TEXT) + """) + cur.execute("SELECT option, value FROM users " + "where name = '%s'" % user) + rows = cur.fetchall() + con.commit() + except sqlite3.Error, e: + if con: + con.rollback() + cherrypy.log.error("Failed to load %s's prefs from " + "%s: [%s]" % ( user, dbname, e)) + finally: + if con: + con.close() + + conf = {} + for row in rows: + conf[row[0]] = row[1] + + return conf + + def _get_user_preferences(self, user): + path = None + if 'user.prefs.db' in cherrypy.config: + path = cherrypy.config['user.prefs.db'] + if not path: + path = os.path.join(self._path, 'userprefs.sqlite') + + return self._load_user_prefs(path, user) diff --git a/templates/index.html b/templates/index.html index 230edc7..b38d105 100644 --- a/templates/index.html +++ b/templates/index.html @@ -8,15 +8,28 @@
-
-
-
-
-
-
+ +
+ {% if user.is_admin %} + admin + {% endif %} +
+
+ {% if user.name %} +

Welcome {{ user.fullname }}

+ {% endif %}
-

{{ content }}

+ {% if not user.name %} +

Please Log In + {% elif user.sites %} +

Registered application shortcuts:

+ {% for site in user.sites %} +

{{ site.name }}

+ {% endfor %} + {% endif %}
-- 2.20.1