diff --git a/server_environment/__init__.py b/server_environment/__init__.py
new file mode 100644
index 0000000..765b02b
--- /dev/null
+++ b/server_environment/__init__.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Adapted by Nicolas Bessi. Copyright Camptocamp SA
+# Based on Florent Xicluna original code. Copyright Wingo SA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+from .serv_config import serv_config, setboolean
diff --git a/server_environment/__openerp__.py b/server_environment/__openerp__.py
new file mode 100644
index 0000000..b919f17
--- /dev/null
+++ b/server_environment/__openerp__.py
@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Adapted by Nicolas Bessi. Copyright Camptocamp SA
+# Based on Florent Xicluna original code. Copyright Wingo SA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+{
+ "name": "server configuration environment files",
+ "version": "1.0",
+ "depends": ["base", "server_environment_files"],
+ "author": "Camptocamp",
+ "description": """This module provides a classical configuration by environnement file pattern into OpenERP.
+Based on code written by WinGo and Camptocamp.
+
+This module allows you to use the classical environment file pattern by reading
+a directive call running_env in config file or openerpc.
+
+[options]
+running_env=dev / prod / etc.
+
+We intended to add a server command line but there is no correct way to do it.
+
+This method allows you to have your settings into a module instead of using config file that might be mixed with openerprc or altered.
+It is an alternative way to config the base config file.
+All your configurations will be read_only and accessible under the admin menu.
+If you are not in the 'dev' environment you will not be able to see the values containing 'passw' in key.
+
+At the current time, the module does not allow to set low level attributes such as database server, etc. .
+
+The first goal of the module is to ensure that OpenERP will never mess up the external system.
+Once installed, profile is mandatory. We do not want to launch an instance in the dev environment on a production server.
+
+
+
+The configuration files are to put in the module server_environment_files ; they are using the config parser module syntax.
+Look at the module to get some sexamples.
+The default configuration are to put in the default folder. All config defined in other environment will be overwritten or added to default one.
+Then, you can add a folder by used environment with the name of the environment
+If your attibutes contain passw it will only be shown in dev environment.
+
+Usage samples:
+
+from server_environment import serv_config
+for key, value in serv_config.items('external_service.ftp'):
+ print (key, value)
+
+
+serv_config.get('external_service.ftp', 'tls')
+ """,
+ "website": "http://www.camptocamp.com",
+ "category": "Tools",
+ "init_xml": [],
+ "demo_xml": [],
+ "update_xml": [
+ 'serv_config.xml',
+ ],
+ "installable": True,
+ "active": False,
+}
diff --git a/server_environment/serv_config.py b/server_environment/serv_config.py
new file mode 100644
index 0000000..dc0224d
--- /dev/null
+++ b/server_environment/serv_config.py
@@ -0,0 +1,184 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Adapted by Nicolas Bessi. Copyright Camptocamp SA
+# Based on Florent Xicluna original code. Copyright Wingo SA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import os
+import ConfigParser
+
+from lxml import etree
+
+from osv import osv, fields
+from tools.config import config as system_base_config
+
+from .system_info import get_server_environment
+
+import server_environment_files
+_dir = os.path.dirname(server_environment_files.__file__)
+
+# Same dict as RawConfigParser._boolean_states
+_boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True,
+ '0': False, 'no': False, 'false': False, 'off': False}
+
+if not system_base_config.get('running_env', False):
+ raise Exception(
+ ("The parameter 'running_env' has not be set neither in base config file option -c or in openerprc.\n"
+ "We strongly recommand you not to use the rc file but instead use an explicite config file with this content : \n"
+ "[options] \nrunning_env = dev")
+ )
+
+ck_path = os.path.join(_dir, system_base_config['running_env'])
+
+if not os.path.exists(ck_path) :
+ raise Exception(
+ "Provided server environment does not exists please add a folder %s"%s(ck_path)
+ )
+
+def setboolean(obj, attr, _bool=_boolean_states):
+ """Replace the attribute with a boolean."""
+ res = _bool[getattr(obj, attr).lower()]
+ setattr(obj, attr, res)
+ return res
+
+
+# Borrowed from MarkupSafe
+def _escape(s):
+ """Convert the characters &<>'" in string s to HTML-safe sequences."""
+ return (str(s).replace('&', '&')
+ .replace('>', '>')
+ .replace('<', '<')
+ .replace("'", ''')
+ .replace('"', '"'))
+
+
+def _listconf(env_path):
+ """List configuration files in a folder."""
+ files = [os.path.join(env_path, name)
+ for name in sorted(os.listdir(env_path))
+ if name.endswith('.conf')]
+ return files
+
+
+def _load_config():
+ """Load the configuration and return a ConfigParser instance."""
+ default = os.path.join(_dir, 'default')
+ running_env = os.path.join(_dir, system_base_config['running_env'])
+ if os.path.isdir(default):
+ conf_files = _listconf(default) + _listconf(running_env)
+ else:
+ conf_files = _listconf(running_env)
+
+ config_p = ConfigParser.SafeConfigParser()
+ # options are case-sensitive
+ config_p.optionxform = str
+ try:
+ config_p.read(conf_files)
+ except Exception, e:
+ raise Exception('Cannot read config files "%s": %s' % (conf_files, e))
+
+ return config_p
+
+serv_config = _load_config()
+
+
+class _Defaults(dict):
+ __slots__ = ()
+
+ def __setitem__(self, key, value):
+ func = lambda *a: str(value)
+ return dict.__setitem__(self, key, func)
+
+
+class ServerConfiguration(osv.osv_memory):
+ """Display server configuration."""
+ _name = 'server.config'
+ _columns = {}
+ _defaults = _Defaults()
+
+ def __init__(self, pool, cr):
+ res = super(ServerConfiguration, self).__init__(pool, cr)
+ self.running_env = system_base_config['running_env']
+ # Only show passwords in development
+ self.show_passwords = self.running_env in ('dev',)
+ self._build_osv()
+ return res
+
+ def _group(self, items, prefix):
+ """Return an XML chunk which represents a group of fields."""
+ names = []
+ for k, v in items:
+ key = '%s\\%s' % (prefix, k)
+ # Mask passwords
+ if 'passw' in k and not self.show_passwords:
+ v = '**********'
+ # for the GTK display, we need to replace '_' with '__'.
+ # XXX: remove this hack when we switch to the web client.
+ k = k.replace('_', '__')
+ self._columns[key] = fields.char(k, size=1024)
+ self._defaults[key] = v
+ names.append(key)
+
+ return ('' +
+ ''.join(['' %
+ _escape(name) for name in names]) +
+ '')
+
+ def _build_osv(self):
+ """Build the view for the current configuration."""
+ arch = (''
+ '
'
+ self._arch = etree.fromstring(arch)
+
+ def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False):
+ """Overwrite the default method to render the custom view."""
+ res = super(ServerConfiguration, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar)
+ if view_type == 'form':
+ arch_node = self._arch
+ xarch, xfields = self._view_look_dom_arch(cr, uid, arch_node, view_id, context=context)
+ res['arch'] = xarch
+ res['fields'] = xfields
+ return res
+
+ # TODO: button action_reload
+
+ServerConfiguration()
diff --git a/server_environment/serv_config.xml b/server_environment/serv_config.xml
new file mode 100644
index 0000000..7227b67
--- /dev/null
+++ b/server_environment/serv_config.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/server_environment/system_info.py b/server_environment/system_info.py
new file mode 100644
index 0000000..e932263
--- /dev/null
+++ b/server_environment/system_info.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Adapted by Nicolas Bessi. Copyright Camptocamp SA
+# Based on Florent Xicluna original code. Copyright Wingo SA
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+
+import locale
+import os
+import platform
+import subprocess
+
+import release
+from tools.config import config
+
+
+def _get_output(cmd):
+ bindir = config['root_path']
+ p = subprocess.Popen(cmd, shell=True, cwd=bindir, stdout=subprocess.PIPE)
+ return p.communicate()[0].rstrip()
+
+
+def get_server_environment():
+ # inspired by server/bin/service/web_services.py
+ try:
+ rev_id = _get_output('bzr revision-info')
+ except Exception, e:
+ rev_id = 'Exception: %s' % (e,)
+
+ os_lang = '.'.join([x for x in locale.getdefaultlocale() if x])
+ if not os_lang:
+ os_lang = 'NOT SET'
+ if os.name == 'posix' and platform.system() == 'Linux':
+ lsbinfo = _get_output('lsb_release -a')
+ else:
+ lsbinfo = 'not lsb compliant'
+ return (
+ ('platform', platform.platform()),
+ ('os.name', os.name),
+ ('lsb_release', lsbinfo),
+ ('release', platform.release()),
+ ('version', platform.version()),
+ ('architecture', platform.architecture()[0]),
+ ('locale', os_lang),
+ ('python', platform.python_version()),
+ ('openerp', release.version),
+ ('revision', rev_id),
+ )