def test_settings_command(self): node = config.SchemaNode(colander.Str(), name="node", default="test") group = config.register_settings("group1", node, title="Section1", description="Description1") group = config.register_settings("group2", node, title="Section2", description="Description2") self._init_ptah() # all sys.argv[1:] = ["-a"] stdout = sys.stdout out = StringIO() sys.stdout = out commands.settingsCommand() sys.stdout = stdout val = out.getvalue() self.assertIn("Section1", val) self.assertIn("Section2", val) self.assertIn("group1.node", val) self.assertIn("group2.node", val) # section sys.argv[1:] = ["-l", "group1"] stdout = sys.stdout out = StringIO() sys.stdout = out commands.settingsCommand() sys.stdout = stdout val = out.getvalue() self.assertIn("Section1", val) self.assertNotIn("Section2", val) self.assertIn("group1.node", val) self.assertNotIn("group2.node", val) # print sys.argv[1:] = ["-p"] stdout = sys.stdout out = StringIO() sys.stdout = out commands.settingsCommand() sys.stdout = stdout val = out.getvalue().strip() self.assertIn("group1.node = test", val) self.assertIn("group2.node = test", val)
def test_settings_group_multiple_validation(self): def validator1(node, appstruct): raise colander.Invalid(node['node1'], 'Error1') def validator2(node, appstruct): raise colander.Invalid(node, 'Error2') node1 = config.SchemaNode( colander.Str(), name = 'node1', default = 'test') node2 = config.SchemaNode( colander.Str(), name = 'node2', default = 'test') group = config.register_settings( 'group3', node1, node2, validator=(validator1, validator2)) self._init_ptah() try: group.schema.deserialize({ 'group3.node1': 'value', 'group3.node2': 'value'}) except colander.Invalid, err: pass
def test_settings_export(self): node1 = config.SchemaNode( colander.Str(), name = 'node1', default = 'test') node2 = config.SchemaNode( colander.Str(), name = 'node2', default = 'test') group = config.register_settings('group4', node1, node2) self._init_ptah() # changed settings self.assertEqual(config.Settings.export(), {}) # default settings self.assertEqual(config.Settings.export(default=True), {'group4.node1': 'test', 'group4.node2': 'test'}) # changed settings group['node2'] = 'changed' data = dict(config.Settings.export()) self.assertEqual(data, {'group4.node2': 'changed'})
def test_settings_register_multiple(self): node = config.SchemaNode( colander.Str(), name = 'node', default = 'test') group = config.register_settings( 'group1', node, title = 'Section title', description = 'Section description', ) node2 = config.SchemaNode( colander.Str(), name = 'node2', default = 'test2') group2 = config.register_settings( 'group1', node2, title = 'Section title', description = 'Section description', ) self.assertTrue(group is group2)
def _create_default_group(self): node1 = config.SchemaNode( colander.Str(), name = 'node1', default = 'default1') node2 = config.SchemaNode( colander.Int(), name = 'node2', default = 10) group = config.register_settings('group', node1, node2) self._init_ptah() group.clear() return group
def test_settings_group_validation(self): def validator(node, appstruct): raise colander.Invalid(node['node'], 'Error') node = config.SchemaNode( colander.Str(), name = 'node', default = 'test') group = config.register_settings( 'group2', node, validator=validator) self._init_ptah() try: group.schema.deserialize({'group2.node': 'value'}) except colander.Invalid, err: pass
def test_settings_initialize_load_default(self): node1 = config.SchemaNode( colander.Str(), name = 'node1', default = 'default1') node2 = config.SchemaNode( colander.Int(), name = 'node2', default = 10) group = config.register_settings('group', node1, node2) self._init_ptah() config.initialize_settings({'group.node1': 'setting from ini'}) self.assertEqual(group['node1'], 'setting from ini') self.assertEqual(group['node2'], 10)
def test_settings_register_simple(self): node = config.SchemaNode( colander.Str(), name = 'node', default = 'test') group = config.register_settings( 'group1', node, title = 'Section title', description = 'Section description', ) self.assertEqual(group.name, 'group1') self.assertEqual(group.title, 'Section title') self.assertEqual(group.description, 'Section description') self.assertEqual(len(group.schema.children), 0) self.assertTrue(isinstance(group.category, InterfaceClass)) self._init_ptah() self.assertEqual(len(group.schema.children), 1) self.assertTrue(group.schema.children[0] is node) self.assertEqual(group.node, 'test') self.assertEqual(group['node'], 'test') self.assertRaises( AttributeError, group.__getattr__, 'unknown') self.assertRaises( KeyError, group.__getitem__, 'unknown') self.assertEqual(config.Settings._changed, None) group.node = 'test2' self.assertFalse(group.node == group['node']) group['node'] = 'test2' self.assertTrue('group1' in config.Settings._changed) self.assertTrue('node' in config.Settings._changed['group1'])
def test_settings_initialize_load_settings_include(self): path = os.path.join(self.dir, 'settings.cfg') f = open(path, 'wb') f.write('[DEFAULT]\ngroup.node1 = value\n\n') f.close() node1 = config.SchemaNode( colander.Str(), name = 'node1', default = 'default1') node2 = config.SchemaNode( colander.Int(), name = 'node2', default = 10) group = config.register_settings('group', node1, node2) self._init_ptah() config.initialize_settings({'include': path}) self.assertEqual(group['node1'], 'value') self.assertEqual(group['node2'], 10)
def test_settings_fs_watcher(self): path = os.path.join(self.dir, 'settings.cfg') f = open(path, 'wb') f.write('[DEFAULT]\ngroup.node1 = value\n\n') f.close() node1 = config.SchemaNode( colander.Str(), name = 'node1', default = 'default1') group = config.register_settings('group', node1) self._init_ptah() class Config(object): def begin(self): pass def end(self): pass config.initialize_settings({'settings': path}, config=Config()) self.assertTrue( isinstance(config.Settings.loader.watcher, iNotifyWatcher)) self.assertEqual(group['node1'], 'value') f = open(path, 'wb') f.write('[DEFAULT]\ngroup.node1 = new_value\n\n') f.close() time.sleep(0.2) self.assertEqual(group['node1'], 'new_value') self.assertTrue(config.Settings.loader.watcher.started) shutdown() self.assertFalse(config.Settings.loader.watcher.started)
CONFIG = config.register_settings( 'manage', config.SchemaNode( config.Sequence(), colander.SchemaNode(colander.Str()), name = 'managers', title = 'Managers', description = 'List of user logins with access rights to '\ 'ptah management ui.', default = ()), config.SchemaNode( colander.Str(), name = 'manage_url', title = 'Ptah manage url', default = '/ptah-manage'), config.SchemaNode( config.Sequence(), colander.SchemaNode(colander.Str()), name = 'disable_modules', title = 'Hide Modules in Management UI', description = 'List of modules names to hide in manage ui', default = ()), config.SchemaNode( config.Sequence(), colander.SchemaNode(colander.Str()), name = 'disable_models', title = 'Hide Models in Model Management UI', description = 'List of models to hide in model manage ui', default = ('cms-type:sqlblob',)), title = 'Ptah manage settings', )
from urlparse import urljoin, urlparse from paste import fileapp, request, httpexceptions from ptah import config from ptah.view import tmpl from ptah.view.customize import LayerWrapper STATIC = config.register_settings( 'static', config.SchemaNode( colander.Str(), name = 'url', default = 'static'), config.SchemaNode( colander.Int(), name = 'cache_max_age', default = 0), title = 'Static resources management', ) STATIC.isurl = False registry = {} dirs = {} def static(name, path, layer=''): """ Register new static assets directory
import colander from chameleon import template as chameleon_template from ptah import config TEMPLATE = config.register_settings( 'template', config.SchemaNode( colander.Bool(), name = 'chameleon_reload', default = False, title = 'Auto reload', description = 'Enable chameleon templates auto reload.'), title = 'Templates settings', ) class _ViewLayersManager(object): def __init__(self): self.layers = {} def register(self, layer, discriminator): data = self.layers.setdefault(discriminator, []) if not layer: data.insert(0, layer) else: data.append(layer)
PWD_CONFIG = config.register_settings( 'ptah-password', config.SchemaNode( colander.Str(), name = 'manager', title = 'Password manager', description = 'Available password managers \ ("plain", "ssha", "bcrypt")', default = 'plain'), config.SchemaNode( colander.Int(), name = 'min_length', title = 'Length', description = 'Password minimium length.', default = 5), config.SchemaNode( colander.Bool(), name = 'letters_digits', title = 'Letters and digits', description = 'Use letters and digits in password.', default = False), config.SchemaNode( colander.Bool(), name = 'letters_mixed_case', title = 'Letters mixed case', description = 'Use letters in mixed case.', default = False), title = 'Password tool settings', )
FORMAT = config.register_settings( 'format', config.SchemaNode( Timezone(), name = 'timezone', default = pytz.timezone('US/Central'), title = _('Timezone'), description = _('Site wide timezone.')), config.SchemaNode( colander.Str(), name = 'date_short', default = u'%m/%d/%y', title = _(u'Date'), description = _(u'Date short format')), config.SchemaNode( colander.Str(), name = 'date_medium', default = u'%b %d, %Y', title = _(u'Date'), description = _(u'Date medium format')), config.SchemaNode( colander.Str(), name = 'date_long', default = u'%B %d, %Y', title = _(u'Date'), description = _(u'Date long format')), config.SchemaNode( colander.Str(), name = 'date_full', default = u'%A, %B %d, %Y', title = _(u'Date'), description = _(u'Date full format')), config.SchemaNode( colander.Str(), name = 'time_short', default = u'%I:%M %p', title = _(u'Time'), description = _(u'Time short format')), config.SchemaNode( colander.Str(), name = 'time_medium', default = u'%I:%M %p', title = _(u'Time'), description = _(u'Time medium format')), config.SchemaNode( colander.Str(), name = 'time_long', default = u'%I:%M %p %z', title = _(u'Time'), description = _(u'Time long format')), config.SchemaNode( colander.Str(), name = 'time_full', default = u'%I:%M:%S %p %Z', title = _(u'Time'), description = _(u'Time full format')), title = 'Site formats', )
MAIL = config.register_settings( 'mail', config.SchemaNode( colander.Str(), name = 'host', title = 'Host', description = 'SMTP Server host name.', default = 'localhost'), config.SchemaNode( colander.Int(), name = 'port', title = 'Port', description = 'SMTP Server port number.', default = 25), config.SchemaNode( colander.Str(), name = 'username', title = 'Username', description = 'SMTP Auth username.', default = ''), config.SchemaNode( colander.Str(), name = 'password', title = 'Password', description = 'SMTP Auth password.', default = ''), config.SchemaNode( colander.Bool(), name = 'no_tls', title = 'No tls', description = 'Disable TLS.', default = False), config.SchemaNode( colander.Bool(), name = 'force_tls', title = 'Force TLS', description = 'Force use TLS.', default = False), config.SchemaNode( colander.Bool(), name = 'debug', title = 'Debug', description = 'Debug smtp.', default = False), config.SchemaNode( colander.Str(), name = 'from_name', default = 'Site administrator'), config.SchemaNode( colander.Str(), name = 'from_address', validator = colander.Email(), required = False, default = '*****@*****.**'), title = 'Mail settings', description = 'Configuration settings for application mail.', )
PTAH_CONFIG = config.register_settings( 'ptah', config.SchemaNode( config.Sequence(), colander.SchemaNode(colander.Str()), name = 'managers', title = 'Managers', description = 'List of user logins with access rights to '\ 'ptah management ui.', default = ()), config.SchemaNode( colander.Str(), name = 'login', title = 'Login url', default = ''), config.SchemaNode( colander.Str(), name = 'pwdmanager', title = 'Password manager', description = 'Available password managers ("plain", "ssha", "bcrypt")', default = 'plain'), config.SchemaNode( config.Sequence(), colander.SchemaNode(colander.Str()), name = 'disable_modules', title = 'Hide Modules in Management UI', description = 'List of modules names to hide in manage ui', default = ()), title = 'Ptah settings', )
import colander from ptah import config nerdfilestest = config.register_settings( 'nerdfilestest', config.SchemaNode( colander.Str(), name = 'band', default = 'Primus', title = 'Favorite band', description = 'This is your favorite band.'), config.SchemaNode( colander.Bool(), name = 'happy', default = True, title = 'Are you happy?', description = 'Does Ptah bring you happiness?'), title = 'nerdfilestest settings', description = 'Configuration settings for nerdfilestest.' )
CROWD = config.register_settings( 'ptah-crowd', config.SchemaNode( colander.Bool(), name = 'provider', title = 'Default user provider', description = 'Enable/Disable default provider', default = True), config.SchemaNode( colander.Bool(), name = 'join', title = 'Site registration', description = 'Enable/Disable site registration', default = True), config.SchemaNode( colander.Str(), name = 'joinurl', title = 'Join form url', default = ''), config.SchemaNode( colander.Bool(), name = 'password', title = 'User password', description = 'Allow use to select password during registration', default = False), config.SchemaNode( colander.Bool(), name = 'validation', title = 'Email validation', description = 'Validate user account by email.', default = True), config.SchemaNode( colander.Bool(), name = 'allow-unvalidated', title = 'Allow un validation', description = 'Allow login for un Validated users.', default = True), title = 'Ptah crowd settings', )
log = logging.getLogger('ptah.view') TEMPLATE = config.register_settings( 'template', config.SchemaNode( colander.Str(), name = 'custom', default = '', title = 'Directory', description = 'Filesystem directory with custom templates.'), config.SchemaNode( colander.Str(), name = 'watcher', default = 'inotify', title = 'Filesystem watcher', description = 'Custom filesystem directory watcher.'), config.SchemaNode( colander.Bool(), name = 'chameleon_reload', default = False, title = 'Auto reload', description = 'Enable chameleon templates auto reload.'), title = 'Templates settings', ) TEMPLATE._manager = None TEMPLATE._watcher = None
SECURITY = config.register_settings( 'auth', config.SchemaNode( colander.Str(), name = 'policy', title = _('Authentication policy'), validator = colander.OneOf(types.keys()), required = False, default = ''), config.SchemaNode( colander.Str(), name = 'secret', title = _('Policy secret'), description = _('The secret (a string) used for auth_tkt ' 'cookie signing'), required = False), config.SchemaNode( colander.Bool(), name = 'authorization', title = _('Authorization policy'), description = _('Enable/disable default authorization policy.'), required = False, default = True), title = _('Pyramid authentication settings'), validator = config.RequiredWithDependency('secret','policy','auth_tkt',''), ) SECURITY['callback'] = LocalRoles