Merge lp:~jfb-tempo-consulting/unifield-web/us-812 into lp:unifield-web

Proposed by jftempo
Status: Merged
Merged at revision: 4778
Proposed branch: lp:~jfb-tempo-consulting/unifield-web/us-812
Merge into: lp:unifield-web
Diff against target: 599 lines (+353/-29)
11 files modified
addons/openerp/controllers/actions.py (+20/-6)
addons/openerp/controllers/database.py (+44/-11)
addons/openerp/utils/serve_file.py (+142/-0)
addons/openerp/utils/tools.py (+2/-1)
doc/openerp-web-oc.cfg (+5/-0)
doc/openerp-web-win.cfg (+93/-0)
doc/openerp-web.cfg (+2/-1)
openobject/__init__.py (+6/-3)
openobject/commands.py (+32/-3)
openobject/tools/_expose.py (+4/-2)
setup.nsi (+3/-2)
To merge this branch: bzr merge lp:~jfb-tempo-consulting/unifield-web/us-812
Reviewer Review Type Date Requested Status
UniField Reviewer Team Pending
Review via email: mp+283073@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'addons/openerp/controllers/actions.py'
--- addons/openerp/controllers/actions.py 2015-12-18 16:10:29 +0000
+++ addons/openerp/controllers/actions.py 2016-01-19 10:40:01 +0000
@@ -27,7 +27,7 @@
27import zlib27import zlib
2828
29import cherrypy29import cherrypy
30from openerp.utils import rpc, common, expr_eval, TinyDict30from openerp.utils import rpc, common, expr_eval, TinyDict, is_server_local, serve_file
3131
32from form import Form32from form import Form
33from openobject import tools33from openobject import tools
@@ -36,6 +36,7 @@
36from wizard import Wizard36from wizard import Wizard
37import urllib37import urllib
38import re38import re
39import os
3940
40def execute_window(view_ids, model, res_id=False, domain=None, view_type='form', context=None,41def execute_window(view_ids, model, res_id=False, domain=None, view_type='form', context=None,
41 mode='form,tree', name=None, target=None, limit=None, search_view=None,42 mode='form,tree', name=None, target=None, limit=None, search_view=None,
@@ -127,17 +128,29 @@
127}128}
128129
129def _print_data(data):130def _print_data(data):
130131 if 'result' not in data and 'path' not in data:
131 if 'result' not in data:
132 raise common.message(_('Error no report'))132 raise common.message(_('Error no report'))
133133
134 cherrypy.response.headers['Content-Type'] = PRINT_FORMATS[data['format']]
134 if data.get('code','normal')=='zlib':135 if data.get('code','normal')=='zlib':
135 import zlib136 import zlib
136 content = zlib.decompress(base64.decodestring(data['result']))137 content = zlib.decompress(base64.decodestring(data['result']))
137 else:138 else:
139 if not data.get('result') and data.get('path'):
140 try:
141 return serve_file.serve_file(data['path'], "application/x-download", 'attachment', delete=data.get('delete', False))
142 except Exception, e:
143 cherrypy.response.headers['Content-Type'] = 'text/html'
144 if 'Content-Disposition' in cherrypy.response.headers:
145 del(cherrypy.response.headers['Content-Disposition'])
146 raise common.warning(e)
147 finally:
148 if data.get('delete', False) and os.path.exists(data['path']):
149 os.remove(data['path'])
150# return cherrypy.lib.static.serve_file(data['path'], "application/x-download", 'attachment')
151
138 content = base64.decodestring(data['result'])152 content = base64.decodestring(data['result'])
139153
140 cherrypy.response.headers['Content-Type'] = PRINT_FORMATS[data['format']]
141 return content154 return content
142155
143def execute_report(name, **data):156def execute_report(name, **data):
@@ -162,6 +175,8 @@
162 try:175 try:
163 ctx = dict(rpc.session.context)176 ctx = dict(rpc.session.context)
164 ctx.update(datas.get('context', {}))177 ctx.update(datas.get('context', {}))
178 if is_server_local():
179 ctx['report_fromfile'] = 1
165 report_id = rpc.session.execute('report', 'report', name, ids, datas, ctx)180 report_id = rpc.session.execute('report', 'report', name, ids, datas, ctx)
166 state = False181 state = False
167 attempt = 0182 attempt = 0
@@ -189,8 +204,7 @@
189 if datas.get('force_attach'):204 if datas.get('force_attach'):
190 attachment = 'attachment;'205 attachment = 'attachment;'
191 if background_id:206 if background_id:
192 bg_report = rpc.session.execute('object', 'execute', 'memory.background.report', 'write', [background_id], {'report_id': report_id, 'report_name': report_name})207 bg_report = rpc.session.execute('object', 'execute', 'memory.background.report', 'write', [background_id], {'report_id': background_id, 'report_name': report_name})
193
194208
195 while not state:209 while not state:
196 val = rpc.session.execute('report', 'report_get', report_id)210 val = rpc.session.execute('report', 'report_get', report_id)
197211
=== modified file 'addons/openerp/controllers/database.py'
--- addons/openerp/controllers/database.py 2015-05-28 10:07:02 +0000
+++ addons/openerp/controllers/database.py 2016-01-19 10:40:01 +0000
@@ -21,6 +21,7 @@
21import base6421import base64
22import re22import re
23import time23import time
24import os
2425
25import cherrypy26import cherrypy
26import formencode27import formencode
@@ -31,7 +32,9 @@
31import openobject.errors32import openobject.errors
3233
33from openerp import validators34from openerp import validators
34from openerp.utils import rpc, get_server_version35from openerp.utils import rpc, get_server_version, is_server_local, serve_file
36from tempfile import NamedTemporaryFile
37import shutil
3538
36def get_lang_list():39def get_lang_list():
37 langs = [('en_US', 'English (US)')]40 langs = [('en_US', 'English (US)')]
@@ -94,14 +97,19 @@
94 fields = [openobject.widgets.SelectField(name='dbname', options=get_db_list, label=_('Database:'), validator=validators.String(not_empty=True)),97 fields = [openobject.widgets.SelectField(name='dbname', options=get_db_list, label=_('Database:'), validator=validators.String(not_empty=True)),
95 openobject.widgets.PasswordField(name='password', label=_('Backup password:'), validator=formencode.validators.NotEmpty())]98 openobject.widgets.PasswordField(name='password', label=_('Backup password:'), validator=formencode.validators.NotEmpty())]
9699
100class FileField(openobject.widgets.FileField):
101 def adjust_value(self, value, **params):
102 return False
103
97class FormRestore(DBForm):104class FormRestore(DBForm):
98 name = "restore"105 name = "restore"
99 string = _('Restore database')106 string = _('Restore database')
100 action = '/openerp/database/do_restore'107 action = '/openerp/database/do_restore'
101 submit_text = _('Restore')108 submit_text = _('Restore')
102 fields = [openobject.widgets.FileField(name="filename", label=_('File:')),109 fields = [FileField(name="filename", label=_('File:')),
103 openobject.widgets.PasswordField(name='password', label=_('Restore password:'), validator=formencode.validators.NotEmpty()),110 openobject.widgets.PasswordField(name='password', label=_('Restore password:'), validator=formencode.validators.NotEmpty()),
104 openobject.widgets.TextField(name='dbname', label=_('New database name:'), validator=formencode.validators.NotEmpty(), readonly=1, attrs={'readonly': ''})]111 openobject.widgets.TextField(name='dbname', label=_('New database name:'), validator=formencode.validators.NotEmpty(), readonly=1, attrs={'readonly': ''})]
112 hidden_fields = [openobject.widgets.HiddenField(name='fpath', label=_('Path:'))]
105113
106class FormPassword(DBForm):114class FormPassword(DBForm):
107 name = "password"115 name = "password"
@@ -245,15 +253,24 @@
245 def do_backup(self, dbname, password, **kw):253 def do_backup(self, dbname, password, **kw):
246 self.msg = {}254 self.msg = {}
247 try:255 try:
248 res = rpc.session.execute_db('dump', password, dbname)
249 filename = [dbname, time.strftime('%Y%m%d-%H%M%S')]256 filename = [dbname, time.strftime('%Y%m%d-%H%M%S')]
250 version = get_server_version()257 version = get_server_version()
251 if version:258 if version:
252 filename.append(version)259 filename.append(version)
253 if res:260
254 cherrypy.response.headers['Content-Type'] = "application/data"261 if is_server_local():
255 cherrypy.response.headers['Content-Disposition'] = 'filename="%s.dump"' % '-'.join(filename)262 res = rpc.session.execute_db('dump_file', password, dbname)
256 return base64.decodestring(res)263 try:
264 return serve_file.serve_file(res, "application/x-download", 'attachment', '%s.dump' % '-'.join(filename), delete=True)
265 finally:
266 if os.path.exists(res):
267 os.remove(res)
268 else:
269 res = rpc.session.execute_db('dump', password, dbname)
270 if res:
271 cherrypy.response.headers['Content-Type'] = "application/data"
272 cherrypy.response.headers['Content-Disposition'] = 'filename="%s.dump"' % '-'.join(filename)
273 return base64.decodestring(res)
257 except openobject.errors.AccessDenied, e:274 except openobject.errors.AccessDenied, e:
258 self.msg = {'message': _('Wrong password'),275 self.msg = {'message': _('Wrong password'),
259 'title' : e.title}276 'title' : e.title}
@@ -293,14 +310,30 @@
293 'title': _('Error')}310 'title': _('Error')}
294 return self.restore()311 return self.restore()
295 try:312 try:
296 data = base64.encodestring(filename.file.read())313 if is_server_local():
297 rpc.session.execute_db('restore', password, dbname, data)314 if not filename.filename and kw.get('fpath'):
315 filename = kw.get('fpath')
316 else:
317 newfile = NamedTemporaryFile(delete=False)
318 shutil.copyfileobj(filename.file, newfile)
319 filename = newfile.name
320 newfile.close()
321 rpc.session.execute_db('restore_file', password, dbname, filename)
322 else:
323 data = base64.encodestring(filename.file.read())
324 rpc.session.execute_db('restore', password, dbname, data)
298 except openobject.errors.AccessDenied, e:325 except openobject.errors.AccessDenied, e:
299 self.msg = {'message': _('Wrong password'),326 self.msg = {'message': _('Wrong password'),
300 'title' : e.title}327 'title' : e.title}
328 if hasattr(cherrypy.request, 'input_values') and filename:
329 cherrypy.request.input_values['fpath'] = filename
301 return self.restore()330 return self.restore()
302 except Exception:331 except Exception, e:
303 self.msg = {'message': _("Could not restore database")}332 msg = _("Could not restore database")
333 if isinstance(e, openobject.errors.TinyException):
334 if 'Database already exists' in e.message:
335 msg = _("Could not restore: database already exists")
336 self.msg = {'message': msg}
304 return self.restore()337 return self.restore()
305 raise redirect('/openerp/login', db=dbname)338 raise redirect('/openerp/login', db=dbname)
306339
307340
=== added file 'addons/openerp/utils/serve_file.py'
--- addons/openerp/utils/serve_file.py 1970-01-01 00:00:00 +0000
+++ addons/openerp/utils/serve_file.py 2016-01-19 10:40:01 +0000
@@ -0,0 +1,142 @@
1import mimetypes
2mimetypes.init()
3mimetypes.types_map['.dwg']='image/x-dwg'
4mimetypes.types_map['.ico']='image/x-icon'
5
6import os
7import re
8import stat
9import time
10import urllib
11import tempfile
12import cherrypy
13from cherrypy.lib import cptools, http, file_generator_limited
14
15def serve_file(path, content_type=None, disposition=None, name=None, delete=False):
16 """Set status, headers, and body in order to serve the given file.
17
18 The Content-Type header will be set to the content_type arg, if provided.
19 If not provided, the Content-Type will be guessed by the file extension
20 of the 'path' argument.
21
22 If disposition is not None, the Content-Disposition header will be set
23 to "<disposition>; filename=<name>". If name is None, it will be set
24 to the basename of path. If disposition is None, no Content-Disposition
25 header will be written.
26 """
27
28 response = cherrypy.response
29
30 # If path is relative, users should fix it by making path absolute.
31 # That is, CherryPy should not guess where the application root is.
32 # It certainly should *not* use cwd (since CP may be invoked from a
33 # variety of paths). If using tools.static, you can make your relative
34 # paths become absolute by supplying a value for "tools.static.root".
35 if not os.path.isabs(path):
36 raise ValueError("'%s' is not an absolute path." % path)
37
38 try:
39 st = os.stat(path)
40 except OSError:
41 raise cherrypy.NotFound()
42
43 # Check if path is a directory.
44 if stat.S_ISDIR(st.st_mode):
45 # Let the caller deal with it as they like.
46 raise cherrypy.NotFound()
47
48 # Set the Last-Modified response header, so that
49 # modified-since validation code can work.
50 response.headers['Last-Modified'] = http.HTTPDate(st.st_mtime)
51 cptools.validate_since()
52
53 if content_type is None:
54 # Set content-type based on filename extension
55 ext = ""
56 i = path.rfind('.')
57 if i != -1:
58 ext = path[i:].lower()
59 content_type = mimetypes.types_map.get(ext, "text/plain")
60 response.headers['Content-Type'] = content_type
61
62 if disposition is not None:
63 if name is None:
64 name = os.path.basename(path)
65 cd = '%s; filename="%s"' % (disposition, name)
66 response.headers["Content-Disposition"] = cd
67
68 # Set Content-Length and use an iterable (file object)
69 # this way CP won't load the whole file in memory
70 c_len = st.st_size
71 if delete:
72 flag = os.O_RDWR | os.O_EXCL
73 if hasattr(os, 'O_BINARY'):
74 flag |= os.O_BINARY
75 if os.name == 'nt':
76 flag |= os.O_TEMPORARY
77 fd = os.open(path, flag)
78 file = os.fdopen(fd, 'rb')
79 bodyfile = file
80 else:
81 bodyfile = open(path, 'rb')
82
83 # HTTP/1.0 didn't have Range/Accept-Ranges headers, or the 206 code
84 if cherrypy.request.protocol >= (1, 1):
85 response.headers["Accept-Ranges"] = "bytes"
86 r = http.get_ranges(cherrypy.request.headers.get('Range'), c_len)
87 if r == []:
88 response.headers['Content-Range'] = "bytes */%s" % c_len
89 message = "Invalid Range (first-byte-pos greater than Content-Length)"
90 raise cherrypy.HTTPError(416, message)
91 if r:
92 if len(r) == 1:
93 # Return a single-part response.
94 start, stop = r[0]
95 if stop > c_len:
96 stop = c_len
97 r_len = stop - start
98 response.status = "206 Partial Content"
99 response.headers['Content-Range'] = ("bytes %s-%s/%s" %
100 (start, stop - 1, c_len))
101 response.headers['Content-Length'] = r_len
102 bodyfile.seek(start)
103 response.body = file_generator_limited(bodyfile, r_len)
104 else:
105 # Return a multipart/byteranges response.
106 response.status = "206 Partial Content"
107 import mimetools
108 boundary = mimetools.choose_boundary()
109 ct = "multipart/byteranges; boundary=%s" % boundary
110 response.headers['Content-Type'] = ct
111 if response.headers.has_key("Content-Length"):
112 # Delete Content-Length header so finalize() recalcs it.
113 del response.headers["Content-Length"]
114
115 def file_ranges():
116 # Apache compatibility:
117 yield "\r\n"
118
119 for start, stop in r:
120 yield "--" + boundary
121 yield "\r\nContent-type: %s" % content_type
122 yield ("\r\nContent-range: bytes %s-%s/%s\r\n\r\n"
123 % (start, stop - 1, c_len))
124 bodyfile.seek(start)
125 for chunk in file_generator_limited(bodyfile, stop-start):
126 yield chunk
127 yield "\r\n"
128 # Final boundary
129 yield "--" + boundary + "--"
130
131 # Apache compatibility:
132 yield "\r\n"
133 response.body = file_ranges()
134 else:
135 response.headers['Content-Length'] = c_len
136 response.body = bodyfile
137 else:
138 response.headers['Content-Length'] = c_len
139 response.body = bodyfile
140 response.stream = True
141 return response.body
142
0143
=== modified file 'addons/openerp/utils/tools.py'
--- addons/openerp/utils/tools.py 2011-06-30 13:58:31 +0000
+++ addons/openerp/utils/tools.py 2016-01-19 10:40:01 +0000
@@ -253,5 +253,6 @@
253 def __deepcopy__(self, visit):253 def __deepcopy__(self, visit):
254 return self254 return self
255255
256256def is_server_local():
257 return cherrypy.config.get('openerp.server.host') in ['127.0.0.1', 'localhost']
257# vim: ts=4 sts=4 sw=4 si et258# vim: ts=4 sts=4 sw=4 si et
258259
=== added file 'doc/openerp-web-oc.cfg'
--- doc/openerp-web-oc.cfg 1970-01-01 00:00:00 +0000
+++ doc/openerp-web-oc.cfg 2016-01-19 10:40:01 +0000
@@ -0,0 +1,5 @@
1[global]
2
3# Web tcp/port, default port is 8061
4#server.socket_port = 8061
5
06
=== added file 'doc/openerp-web-win.cfg'
--- doc/openerp-web-win.cfg 1970-01-01 00:00:00 +0000
+++ doc/openerp-web-win.cfg 2016-01-19 10:40:01 +0000
@@ -0,0 +1,93 @@
1[global]
2server.environment = "development"
3
4# Some server parameters that you may want to tweak
5server.socket_host = "0.0.0.0"
6server.socket_port = 8061
7
8# Sets the number of threads the server uses
9server.thread_pool = 40
10
11tools.sessions.on = True
12tools.sessions.persistent = False
13
14# Simple code profiling
15server.profile_on = False
16server.profile_dir = "profile"
17# Max size: 10GB
18server.max_request_body_size = 10737418240
19# disable monitor which raises an error at the end of the request
20engine.timeout_monitor.on = False
21
22# if this is part of a larger site, you can set the path
23# to the TurboGears instance here
24#server.webpath = ""
25
26# Set to True if you are deploying your App behind a proxy
27# e.g. Apache using mod_proxy
28#tools.proxy.on = True
29
30# If your proxy does not add the X-Forwarded-Host header, set
31# the following to the *public* host url.
32#tools.proxy.base = 'http://mydomain.com'
33
34# logging
35#log.screen = False
36#log.access_file = "/var/log/openerp-web/access.log"
37#log.error_file = "/var/log/openerp-web/error.log"
38log.error_file = "../ServerLog/openerp-web.log"
39log.access_level = "INFO"
40log.error_level = "INFO"
41# Replaces the cherrypy-created FileHandler by a TimedRotatingFileHandler,
42# requires that access_file and error_file be uncommented and set correctly
43# (they will be used to configure the rotating file handlers).
44# Value should be a dictionary providing TimedRotatingFileHandler's optional
45# arguments (any argument can be provided but `filename`).
46# See the documentation at http://docs.python.org/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler
47# for more informations on TimedRotatingFileHandler
48log.rotate = {'when' : 'D'}
49
50# Set to false to disable CSRF checks
51tools.csrf.on = True
52
53# replace builtin traceback tools by cgitb
54tools.log_tracebacks.on: False
55tools.cgitb.on: True
56# a default install can probably avoid logging those via cgitb as they're
57# available in the server log
58tools.cgitb.ignore=(
59 openobject.errors.Concurrency,
60 openobject.errors.TinyException)
61
62# if enable this force cookie to be sent over a secure channel 'ssl'
63# (make sure you site is reachable on https before activating this)
64#tools.secure_cookies.on = True
65
66# if enable for browse who understand this, the cookie will not be
67# readable by scripts, see: http://www.owasp.org/index.php/HttpOnly
68tools.httponly_cookies.on = True
69
70# fix support of cherrpy 3.1.2 tools.sessions.persistant = False
71tools.fix_312_session_persistent.on = True
72
73# OpenERP Server
74openerp.server.host = 'localhost'
75openerp.server.port = '8070'
76openerp.server.protocol = 'socket'
77openerp.server.timeout = 1800
78
79# Web client settings
80[openerp-web]
81# filter dblists based on url pattern?
82# NONE: No Filter
83# EXACT: Exact Hostname
84# UNDERSCORE: Hostname_
85# BOTH: Exact Hostname or Hostname_
86
87dblist.filter = 'NONE'
88
89# whether to show Databases button on Login screen or not
90dbbutton.visible = True
91
92# will be applied on company logo
93company.url = ''
094
=== modified file 'doc/openerp-web.cfg'
--- doc/openerp-web.cfg 2015-10-01 08:55:14 +0000
+++ doc/openerp-web.cfg 2016-01-19 10:40:01 +0000
@@ -14,7 +14,8 @@
14# Simple code profiling14# Simple code profiling
15server.profile_on = False15server.profile_on = False
16server.profile_dir = "profile"16server.profile_dir = "profile"
17server.max_request_body_size = 20971520017# Max size: 10GB
18server.max_request_body_size = 10737418240
18# disable monitor which raises an error at the end of the request19# disable monitor which raises an error at the end of the request
19engine.timeout_monitor.on = False20engine.timeout_monitor.on = False
2021
2122
=== modified file 'openobject/__init__.py'
--- openobject/__init__.py 2011-06-22 09:35:20 +0000
+++ openobject/__init__.py 2016-01-19 10:40:01 +0000
@@ -128,8 +128,11 @@
128 error_handler = handlers.TimedRotatingFileHandler(error_file, **rotate)128 error_handler = handlers.TimedRotatingFileHandler(error_file, **rotate)
129 error_handler.setLevel(error_level)129 error_handler.setLevel(error_level)
130 log.error_log.addHandler(error_handler)130 log.error_log.addHandler(error_handler)
131 log.error_file = ''
131132
132 # Make a new RotatingFileHandler for the access log.133 # Make a new RotatingFileHandler for the access log.
133 access_handler = handlers.TimedRotatingFileHandler(access_file, **rotate)134 if access_file:
134 access_handler.setLevel(access_level)135 access_handler = handlers.TimedRotatingFileHandler(access_file, **rotate)
135 log.access_log.addHandler(access_handler)136 access_handler.setLevel(access_level)
137 log.access_log.addHandler(access_handler)
138 log.access_file = ''
136139
=== modified file 'openobject/commands.py'
--- openobject/commands.py 2013-02-04 11:48:01 +0000
+++ openobject/commands.py 2016-01-19 10:40:01 +0000
@@ -19,6 +19,15 @@
1919
20DISTRIBUTION_CONFIG = os.path.join('doc', 'openerp-web.cfg')20DISTRIBUTION_CONFIG = os.path.join('doc', 'openerp-web.cfg')
21FROZEN_DISTRIBUTION_CONFIG = os.path.join('conf', 'openerp-web.cfg')21FROZEN_DISTRIBUTION_CONFIG = os.path.join('conf', 'openerp-web.cfg')
22OVERRIDE_CONFIG = os.path.join('conf', 'openerp-web-oc.cfg')
23def get_config_override_file():
24 if hasattr(sys, 'frozen'):
25 configfile = os.path.join(openobject.paths.root(), OVERRIDE_CONFIG)
26 if os.path.exists(configfile):
27 return configfile
28
29 return False
30
22def get_config_file():31def get_config_file():
23 if hasattr(sys, 'frozen'):32 if hasattr(sys, 'frozen'):
24 configfile = os.path.join(openobject.paths.root(), FROZEN_DISTRIBUTION_CONFIG)33 configfile = os.path.join(openobject.paths.root(), FROZEN_DISTRIBUTION_CONFIG)
@@ -37,6 +46,8 @@
37 parser = OptionParser(version="%s" % (openobject.release.version))46 parser = OptionParser(version="%s" % (openobject.release.version))
38 parser.add_option("-c", "--config", metavar="FILE", dest="config",47 parser.add_option("-c", "--config", metavar="FILE", dest="config",
39 help="configuration file", default=get_config_file())48 help="configuration file", default=get_config_file())
49 parser.add_option("--config-override", metavar="FILE", dest="config_override",
50 help="override configuration file", default=get_config_override_file())
40 parser.add_option("-a", "--address", help="host address, overrides server.socket_host")51 parser.add_option("-a", "--address", help="host address, overrides server.socket_host")
41 parser.add_option("-p", "--port", help="port number, overrides server.socket_port")52 parser.add_option("-p", "--port", help="port number, overrides server.socket_port")
42 parser.add_option("--openerp-host", dest="openerp_host", help="overrides openerp.server.host")53 parser.add_option("--openerp-host", dest="openerp_host", help="overrides openerp.server.host")
@@ -50,13 +61,26 @@
50 if not os.path.exists(options.config):61 if not os.path.exists(options.config):
51 raise ConfigurationError(_("Could not find configuration file: %s") %62 raise ConfigurationError(_("Could not find configuration file: %s") %
52 options.config)63 options.config)
53 64
65 error_config = False
54 app_config = as_dict(options.config)66 app_config = as_dict(options.config)
55 67 if options.config_override:
68 try:
69 over_config = as_dict(options.config_override)
70 for section, value in over_config.iteritems():
71 app_config.setdefault(section, {}).update(value)
72 except Exception, error_config:
73 pass
56 openobject.configure(app_config)74 openobject.configure(app_config)
75
76 if error_config:
77 cherrypy.log('Unable to parse %s\nError: %s' % (options.config_override, error_config), "ERROR")
78 raise ConfigurationError(_("Unable to parse: %s") %
79 options.config_override)
80
57 if options.static:81 if options.static:
58 openobject.enable_static_paths()82 openobject.enable_static_paths()
59 83
60 if options.address:84 if options.address:
61 cherrypy.config['server.socket_host'] = options.address85 cherrypy.config['server.socket_host'] = options.address
62 if options.port:86 if options.port:
@@ -64,6 +88,11 @@
64 cherrypy.config['server.socket_port'] = int(options.port)88 cherrypy.config['server.socket_port'] = int(options.port)
65 except:89 except:
66 pass90 pass
91 port = cherrypy.config.get('server.socket_port')
92 if not isinstance(port, (int, long)) or port < 1 or port > 65535:
93 cherrypy.log('Wrong configuration socket_port: %s' % (port,), "ERROR")
94 raise ConfigurationError(_("Wrong configuration socket_port: %s") %
95 port)
67 if options.openerp_host:96 if options.openerp_host:
68 cherrypy.config['openerp.server.host'] = options.openerp_host97 cherrypy.config['openerp.server.host'] = options.openerp_host
69 if options.openerp_port:98 if options.openerp_port:
7099
=== modified file 'openobject/tools/_expose.py'
--- openobject/tools/_expose.py 2011-01-20 18:50:26 +0000
+++ openobject/tools/_expose.py 2016-01-19 10:40:01 +0000
@@ -29,7 +29,8 @@
29from openobject import i18n29from openobject import i18n
30import _utils as utils30import _utils as utils
31import resources31import resources
3232import types
33import tempfile
3334
34__all__ = ['load_template', 'render_template', 'expose', 'register_template_vars']35__all__ = ['load_template', 'render_template', 'expose', 'register_template_vars']
3536
@@ -220,7 +221,8 @@
220 jset.add(script)221 jset.add(script)
221222
222 return render_template(_template, res).encode("utf-8")223 return render_template(_template, res).encode("utf-8")
223224 if isinstance(res, types.GeneratorType) and hasattr(res, '__name__') and res.__name__ == 'file_generator':
225 return res
224 if not isinstance(res, basestring):226 if not isinstance(res, basestring):
225 return unicode(res).encode("utf-8")227 return unicode(res).encode("utf-8")
226228
227229
=== modified file 'setup.nsi'
--- setup.nsi 2010-12-29 19:48:48 +0000
+++ setup.nsi 2016-01-19 10:40:01 +0000
@@ -151,7 +151,8 @@
151 File "win32\stop.bat"151 File "win32\stop.bat"
152152
153 SetOutPath "$INSTDIR\conf"153 SetOutPath "$INSTDIR\conf"
154 File "/oname=openerp-web.cfg" ".\doc\openerp-web.cfg"154 File "/oname=openerp-web.cfg" ".\doc\openerp-web-win.cfg"
155 File "/oname=openerp-web-oc.cfg" ".\doc\openerp-web-oc.cfg"
155156
156 !insertmacro MUI_STARTMENU_WRITE_BEGIN Application157 !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
157 ;Create shortcuts158 ;Create shortcuts
@@ -159,7 +160,7 @@
159 160
160 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Start OpenERP Web.lnk" "$INSTDIR\service\start.bat"161 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Start OpenERP Web.lnk" "$INSTDIR\service\start.bat"
161 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Stop OpenERP Web.lnk" "$INSTDIR\service\stop.bat"162 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Stop OpenERP Web.lnk" "$INSTDIR\service\stop.bat"
162 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Edit Web Config.lnk" "notepad.exe" "$INSTDIR\conf\openerp-web.cfg"163 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Edit Web Config.lnk" "notepad.exe" "$INSTDIR\conf\openerp-web-oc.cfg"
163 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\uninstall.exe"164 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\uninstall.exe"
164 !insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\Forum" "http://www.openerp.com/forum"165 !insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\Forum" "http://www.openerp.com/forum"
165 !insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\Translation" "https://translations.launchpad.net/openobject"166 !insertmacro CreateInternetShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\Translation" "https://translations.launchpad.net/openobject"

Subscribers

People subscribed via source and target branches