[MERGE] Merge with trunk
bzr revid: fme@openerp.com-20110901192924-8z316s66tvat3ibp
This commit is contained in:
commit
8c920abe89
|
@ -33,7 +33,7 @@ path_addons = __main__.path_addons
|
|||
cherrypy_root = None
|
||||
|
||||
#-----------------------------------------------------------
|
||||
# Per Database Globals (might move into a pool if needed)
|
||||
# Globals (wont move into a pool)
|
||||
#-----------------------------------------------------------
|
||||
|
||||
applicationsession = {}
|
||||
|
@ -270,44 +270,4 @@ class Root(object):
|
|||
raise cherrypy.HTTPRedirect('/base/webclient/home' + qs, 301)
|
||||
default.exposed = True
|
||||
|
||||
def main(argv):
|
||||
# change the timezone of the program to the OpenERP server's assumed timezone
|
||||
os.environ["TZ"] = "UTC"
|
||||
|
||||
DEFAULT_CONFIG = {
|
||||
'server.socket_host': '0.0.0.0',
|
||||
'tools.sessions.on': True,
|
||||
'tools.sessions.storage_type': 'file',
|
||||
'tools.sessions.timeout': 60
|
||||
}
|
||||
|
||||
# Parse config
|
||||
op = optparse.OptionParser()
|
||||
op.add_option("-p", "--port", dest="server.socket_port", default=8002, help="listening port", type="int", metavar="NUMBER")
|
||||
op.add_option("-s", "--session-path", dest="tools.sessions.storage_path", default=os.path.join(tempfile.gettempdir(), "cpsessions"), help="directory used for session storage", metavar="DIR")
|
||||
op.add_option("--server-host", dest="openerp.server.host", default='127.0.0.1', help="OpenERP server hostname", metavar="HOST")
|
||||
op.add_option("--server-port", dest="openerp.server.port", default=8069, help="OpenERP server port", type="int", metavar="NUMBER")
|
||||
op.add_option("--db-filter", dest="openerp.dbfilter", default='.*', help="Filter listed database", metavar="REGEXP")
|
||||
(o, args) = op.parse_args(argv[1:])
|
||||
o = vars(o)
|
||||
for k in o.keys():
|
||||
if o[k] is None:
|
||||
del(o[k])
|
||||
|
||||
# Setup and run cherrypy
|
||||
cherrypy.tree.mount(Root())
|
||||
|
||||
cherrypy.config.update(config=DEFAULT_CONFIG)
|
||||
if os.path.exists(os.path.join(path_root,'openerp-web.cfg')):
|
||||
cherrypy.config.update(os.path.join(path_root,'openerp-web.cfg'))
|
||||
if os.path.exists(os.path.expanduser('~/.openerp_webrc')):
|
||||
cherrypy.config.update(os.path.expanduser('~/.openerp_webrc'))
|
||||
cherrypy.config.update(o)
|
||||
|
||||
if not os.path.exists(cherrypy.config['tools.sessions.storage_path']):
|
||||
os.makedirs(cherrypy.config['tools.sessions.storage_path'], 0700)
|
||||
|
||||
cherrypy.server.subscribe()
|
||||
cherrypy.engine.start()
|
||||
cherrypy.engine.block()
|
||||
|
||||
#
|
||||
|
|
|
@ -298,7 +298,21 @@ class Session(openerpweb.Controller):
|
|||
"uid": req.session._uid,
|
||||
"context": ctx
|
||||
}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def change_password (self,req,fields):
|
||||
old_password, new_password,confirm_password = operator.itemgetter('old_pwd', 'new_password','confirm_pwd')(
|
||||
dict(map(operator.itemgetter('name', 'value'), fields)))
|
||||
if not (old_password.strip() and new_password.strip() and confirm_password.strip()):
|
||||
return {'error':'All passwords have to be filled.','title': 'Change Password'}
|
||||
if new_password != confirm_password:
|
||||
return {'error': 'The new password and its confirmation must be identical.','title': 'Change Password'}
|
||||
try:
|
||||
if req.session.model('res.users').change_password(
|
||||
old_password, new_password):
|
||||
return {'new_password':new_password}
|
||||
except:
|
||||
return {'error': 'Original password incorrect, your password was not changed.', 'title': 'Change Password'}
|
||||
return {'error': 'Error, password not changed !', 'title': 'Change Password'}
|
||||
@openerpweb.jsonrequest
|
||||
def sc_list(self, req):
|
||||
return req.session.model('ir.ui.view_sc').get_sc(
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
// TODO: t-set + t-value + children node == scoped variable ?
|
||||
var QWeb2 = {
|
||||
expressions_cache: {},
|
||||
reserved_words: 'true,false,NaN,null,undefined,debugger,in,instanceof,new,function,return,this,typeof,eval,Math,RegExp,Array,Object,Date'.split(','),
|
||||
actions_precedence: 'foreach,if,call,set,esc,escf,raw,rawf,js,debug,log'.split(','),
|
||||
word_replacement: {
|
||||
RESERVED_WORDS: 'true,false,NaN,null,undefined,debugger,in,instanceof,new,function,return,this,typeof,eval,Math,RegExp,Array,Object,Date'.split(','),
|
||||
ACTIONS_PRECEDENCE: 'foreach,if,call,set,esc,escf,raw,rawf,js,debug,log'.split(','),
|
||||
WORD_REPLACEMENT: {
|
||||
'and': '&&',
|
||||
'or': '||',
|
||||
'gt': '>',
|
||||
|
@ -204,6 +204,9 @@ QWeb2.Engine = (function() {
|
|||
this.dict = {};
|
||||
this.tools = QWeb2.tools;
|
||||
this.jQuery = window.jQuery;
|
||||
this.reserved_words = QWeb2.RESERVED_WORDS.slice(0);
|
||||
this.actions_precedence = QWeb2.ACTIONS_PRECEDENCE.slice(0);
|
||||
this.word_replacement = QWeb2.tools.extend({}, QWeb2.WORD_REPLACEMENT);
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
this.add_template(arguments[i]);
|
||||
}
|
||||
|
@ -290,6 +293,9 @@ QWeb2.Engine = (function() {
|
|||
xDoc.loadXML(s);
|
||||
return xDoc;
|
||||
},
|
||||
has_template : function(template) {
|
||||
return !!this.templates[template];
|
||||
},
|
||||
get_xhr : function() {
|
||||
if (window.XMLHttpRequest) {
|
||||
return new window.XMLHttpRequest();
|
||||
|
@ -519,8 +525,8 @@ QWeb2.Element = (function() {
|
|||
continue;
|
||||
} else if (c.match(/\W/) && invar.length) {
|
||||
// TODO: Should check for possible spaces before dot
|
||||
if (chars[invar_pos - 1] !== '.' && QWeb2.tools.arrayIndexOf(QWeb2.reserved_words, invar) < 0) {
|
||||
invar = QWeb2.word_replacement[invar] || ("dict['" + invar + "']");
|
||||
if (chars[invar_pos - 1] !== '.' && QWeb2.tools.arrayIndexOf(this.engine.reserved_words, invar) < 0) {
|
||||
invar = this.engine.word_replacement[invar] || ("dict['" + invar + "']");
|
||||
}
|
||||
r += invar;
|
||||
invar = '';
|
||||
|
@ -579,15 +585,18 @@ QWeb2.Element = (function() {
|
|||
return this._bottom.unshift(this.get_indent() + "//@string=" + this.engine.tools.js_escape(s, true) + '\n');
|
||||
},
|
||||
compile_element : function() {
|
||||
for (var i = 0, ilen = QWeb2.actions_precedence.length; i < ilen; i++) {
|
||||
var a = QWeb2.actions_precedence[i];
|
||||
for (var i = 0, ilen = this.engine.actions_precedence.length; i < ilen; i++) {
|
||||
var a = this.engine.actions_precedence[i];
|
||||
if (a in this.actions) {
|
||||
var value = this.actions[a];
|
||||
var key = 'compile_action_' + a;
|
||||
if (!this[key]) {
|
||||
if (this[key]) {
|
||||
this[key](value);
|
||||
} else if (this.engine[key]) {
|
||||
this.engine[key].call(this, value);
|
||||
} else {
|
||||
this.engine.tools.exception("No handler method for action '" + a + "'");
|
||||
}
|
||||
this[key](value);
|
||||
}
|
||||
}
|
||||
if (this.tag !== this.engine.prefix) {
|
||||
|
|
|
@ -576,6 +576,7 @@ openerp.base.Header = openerp.base.Widget.extend({
|
|||
this.$content = $(QWeb.render("Header-content", {widget: this}));
|
||||
this.$content.appendTo(this.$element);
|
||||
this.$element.find(".logout").click(this.on_logout);
|
||||
this.$element.find("a.preferences").click(this.on_preferences);
|
||||
return this.shortcut_load();
|
||||
},
|
||||
do_reset: function() {
|
||||
|
@ -634,9 +635,98 @@ openerp.base.Header = openerp.base.Widget.extend({
|
|||
});
|
||||
});
|
||||
},
|
||||
|
||||
on_action: function(action) {
|
||||
},
|
||||
|
||||
on_preferences: function(){
|
||||
var self = this;
|
||||
var action_manager = new openerp.base.ActionManager(this);
|
||||
var dataset = new openerp.base.DataSet (this,'res.users',this.context);
|
||||
dataset.call ('action_get','',function (result){
|
||||
self.rpc('/base/action/load', {action_id:result}, function(result){
|
||||
action_manager.do_action(_.extend(result['result'], {
|
||||
res_id: self.session.uid,
|
||||
res_model: 'res.users',
|
||||
flags: {
|
||||
action_buttons: false,
|
||||
search_view: false,
|
||||
sidebar: false,
|
||||
views_switcher: false,
|
||||
pager: false
|
||||
}
|
||||
}));
|
||||
});
|
||||
});
|
||||
this.dialog = new openerp.base.Dialog(this,{
|
||||
modal: true,
|
||||
title: 'Preferences',
|
||||
width: 600,
|
||||
height: 500,
|
||||
buttons: {
|
||||
"Change password": function(){
|
||||
self.change_password();
|
||||
},
|
||||
Cancel: function(){
|
||||
$(this).dialog('destroy');
|
||||
},
|
||||
Save: function(){
|
||||
var inner_viewmanager = action_manager.inner_viewmanager;
|
||||
inner_viewmanager.views[inner_viewmanager.active_view].controller.do_save(function(){
|
||||
inner_viewmanager.start();
|
||||
});
|
||||
$(this).dialog('destroy')
|
||||
}
|
||||
}
|
||||
});
|
||||
this.dialog.start().open();
|
||||
action_manager.appendTo(this.dialog);
|
||||
action_manager.render(this.dialog);
|
||||
},
|
||||
|
||||
change_password :function() {
|
||||
var self = this;
|
||||
this.dialog = new openerp.base.Dialog(this,{
|
||||
modal : true,
|
||||
title : 'Change Password',
|
||||
width : 'auto',
|
||||
height : 'auto'
|
||||
});
|
||||
this.dialog.start().open();
|
||||
this.dialog.$element.html(QWeb.render("Change_Pwd", self));
|
||||
this.dialog.$element.find("form[name=change_password_form]").validate({
|
||||
submitHandler: function (form) {
|
||||
self.rpc("/base/session/change_password",{
|
||||
'fields': $(form).serializeArray()
|
||||
}, function(result) {
|
||||
if (result.error) {
|
||||
self.display_error(result);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
if (result.new_password) {
|
||||
self.session.password = result.new_password;
|
||||
var session = new openerp.base.Session(self.session.server, self.session.port);
|
||||
session.start();
|
||||
session.session_login(self.session.db, self.session.login, self.session.password)
|
||||
}
|
||||
}
|
||||
self.notification.notify("Changed Password", "Password has been changed successfully");
|
||||
self.dialog.close();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
display_error: function (error) {
|
||||
return $('<div>').dialog({
|
||||
modal: true,
|
||||
title: error.title,
|
||||
buttons: {
|
||||
Ok: function() {
|
||||
$(this).dialog("close");
|
||||
}
|
||||
}
|
||||
}).html(error.error);
|
||||
},
|
||||
on_logout: function() {
|
||||
this.$element.find('.oe-shortcuts ul').empty();
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ openerp.base.format_value = function (value, descriptor, value_if_empty) {
|
|||
return value[1];
|
||||
case 'datetime':
|
||||
if (typeof(value) == "string")
|
||||
value = openerp.base.str_to_datetime(value);
|
||||
value = auto_str_to_date(value, descriptor.type);
|
||||
try {
|
||||
return value.toString(_.sprintf("%s %s", Date.CultureInfo.formatPatterns.shortDate,
|
||||
Date.CultureInfo.formatPatterns.longTime));
|
||||
|
@ -55,7 +55,7 @@ openerp.base.format_value = function (value, descriptor, value_if_empty) {
|
|||
return value;
|
||||
case 'date':
|
||||
if (typeof(value) == "string")
|
||||
value = openerp.base.str_to_date(value);
|
||||
value = auto_str_to_date(value, descriptor.type);
|
||||
try {
|
||||
return value.toString(Date.CultureInfo.formatPatterns.shortDate);
|
||||
} catch (e) {
|
||||
|
@ -63,7 +63,7 @@ openerp.base.format_value = function (value, descriptor, value_if_empty) {
|
|||
}
|
||||
case 'time':
|
||||
if (typeof(value) == "string")
|
||||
value = openerp.base.str_to_time(value);
|
||||
value = auto_str_to_date(value, descriptor.type);
|
||||
try {
|
||||
return value.toString(Date.CultureInfo.formatPatterns.longTime);
|
||||
} catch (e) {
|
||||
|
@ -138,6 +138,19 @@ openerp.base.parse_value = function (value, descriptor, value_if_empty) {
|
|||
return value;
|
||||
};
|
||||
|
||||
var auto_str_to_date = function(value, type) {
|
||||
switch(type) {
|
||||
case 'datetime':
|
||||
return openerp.base.str_to_datetime(value);
|
||||
case 'date':
|
||||
return openerp.base.str_to_date(value);
|
||||
case 'time':
|
||||
return openerp.base.str_to_time(value);
|
||||
default:
|
||||
throw "'" + value + "' is not a valid date, datetime nor time"
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Formats a provided cell based on its field type
|
||||
*
|
||||
|
|
|
@ -314,16 +314,25 @@ openerp.base.SearchView = openerp.base.Widget.extend({
|
|||
on_invalid: function (errors) {
|
||||
this.notification.notify("Invalid Search", "triggered from search view");
|
||||
},
|
||||
do_clear: function (e) {
|
||||
if (e && e.preventDefault) { e.preventDefault(); }
|
||||
this.on_clear();
|
||||
do_clear: function () {
|
||||
$('.filter_label').removeClass('enabled');
|
||||
var string = $('a.searchview_group_string');
|
||||
_.each(string, function(str){
|
||||
$(str).closest('div.searchview_group').removeClass("expanded").addClass('folded');
|
||||
});
|
||||
this.$element.find('table:last').hide();
|
||||
|
||||
$('.searchview_extended_groups_list').empty();
|
||||
setTimeout(this.on_clear);
|
||||
},
|
||||
/**
|
||||
* Triggered when the search view gets cleared
|
||||
*
|
||||
* @event
|
||||
*/
|
||||
on_clear: function () { },
|
||||
on_clear: function () {
|
||||
this.do_search();
|
||||
},
|
||||
/**
|
||||
* Called by a filter propagating its state changes
|
||||
*
|
||||
|
|
|
@ -1363,4 +1363,28 @@
|
|||
<td><button class="oe_export_button_export" id="delete_export_list">Delete</button></td>
|
||||
</tr>
|
||||
</t>
|
||||
<t t-name="Change_Pwd">
|
||||
<form name="change_password_form" class="oe_forms" method="POST">
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td><label for="old_pwd">Old Password:</label></td>
|
||||
<td><input type="password" name="old_pwd"
|
||||
minlength="1" autofocus="autofocus"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="new_password">New Password:</label></td>
|
||||
<td><input type="password" name="new_password"
|
||||
minlength="1" autofocus="autofocus"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="confirm_pwd">Confirm Password:</label></td>
|
||||
<td><input type="password" name="confirm_pwd"
|
||||
minlength="1"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" align="right"><input type="submit" value="Change Password"/></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</t>
|
||||
</templates>
|
||||
|
|
|
@ -173,7 +173,6 @@
|
|||
.openerp .oe-dashboard-config-overview li.oe-done {
|
||||
cursor: default;
|
||||
color: #999999;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
.openerp .oe-dashboard-layout_2-1 .index_0 .oe-dashboard-config-overview ul,
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<div t-name="StaticHome" class="oe-static-home">
|
||||
<h1>Welcome to your new OpenERP instance.</h1>
|
||||
<div class="oe-static-home-banner">
|
||||
<li>Bookmark this <a t-att-href="url">page</a></li>
|
||||
<li>Remember to bookmark this page.</li>
|
||||
<li>Remember your login: <i><t t-esc="session.login"/></i></li>
|
||||
<li>Choose the first OpenERP Application you want to install..</li>
|
||||
</div>
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
import os,sys
|
||||
import optparse,os,sys,tempfile
|
||||
|
||||
import cherrypy
|
||||
import cherrypy.lib.static
|
||||
|
||||
path_root = os.path.dirname(os.path.abspath(__file__))
|
||||
path_addons = os.path.join(path_root, 'addons')
|
||||
|
@ -8,13 +11,47 @@ if path_addons not in sys.path:
|
|||
|
||||
import base
|
||||
|
||||
def main():
|
||||
# TODO move the code of base.common.main here !
|
||||
# change the code to configure a simple werzug server -> base.common.Root()
|
||||
base.common.main(sys.argv)
|
||||
def main(argv):
|
||||
# change the timezone of the program to the OpenERP server's assumed timezone
|
||||
os.environ["TZ"] = "UTC"
|
||||
|
||||
DEFAULT_CONFIG = {
|
||||
'server.socket_host': '0.0.0.0',
|
||||
'tools.sessions.on': True,
|
||||
'tools.sessions.storage_type': 'file',
|
||||
'tools.sessions.timeout': 60
|
||||
}
|
||||
|
||||
# Parse config
|
||||
op = optparse.OptionParser()
|
||||
op.add_option("-p", "--port", dest="server.socket_port", default=8002, help="listening port", type="int", metavar="NUMBER")
|
||||
op.add_option("-s", "--session-path", dest="tools.sessions.storage_path", default=os.path.join(tempfile.gettempdir(), "cpsessions"), help="directory used for session storage", metavar="DIR")
|
||||
op.add_option("--server-host", dest="openerp.server.host", default='127.0.0.1', help="OpenERP server hostname", metavar="HOST")
|
||||
op.add_option("--server-port", dest="openerp.server.port", default=8069, help="OpenERP server port", type="int", metavar="NUMBER")
|
||||
op.add_option("--db-filter", dest="openerp.dbfilter", default='.*', help="Filter listed database", metavar="REGEXP")
|
||||
(o, args) = op.parse_args(argv[1:])
|
||||
o = vars(o)
|
||||
for k in o.keys():
|
||||
if o[k] is None:
|
||||
del(o[k])
|
||||
|
||||
# Setup and run cherrypy
|
||||
cherrypy.tree.mount(base.common.Root())
|
||||
|
||||
cherrypy.config.update(config=DEFAULT_CONFIG)
|
||||
if os.path.exists(os.path.join(path_root,'openerp-web.cfg')):
|
||||
cherrypy.config.update(os.path.join(path_root,'openerp-web.cfg'))
|
||||
if os.path.exists(os.path.expanduser('~/.openerp_webrc')):
|
||||
cherrypy.config.update(os.path.expanduser('~/.openerp_webrc'))
|
||||
cherrypy.config.update(o)
|
||||
|
||||
if not os.path.exists(cherrypy.config['tools.sessions.storage_path']):
|
||||
os.makedirs(cherrypy.config['tools.sessions.storage_path'], 0700)
|
||||
|
||||
cherrypy.server.subscribe()
|
||||
cherrypy.engine.start()
|
||||
cherrypy.engine.block()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
main(sys.argv)
|
||||
|
||||
|
|
Loading…
Reference in New Issue