Initial user preferences infrastructure
authorSimo Sorce <simo@redhat.com>
Thu, 12 Dec 2013 19:21:41 +0000 (14:21 -0500)
committerSimo Sorce <simo@redhat.com>
Thu, 19 Dec 2013 04:05:57 +0000 (23:05 -0500)
Signed-off-by: Simo Sorce <simo@redhat.com>
examples/ipsilon.conf
src/root.py
src/util/data.py
templates/index.html

index dc45a1b..17cf5e9 100644 (file)
@@ -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"
index d4cd900..0c6cd41 100755 (executable)
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+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):
index 871f991..ec64588 100755 (executable)
@@ -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)
index 230edc7..b38d105 100644 (file)
@@ -8,15 +8,28 @@
 </head>
 <body>
     <div id="container">
-        <div id="background">
-            <div id="background-header"></div>
-            <div id="background-navigation"></div>
-            <div id="background-left"></div>
-            <div id="background-center"></div>
-            <div id="background-right"></div>
+        <div id="logo">
+            <p>Ipsilon</p>
+        </div>
+        <div id="admin">
+            {% if user.is_admin %}
+                <a href="admin">admin</a>
+            {% endif %}
+        </div>
+        <div id="welcome">
+            {% if user.name %}
+                <p>Welcome {{ user.fullname }}</p>
+            {% endif %}
         </div>
         <div id="content">
-            <p>{{ content }}</p>
+            {% if not user.name %}
+                <p>Please <a href="login">Log In</a>
+            {% elif user.sites %}
+                <p>Registered application shortcuts:</p>
+                {% for site in user.sites %}
+                    <p><a href="{{ site.link }}">{{ site.name }}</a></p>
+                {% endfor %}
+            {% endif %}
         </div>
     </div>
 </body>