207 lines
7.7 KiB
Python
207 lines
7.7 KiB
Python
#This file is part of Tryton. The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms.
|
|
"Options"
|
|
import ConfigParser
|
|
import optparse
|
|
import os
|
|
import gettext
|
|
from version import VERSION
|
|
import logging
|
|
import sys
|
|
import locale
|
|
|
|
_ = gettext.gettext
|
|
|
|
def get_home_dir():
|
|
"""
|
|
Return the closest possible equivalent to a 'home' directory.
|
|
For Posix systems, this is $HOME, and on NT it's $HOMEDRIVE\$HOMEPATH.
|
|
Currently only Posix and NT are implemented, a HomeDirError exception is
|
|
raised for all other OSes.
|
|
"""
|
|
|
|
if os.name == 'posix':
|
|
return os.path.expanduser('~')
|
|
elif os.name == 'nt':
|
|
try:
|
|
return os.path.join(os.environ['HOMEDRIVE'], os.environ['HOMEPATH'])
|
|
except:
|
|
try:
|
|
import _winreg as wreg
|
|
key = wreg.OpenKey(wreg.HKEY_CURRENT_USER,
|
|
"Software\Microsoft\Windows\Current" \
|
|
"Version\Explorer\Shell Folders")
|
|
homedir = wreg.QueryValueEx(key, 'Personal')[0]
|
|
key.Close()
|
|
return homedir
|
|
except:
|
|
return 'C:\\'
|
|
elif os.name == 'dos':
|
|
return 'C:\\'
|
|
else:
|
|
return '.'
|
|
|
|
def find_path(progs, args):
|
|
#TODO check for win32
|
|
paths = [x for x in os.environ['PATH'].split(':')
|
|
if os.path.isdir(x)]
|
|
for dir in paths:
|
|
content = os.listdir(dir)
|
|
for prog in progs:
|
|
if prog in content:
|
|
return os.path.join(dir, prog) + ' ' + args
|
|
return ''
|
|
|
|
|
|
class ConfigManager(object):
|
|
"Config manager"
|
|
|
|
def __init__(self):
|
|
self.options = {
|
|
'login.login': 'admin',
|
|
'login.server': 'localhost',
|
|
'login.port': '8070',
|
|
'login.protocol': 'socket://',
|
|
'login.db': False,
|
|
'client.modepda': False,
|
|
'client.toolbar': 'default',
|
|
'tip.autostart': False,
|
|
'tip.position': 0,
|
|
'logging.logger': '',
|
|
'logging.level': 'ERROR',
|
|
'logging.verbose': False,
|
|
'client.default_path': get_home_dir(),
|
|
'form.toolbar': True,
|
|
'client.form_tab': 'left',
|
|
'client.form_tab_orientation': 90,
|
|
'client.tree_width': True,
|
|
'client.spellcheck': False,
|
|
'client.lang': locale.getdefaultlocale()[0],
|
|
'client.actions': {
|
|
'odt': {0: find_path(['ooffice', 'ooffice2'], '%s'),
|
|
1: find_path(['ooffice', 'ooffice2'], '-p %s')},
|
|
'txt': {0: find_path(['ooffice', 'ooffice2'], '%s'),
|
|
1: find_path(['ooffice', 'ooffice2'], '-p %s')},
|
|
'pdf': {0: find_path(['evince', 'xpdf', 'gpdf',
|
|
'kpdf', 'epdfview', 'acroread'], '%s'), 1: ''},
|
|
'png': {0: find_path(['display', 'qiv', 'eye', 'mspaint.exe'],
|
|
'%s'), 1: ''},
|
|
},
|
|
'roundup.url': 'http://bugs.tryton.org/roundup/',
|
|
'roundup.xmlrpc': 'roundup-xmlrpc.tryton.org',
|
|
}
|
|
parser = optparse.OptionParser(version=("Tryton %s" % VERSION))
|
|
parser.add_option("-c", "--config", dest="config",
|
|
help=_("specify alternate config file"))
|
|
parser.add_option("-v", "--verbose", action="store_true",
|
|
default=False, dest="verbose",
|
|
help=_("enable basic debugging"))
|
|
parser.add_option("-d", "--log", dest="log_logger", default='',
|
|
help=_("specify channels to log"))
|
|
parser.add_option("-l", "--log-level", dest="log_level",
|
|
default='ERROR', help=_("specify the log level: " \
|
|
"INFO, DEBUG, WARNING, ERROR, CRITICAL"))
|
|
parser.add_option("-u", "--user", dest="login",
|
|
help=_("specify the login user"))
|
|
parser.add_option("-p", "--port", dest="port",
|
|
help=_("specify the server port"))
|
|
parser.add_option("-s", "--server", dest="server",
|
|
help=_("specify the server hostname"))
|
|
opt = parser.parse_args()[0]
|
|
|
|
|
|
self.rcfile = opt.config or os.path.join(get_home_dir(), '.tryton')
|
|
self.load()
|
|
|
|
if opt.verbose:
|
|
self.options['logging.verbose'] = True
|
|
self.options['logging.logger'] = opt.log_logger
|
|
self.options['logging.level'] = opt.log_level
|
|
|
|
for arg in ('login', 'port', 'server'):
|
|
if getattr(opt, arg):
|
|
self.options['login.'+arg] = getattr(opt, arg)
|
|
|
|
def save(self):
|
|
try:
|
|
configparser = ConfigParser.ConfigParser()
|
|
for option in self.options.keys():
|
|
if not len(option.split('.')) == 2:
|
|
continue
|
|
section, name = option.split('.')
|
|
if section in ('logging'):
|
|
continue
|
|
if not configparser.has_section(section):
|
|
configparser.add_section(section)
|
|
configparser.set(section, name, self.options[option])
|
|
configparser.write(file(self.rcfile, 'wb'))
|
|
except:
|
|
logging.getLogger('common.options').warn(
|
|
_('Unable to write config file %s!') % \
|
|
(self.rcfile,))
|
|
return False
|
|
return True
|
|
|
|
def load(self):
|
|
try:
|
|
if not os.path.isfile(self.rcfile):
|
|
return False
|
|
|
|
configparser = ConfigParser.ConfigParser()
|
|
configparser.read([self.rcfile])
|
|
for section in configparser.sections():
|
|
for (name, value) in configparser.items(section):
|
|
if value.lower() == 'true':
|
|
value = True
|
|
elif value.lower() == 'false':
|
|
value = False
|
|
if section == 'client' and name == 'actions':
|
|
value = eval(value)
|
|
self.options[section + '.' + name] = value
|
|
except:
|
|
logging.getLogger('options').warn(
|
|
_('Unable to read config file %s!') % \
|
|
(self.rcfile,))
|
|
return False
|
|
return True
|
|
|
|
def __setitem__(self, key, value):
|
|
self.options[key] = value
|
|
|
|
def __getitem__(self, key):
|
|
return self.options[key]
|
|
|
|
CONFIG = ConfigManager()
|
|
CURRENT_DIR = os.path.abspath(os.path.normpath(os.path.join(
|
|
os.path.dirname(__file__), '..')))
|
|
PREFIX = os.path.abspath(os.path.normpath(os.path.join(
|
|
os.path.dirname(sys.argv[0]), '..')))
|
|
PIXMAPS_DIR = os.path.join(CURRENT_DIR, 'share', 'pixmaps')
|
|
if not os.path.isdir(PIXMAPS_DIR):
|
|
PIXMAPS_DIR = os.path.join(PREFIX, 'share', 'pixmaps')
|
|
if not os.path.isdir(PIXMAPS_DIR):
|
|
PREFIX = os.path.abspath(os.path.normpath(
|
|
os.path.dirname(sys.argv[0])))
|
|
PIXMAPS_DIR = os.path.join(PREFIX, 'share', 'pixmaps')
|
|
|
|
if os.name == 'nt':
|
|
sys.path.insert(0, os.path.join(CURRENT_DIR, 'GTK\\bin'))
|
|
sys.path.insert(0, os.path.join(CURRENT_DIR, 'GTK\\lib'))
|
|
sys.path.insert(0, os.path.join(CURRENT_DIR))
|
|
os.environ['PATH'] = os.path.join(CURRENT_DIR, 'GTK\\lib') + ";" + \
|
|
os.environ['PATH']
|
|
os.environ['PATH'] = os.path.join(CURRENT_DIR, 'GTK\\bin') + ";" + \
|
|
os.environ['PATH']
|
|
os.environ['PATH'] = os.path.join(CURRENT_DIR) + ";" + os.environ['PATH']
|
|
|
|
import gtk
|
|
|
|
TRYTON_ICON = gtk.gdk.pixbuf_new_from_file(
|
|
os.path.join(PIXMAPS_DIR, 'tryton-icon.png'))
|
|
|
|
def _data_dir():
|
|
data_dir = os.path.join(CURRENT_DIR, 'share', 'tryton')
|
|
if not os.path.isdir(data_dir):
|
|
data_dir = os.path.join(PREFIX, 'share', 'tryton')
|
|
return data_dir
|
|
DATA_DIR = _data_dir()
|