Moving server environment module and sample module
This commit is contained in:
parent
11f44efa63
commit
7b76f579df
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
from .serv_config import serv_config, setboolean
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
# -*- 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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
"name": "server configuration environment files",
|
||||
"version": "1.0",
|
||||
"depends": ["base", "server_environment_files"],
|
||||
"author": "Camptocamp",
|
||||
"description": """\
|
||||
Environment file pattern for OpenERP
|
||||
====================================
|
||||
|
||||
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 the OpenERP configuration
|
||||
file::
|
||||
|
||||
[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 keep your settings into a module instead of
|
||||
using config files that might be mixed with openerprc or altered. It
|
||||
is an alternative way to the base config file for such configuration
|
||||
needs . 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 contained in keys named 'passw'.
|
||||
|
||||
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 stored in the `server_environment_files`
|
||||
module, and user config parser module syntax. Look at the module to
|
||||
get some examples. The `default` configuration are stored in the
|
||||
`default/` directory. You can add one directory for each environment
|
||||
you want to define, named after the environment. All config defined in
|
||||
non-default environments will override or complement the default
|
||||
config. If your attibutes contain `passw`, it will only be shown in
|
||||
the `dev` environment.
|
||||
|
||||
Example usage
|
||||
-------------
|
||||
|
||||
::
|
||||
|
||||
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",
|
||||
"data": [
|
||||
'serv_config.xml',
|
||||
],
|
||||
"installable": True,
|
||||
"active": False,
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# Translation of OpenERP Server.
|
||||
# This file contains the translation of the following modules:
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 7.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2014-03-14 17:41+0000\n"
|
||||
"PO-Revision-Date: 2014-03-14 17:41+0000\n"
|
||||
"Last-Translator: <>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Plural-Forms: \n"
|
||||
|
||||
|
|
@ -0,0 +1,195 @@
|
|||
# -*- 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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import os
|
||||
import ConfigParser
|
||||
from lxml import etree
|
||||
|
||||
from openerp.osv import fields, orm
|
||||
from openerp.tools.config import config as system_base_config
|
||||
|
||||
from .system_info import get_server_environment
|
||||
|
||||
from openerp.addons 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 recommend against using the rc file but instead use an "
|
||||
"explicit 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 exist, "
|
||||
"please add a folder %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 as 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(orm.TransientModel):
|
||||
"""Display server configuration."""
|
||||
_name = 'server.config'
|
||||
_columns = {}
|
||||
_conf_defaults = _Defaults()
|
||||
|
||||
def __init__(self, pool, cr):
|
||||
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._arch = None
|
||||
self._build_osv()
|
||||
|
||||
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 = '**********'
|
||||
self._columns[key] = fields.char(k, size=1024)
|
||||
self._conf_defaults[key] = v
|
||||
names.append(key)
|
||||
|
||||
return ('<group col="2" colspan="4">' +
|
||||
''.join(['<field name="%s" readonly="1"/>' %
|
||||
_escape(name) for name in names]) +
|
||||
'</group>')
|
||||
|
||||
def _build_osv(self):
|
||||
"""Build the view for the current configuration."""
|
||||
arch = ('<?xml version="1.0" encoding="utf-8"?>'
|
||||
'<form string="Configuration Form">'
|
||||
'<notebook colspan="4">')
|
||||
|
||||
# OpenERP server configuration
|
||||
rcfile = system_base_config.rcfile
|
||||
items = sorted(system_base_config.options.items())
|
||||
arch += '<page string="OpenERP">'
|
||||
arch += '<separator string="%s" colspan="4"/>' % _escape(rcfile)
|
||||
arch += self._group(items, prefix='openerp')
|
||||
arch += '<separator colspan="4"/></page>'
|
||||
|
||||
arch += '<page string="Environment based configurations">'
|
||||
for section in sorted(serv_config.sections()):
|
||||
items = sorted(serv_config.items(section))
|
||||
arch += '<separator string="[%s]" colspan="4"/>' % _escape(section)
|
||||
arch += self._group(items, prefix=section)
|
||||
arch += '<separator colspan="4"/></page>'
|
||||
|
||||
# System information
|
||||
arch += '<page string="System">'
|
||||
arch += '<separator string="Server Environment" colspan="4"/>'
|
||||
arch += self._group(get_server_environment(), prefix='system')
|
||||
arch += '<separator colspan="4"/></page>'
|
||||
|
||||
arch += '</notebook></form>'
|
||||
self._arch = etree.fromstring(arch)
|
||||
|
||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form',
|
||||
context=None, toolbar=False, submenu=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
|
||||
|
||||
def default_get(self, cr, uid, fields_list, context=None):
|
||||
res = {}
|
||||
for key in self._conf_defaults:
|
||||
res[key] = self._conf_defaults[key]()
|
||||
return res
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<act_window id="act_show_config_window"
|
||||
name="Server Environment"
|
||||
res_model="server.config"
|
||||
view_type="form"
|
||||
view_mode="form"/>
|
||||
|
||||
<menuitem
|
||||
parent="base.menu_config"
|
||||
icon="STOCK_PROPERTIES"
|
||||
sequence="90"
|
||||
action="act_show_config_window"
|
||||
id="menu_server_show_config"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import locale
|
||||
import os
|
||||
import platform
|
||||
import subprocess
|
||||
|
||||
from openerp import release
|
||||
from openerp.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 as 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),
|
||||
)
|
||||
Loading…
Reference in New Issue