[MERGE] Merge with trunk

bzr revid: fme@openerp.com-20110901192924-8z316s66tvat3ibp
This commit is contained in:
Fabien Meghazi 2011-09-01 21:29:24 +02:00
commit 8c920abe89
10 changed files with 225 additions and 70 deletions

View File

@ -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()
#

View File

@ -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(

View File

@ -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) {

View File

@ -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();
}

View File

@ -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
*

View File

@ -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
*

View File

@ -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>

View File

@ -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,

View File

@ -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>

View File

@ -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)