better sqlalchemy integration
This commit is contained in:
parent
6fbc4accb9
commit
69de44bbb4
|
@ -82,7 +82,7 @@ def make_description4():
|
||||||
|
|
||||||
def test_mandatory_ro():
|
def test_mandatory_ro():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man001')
|
||||||
config.read_only()
|
config.read_only()
|
||||||
prop = []
|
prop = []
|
||||||
try:
|
try:
|
||||||
|
@ -94,21 +94,31 @@ def test_mandatory_ro():
|
||||||
config.str1 = 'yes'
|
config.str1 = 'yes'
|
||||||
config.read_only()
|
config.read_only()
|
||||||
assert config.str1 == 'yes'
|
assert config.str1 == 'yes'
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_rw():
|
def test_mandatory_rw():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man002')
|
||||||
config.read_write()
|
config.read_write()
|
||||||
#not mandatory in rw
|
#not mandatory in rw
|
||||||
config.str1
|
config.str1
|
||||||
config.str1 = 'yes'
|
config.str1 = 'yes'
|
||||||
assert config.str1 == 'yes'
|
assert config.str1 == 'yes'
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_default():
|
def test_mandatory_default():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man003')
|
||||||
config.read_only()
|
config.read_only()
|
||||||
#not mandatory in rw
|
#not mandatory in rw
|
||||||
config.str
|
config.str
|
||||||
|
@ -125,11 +135,16 @@ def test_mandatory_default():
|
||||||
except PropertiesOptionError as err:
|
except PropertiesOptionError as err:
|
||||||
prop = err.proptype
|
prop = err.proptype
|
||||||
assert 'mandatory' in prop
|
assert 'mandatory' in prop
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_delete():
|
def test_mandatory_delete():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man004')
|
||||||
config.read_only()
|
config.read_only()
|
||||||
config.str
|
config.str
|
||||||
try:
|
try:
|
||||||
|
@ -150,12 +165,17 @@ def test_mandatory_delete():
|
||||||
assert 'mandatory' in prop
|
assert 'mandatory' in prop
|
||||||
del(config.str)
|
del(config.str)
|
||||||
assert config.str1 == 'yes'
|
assert config.str1 == 'yes'
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
#valeur vide : None, '', u'', ...
|
#valeur vide : None, '', u'', ...
|
||||||
def test_mandatory_none():
|
def test_mandatory_none():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man005')
|
||||||
config.str1 = None
|
config.str1 = None
|
||||||
assert config.getowner(config.unwrap_from_path('str1')) == 'user'
|
assert config.getowner(config.unwrap_from_path('str1')) == 'user'
|
||||||
config.read_only()
|
config.read_only()
|
||||||
|
@ -165,11 +185,16 @@ def test_mandatory_none():
|
||||||
except PropertiesOptionError as err:
|
except PropertiesOptionError as err:
|
||||||
prop = err.proptype
|
prop = err.proptype
|
||||||
assert 'mandatory' in prop
|
assert 'mandatory' in prop
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_empty():
|
def test_mandatory_empty():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man006')
|
||||||
config.str1 = ''
|
config.str1 = ''
|
||||||
assert config.getowner(config.unwrap_from_path('str1')) == 'user'
|
assert config.getowner(config.unwrap_from_path('str1')) == 'user'
|
||||||
config.read_only()
|
config.read_only()
|
||||||
|
@ -179,11 +204,16 @@ def test_mandatory_empty():
|
||||||
except PropertiesOptionError as err:
|
except PropertiesOptionError as err:
|
||||||
prop = err.proptype
|
prop = err.proptype
|
||||||
assert 'mandatory' in prop
|
assert 'mandatory' in prop
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_multi_none():
|
def test_mandatory_multi_none():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man007')
|
||||||
config.str3 = [None]
|
config.str3 = [None]
|
||||||
assert config.getowner(config.unwrap_from_path('str3')) == 'user'
|
assert config.getowner(config.unwrap_from_path('str3')) == 'user'
|
||||||
config.read_only()
|
config.read_only()
|
||||||
|
@ -203,11 +233,16 @@ def test_mandatory_multi_none():
|
||||||
except PropertiesOptionError as err:
|
except PropertiesOptionError as err:
|
||||||
prop = err.proptype
|
prop = err.proptype
|
||||||
assert 'mandatory' in prop
|
assert 'mandatory' in prop
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_multi_empty():
|
def test_mandatory_multi_empty():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man008')
|
||||||
config.str3 = []
|
config.str3 = []
|
||||||
assert config.getowner(config.unwrap_from_path('str3')) == 'user'
|
assert config.getowner(config.unwrap_from_path('str3')) == 'user'
|
||||||
config.read_only()
|
config.read_only()
|
||||||
|
@ -239,11 +274,16 @@ def test_mandatory_multi_empty():
|
||||||
except PropertiesOptionError as err:
|
except PropertiesOptionError as err:
|
||||||
prop = err.proptype
|
prop = err.proptype
|
||||||
assert 'mandatory' in prop
|
assert 'mandatory' in prop
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_multi_empty_allow_empty_list():
|
def test_mandatory_multi_empty_allow_empty_list():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man009')
|
||||||
config.str4 = []
|
config.str4 = []
|
||||||
assert config.getowner(config.unwrap_from_path('str4')) == 'user'
|
assert config.getowner(config.unwrap_from_path('str4')) == 'user'
|
||||||
config.read_only()
|
config.read_only()
|
||||||
|
@ -271,19 +311,29 @@ def test_mandatory_multi_empty_allow_empty_list():
|
||||||
except PropertiesOptionError as err:
|
except PropertiesOptionError as err:
|
||||||
prop = err.proptype
|
prop = err.proptype
|
||||||
assert 'mandatory' in prop
|
assert 'mandatory' in prop
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_multi_append():
|
def test_mandatory_multi_append():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man010')
|
||||||
config.str3 = ['yes']
|
config.str3 = ['yes']
|
||||||
config.read_write()
|
config.read_write()
|
||||||
config.str3.append(None)
|
config.str3.append(None)
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_disabled():
|
def test_mandatory_disabled():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man011')
|
||||||
setting = config.cfgimpl_get_settings()
|
setting = config.cfgimpl_get_settings()
|
||||||
config.str1
|
config.str1
|
||||||
config.read_only()
|
config.read_only()
|
||||||
|
@ -300,11 +350,16 @@ def test_mandatory_disabled():
|
||||||
except PropertiesOptionError as err:
|
except PropertiesOptionError as err:
|
||||||
prop = err.proptype
|
prop = err.proptype
|
||||||
assert set(prop) == set(['disabled', 'mandatory'])
|
assert set(prop) == set(['disabled', 'mandatory'])
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_unicode():
|
def test_mandatory_unicode():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man012')
|
||||||
config.unicode2
|
config.unicode2
|
||||||
config.read_only()
|
config.read_only()
|
||||||
prop = []
|
prop = []
|
||||||
|
@ -322,11 +377,16 @@ def test_mandatory_unicode():
|
||||||
except PropertiesOptionError as err:
|
except PropertiesOptionError as err:
|
||||||
prop = err.proptype
|
prop = err.proptype
|
||||||
assert prop == ['mandatory']
|
assert prop == ['mandatory']
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_warnings_ro():
|
def test_mandatory_warnings_ro():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man013')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
config.read_only()
|
config.read_only()
|
||||||
proc = []
|
proc = []
|
||||||
|
@ -341,11 +401,16 @@ def test_mandatory_warnings_ro():
|
||||||
config.read_only()
|
config.read_only()
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
|
||||||
|
try:
|
||||||
|
delete_session('config', config.impl_getsessionid())
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
del(config)
|
||||||
|
|
||||||
|
|
||||||
def test_mandatory_warnings_rw():
|
def test_mandatory_warnings_rw():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man100')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
config.read_write()
|
config.read_write()
|
||||||
config.str
|
config.str
|
||||||
|
@ -354,7 +419,7 @@ def test_mandatory_warnings_rw():
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man100')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -362,7 +427,7 @@ def test_mandatory_warnings_rw():
|
||||||
|
|
||||||
def test_mandatory_warnings_disabled():
|
def test_mandatory_warnings_disabled():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man101')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
setting = config.cfgimpl_get_settings()
|
setting = config.cfgimpl_get_settings()
|
||||||
config.read_write()
|
config.read_write()
|
||||||
|
@ -372,7 +437,7 @@ def test_mandatory_warnings_disabled():
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str1', 'unicode2', 'str3']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man101')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -380,7 +445,7 @@ def test_mandatory_warnings_disabled():
|
||||||
|
|
||||||
def test_mandatory_warnings_hidden():
|
def test_mandatory_warnings_hidden():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man102')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
setting = config.cfgimpl_get_settings()
|
setting = config.cfgimpl_get_settings()
|
||||||
config.read_write()
|
config.read_write()
|
||||||
|
@ -391,7 +456,7 @@ def test_mandatory_warnings_hidden():
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str', 'str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings(force_permissive=True)) == ['str', 'str1', 'unicode2', 'str3']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man102')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -399,7 +464,7 @@ def test_mandatory_warnings_hidden():
|
||||||
|
|
||||||
def test_mandatory_warnings_frozen():
|
def test_mandatory_warnings_frozen():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man103')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
setting = config.cfgimpl_get_settings()
|
setting = config.cfgimpl_get_settings()
|
||||||
config.read_write()
|
config.read_write()
|
||||||
|
@ -409,7 +474,7 @@ def test_mandatory_warnings_frozen():
|
||||||
config.read_only()
|
config.read_only()
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'unicode2', 'str3']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man103')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -423,12 +488,12 @@ def test_mandatory_master():
|
||||||
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
interface1.impl_set_group_type(groups.master)
|
interface1.impl_set_group_type(groups.master)
|
||||||
o = OptionDescription('o', '', [interface1])
|
o = OptionDescription('o', '', [interface1])
|
||||||
config = Config(o)
|
config = Config(o, session_id='man104')
|
||||||
config.read_only()
|
config.read_only()
|
||||||
raises(PropertiesOptionError, 'config.ip_admin_eth0.ip_admin_eth0')
|
raises(PropertiesOptionError, 'config.ip_admin_eth0.ip_admin_eth0')
|
||||||
raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
|
raises(PropertiesOptionError, 'config.ip_admin_eth0.netmask_admin_eth0')
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man104')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -442,10 +507,10 @@ def test_mandatory_warnings_master():
|
||||||
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
interface1.impl_set_group_type(groups.master)
|
interface1.impl_set_group_type(groups.master)
|
||||||
o = OptionDescription('o', '', [interface1])
|
o = OptionDescription('o', '', [interface1])
|
||||||
config = Config(o)
|
config = Config(o, session_id='man105')
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['ip_admin_eth0.ip_admin_eth0']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['ip_admin_eth0.ip_admin_eth0']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man105')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -458,7 +523,7 @@ def test_mandatory_master_empty():
|
||||||
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
interface1.impl_set_group_type(groups.master)
|
interface1.impl_set_group_type(groups.master)
|
||||||
o = OptionDescription('o', '', [interface1])
|
o = OptionDescription('o', '', [interface1])
|
||||||
config = Config(o)
|
config = Config(o, session_id='man106')
|
||||||
config.read_write()
|
config.read_write()
|
||||||
assert config.ip_admin_eth0.ip_admin_eth0 == []
|
assert config.ip_admin_eth0.ip_admin_eth0 == []
|
||||||
assert config.ip_admin_eth0.netmask_admin_eth0 == []
|
assert config.ip_admin_eth0.netmask_admin_eth0 == []
|
||||||
|
@ -489,7 +554,7 @@ def test_mandatory_master_empty():
|
||||||
assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
|
assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
|
||||||
assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
|
assert config.ip_admin_eth0.netmask_admin_eth0 == [None]
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man106')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -502,7 +567,7 @@ def test_mandatory_warnings_master_empty():
|
||||||
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
interface1.impl_set_group_type(groups.master)
|
interface1.impl_set_group_type(groups.master)
|
||||||
o = OptionDescription('o', '', [interface1])
|
o = OptionDescription('o', '', [interface1])
|
||||||
config = Config(o)
|
config = Config(o, session_id='man107')
|
||||||
config.read_write()
|
config.read_write()
|
||||||
config.ip_admin_eth0.ip_admin_eth0.append()
|
config.ip_admin_eth0.ip_admin_eth0.append()
|
||||||
assert config.ip_admin_eth0.ip_admin_eth0 == [None]
|
assert config.ip_admin_eth0.ip_admin_eth0 == [None]
|
||||||
|
@ -520,7 +585,7 @@ def test_mandatory_warnings_master_empty():
|
||||||
config.ip_admin_eth0.ip_admin_eth0 = ['ip']
|
config.ip_admin_eth0.ip_admin_eth0 = ['ip']
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == []
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == []
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man107')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -533,7 +598,7 @@ def test_mandatory_slave():
|
||||||
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
interface1.impl_set_group_type(groups.master)
|
interface1.impl_set_group_type(groups.master)
|
||||||
o = OptionDescription('o', '', [interface1])
|
o = OptionDescription('o', '', [interface1])
|
||||||
config = Config(o)
|
config = Config(o, session_id='man108')
|
||||||
config.read_only()
|
config.read_only()
|
||||||
assert config.ip_admin_eth0.ip_admin_eth0 == []
|
assert config.ip_admin_eth0.ip_admin_eth0 == []
|
||||||
assert config.ip_admin_eth0.netmask_admin_eth0 == []
|
assert config.ip_admin_eth0.netmask_admin_eth0 == []
|
||||||
|
@ -556,7 +621,7 @@ def test_mandatory_slave():
|
||||||
assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
|
assert config.ip_admin_eth0.ip_admin_eth0 == ['ip']
|
||||||
assert config.ip_admin_eth0.netmask_admin_eth0 == ['ip']
|
assert config.ip_admin_eth0.netmask_admin_eth0 == ['ip']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man108')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -569,7 +634,7 @@ def test_mandatory_warnings_slave():
|
||||||
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
interface1 = OptionDescription('ip_admin_eth0', '', [ip_admin_eth0, netmask_admin_eth0])
|
||||||
interface1.impl_set_group_type(groups.master)
|
interface1.impl_set_group_type(groups.master)
|
||||||
o = OptionDescription('o', '', [interface1])
|
o = OptionDescription('o', '', [interface1])
|
||||||
config = Config(o)
|
config = Config(o, session_id='man109')
|
||||||
config.read_only()
|
config.read_only()
|
||||||
assert config.ip_admin_eth0.ip_admin_eth0 == []
|
assert config.ip_admin_eth0.ip_admin_eth0 == []
|
||||||
assert config.ip_admin_eth0.netmask_admin_eth0 == []
|
assert config.ip_admin_eth0.netmask_admin_eth0 == []
|
||||||
|
@ -579,7 +644,7 @@ def test_mandatory_warnings_slave():
|
||||||
config.ip_admin_eth0.ip_admin_eth0.append('ip')
|
config.ip_admin_eth0.ip_admin_eth0.append('ip')
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['ip_admin_eth0.netmask_admin_eth0']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['ip_admin_eth0.netmask_admin_eth0']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man109')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -587,7 +652,7 @@ def test_mandatory_warnings_slave():
|
||||||
|
|
||||||
def test_mandatory_warnings_symlink():
|
def test_mandatory_warnings_symlink():
|
||||||
descr = make_description_sym()
|
descr = make_description_sym()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man110')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
setting = config.cfgimpl_get_settings()
|
setting = config.cfgimpl_get_settings()
|
||||||
config.read_write()
|
config.read_write()
|
||||||
|
@ -597,7 +662,7 @@ def test_mandatory_warnings_symlink():
|
||||||
config.read_only()
|
config.read_only()
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str', 'str1', 'str3']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man110')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -605,7 +670,7 @@ def test_mandatory_warnings_symlink():
|
||||||
|
|
||||||
def test_mandatory_warnings_validate():
|
def test_mandatory_warnings_validate():
|
||||||
descr = make_description3()
|
descr = make_description3()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man111')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())")
|
raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())")
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1', 'int1']
|
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1', 'int1']
|
||||||
|
@ -613,7 +678,7 @@ def test_mandatory_warnings_validate():
|
||||||
raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())")
|
raises(ValueError, "list(config.cfgimpl_get_values().mandatory_warnings())")
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str1', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str1', 'str3']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man111')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -621,13 +686,13 @@ def test_mandatory_warnings_validate():
|
||||||
|
|
||||||
def test_mandatory_warnings_validate_empty():
|
def test_mandatory_warnings_validate_empty():
|
||||||
descr = make_description2()
|
descr = make_description2()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man112')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
config.read_only()
|
config.read_only()
|
||||||
raises(ConfigError, "list(config.cfgimpl_get_values().mandatory_warnings())")
|
raises(ConfigError, "list(config.cfgimpl_get_values().mandatory_warnings())")
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1']
|
assert list(config.cfgimpl_get_values().mandatory_warnings(validate=False)) == ['str', 'str1', 'str3', 'unicode1']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man112')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -635,7 +700,7 @@ def test_mandatory_warnings_validate_empty():
|
||||||
|
|
||||||
def test_mandatory_warnings_requires():
|
def test_mandatory_warnings_requires():
|
||||||
descr = make_description4()
|
descr = make_description4()
|
||||||
config = Config(descr)
|
config = Config(descr, session_id='man113')
|
||||||
config.str = ''
|
config.str = ''
|
||||||
config.read_write()
|
config.read_write()
|
||||||
config.str
|
config.str
|
||||||
|
@ -646,7 +711,7 @@ def test_mandatory_warnings_requires():
|
||||||
config.str = 'yes'
|
config.str = 'yes'
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['str1', 'unicode2', 'str3']
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man113')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
@ -655,13 +720,13 @@ def test_mandatory_warnings_requires():
|
||||||
def test_mandatory_od_disabled():
|
def test_mandatory_od_disabled():
|
||||||
descr = make_description()
|
descr = make_description()
|
||||||
od = OptionDescription('od', '', [descr])
|
od = OptionDescription('od', '', [descr])
|
||||||
config = Config(od)
|
config = Config(od, session_id='man114')
|
||||||
config.read_only()
|
config.read_only()
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['tiram.str1', 'tiram.unicode2', 'tiram.str3']
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == ['tiram.str1', 'tiram.unicode2', 'tiram.str3']
|
||||||
config.cfgimpl_get_settings()[descr].append('disabled')
|
config.cfgimpl_get_settings()[descr].append('disabled')
|
||||||
assert list(config.cfgimpl_get_values().mandatory_warnings()) == []
|
assert list(config.cfgimpl_get_values().mandatory_warnings()) == []
|
||||||
try:
|
try:
|
||||||
delete_session('config', config.impl_getsessionid())
|
delete_session('config', 'man114')
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
del(config)
|
del(config)
|
||||||
|
|
|
@ -11,6 +11,9 @@ from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption,\
|
||||||
URLOption, FilenameOption
|
URLOption, FilenameOption
|
||||||
|
|
||||||
|
|
||||||
|
print "FIXME slot pour un masterslaves !!"
|
||||||
|
|
||||||
|
|
||||||
def test_slots_option():
|
def test_slots_option():
|
||||||
c = ChoiceOption('a', '', ('a',))
|
c = ChoiceOption('a', '', ('a',))
|
||||||
raises(AttributeError, "c.x = 1")
|
raises(AttributeError, "c.x = 1")
|
||||||
|
|
|
@ -107,9 +107,9 @@ def _diff_opt(opt1, opt2):
|
||||||
else:
|
else:
|
||||||
assert v[1] == val2[idx][1]
|
assert v[1] == val2[idx][1]
|
||||||
elif attr == '_master_slaves':
|
elif attr == '_master_slaves':
|
||||||
assert val1.master.impl_getname() == val2.master.impl_getname()
|
assert val1._p_._sm_getmaster().impl_getname() == val2._p_._sm_getmaster().impl_getname()
|
||||||
sval1 = [opt.impl_getname() for opt in val1.slaves]
|
sval1 = [opt.impl_getname() for opt in val1._p_._sm_getslaves()]
|
||||||
sval2 = [opt.impl_getname() for opt in val2.slaves]
|
sval2 = [opt.impl_getname() for opt in val2._p_._sm_getslaves()]
|
||||||
assert sval1 == sval2
|
assert sval1 == sval2
|
||||||
elif attr == '_subdyn':
|
elif attr == '_subdyn':
|
||||||
try:
|
try:
|
||||||
|
@ -222,6 +222,10 @@ def test_diff_information_config():
|
||||||
_diff_conf(cfg, q)
|
_diff_conf(cfg, q)
|
||||||
assert cfg.impl_get_information('info') == 'oh'
|
assert cfg.impl_get_information('info') == 'oh'
|
||||||
assert q.impl_get_information('info') == 'oh'
|
assert q.impl_get_information('info') == 'oh'
|
||||||
|
try:
|
||||||
|
delete_session('config', '29090938')
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def test_diff_opt_multi():
|
def test_diff_opt_multi():
|
||||||
|
@ -353,6 +357,10 @@ def test_diff_opt_config():
|
||||||
q = loads(a)
|
q = loads(a)
|
||||||
_diff_opts(cfg.cfgimpl_get_description(), q.cfgimpl_get_description())
|
_diff_opts(cfg.cfgimpl_get_description(), q.cfgimpl_get_description())
|
||||||
_diff_conf(cfg, q)
|
_diff_conf(cfg, q)
|
||||||
|
try:
|
||||||
|
delete_session('config', '29090940')
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def test_state_properties():
|
def test_state_properties():
|
||||||
|
@ -422,6 +430,9 @@ def test_state_metaconfig():
|
||||||
i1 = IntOption('i1', '')
|
i1 = IntOption('i1', '')
|
||||||
od1 = OptionDescription('od1', '', [i1])
|
od1 = OptionDescription('od1', '', [i1])
|
||||||
od2 = OptionDescription('od2', '', [od1])
|
od2 = OptionDescription('od2', '', [od1])
|
||||||
|
try:
|
||||||
|
cfg = Config(od2, persistent=True, session_id='29090935')
|
||||||
|
except ValueError:
|
||||||
conf1 = Config(od2, session_id='29090935')
|
conf1 = Config(od2, session_id='29090935')
|
||||||
conf1._impl_test = True
|
conf1._impl_test = True
|
||||||
conf2 = Config(od2, session_id='29090936')
|
conf2 = Config(od2, session_id='29090936')
|
||||||
|
@ -431,8 +442,6 @@ def test_state_metaconfig():
|
||||||
raises(ConfigError, "dumps(meta)")
|
raises(ConfigError, "dumps(meta)")
|
||||||
try:
|
try:
|
||||||
delete_session('config', '29090935')
|
delete_session('config', '29090935')
|
||||||
delete_session('config', '29090936')
|
|
||||||
delete_session('config', '29090937')
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -441,19 +450,20 @@ def test_state_groupconfig():
|
||||||
i1 = IntOption('i1', '')
|
i1 = IntOption('i1', '')
|
||||||
od1 = OptionDescription('od1', '', [i1])
|
od1 = OptionDescription('od1', '', [i1])
|
||||||
od2 = OptionDescription('od2', '', [od1])
|
od2 = OptionDescription('od2', '', [od1])
|
||||||
conf1 = Config(od2, session_id='29090935')
|
try:
|
||||||
|
cfg = Config(od2, persistent=True, session_id='29090938')
|
||||||
|
except ValueError:
|
||||||
|
conf1 = Config(od2, session_id='29090938')
|
||||||
conf1._impl_test = True
|
conf1._impl_test = True
|
||||||
conf2 = Config(od2, session_id='29090936')
|
conf2 = Config(od2, session_id='29090939')
|
||||||
conf2._impl_test = True
|
conf2._impl_test = True
|
||||||
meta = GroupConfig([conf1, conf2], session_id='29090937')
|
meta = GroupConfig([conf1, conf2], session_id='29090940')
|
||||||
meta._impl_test = True
|
meta._impl_test = True
|
||||||
a = dumps(meta)
|
a = dumps(meta)
|
||||||
q = loads(a)
|
q = loads(a)
|
||||||
_diff_conf(meta, q)
|
_diff_conf(meta, q)
|
||||||
try:
|
try:
|
||||||
delete_session('config', '29090935')
|
delete_session('config', '29090938')
|
||||||
delete_session('config', '29090936')
|
|
||||||
delete_session('config', '29090937')
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -258,7 +258,7 @@ class SubConfig(object):
|
||||||
return subpath
|
return subpath
|
||||||
|
|
||||||
def getattr(self, name, force_permissive=False, validate=True,
|
def getattr(self, name, force_permissive=False, validate=True,
|
||||||
_setting_properties=undefined, index=None,
|
_setting_properties=undefined, _self_properties=undefined, index=None,
|
||||||
returns_raise=False):
|
returns_raise=False):
|
||||||
"""
|
"""
|
||||||
attribute notation mechanism for accessing the value of an option
|
attribute notation mechanism for accessing the value of an option
|
||||||
|
@ -277,6 +277,7 @@ class SubConfig(object):
|
||||||
return homeconfig.getattr(name, force_permissive=force_permissive,
|
return homeconfig.getattr(name, force_permissive=force_permissive,
|
||||||
validate=validate,
|
validate=validate,
|
||||||
_setting_properties=_setting_properties,
|
_setting_properties=_setting_properties,
|
||||||
|
_self_properties=_self_properties,
|
||||||
index=index, returns_raise=returns_raise)
|
index=index, returns_raise=returns_raise)
|
||||||
context = self._cfgimpl_get_context()
|
context = self._cfgimpl_get_context()
|
||||||
option = self.cfgimpl_get_description().__getattr__(name,
|
option = self.cfgimpl_get_description().__getattr__(name,
|
||||||
|
@ -287,7 +288,9 @@ class SubConfig(object):
|
||||||
option, path=subpath,
|
option, path=subpath,
|
||||||
validate=validate,
|
validate=validate,
|
||||||
force_permissive=force_permissive,
|
force_permissive=force_permissive,
|
||||||
setting_properties=_setting_properties, index=index,
|
setting_properties=_setting_properties,
|
||||||
|
self_properties=_self_properties,
|
||||||
|
index=index,
|
||||||
returns_raise=returns_raise)
|
returns_raise=returns_raise)
|
||||||
elif isinstance(option, SymLinkOption): # pragma: no dynoptiondescription cover
|
elif isinstance(option, SymLinkOption): # pragma: no dynoptiondescription cover
|
||||||
path = context.cfgimpl_get_description().impl_get_path_by_opt(
|
path = context.cfgimpl_get_description().impl_get_path_by_opt(
|
||||||
|
@ -295,11 +298,13 @@ class SubConfig(object):
|
||||||
return context.getattr(path, validate=validate,
|
return context.getattr(path, validate=validate,
|
||||||
force_permissive=force_permissive,
|
force_permissive=force_permissive,
|
||||||
_setting_properties=_setting_properties,
|
_setting_properties=_setting_properties,
|
||||||
|
_self_properties=_self_properties,
|
||||||
index=index, returns_raise=returns_raise)
|
index=index, returns_raise=returns_raise)
|
||||||
elif option.impl_is_optiondescription():
|
elif option.impl_is_optiondescription():
|
||||||
props = self.cfgimpl_get_settings().validate_properties(
|
props = self.cfgimpl_get_settings().validate_properties(
|
||||||
option, True, False, path=subpath,
|
option, True, False, path=subpath,
|
||||||
force_permissive=force_permissive,
|
force_permissive=force_permissive,
|
||||||
|
self_properties=_self_properties,
|
||||||
setting_properties=_setting_properties)
|
setting_properties=_setting_properties)
|
||||||
if props:
|
if props:
|
||||||
if returns_raise:
|
if returns_raise:
|
||||||
|
@ -313,6 +318,7 @@ class SubConfig(object):
|
||||||
validate=validate,
|
validate=validate,
|
||||||
force_permissive=force_permissive,
|
force_permissive=force_permissive,
|
||||||
setting_properties=_setting_properties,
|
setting_properties=_setting_properties,
|
||||||
|
self_properties=_self_properties,
|
||||||
index=index, returns_raise=returns_raise)
|
index=index, returns_raise=returns_raise)
|
||||||
|
|
||||||
def find(self, bytype=None, byname=None, byvalue=undefined, type_='option',
|
def find(self, bytype=None, byname=None, byvalue=undefined, type_='option',
|
||||||
|
@ -656,7 +662,8 @@ class _CommonConfig(SubConfig):
|
||||||
|
|
||||||
def duplicate(self):
|
def duplicate(self):
|
||||||
config = Config(self._impl_descr)
|
config = Config(self._impl_descr)
|
||||||
config.cfgimpl_get_values()._p_._values = self.cfgimpl_get_values()._p_._values
|
session = self.cfgimpl_get_values()._p_.getsession()
|
||||||
|
config.cfgimpl_get_values()._p_.importation(self.cfgimpl_get_values()._p_.exportation(session))
|
||||||
config.cfgimpl_get_settings()._p_._properties = self.cfgimpl_get_settings()._p_.get_modified_properties()
|
config.cfgimpl_get_settings()._p_._properties = self.cfgimpl_get_settings()._p_.get_modified_properties()
|
||||||
config.cfgimpl_get_settings()._p_._permissives = self.cfgimpl_get_settings()._p_.get_modified_permissives()
|
config.cfgimpl_get_settings()._p_._permissives = self.cfgimpl_get_settings()._p_.get_modified_permissives()
|
||||||
return config
|
return config
|
||||||
|
|
|
@ -29,6 +29,7 @@ from ..autolib import carry_out_calculation
|
||||||
from ..error import (ConfigError, ValueWarning, PropertiesOptionError,
|
from ..error import (ConfigError, ValueWarning, PropertiesOptionError,
|
||||||
display_list)
|
display_list)
|
||||||
from ..storage import get_storages_option
|
from ..storage import get_storages_option
|
||||||
|
from . import MasterSlaves
|
||||||
|
|
||||||
|
|
||||||
StorageBase = get_storages_option('base')
|
StorageBase = get_storages_option('base')
|
||||||
|
@ -99,7 +100,7 @@ class Base(StorageBase):
|
||||||
requires=None, multi=False, callback=None,
|
requires=None, multi=False, callback=None,
|
||||||
callback_params=None, validator=None, validator_params=None,
|
callback_params=None, validator=None, validator_params=None,
|
||||||
properties=None, warnings_only=False, extra=None,
|
properties=None, warnings_only=False, extra=None,
|
||||||
allow_empty_list=undefined):
|
allow_empty_list=undefined, session=None):
|
||||||
if not valid_name(name): # pragma: optional cover
|
if not valid_name(name): # pragma: optional cover
|
||||||
raise ValueError(_("invalid name: {0} for option").format(name))
|
raise ValueError(_("invalid name: {0} for option").format(name))
|
||||||
if not multi and default_multi is not None: # pragma: optional cover
|
if not multi and default_multi is not None: # pragma: optional cover
|
||||||
|
@ -138,9 +139,11 @@ class Base(StorageBase):
|
||||||
raise ValueError('conflict: properties already set in '
|
raise ValueError('conflict: properties already set in '
|
||||||
'requirement {0}'.format(
|
'requirement {0}'.format(
|
||||||
list(set_forbidden_properties)))
|
list(set_forbidden_properties)))
|
||||||
|
if session is None:
|
||||||
|
session = self.getsession()
|
||||||
StorageBase.__init__(self, name, _multi, warnings_only, doc, extra,
|
StorageBase.__init__(self, name, _multi, warnings_only, doc, extra,
|
||||||
calc_properties, requires, properties,
|
calc_properties, requires, properties,
|
||||||
allow_empty_list)
|
allow_empty_list, session=session)
|
||||||
if multi is not False and default is None:
|
if multi is not False and default is None:
|
||||||
default = []
|
default = []
|
||||||
err = self.impl_validate(default, is_multi=is_multi)
|
err = self.impl_validate(default, is_multi=is_multi)
|
||||||
|
@ -150,7 +153,7 @@ class Base(StorageBase):
|
||||||
##callback is False in optiondescription
|
##callback is False in optiondescription
|
||||||
if callback is not False:
|
if callback is not False:
|
||||||
self.impl_set_callback(callback, callback_params, _init=True)
|
self.impl_set_callback(callback, callback_params, _init=True)
|
||||||
self.commit()
|
self.commit(session)
|
||||||
|
|
||||||
def impl_set_callback(self, callback, callback_params=None, _init=False):
|
def impl_set_callback(self, callback, callback_params=None, _init=False):
|
||||||
if callback is None and callback_params is not None: # pragma: optional cover
|
if callback is None and callback_params is not None: # pragma: optional cover
|
||||||
|
@ -342,9 +345,6 @@ class BaseOption(Base):
|
||||||
def _is_subdyn(self):
|
def _is_subdyn(self):
|
||||||
return getattr(self, '_subdyn', None) is not None
|
return getattr(self, '_subdyn', None) is not None
|
||||||
|
|
||||||
def impl_getproperties(self):
|
|
||||||
return self._properties
|
|
||||||
|
|
||||||
def _impl_valid_unicode(self, value):
|
def _impl_valid_unicode(self, value):
|
||||||
if sys.version_info[0] >= 3:
|
if sys.version_info[0] >= 3:
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
|
@ -590,10 +590,13 @@ class Option(OnlyOption):
|
||||||
return self._valid_consistency(current_opt, None, context,
|
return self._valid_consistency(current_opt, None, context,
|
||||||
None, None)
|
None, None)
|
||||||
|
|
||||||
|
def impl_is_dynsymlinkoption(self):
|
||||||
|
return False
|
||||||
|
|
||||||
def impl_is_master_slaves(self, type_='both'):
|
def impl_is_master_slaves(self, type_='both'):
|
||||||
"""FIXME
|
"""FIXME
|
||||||
"""
|
"""
|
||||||
master_slaves = getattr(self, '_master_slaves', None)
|
master_slaves = self.impl_get_master_slaves()
|
||||||
if master_slaves is not None:
|
if master_slaves is not None:
|
||||||
if type_ in ('both', 'master') and \
|
if type_ in ('both', 'master') and \
|
||||||
master_slaves.is_master(self):
|
master_slaves.is_master(self):
|
||||||
|
@ -604,7 +607,12 @@ class Option(OnlyOption):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def impl_get_master_slaves(self):
|
def impl_get_master_slaves(self):
|
||||||
return self._master_slaves
|
masterslaves = self._get_master_slave()
|
||||||
|
if masterslaves is None:
|
||||||
|
return None
|
||||||
|
if not isinstance(masterslaves, MasterSlaves):
|
||||||
|
return MasterSlaves(masterslaves)
|
||||||
|
return masterslaves
|
||||||
|
|
||||||
def impl_getdoc(self):
|
def impl_getdoc(self):
|
||||||
"accesses the Option's doc"
|
"accesses the Option's doc"
|
||||||
|
@ -876,10 +884,11 @@ class SymLinkOption(OnlyOption):
|
||||||
raise ValueError(_('malformed symlinkoption '
|
raise ValueError(_('malformed symlinkoption '
|
||||||
'must be an option '
|
'must be an option '
|
||||||
'for symlink {0}').format(name))
|
'for symlink {0}').format(name))
|
||||||
|
session = self.getsession()
|
||||||
super(Base, self).__init__(name, undefined, undefined, undefined,
|
super(Base, self).__init__(name, undefined, undefined, undefined,
|
||||||
undefined, undefined, undefined, undefined,
|
undefined, undefined, undefined, undefined,
|
||||||
undefined, opt)
|
undefined, opt, session=session)
|
||||||
self.commit()
|
self.commit(session)
|
||||||
|
|
||||||
def __getattr__(self, name, context=undefined):
|
def __getattr__(self, name, context=undefined):
|
||||||
if name in ('_opt', '_readonly', 'impl_getpath', '_name',
|
if name in ('_opt', '_readonly', 'impl_getpath', '_name',
|
||||||
|
@ -964,3 +973,6 @@ class DynSymLinkOption(object):
|
||||||
force_submulti_index,
|
force_submulti_index,
|
||||||
current_opt=self,
|
current_opt=self,
|
||||||
is_multi=is_multi)
|
is_multi=is_multi)
|
||||||
|
|
||||||
|
def impl_is_dynsymlinkoption(self):
|
||||||
|
return True
|
||||||
|
|
|
@ -22,43 +22,36 @@
|
||||||
from ..i18n import _
|
from ..i18n import _
|
||||||
from ..setting import log, undefined, debug
|
from ..setting import log, undefined, debug
|
||||||
from ..error import SlaveError, PropertiesOptionError
|
from ..error import SlaveError, PropertiesOptionError
|
||||||
from .baseoption import DynSymLinkOption, SymLinkOption, Option
|
from ..storage import get_storages_option
|
||||||
|
|
||||||
|
|
||||||
|
StorageMasterSlaves = get_storages_option('masterslaves')
|
||||||
|
|
||||||
|
|
||||||
class MasterSlaves(object):
|
class MasterSlaves(object):
|
||||||
__slots__ = ('master', 'slaves')
|
__slots__ = ('_p_')
|
||||||
|
|
||||||
def __init__(self, name, childs, validate=True):
|
def __init__(self, name, childs=None, validate=True, add=True):
|
||||||
#if master (same name has group) is set
|
#if master (same name has group) is set
|
||||||
#for collect all slaves
|
#for collect all slaves
|
||||||
self.master = None
|
if isinstance(name, StorageMasterSlaves):
|
||||||
slaves = []
|
self._p_ = name
|
||||||
for child in childs:
|
|
||||||
if isinstance(child, SymLinkOption): # pragma: optional cover
|
|
||||||
raise ValueError(_("master group {0} shall not have "
|
|
||||||
"a symlinkoption").format(name))
|
|
||||||
if not isinstance(child, Option): # pragma: optional cover
|
|
||||||
raise ValueError(_("master group {0} shall not have "
|
|
||||||
"a subgroup").format(name))
|
|
||||||
if not child.impl_is_multi(): # pragma: optional cover
|
|
||||||
raise ValueError(_("not allowed option {0} "
|
|
||||||
"in group {1}"
|
|
||||||
": this option is not a multi"
|
|
||||||
"").format(child.impl_getname(), name))
|
|
||||||
if child.impl_getname() == name:
|
|
||||||
self.master = child
|
|
||||||
else:
|
else:
|
||||||
|
slaves = []
|
||||||
|
if childs[0].impl_getname() == name:
|
||||||
|
master = childs[0]
|
||||||
|
else:
|
||||||
|
raise ValueError(_('master group with wrong'
|
||||||
|
' master name for {0}'
|
||||||
|
).format(name))
|
||||||
|
for child in childs[1:]:
|
||||||
if child.impl_getdefault() != []:
|
if child.impl_getdefault() != []:
|
||||||
raise ValueError(_("not allowed default value for option {0} "
|
raise ValueError(_("not allowed default value for option {0} "
|
||||||
"in group {1}").format(child.impl_getname(),
|
"in group {1}").format(child.impl_getname(),
|
||||||
name))
|
name))
|
||||||
slaves.append(child)
|
slaves.append(child)
|
||||||
if self.master is None: # pragma: optional cover
|
|
||||||
raise ValueError(_('master group with wrong'
|
|
||||||
' master name for {0}'
|
|
||||||
).format(name))
|
|
||||||
if validate:
|
if validate:
|
||||||
callback, callback_params = self.master.impl_get_callback()
|
callback, callback_params = master.impl_get_callback()
|
||||||
if callback is not None and callback_params != {}: # pragma: optional cover
|
if callback is not None and callback_params != {}: # pragma: optional cover
|
||||||
for key, callbacks in callback_params.items():
|
for key, callbacks in callback_params.items():
|
||||||
for callbk in callbacks:
|
for callbk in callbacks:
|
||||||
|
@ -67,42 +60,43 @@ class MasterSlaves(object):
|
||||||
raise ValueError(_("callback of master's option shall "
|
raise ValueError(_("callback of master's option shall "
|
||||||
"not refered a slave's ones"))
|
"not refered a slave's ones"))
|
||||||
#everything is ok, store references
|
#everything is ok, store references
|
||||||
self.slaves = tuple(slaves)
|
self._p_ = StorageMasterSlaves(master, slaves)
|
||||||
|
if add:
|
||||||
for child in childs:
|
for child in childs:
|
||||||
child._master_slaves = self
|
child._set_master_slaves(self)
|
||||||
|
|
||||||
def is_master(self, opt):
|
def is_master(self, opt):
|
||||||
return opt == self.master or (isinstance(opt, DynSymLinkOption) and
|
master = self._p_._sm_getmaster().impl_getname()
|
||||||
opt._opt == self.master)
|
return opt.impl_getname() == master or (opt.impl_is_dynsymlinkoption() and
|
||||||
|
opt._opt.impl_getname() == master)
|
||||||
|
|
||||||
def getmaster(self, opt):
|
def getmaster(self, opt):
|
||||||
if isinstance(opt, DynSymLinkOption):
|
master = self._p_._sm_getmaster()
|
||||||
|
if opt.impl_is_dynsymlinkoption():
|
||||||
suffix = opt.impl_getsuffix()
|
suffix = opt.impl_getsuffix()
|
||||||
name = self.master.impl_getname() + suffix
|
name = master.impl_getname() + suffix
|
||||||
base_path = opt._dyn.split('.')[0] + '.'
|
base_path = opt._dyn.split('.')[0] + '.'
|
||||||
path = base_path + name
|
path = base_path + name
|
||||||
master = self.master._impl_to_dyn(name, path)
|
master = master._impl_to_dyn(name, path)
|
||||||
else: # pragma: no dynoptiondescription cover
|
|
||||||
master = self.master
|
|
||||||
return master
|
return master
|
||||||
|
|
||||||
def getslaves(self, opt):
|
def getslaves(self, opt):
|
||||||
if isinstance(opt, DynSymLinkOption):
|
if opt.impl_is_dynsymlinkoption():
|
||||||
for slave in self.slaves:
|
for slave in self._p_._sm_getslaves():
|
||||||
suffix = opt.impl_getsuffix()
|
suffix = opt.impl_getsuffix()
|
||||||
name = slave.impl_getname() + suffix
|
name = slave.impl_getname() + suffix
|
||||||
base_path = opt._dyn.split('.')[0] + '.'
|
base_path = opt._dyn.split('.')[0] + '.'
|
||||||
path = base_path + name
|
path = base_path + name
|
||||||
yield slave._impl_to_dyn(name, path)
|
yield slave._impl_to_dyn(name, path)
|
||||||
else: # pragma: no dynoptiondescription cover
|
else: # pragma: no dynoptiondescription cover
|
||||||
for slave in self.slaves:
|
for slave in self._p_._sm_getslaves():
|
||||||
yield slave
|
yield slave
|
||||||
|
|
||||||
def in_same_group(self, opt):
|
def in_same_group(self, opt):
|
||||||
if isinstance(opt, DynSymLinkOption):
|
if opt.impl_is_dynsymlinkoption():
|
||||||
return opt._opt == self.master or opt._opt in self.slaves
|
return opt._opt == self._p_._sm_getmaster() or opt._opt in self._p_._sm_getslaves()
|
||||||
else: # pragma: no dynoptiondescription cover
|
else: # pragma: no dynoptiondescription cover
|
||||||
return opt == self.master or opt in self.slaves
|
return opt == self._p_._sm_getmaster() or opt in self._p_._sm_getslaves()
|
||||||
|
|
||||||
def reset(self, opt, values, setting_properties):
|
def reset(self, opt, values, setting_properties):
|
||||||
for slave in self.getslaves(opt):
|
for slave in self.getslaves(opt):
|
||||||
|
|
|
@ -55,9 +55,8 @@ class ChoiceOption(Option):
|
||||||
if not isinstance(values, tuple): # pragma: optional cover
|
if not isinstance(values, tuple): # pragma: optional cover
|
||||||
raise TypeError(_('values must be a tuple or a function for {0}'
|
raise TypeError(_('values must be a tuple or a function for {0}'
|
||||||
).format(name))
|
).format(name))
|
||||||
_setattr = object.__setattr__
|
self.impl_set_choice_values_params(values, values_params)
|
||||||
_setattr(self, '_choice_values', values)
|
|
||||||
_setattr(self, '_choice_values_params', values_params)
|
|
||||||
super(ChoiceOption, self).__init__(name, doc, default=default,
|
super(ChoiceOption, self).__init__(name, doc, default=default,
|
||||||
default_multi=default_multi,
|
default_multi=default_multi,
|
||||||
callback=callback,
|
callback=callback,
|
||||||
|
@ -79,9 +78,7 @@ class ChoiceOption(Option):
|
||||||
if context is None:
|
if context is None:
|
||||||
values = []
|
values = []
|
||||||
else:
|
else:
|
||||||
values_params = self._choice_values_params
|
values_params = self.impl_get_choice_values_params()
|
||||||
if values_params is None:
|
|
||||||
values_params = {}
|
|
||||||
values = carry_out_calculation(current_opt, context=context,
|
values = carry_out_calculation(current_opt, context=context,
|
||||||
callback=values,
|
callback=values,
|
||||||
callback_params=values_params,
|
callback_params=values_params,
|
||||||
|
@ -93,6 +90,7 @@ class ChoiceOption(Option):
|
||||||
'').format(self.impl_getname()))
|
'').format(self.impl_getname()))
|
||||||
return values
|
return values
|
||||||
|
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined,
|
def _validate(self, value, context=undefined, current_opt=undefined,
|
||||||
returns_raise=False):
|
returns_raise=False):
|
||||||
values = self.impl_get_values(context, current_opt=current_opt,
|
values = self.impl_get_values(context, current_opt=current_opt,
|
||||||
|
|
|
@ -24,7 +24,7 @@ import re
|
||||||
|
|
||||||
from ..i18n import _
|
from ..i18n import _
|
||||||
from ..setting import groups, undefined, owners # , log
|
from ..setting import groups, undefined, owners # , log
|
||||||
from .baseoption import BaseOption, SymLinkOption
|
from .baseoption import BaseOption, SymLinkOption, Option
|
||||||
from . import MasterSlaves
|
from . import MasterSlaves
|
||||||
from ..error import ConfigError, ConflictError
|
from ..error import ConfigError, ConflictError
|
||||||
from ..storage import get_storages_option
|
from ..storage import get_storages_option
|
||||||
|
@ -229,7 +229,20 @@ class OptionDescription(BaseOption, StorageOptionDescription):
|
||||||
if isinstance(group_type, groups.GroupType):
|
if isinstance(group_type, groups.GroupType):
|
||||||
self._group_type = group_type
|
self._group_type = group_type
|
||||||
if isinstance(group_type, groups.MasterGroupType):
|
if isinstance(group_type, groups.MasterGroupType):
|
||||||
MasterSlaves(self.impl_getname(), self.impl_getchildren())
|
children = self.impl_getchildren()
|
||||||
|
for child in children:
|
||||||
|
if isinstance(child, SymLinkOption): # pragma: optional cover
|
||||||
|
raise ValueError(_("master group {0} shall not have "
|
||||||
|
"a symlinkoption").format(self.impl_getname()))
|
||||||
|
if not isinstance(child, Option): # pragma: optional cover
|
||||||
|
raise ValueError(_("master group {0} shall not have "
|
||||||
|
"a subgroup").format(self.impl_getname()))
|
||||||
|
if not child.impl_is_multi(): # pragma: optional cover
|
||||||
|
raise ValueError(_("not allowed option {0} "
|
||||||
|
"in group {1}"
|
||||||
|
": this option is not a multi"
|
||||||
|
"").format(child.impl_getname(), self.impl_getname()))
|
||||||
|
MasterSlaves(self.impl_getname(), children)
|
||||||
else: # pragma: optional cover
|
else: # pragma: optional cover
|
||||||
raise ValueError(_('group_type: {0}'
|
raise ValueError(_('group_type: {0}'
|
||||||
' not allowed').format(group_type))
|
' not allowed').format(group_type))
|
||||||
|
@ -365,7 +378,6 @@ class DynOptionDescription(OptionDescription):
|
||||||
'dynoptiondescription'))
|
'dynoptiondescription'))
|
||||||
child._impl_setsubdyn(self)
|
child._impl_setsubdyn(self)
|
||||||
self.impl_set_callback(callback, callback_params)
|
self.impl_set_callback(callback, callback_params)
|
||||||
self.commit()
|
|
||||||
|
|
||||||
def _validate_callback(self, callback, callback_params):
|
def _validate_callback(self, callback, callback_params):
|
||||||
if callback is None:
|
if callback is None:
|
||||||
|
|
|
@ -135,6 +135,8 @@ def get_storages_option(type_):
|
||||||
imp = storage_option_type.get()
|
imp = storage_option_type.get()
|
||||||
if type_ == 'base':
|
if type_ == 'base':
|
||||||
return imp.StorageBase
|
return imp.StorageBase
|
||||||
|
elif type_ == 'masterslaves':
|
||||||
|
return imp.StorageMasterSlaves
|
||||||
else:
|
else:
|
||||||
return imp.StorageOptionDescription
|
return imp.StorageOptionDescription
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ use it. But if something goes wrong, you will lost your modifications.
|
||||||
from .value import Values
|
from .value import Values
|
||||||
from .setting import Settings
|
from .setting import Settings
|
||||||
from .storage import setting, Storage, list_sessions, delete_session
|
from .storage import setting, Storage, list_sessions, delete_session
|
||||||
from .option import StorageBase, StorageOptionDescription
|
from .option import StorageBase, StorageOptionDescription, StorageMasterSlaves
|
||||||
|
|
||||||
__all__ = (setting, Values, Settings, Storage, list_sessions, delete_session,
|
__all__ = (setting, Values, Settings, Storage, list_sessions, delete_session,
|
||||||
StorageBase, StorageOptionDescription)
|
StorageBase, StorageOptionDescription, StorageMasterSlaves)
|
||||||
|
|
|
@ -65,7 +65,8 @@ class StorageBase(object):
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, name, multi, warnings_only, doc, extra, calc_properties,
|
def __init__(self, name, multi, warnings_only, doc, extra, calc_properties,
|
||||||
requires, properties, allow_empty_list, opt=undefined):
|
requires, properties, allow_empty_list, opt=undefined,
|
||||||
|
session=None):
|
||||||
_setattr = object.__setattr__
|
_setattr = object.__setattr__
|
||||||
_setattr(self, '_name', name)
|
_setattr(self, '_name', name)
|
||||||
if doc is not undefined:
|
if doc is not undefined:
|
||||||
|
@ -164,6 +165,12 @@ class StorageBase(object):
|
||||||
val_call = tuple([callback, callback_params])
|
val_call = tuple([callback, callback_params])
|
||||||
self._val_call = (val, val_call)
|
self._val_call = (val, val_call)
|
||||||
|
|
||||||
|
def impl_set_choice_values_params(self, values, values_params):
|
||||||
|
self._choice_values = values
|
||||||
|
if values_params is not None:
|
||||||
|
self._choice_values_params = values_params
|
||||||
|
|
||||||
|
|
||||||
def impl_get_callback(self):
|
def impl_get_callback(self):
|
||||||
call = getattr(self, '_val_call', (None, None))[1]
|
call = getattr(self, '_val_call', (None, None))[1]
|
||||||
if call is None:
|
if call is None:
|
||||||
|
@ -174,6 +181,9 @@ class StorageBase(object):
|
||||||
ret_call = call
|
ret_call = call
|
||||||
return ret_call
|
return ret_call
|
||||||
|
|
||||||
|
def impl_get_choice_values_params(self):
|
||||||
|
return getattr(self, '_choice_values_params', {})
|
||||||
|
|
||||||
def impl_get_calc_properties(self):
|
def impl_get_calc_properties(self):
|
||||||
return getattr(self, '_calc_properties', static_set)
|
return getattr(self, '_calc_properties', static_set)
|
||||||
|
|
||||||
|
@ -259,6 +269,9 @@ class StorageBase(object):
|
||||||
if extra is not None:
|
if extra is not None:
|
||||||
_setattr(self, '_extra', tuple([tuple(extra.keys()), tuple(extra.values())]))
|
_setattr(self, '_extra', tuple([tuple(extra.keys()), tuple(extra.values())]))
|
||||||
|
|
||||||
|
def impl_getproperties(self):
|
||||||
|
return self._properties
|
||||||
|
|
||||||
def _impl_setsubdyn(self, subdyn):
|
def _impl_setsubdyn(self, subdyn):
|
||||||
self._subdyn = subdyn
|
self._subdyn = subdyn
|
||||||
|
|
||||||
|
@ -357,7 +370,16 @@ class StorageBase(object):
|
||||||
"accessing the default value for a multi"
|
"accessing the default value for a multi"
|
||||||
return getattr(self, '_default_multi', None)
|
return getattr(self, '_default_multi', None)
|
||||||
|
|
||||||
def commit(self):
|
def _get_master_slave(self):
|
||||||
|
return getattr(self, '_master_slaves', None)
|
||||||
|
|
||||||
|
def _set_master_slaves(self, option):
|
||||||
|
self._master_slaves = option
|
||||||
|
|
||||||
|
def getsession(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def commit(self, session):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@ -549,3 +571,17 @@ class StorageOptionDescription(StorageBase):
|
||||||
raise AttributeError(_('unknown Option {0} '
|
raise AttributeError(_('unknown Option {0} '
|
||||||
'in OptionDescription {1}'
|
'in OptionDescription {1}'
|
||||||
'').format(name, self.impl_getname()))
|
'').format(name, self.impl_getname()))
|
||||||
|
|
||||||
|
|
||||||
|
class StorageMasterSlaves(object):
|
||||||
|
__slots__ = ('master', 'slaves')
|
||||||
|
|
||||||
|
def __init__(self, master, slaves):
|
||||||
|
self.master = master
|
||||||
|
self.slaves = slaves
|
||||||
|
|
||||||
|
def _sm_getmaster(self):
|
||||||
|
return self.master
|
||||||
|
|
||||||
|
def _sm_getslaves(self):
|
||||||
|
return tuple(self.slaves)
|
||||||
|
|
|
@ -25,7 +25,7 @@ use it. But if something goes wrong, you will lost your modifications.
|
||||||
from .value import Values
|
from .value import Values
|
||||||
from .setting import Settings
|
from .setting import Settings
|
||||||
from .storage import Storage, list_sessions, delete_session, storage_setting
|
from .storage import Storage, list_sessions, delete_session, storage_setting
|
||||||
from .option import StorageBase, StorageOptionDescription
|
from .option import StorageBase, StorageOptionDescription, StorageMasterSlaves
|
||||||
from .util import load
|
from .util import load
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,5 +33,5 @@ load()
|
||||||
|
|
||||||
|
|
||||||
__all__ = (storage_setting, Values, Settings, Storage, list_sessions, delete_session,
|
__all__ = (storage_setting, Values, Settings, Storage, list_sessions, delete_session,
|
||||||
StorageBase, StorageOptionDescription)
|
StorageBase, StorageOptionDescription, StorageMasterSlaves)
|
||||||
# Base, OptionDescription)
|
# Base, OptionDescription)
|
||||||
|
|
|
@ -40,8 +40,9 @@ def load_requires(collection_type, proxy):
|
||||||
return None
|
return None
|
||||||
ret = []
|
ret = []
|
||||||
requires = getattr(obj, proxy.value_attr)
|
requires = getattr(obj, proxy.value_attr)
|
||||||
|
session = util.Session()
|
||||||
for require in requires:
|
for require in requires:
|
||||||
option = util.session.query(_Base).filter_by(id=require.option).first()
|
option = session.query(_Base).filter_by(id=require.option).first()
|
||||||
ret.append(tuple([option, require.expected, require.action, require.inverse, require.transitive, require.same_action]))
|
ret.append(tuple([option, require.expected, require.action, require.inverse, require.transitive, require.same_action]))
|
||||||
return tuple(ret)
|
return tuple(ret)
|
||||||
|
|
||||||
|
@ -128,11 +129,12 @@ class _PropertyOption(SqlAlchemyBase):
|
||||||
class _Information(SqlAlchemyBase):
|
class _Information(SqlAlchemyBase):
|
||||||
__tablename__ = 'information'
|
__tablename__ = 'information'
|
||||||
id = Column(Integer, primary_key=True)
|
id = Column(Integer, primary_key=True)
|
||||||
option = Column(Integer, ForeignKey('baseoption.id'), nullable=False)
|
option = Column(String, index=True, nullable=False)
|
||||||
key = Column(String)
|
key = Column(String)
|
||||||
value = Column(PickleType)
|
value = Column(PickleType)
|
||||||
|
|
||||||
def __init__(self, key, value):
|
def __init__(self, option, key, value):
|
||||||
|
self.option = option
|
||||||
self.key = key
|
self.key = key
|
||||||
self.value = value
|
self.value = value
|
||||||
|
|
||||||
|
@ -146,11 +148,12 @@ def load_callback_parm(collection_type, proxy):
|
||||||
return None
|
return None
|
||||||
ret = []
|
ret = []
|
||||||
requires = getattr(obj, proxy.value_attr)
|
requires = getattr(obj, proxy.value_attr)
|
||||||
|
session = util.Session()
|
||||||
for require in requires:
|
for require in requires:
|
||||||
if require.value is not None:
|
if require.value is not None:
|
||||||
ret.append(require.value)
|
ret.append(require.value)
|
||||||
else:
|
else:
|
||||||
option = util.session.query(_Base).filter_by(id=require.option).first()
|
option = session.query(_Base).filter_by(id=require.option).first()
|
||||||
ret.append((option, require.force_permissive))
|
ret.append((option, require.force_permissive))
|
||||||
return tuple(ret)
|
return tuple(ret)
|
||||||
|
|
||||||
|
@ -239,20 +242,20 @@ class _Base(SqlAlchemyBase):
|
||||||
id = Column(Integer, primary_key=True)
|
id = Column(Integer, primary_key=True)
|
||||||
_name = Column(String)
|
_name = Column(String)
|
||||||
#FIXME not autoload
|
#FIXME not autoload
|
||||||
_infos = relationship("_Information",
|
# _infos = relationship("_Information",
|
||||||
collection_class=attribute_mapped_collection('key'),
|
# collection_class=attribute_mapped_collection('key'),
|
||||||
cascade="all, delete-orphan")
|
# cascade="all, delete-orphan")
|
||||||
_informations = association_proxy("_infos", "value")
|
# _informations = association_proxy("_infos", "value")
|
||||||
_default = Column(PickleType)
|
_default = Column(PickleType)
|
||||||
_default_multi = Column(PickleType)
|
_default_multi = Column(PickleType)
|
||||||
_subdyn = Column(Integer)
|
_subdyn = Column(Integer)
|
||||||
_dyn = Column(String)
|
_dyn = Column(String)
|
||||||
_opt = Column(Integer)
|
_opt = Column(Integer)
|
||||||
|
_master_slaves = Column(Integer)
|
||||||
_choice_values = Column(PickleType)
|
_choice_values = Column(PickleType)
|
||||||
_cho_params = relationship('_CallbackParam',
|
_cho_params = relationship('_CallbackParam',
|
||||||
collection_class=
|
collection_class=attribute_mapped_collection('key'))
|
||||||
attribute_mapped_collection('key'))
|
_choice_values_params = association_proxy("_cho_params", "params",
|
||||||
_choice_params = association_proxy("_cho_params", "params",
|
|
||||||
getset_factory=load_callback_parm)
|
getset_factory=load_callback_parm)
|
||||||
_reqs = relationship("_Require", collection_class=list)
|
_reqs = relationship("_Require", collection_class=list)
|
||||||
_requires = association_proxy("_reqs", "requires", getset_factory=load_requires)
|
_requires = association_proxy("_reqs", "requires", getset_factory=load_requires)
|
||||||
|
@ -260,14 +263,12 @@ class _Base(SqlAlchemyBase):
|
||||||
######
|
######
|
||||||
_callback = Column(PickleType)
|
_callback = Column(PickleType)
|
||||||
_call_params = relationship('_CallbackParam',
|
_call_params = relationship('_CallbackParam',
|
||||||
collection_class=
|
collection_class=attribute_mapped_collection('key'))
|
||||||
attribute_mapped_collection('key'))
|
|
||||||
_callback_params = association_proxy("_call_params", "params",
|
_callback_params = association_proxy("_call_params", "params",
|
||||||
getset_factory=load_callback_parm)
|
getset_factory=load_callback_parm)
|
||||||
_validator = Column(PickleType)
|
_validator = Column(PickleType)
|
||||||
_val_params = relationship('_CallbackParam',
|
_val_params = relationship('_CallbackParam',
|
||||||
collection_class=
|
collection_class=attribute_mapped_collection('key'))
|
||||||
attribute_mapped_collection('key'))
|
|
||||||
_validator_params = association_proxy("_val_params", "params",
|
_validator_params = association_proxy("_val_params", "params",
|
||||||
getset_factory=load_callback_parm)
|
getset_factory=load_callback_parm)
|
||||||
######
|
######
|
||||||
|
@ -282,10 +283,10 @@ class _Base(SqlAlchemyBase):
|
||||||
_consistencies = relationship('_Consistency', secondary=consistency_table,
|
_consistencies = relationship('_Consistency', secondary=consistency_table,
|
||||||
backref=backref('options',
|
backref=backref('options',
|
||||||
enable_typechecks=False))
|
enable_typechecks=False))
|
||||||
_type = Column(String(50))
|
|
||||||
_stated = Column(Boolean)
|
_stated = Column(Boolean)
|
||||||
|
_type = Column(String(50))
|
||||||
__mapper_args__ = {
|
__mapper_args__ = {
|
||||||
'polymorphic_identity': 'option',
|
'polymorphic_identity': 'optionsql',
|
||||||
'polymorphic_on': _type
|
'polymorphic_on': _type
|
||||||
}
|
}
|
||||||
_extra = Column(PickleType)
|
_extra = Column(PickleType)
|
||||||
|
@ -293,10 +294,8 @@ class _Base(SqlAlchemyBase):
|
||||||
_group_type = Column(String)
|
_group_type = Column(String)
|
||||||
_is_build_cache = Column(Boolean, default=False)
|
_is_build_cache = Column(Boolean, default=False)
|
||||||
|
|
||||||
#def __init__(self):
|
|
||||||
def __init__(self, name, multi, warnings_only, doc, extra, calc_properties,
|
def __init__(self, name, multi, warnings_only, doc, extra, calc_properties,
|
||||||
requires, properties, allow_empty_list, opt=undefined):
|
requires, properties, allow_empty_list, opt=undefined, session=None):
|
||||||
util.session.add(self)
|
|
||||||
self._name = name
|
self._name = name
|
||||||
if multi is not undefined:
|
if multi is not undefined:
|
||||||
self._multi = multi
|
self._multi = multi
|
||||||
|
@ -316,14 +315,19 @@ class _Base(SqlAlchemyBase):
|
||||||
self._requires = requires
|
self._requires = requires
|
||||||
if properties is not undefined:
|
if properties is not undefined:
|
||||||
self._properties = properties
|
self._properties = properties
|
||||||
|
session.add(self)
|
||||||
|
|
||||||
def commit(self):
|
def getsession(self):
|
||||||
util.session.commit()
|
return util.Session()
|
||||||
|
|
||||||
|
def commit(self, session):
|
||||||
|
session.commit()
|
||||||
|
del(session)
|
||||||
|
|
||||||
def _add_consistency(self, func, all_cons_opts, params):
|
def _add_consistency(self, func, all_cons_opts, params):
|
||||||
_Consistency(func, all_cons_opts, params)
|
_Consistency(func, all_cons_opts, params)
|
||||||
|
|
||||||
def _set_default_values(self, default, default_multi):
|
def _set_default_values(self, default, default_multi, is_multi):
|
||||||
self._default = default
|
self._default = default
|
||||||
if self.impl_is_multi() and default_multi is not None:
|
if self.impl_is_multi() and default_multi is not None:
|
||||||
err = self._validate(default_multi)
|
err = self._validate(default_multi)
|
||||||
|
@ -344,6 +348,9 @@ class _Base(SqlAlchemyBase):
|
||||||
return (None, {})
|
return (None, {})
|
||||||
return ret, self._callback_params
|
return ret, self._callback_params
|
||||||
|
|
||||||
|
def impl_get_choice_values_params(self):
|
||||||
|
return self._choice_values_params
|
||||||
|
|
||||||
def impl_get_validator(self):
|
def impl_get_validator(self):
|
||||||
ret = self._validator
|
ret = self._validator
|
||||||
if ret is None:
|
if ret is None:
|
||||||
|
@ -351,16 +358,30 @@ class _Base(SqlAlchemyBase):
|
||||||
return ret, self._validator_params
|
return ret, self._validator_params
|
||||||
|
|
||||||
def _impl_getsubdyn(self):
|
def _impl_getsubdyn(self):
|
||||||
return util.session.query(_Base).filter_by(id=self._subdyn).first()
|
session = self.getsession()
|
||||||
|
return session.query(_Base).filter_by(id=self._subdyn).first()
|
||||||
|
|
||||||
def _impl_getopt(self):
|
def _impl_getopt(self):
|
||||||
return util.session.query(_Base).filter_by(id=self._opt).first()
|
session = self.getsession()
|
||||||
|
return session.query(_Base).filter_by(id=self._opt).first()
|
||||||
|
|
||||||
def impl_getname(self):
|
def impl_getname(self):
|
||||||
return self._name
|
return self._name
|
||||||
|
|
||||||
def impl_getrequires(self):
|
def impl_getrequires(self):
|
||||||
return self._requires
|
session = self.getsession()
|
||||||
|
requires = session.query(_Require).filter_by(requires_id=self.id).all()
|
||||||
|
for require in requires:
|
||||||
|
_ret = []
|
||||||
|
for req in require.requires:
|
||||||
|
_ret.append((session.query(_Base).filter_by(id=req.option).first(),
|
||||||
|
req.expected,
|
||||||
|
req.action,
|
||||||
|
req.inverse,
|
||||||
|
req.transitive,
|
||||||
|
req.same_action))
|
||||||
|
yield(_ret)
|
||||||
|
|
||||||
|
|
||||||
def impl_getdefault(self):
|
def impl_getdefault(self):
|
||||||
ret = self._default
|
ret = self._default
|
||||||
|
@ -381,10 +402,11 @@ class _Base(SqlAlchemyBase):
|
||||||
self._opt = opt.id
|
self._opt = opt.id
|
||||||
|
|
||||||
def _impl_setsubdyn(self, subdyn):
|
def _impl_setsubdyn(self, subdyn):
|
||||||
|
session = self.getsession()
|
||||||
self._subdyn = subdyn.id
|
self._subdyn = subdyn.id
|
||||||
self.commit()
|
self.commit(session)
|
||||||
|
|
||||||
def _set_readonly(self):
|
def _set_readonly(self, has_extra):
|
||||||
self._readonly = True
|
self._readonly = True
|
||||||
|
|
||||||
def _set_callback(self, callback, callback_params):
|
def _set_callback(self, callback, callback_params):
|
||||||
|
@ -392,6 +414,11 @@ class _Base(SqlAlchemyBase):
|
||||||
if callback_params is not None:
|
if callback_params is not None:
|
||||||
self._callback_params = callback_params
|
self._callback_params = callback_params
|
||||||
|
|
||||||
|
def impl_set_choice_values_params(self, values, values_params):
|
||||||
|
self._choice_values = values
|
||||||
|
if values_params is not None:
|
||||||
|
self._choice_values_params = values_params
|
||||||
|
|
||||||
def _set_validator(self, validator, validator_params):
|
def _set_validator(self, validator, validator_params):
|
||||||
self._validator = validator
|
self._validator = validator
|
||||||
if validator_params is not None:
|
if validator_params is not None:
|
||||||
|
@ -419,27 +446,39 @@ class _Base(SqlAlchemyBase):
|
||||||
return self._warnings_only
|
return self._warnings_only
|
||||||
|
|
||||||
def impl_get_calc_properties(self):
|
def impl_get_calc_properties(self):
|
||||||
try:
|
session = self.getsession()
|
||||||
return self._calc_properties
|
return session.query(_CalcProperties).filter_by(require=self.id).all()
|
||||||
except AttributeError:
|
#try:
|
||||||
return frozenset()
|
# return self._calc_properties
|
||||||
|
#except AttributeError:
|
||||||
|
# return frozenset()
|
||||||
|
|
||||||
# information
|
# information
|
||||||
def impl_set_information(self, key, value):
|
def impl_set_information(self, key, value):
|
||||||
self._informations[key] = value
|
session = self.getsession()
|
||||||
|
# self._informations[key] = value
|
||||||
|
val = session.query(_Information).filter_by(
|
||||||
|
option=self.id, key=key).first()
|
||||||
|
if val is None:
|
||||||
|
session.add(_Information(self.id, key, value))
|
||||||
|
else:
|
||||||
|
val.value = value
|
||||||
|
session.commit()
|
||||||
|
|
||||||
def impl_get_information(self, key, default=undefined):
|
def impl_get_information(self, key, default=undefined):
|
||||||
"""retrieves one information's item
|
"""retrieves one information's item
|
||||||
|
|
||||||
:param key: the item string (ex: "help")
|
:param key: the item string (ex: "help")
|
||||||
"""
|
"""
|
||||||
|
session = self.getsession()
|
||||||
|
val = session.query(_Information).filter_by(
|
||||||
|
option=self.id, key=key).first()
|
||||||
|
if not val:
|
||||||
if default is not undefined:
|
if default is not undefined:
|
||||||
return self._informations.get(key, default)
|
return default
|
||||||
try:
|
|
||||||
return self._informations[key]
|
|
||||||
except KeyError: # pragma: optional cover
|
|
||||||
raise ValueError(_("information's item not found: {0}").format(
|
raise ValueError(_("information's item not found: {0}").format(
|
||||||
key))
|
key))
|
||||||
|
return val.value
|
||||||
|
|
||||||
def _impl_getattributes(self):
|
def _impl_getattributes(self):
|
||||||
slots = set()
|
slots = set()
|
||||||
|
@ -448,6 +487,20 @@ class _Base(SqlAlchemyBase):
|
||||||
slots.add(column.key)
|
slots.add(column.key)
|
||||||
return slots
|
return slots
|
||||||
|
|
||||||
|
def impl_getproperties(self):
|
||||||
|
session = self.getsession()
|
||||||
|
return session.query(_PropertyOption).filter_by(option=self.id).all()
|
||||||
|
|
||||||
|
def _set_master_slaves(self, option):
|
||||||
|
session = self.getsession()
|
||||||
|
opt = session.query(_Base).filter_by(id=self.id).first()
|
||||||
|
opt._master_slaves = option.id
|
||||||
|
self.commit(session)
|
||||||
|
|
||||||
|
def _get_master_slave(self):
|
||||||
|
session = self.getsession()
|
||||||
|
return session.query(StorageMasterSlaves).filter_by(id=self._master_slaves).first()
|
||||||
|
|
||||||
|
|
||||||
class Cache(SqlAlchemyBase):
|
class Cache(SqlAlchemyBase):
|
||||||
__tablename__ = 'cache'
|
__tablename__ = 'cache'
|
||||||
|
@ -477,19 +530,24 @@ class Cache(SqlAlchemyBase):
|
||||||
|
|
||||||
class StorageOptionDescription(object):
|
class StorageOptionDescription(object):
|
||||||
def impl_already_build_caches(self):
|
def impl_already_build_caches(self):
|
||||||
return self._is_build_cache
|
cache = self._is_build_cache
|
||||||
|
if cache is None:
|
||||||
|
cache = False
|
||||||
|
return cache
|
||||||
|
|
||||||
def impl_get_opt_by_path(self, path):
|
def impl_get_opt_by_path(self, path):
|
||||||
ret = util.session.query(Cache).filter_by(descr=self.id, path=path).first()
|
session = self.getsession()
|
||||||
|
ret = session.query(Cache).filter_by(descr=self.id, path=path).first()
|
||||||
if ret is None:
|
if ret is None:
|
||||||
raise AttributeError(_('no option for path {0}').format(path))
|
raise AttributeError(_('no option for path {0}').format(path))
|
||||||
return util.session.query(_Base).filter_by(id=ret.option).first()
|
return session.query(_Base).filter_by(id=ret.option).first()
|
||||||
|
|
||||||
def impl_get_path_by_opt(self, opt):
|
def impl_get_path_by_opt(self, opt):
|
||||||
ret = util.session.query(Cache).filter_by(descr=self.id,
|
session = self.getsession()
|
||||||
|
ret = session.query(Cache).filter_by(descr=self.id,
|
||||||
option=opt.id).first()
|
option=opt.id).first()
|
||||||
if ret is None:
|
if ret is None:
|
||||||
ret = util.session.query(Cache).filter_by(descr=self.id).first()
|
ret = session.query(Cache).filter_by(descr=self.id).first()
|
||||||
if ret is None:
|
if ret is None:
|
||||||
raise ConfigError(_('use impl_get_path_by_opt only with root OptionDescription'))
|
raise ConfigError(_('use impl_get_path_by_opt only with root OptionDescription'))
|
||||||
raise AttributeError(_('no option {0} found').format(opt))
|
raise AttributeError(_('no option {0} found').format(opt))
|
||||||
|
@ -499,11 +557,12 @@ class StorageOptionDescription(object):
|
||||||
return getattr(groups, self._group_type)
|
return getattr(groups, self._group_type)
|
||||||
|
|
||||||
def impl_build_cache_option(self, descr=None, _currpath=None,
|
def impl_build_cache_option(self, descr=None, _currpath=None,
|
||||||
subdyn_path=None):
|
subdyn_path=None, session=None):
|
||||||
if descr is None:
|
if descr is None:
|
||||||
save = True
|
save = True
|
||||||
descr = self
|
descr = self
|
||||||
_currpath = []
|
_currpath = []
|
||||||
|
session = self.getsession()
|
||||||
else:
|
else:
|
||||||
save = False
|
save = False
|
||||||
for option in self._impl_getchildren(dyn=False):
|
for option in self._impl_getchildren(dyn=False):
|
||||||
|
@ -512,23 +571,23 @@ class StorageOptionDescription(object):
|
||||||
sub = subdyn_path
|
sub = subdyn_path
|
||||||
if option.impl_is_dynoptiondescription():
|
if option.impl_is_dynoptiondescription():
|
||||||
sub = '.'.join(_currpath)
|
sub = '.'.join(_currpath)
|
||||||
util.session.add(Cache(descr, self, option,
|
session.add(Cache(descr, self, option,
|
||||||
str('.'.join(_currpath + [attr])),
|
str('.'.join(_currpath + [attr])),
|
||||||
sub))
|
sub))
|
||||||
_currpath.append(attr)
|
_currpath.append(attr)
|
||||||
option.impl_build_cache_option(descr,
|
option.impl_build_cache_option(descr,
|
||||||
_currpath,
|
_currpath,
|
||||||
sub)
|
sub, session)
|
||||||
_currpath.pop()
|
_currpath.pop()
|
||||||
else:
|
else:
|
||||||
if subdyn_path:
|
if subdyn_path:
|
||||||
subdyn_path = '.'.join(_currpath)
|
subdyn_path = '.'.join(_currpath)
|
||||||
util.session.add(Cache(descr, self, option,
|
session.add(Cache(descr, self, option,
|
||||||
str('.'.join(_currpath + [attr])),
|
str('.'.join(_currpath + [attr])),
|
||||||
subdyn_path))
|
subdyn_path))
|
||||||
if save:
|
if save:
|
||||||
self._is_build_cache = True
|
self._is_build_cache = True
|
||||||
util.session.commit()
|
self.commit(session)
|
||||||
|
|
||||||
def impl_get_options_paths(self, bytype, byname, _subpath, only_first,
|
def impl_get_options_paths(self, bytype, byname, _subpath, only_first,
|
||||||
context):
|
context):
|
||||||
|
@ -546,7 +605,8 @@ class StorageOptionDescription(object):
|
||||||
_opt = option._impl_to_dyn(name + suffix, path)
|
_opt = option._impl_to_dyn(name + suffix, path)
|
||||||
return (path, _opt)
|
return (path, _opt)
|
||||||
|
|
||||||
sqlquery = util.session.query(Cache).filter_by(descr=self.id)
|
session = self.getsession()
|
||||||
|
sqlquery = session.query(Cache).filter_by(descr=self.id)
|
||||||
if bytype is None:
|
if bytype is None:
|
||||||
sqlquery = sqlquery.filter(and_(not_(
|
sqlquery = sqlquery.filter(and_(not_(
|
||||||
Cache.opt_type == 'OptionDescription'),
|
Cache.opt_type == 'OptionDescription'),
|
||||||
|
@ -575,7 +635,7 @@ class StorageOptionDescription(object):
|
||||||
#else:
|
#else:
|
||||||
ret = []
|
ret = []
|
||||||
for opt in sqlquery.all():
|
for opt in sqlquery.all():
|
||||||
option = util.session.query(_Base).filter_by(id=opt.option).first()
|
option = session.query(_Base).filter_by(id=opt.option).first()
|
||||||
if opt.is_subdyn:
|
if opt.is_subdyn:
|
||||||
name = option.impl_getname()
|
name = option.impl_getname()
|
||||||
if byname is not None:
|
if byname is not None:
|
||||||
|
@ -616,21 +676,24 @@ class StorageOptionDescription(object):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def _add_children(self, child_names, children):
|
def _add_children(self, child_names, children):
|
||||||
|
session = self.getsession()
|
||||||
for child in children:
|
for child in children:
|
||||||
util.session.add(_Parent(self, child))
|
session.add(_Parent(self, child))
|
||||||
|
self.commit(session)
|
||||||
|
|
||||||
def _impl_st_getchildren(self, context, only_dyn=False):
|
def _impl_st_getchildren(self, context, only_dyn=False):
|
||||||
|
session = self.getsession()
|
||||||
if only_dyn is False or context is undefined:
|
if only_dyn is False or context is undefined:
|
||||||
for child in util.session.query(_Parent).filter_by(
|
for child in session.query(_Parent).filter_by(
|
||||||
parent_id=self.id).all():
|
parent_id=self.id).all():
|
||||||
yield(util.session.query(_Base).filter_by(id=child.child_id
|
yield(session.query(_Base).filter_by(id=child.child_id
|
||||||
).first())
|
).first())
|
||||||
else:
|
else:
|
||||||
descr = context.cfgimpl_get_description().id
|
descr = context.cfgimpl_get_description().id
|
||||||
for child in util.session.query(Cache).filter_by(descr=descr,
|
for child in session.query(Cache).filter_by(descr=descr,
|
||||||
parent=self.id
|
parent=self.id
|
||||||
).all():
|
).all():
|
||||||
yield(util.session.query(_Base).filter_by(id=child.option).first())
|
yield(session.query(_Base).filter_by(id=child.option).first())
|
||||||
|
|
||||||
def _getattr(self, name, suffix=undefined, context=undefined, dyn=True):
|
def _getattr(self, name, suffix=undefined, context=undefined, dyn=True):
|
||||||
error = False
|
error = False
|
||||||
|
@ -640,14 +703,15 @@ class StorageOptionDescription(object):
|
||||||
raise ConfigError(_("suffix and context needed if "
|
raise ConfigError(_("suffix and context needed if "
|
||||||
"it's a dyn option"))
|
"it's a dyn option"))
|
||||||
if name.endswith(suffix):
|
if name.endswith(suffix):
|
||||||
|
session = self.getsession()
|
||||||
oname = name[:-len(suffix)]
|
oname = name[:-len(suffix)]
|
||||||
#child = self._children[1][self._children[0].index(oname)]
|
#child = self._children[1][self._children[0].index(oname)]
|
||||||
child = util.session.query(_Parent).filter_by(
|
child = session.query(_Parent).filter_by(
|
||||||
parent_id=self.id, child_name=oname).first()
|
parent_id=self.id, child_name=oname).first()
|
||||||
if child is None:
|
if child is None:
|
||||||
error = True
|
error = True
|
||||||
else:
|
else:
|
||||||
opt = util.session.query(_Base).filter_by(
|
opt = session.query(_Base).filter_by(
|
||||||
id=child.child_id).first()
|
id=child.child_id).first()
|
||||||
return self._impl_get_dynchild(opt, suffix)
|
return self._impl_get_dynchild(opt, suffix)
|
||||||
else:
|
else:
|
||||||
|
@ -655,7 +719,8 @@ class StorageOptionDescription(object):
|
||||||
except ValueError: # pragma: optional cover
|
except ValueError: # pragma: optional cover
|
||||||
error = True
|
error = True
|
||||||
else:
|
else:
|
||||||
child = util.session.query(_Parent).filter_by(parent_id=self.id,
|
session = self.getsession()
|
||||||
|
child = session.query(_Parent).filter_by(parent_id=self.id,
|
||||||
child_name=name
|
child_name=name
|
||||||
).first()
|
).first()
|
||||||
if child is None:
|
if child is None:
|
||||||
|
@ -664,7 +729,7 @@ class StorageOptionDescription(object):
|
||||||
return child
|
return child
|
||||||
error = True
|
error = True
|
||||||
if error is False:
|
if error is False:
|
||||||
return util.session.query(_Base).filter_by(id=child.child_id
|
return session.query(_Base).filter_by(id=child.child_id
|
||||||
).first()
|
).first()
|
||||||
if error:
|
if error:
|
||||||
raise AttributeError(_('unknown Option {0} in OptionDescription {1}'
|
raise AttributeError(_('unknown Option {0} in OptionDescription {1}'
|
||||||
|
@ -672,12 +737,13 @@ class StorageOptionDescription(object):
|
||||||
|
|
||||||
def _get_force_store_value(self):
|
def _get_force_store_value(self):
|
||||||
#only option in current tree
|
#only option in current tree
|
||||||
current_ids = tuple(chain(*util.session.query(Cache.option).filter_by(
|
session = self.getsession()
|
||||||
|
current_ids = tuple(chain(*session.query(Cache.option).filter_by(
|
||||||
descr=self.id).all()))
|
descr=self.id).all()))
|
||||||
for prop in util.session.query(_PropertyOption).filter(
|
for prop in session.query(_PropertyOption).filter(
|
||||||
_PropertyOption.option.in_(current_ids),
|
_PropertyOption.option.in_(current_ids),
|
||||||
_PropertyOption.name == 'force_store_value').all():
|
_PropertyOption.name == 'force_store_value').all():
|
||||||
opt = util.session.query(_Base).filter_by(id=prop.option).first()
|
opt = session.query(_Base).filter_by(id=prop.option).first()
|
||||||
path = self.impl_get_path_by_opt(opt)
|
path = self.impl_get_path_by_opt(opt)
|
||||||
yield (opt, path)
|
yield (opt, path)
|
||||||
|
|
||||||
|
@ -686,3 +752,39 @@ class StorageBase(_Base):
|
||||||
@declared_attr
|
@declared_attr
|
||||||
def __mapper_args__(self):
|
def __mapper_args__(self):
|
||||||
return {'polymorphic_identity': self.__name__.lower()}
|
return {'polymorphic_identity': self.__name__.lower()}
|
||||||
|
|
||||||
|
|
||||||
|
class _Slave(SqlAlchemyBase):
|
||||||
|
__tablename__ = 'slaves'
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
master_id = Column(Integer, index=True, nullable=False)
|
||||||
|
slave_id = Column(Integer)
|
||||||
|
|
||||||
|
def __init__(self, master, slave):
|
||||||
|
self.master_id = master.id
|
||||||
|
self.slave_id = slave.id
|
||||||
|
|
||||||
|
|
||||||
|
class StorageMasterSlaves(SqlAlchemyBase):
|
||||||
|
__tablename__ = 'masterslaves2'
|
||||||
|
id = Column(Integer, primary_key=True)
|
||||||
|
master = Column(Integer)
|
||||||
|
|
||||||
|
def __init__(self, master, slaves):
|
||||||
|
session = util.Session()
|
||||||
|
self.master = master.id
|
||||||
|
session.add(self)
|
||||||
|
session.commit()
|
||||||
|
for slave in slaves:
|
||||||
|
sl = _Slave(self, slave)
|
||||||
|
session.add(sl)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
def _sm_getslaves(self):
|
||||||
|
session = util.Session()
|
||||||
|
for slave in session.query(_Slave).filter_by(master_id=self.master).all():
|
||||||
|
yield(session.query(_Base).filter_by(id=slave.slave_id).first())
|
||||||
|
|
||||||
|
def _sm_getmaster(self):
|
||||||
|
session = util.Session()
|
||||||
|
return session.query(_Base).filter_by(id=self.master).first()
|
||||||
|
|
Loading…
Reference in New Issue