mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-03-11 09:04:54 +00:00
Changes to get user management screens started. Updated UserStore to add all expected functions. Added tests for these functions.
This commit is contained in:
parent
a312b6d288
commit
c4cddbfc0e
9
model.py
9
model.py
@ -1,14 +1,15 @@
|
||||
class User(dict):
|
||||
""" Every user must have keys for a username, name, password (this
|
||||
""" Every user must have keys for a username, name, passphrase (this
|
||||
is a md5 hash of the password), groups, and an email address. They can be
|
||||
blank or None, but the keys must exist. """
|
||||
def __init__(self, dict=None):
|
||||
for key in ['username', 'name', 'password', 'email']:
|
||||
for key in ['username', 'name', 'passphrase', 'email']:
|
||||
self[key] = ''
|
||||
for key in ['groups']:
|
||||
self[key] = []
|
||||
for key in dict:
|
||||
self[key] = dict[key]
|
||||
if dict:
|
||||
for key in dict:
|
||||
self[key] = dict[key]
|
||||
|
||||
def __getattr__(self, attr):
|
||||
return None
|
||||
|
||||
@ -12,10 +12,42 @@ class UserStore(UserStoreModule, sqlite_db):
|
||||
self.db_file = cfg.user_db
|
||||
sqlite_db.__init__(self, self.db_file, autocommit=True)
|
||||
self.__enter__()
|
||||
|
||||
def close(self):
|
||||
self.__exit__()
|
||||
def expert(self):
|
||||
return False
|
||||
self.__exit__(None,None,None)
|
||||
|
||||
def expert(self, username=None):
|
||||
groups = self.attr(username,"groups")
|
||||
if not groups:
|
||||
return False
|
||||
return 'expert' in groups
|
||||
|
||||
def attr(self, username=None, field=None):
|
||||
return self.get(username)[field]
|
||||
|
||||
def get(self,username=None):
|
||||
return User(sqlite_db.get(self,username))
|
||||
|
||||
def exists(self, username=None):
|
||||
try:
|
||||
user = self.get(username)
|
||||
if not user:
|
||||
return False
|
||||
elif user["username"]=='':
|
||||
return False
|
||||
return True
|
||||
except TypeError:
|
||||
return False
|
||||
|
||||
def remove(self,username=None):
|
||||
self.__delitem__(username)
|
||||
self.commit()
|
||||
|
||||
def get_all(self):
|
||||
return self.items()
|
||||
|
||||
def set(self,username=None,user=None):
|
||||
sqlite_db.__setitem__(self,username, user)
|
||||
|
||||
class UserStoreOld():
|
||||
#class UserStore(UserStoreModule):
|
||||
|
||||
@ -47,23 +47,25 @@ class add(FormPlugin, PagePlugin):
|
||||
return form.render()
|
||||
|
||||
def process_form(self, username=None, name=None, email=None, md5_password=None, **kwargs):
|
||||
msg = ''
|
||||
msg = Message()
|
||||
|
||||
if not username: msg = add_message(msg, _("Must specify a username!"))
|
||||
if not md5_password: msg = add_message(msg, _("Must specify a password!"))
|
||||
if not username: msg.add = _("Must specify a username!")
|
||||
if not md5_password: msg.add = _("Must specify a password!")
|
||||
|
||||
if username in cfg.users:
|
||||
msg = add_message(msg, _("User already exists!"))
|
||||
if username in cfg.users.keys():
|
||||
msg.add = _("User already exists!")
|
||||
else:
|
||||
try:
|
||||
cfg.users[username]= User(dict={'username':username, 'name':name, 'email':email, 'password':md5_password})
|
||||
di = {'username':username, 'name':name, 'email':email, 'passphrase':md5_password}
|
||||
new_user = User(dict=di)
|
||||
cfg.users.set(username,new_user)
|
||||
except:
|
||||
msg = add_message(msg, _("Error storing user!"))
|
||||
msg.add = _("Error storing user!")
|
||||
|
||||
if not msg:
|
||||
msg = add_message(msg, "%s saved." % username)
|
||||
|
||||
main = self.make_form(username, name, email, message=msg)
|
||||
msg.add = _("%s saved." % username)
|
||||
cfg.log(msg.text)
|
||||
#main = self.make_form(username, name, email, msg=msg.text)
|
||||
return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right)
|
||||
|
||||
class edit(FormPlugin, PagePlugin):
|
||||
@ -114,7 +116,7 @@ class edit(FormPlugin, PagePlugin):
|
||||
msg.add(_("User %s does not exist." % username))
|
||||
else:
|
||||
msg.add = _("Must specify at least one valid, existing user.")
|
||||
main = self.make_form(msg=msg.text)
|
||||
#main = self.make_form(msg=msg.text)
|
||||
return self.fill_template(title="Manage Users and Groups", main=main, sidebar_left=self.sidebar_left, sidebar_right=self.sidebar_right)
|
||||
|
||||
sidebar_right = ''
|
||||
|
||||
9
test.sh
Executable file
9
test.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#! /bin/sh
|
||||
|
||||
PYTHONPATH=build/exmachina:$PYTHONPATH
|
||||
PYTHONPATH=modules/installed/lib:$PYTHONPATH
|
||||
PYTHONPATH=vendor:$PYTHONPATH
|
||||
|
||||
export PYTHONPATH
|
||||
|
||||
python tests/test_user_store.py
|
||||
86
tests/test_user_store.py
Normal file
86
tests/test_user_store.py
Normal file
@ -0,0 +1,86 @@
|
||||
#! /usr/bin/env python
|
||||
# -*- mode: python; mode: auto-fill; fill-column: 80 -*-
|
||||
|
||||
import user_store
|
||||
from logger import Logger
|
||||
import cfg
|
||||
import unittest
|
||||
import cherrypy
|
||||
import plugin_mount
|
||||
import os
|
||||
from model import User
|
||||
cfg.log = Logger()
|
||||
|
||||
cherrypy.log.access_file = None
|
||||
|
||||
class UserStore(unittest.TestCase):
|
||||
"""Test each function of user_store to confirm they work as expected"""
|
||||
|
||||
def setUp(self):
|
||||
cfg.user_db = os.path.join(cfg.file_root, "tests/testdata/users");
|
||||
self.userstore = plugin_mount.UserStoreModule.get_plugins()[0]
|
||||
|
||||
def tearDown(self):
|
||||
for user in self.userstore.get_all():
|
||||
self.userstore.remove(user[0])
|
||||
self.userstore.close()
|
||||
|
||||
def test_user_does_not_exist(self):
|
||||
self.assertEqual(self.userstore.exists("notausername"),False)
|
||||
|
||||
def test_user_does_exist(self):
|
||||
self.add_user("isausername", False)
|
||||
self.assertEqual(self.userstore.exists("isausername"),True)
|
||||
|
||||
def test_add_user(self):
|
||||
self.assertEqual(len(self.userstore.items()),0)
|
||||
self.add_user("test_user", False)
|
||||
self.assertEqual(len(self.userstore.items()),1)
|
||||
|
||||
def test_user_is_in_expert_group(self):
|
||||
self.add_user("test_user", True)
|
||||
self.assertEqual(self.userstore.expert("test_user"),True)
|
||||
|
||||
def test_user_is_not_in_expert_group(self):
|
||||
self.add_user("test_user", False)
|
||||
self.assertEqual(self.userstore.expert("test_user"),False)
|
||||
|
||||
def test_user_removal(self):
|
||||
self.assertEqual(len(self.userstore.items()),0)
|
||||
self.add_user("test_user", False)
|
||||
self.assertEqual(len(self.userstore.items()),1)
|
||||
self.userstore.remove("test_user")
|
||||
self.assertEqual(len(self.userstore.items()),0)
|
||||
|
||||
def test_get_user_email_attribute(self):
|
||||
self.add_user("test_user", False,"test@home")
|
||||
self.assertEqual(self.userstore.attr("test_user","email"),"test@home")
|
||||
|
||||
def test_get_user(self):
|
||||
test_user = self.add_user("test_user", False)
|
||||
self.assertEqual(self.userstore.get("test_user"),test_user)
|
||||
|
||||
def test_get_all_users(self):
|
||||
self.add_user("test_user1", False)
|
||||
self.add_user("test_user2", False)
|
||||
self.assertEqual(len(self.userstore.get_all()),2)
|
||||
|
||||
def add_user(self, test_username, add_to_expert_group, email=''):
|
||||
test_user = self.create_user(test_username, email)
|
||||
if add_to_expert_group:
|
||||
test_user = self.add_user_to_expert_group(test_user)
|
||||
self.userstore.set(test_username,test_user)
|
||||
return test_user
|
||||
|
||||
def create_user(self, username, email=''):
|
||||
test_user = User()
|
||||
test_user["username"] = username
|
||||
test_user["email"] = email
|
||||
return test_user
|
||||
|
||||
def add_user_to_expert_group(self, user):
|
||||
user["groups"] = ["expert"]
|
||||
return user
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
BIN
tests/testdata/users.sqlite3
vendored
Normal file
BIN
tests/testdata/users.sqlite3
vendored
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user