[MERGE] server side login
bzr revid: fme@openerp.com-20140122133757-hougjgwesg9n9s1p
This commit is contained in:
commit
92f06e7eab
|
@ -3,6 +3,7 @@ openerp.auth_oauth = function(instance) {
|
|||
_lt = instance.web._lt;
|
||||
var QWeb = instance.web.qweb;
|
||||
|
||||
/* TODO: make this a server side controller
|
||||
instance.web.Login.include({
|
||||
start: function(parent, params) {
|
||||
var self = this;
|
||||
|
@ -76,5 +77,5 @@ openerp.auth_oauth = function(instance) {
|
|||
};
|
||||
},
|
||||
});
|
||||
|
||||
*/
|
||||
};
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
openerp.auth_oauth_signup = function(instance) {
|
||||
|
||||
/* TODO: make this a server side controller
|
||||
// override Login._oauth_state to add the signup token in the state
|
||||
instance.web.Login.include({
|
||||
_oauth_state: function(provider) {
|
||||
|
@ -10,5 +11,6 @@ openerp.auth_oauth_signup = function(instance) {
|
|||
return state;
|
||||
},
|
||||
});
|
||||
*/
|
||||
|
||||
};
|
||||
|
|
|
@ -3,6 +3,7 @@ openerp.auth_openid = function(instance) {
|
|||
|
||||
var QWeb = instance.web.qweb;
|
||||
|
||||
/* TODO: make this a server side controller
|
||||
instance.web.Login = instance.web.Login.extend({
|
||||
start: function() {
|
||||
var self = this;
|
||||
|
@ -149,6 +150,7 @@ instance.web.Login = instance.web.Login.extend({
|
|||
}
|
||||
|
||||
});
|
||||
*/
|
||||
|
||||
|
||||
};
|
||||
|
|
|
@ -34,13 +34,14 @@ Allow users to sign up and reset their password
|
|||
'depends': [
|
||||
'base_setup',
|
||||
'email_template',
|
||||
'web',
|
||||
],
|
||||
'data': [
|
||||
'auth_signup_data.xml',
|
||||
'res_config.xml',
|
||||
'res_users_view.xml',
|
||||
'views/auth_signup_login.xml',
|
||||
],
|
||||
'js': ['static/src/js/auth_signup.js'],
|
||||
'qweb': ['static/src/xml/auth_signup.xml'],
|
||||
'bootstrap': True,
|
||||
}
|
||||
|
|
|
@ -21,64 +21,71 @@
|
|||
import logging
|
||||
|
||||
import openerp
|
||||
import openerp.addons.web.controllers.main as webmain
|
||||
from openerp import http
|
||||
from openerp.http import request
|
||||
from openerp.modules.registry import RegistryManager
|
||||
from ..res_users import SignupError
|
||||
from openerp.http import request, LazyResponse
|
||||
from openerp.tools.translate import _
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class Controller(http.Controller):
|
||||
class Home(openerp.addons.web.controllers.main.Home):
|
||||
|
||||
@http.route('/auth_signup/get_config', type='json', auth="none")
|
||||
def get_config(self, dbname):
|
||||
""" retrieve the module config (which features are enabled) for the login page """
|
||||
registry = RegistryManager.get(dbname)
|
||||
with registry.cursor() as cr:
|
||||
icp = registry.get('ir.config_parameter')
|
||||
config = {
|
||||
'signup': icp.get_param(cr, openerp.SUPERUSER_ID, 'auth_signup.allow_uninvited') == 'True',
|
||||
'reset_password': icp.get_param(cr, openerp.SUPERUSER_ID, 'auth_signup.reset_password') == 'True',
|
||||
}
|
||||
return config
|
||||
@http.route()
|
||||
def web_login(self, *args, **kw):
|
||||
# TODO: ensure_db()
|
||||
request.disable_db = False
|
||||
|
||||
@http.route('/auth_signup/retrieve', type='json', auth="none")
|
||||
def retrieve(self, dbname, token):
|
||||
""" retrieve the user info (name, login or email) corresponding to a signup token """
|
||||
registry = RegistryManager.get(dbname)
|
||||
with registry.cursor() as cr:
|
||||
res_partner = registry.get('res.partner')
|
||||
user_info = res_partner.signup_retrieve_info(cr, openerp.SUPERUSER_ID, token)
|
||||
return user_info
|
||||
|
||||
@http.route('/auth_signup/signup', type='json', auth="none")
|
||||
def signup(self, dbname, token, **values):
|
||||
""" sign up a user (new or existing)"""
|
||||
try:
|
||||
self._signup_with_values(dbname, token, values)
|
||||
except SignupError, e:
|
||||
return {'error': openerp.tools.exception_to_unicode(e)}
|
||||
return {}
|
||||
|
||||
def _signup_with_values(self, dbname, token, values):
|
||||
registry = RegistryManager.get(dbname)
|
||||
with registry.cursor() as cr:
|
||||
res_users = registry.get('res.users')
|
||||
res_users.signup(cr, openerp.SUPERUSER_ID, values, token)
|
||||
|
||||
@http.route('/auth_signup/reset_password', type='json', auth="none")
|
||||
def reset_password(self, dbname, login):
|
||||
""" retrieve user, and perform reset password """
|
||||
registry = RegistryManager.get(dbname)
|
||||
with registry.cursor() as cr:
|
||||
mode = request.params.get('mode')
|
||||
qcontext = request.params.copy()
|
||||
response = webmain.render_bootstrap_template(request.session.db, 'auth_signup.signup', qcontext, lazy=True)
|
||||
token = qcontext.get('token', None)
|
||||
token_infos = None
|
||||
if token:
|
||||
try:
|
||||
res_users = registry.get('res.users')
|
||||
res_users.reset_password(cr, openerp.SUPERUSER_ID, login)
|
||||
cr.commit()
|
||||
except Exception as e:
|
||||
# signup error
|
||||
_logger.exception('error when resetting password')
|
||||
raise(e)
|
||||
return True
|
||||
# retrieve the user info (name, login or email) corresponding to a signup token
|
||||
res_partner = request.registry.get('res.partner')
|
||||
token_infos = res_partner.signup_retrieve_info(request.cr, openerp.SUPERUSER_ID, token)
|
||||
for k, v in token_infos.items():
|
||||
qcontext.setdefault(k, v)
|
||||
except:
|
||||
qcontext['error'] = _("Invalid signup token")
|
||||
response.params['template'] = 'web.login'
|
||||
return response
|
||||
|
||||
# retrieve the module config (which features are enabled) for the login page
|
||||
icp = request.registry.get('ir.config_parameter')
|
||||
config = {
|
||||
'signup': icp.get_param(request.cr, openerp.SUPERUSER_ID, 'auth_signup.allow_uninvited') == 'True',
|
||||
'reset': icp.get_param(request.cr, openerp.SUPERUSER_ID, 'auth_signup.reset_password') == 'True',
|
||||
}
|
||||
qcontext.update(config)
|
||||
|
||||
if 'error' in qcontext or mode not in ('reset', 'signup') or (not token and not config[mode]):
|
||||
response = super(Home, self).web_login(*args, **kw)
|
||||
if isinstance(response, LazyResponse):
|
||||
response.params['values'].update(config)
|
||||
return response
|
||||
|
||||
if request.httprequest.method == 'GET':
|
||||
if token_infos:
|
||||
qcontext.update(token_infos)
|
||||
else:
|
||||
res_users = request.registry.get('res.users')
|
||||
login = request.params.get('login')
|
||||
if mode == 'reset' and not token:
|
||||
try:
|
||||
res_users.reset_password(request.cr, openerp.SUPERUSER_ID, login)
|
||||
qcontext['message'] = _("An email has been sent with credentials to reset your password")
|
||||
response.params['template'] = 'web.login'
|
||||
except:
|
||||
qcontext['error'] = _("Could not reset your password")
|
||||
_logger.exception('error when resetting password')
|
||||
else:
|
||||
values = {key: qcontext.get(key) for key in ('login', 'name', 'password')}
|
||||
res_users.signup(request.cr, openerp.SUPERUSER_ID, values, token)
|
||||
request.cr.commit()
|
||||
return super(Home, self).web_login(*args, **kw)
|
||||
|
||||
return response
|
||||
|
||||
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -66,19 +66,20 @@ class res_partner(osv.Model):
|
|||
self.signup_prepare(cr, uid, [partner.id], context=context)
|
||||
partner.refresh()
|
||||
|
||||
# the parameters to encode for the query and fragment part of url
|
||||
query = {'db': cr.dbname}
|
||||
# the parameters to encode for the query
|
||||
query = dict(db=cr.dbname)
|
||||
signup_type = context.get('signup_force_type_in_url', partner.signup_type or '')
|
||||
fragment = {'action': action, 'type': signup_type}
|
||||
if signup_type:
|
||||
query['mode'] = signup_type
|
||||
|
||||
if partner.signup_token and signup_type:
|
||||
fragment['token'] = partner.signup_token
|
||||
query['token'] = partner.signup_token
|
||||
elif partner.user_ids:
|
||||
fragment['db'] = cr.dbname
|
||||
fragment['login'] = partner.user_ids[0].login
|
||||
query['login'] = partner.user_ids[0].login
|
||||
else:
|
||||
continue # no signup token, no user, thus no signup url!
|
||||
|
||||
fragment = dict()
|
||||
if view_type:
|
||||
fragment['view_type'] = view_type
|
||||
if menu_id:
|
||||
|
@ -88,7 +89,7 @@ class res_partner(osv.Model):
|
|||
if res_id:
|
||||
fragment['id'] = res_id
|
||||
|
||||
res[partner.id] = urljoin(base_url, "?%s#%s" % (urlencode(query), urlencode(fragment)))
|
||||
res[partner.id] = urljoin(base_url, "/web/login?%s#%s" % (urlencode(query), urlencode(fragment)))
|
||||
|
||||
return res
|
||||
|
||||
|
|
|
@ -1,186 +1,19 @@
|
|||
openerp.auth_signup = function(instance) {
|
||||
instance.auth_signup = instance.auth_signup || {};
|
||||
var _t = instance.web._t;
|
||||
|
||||
instance.web.Login.include({
|
||||
start: function() {
|
||||
openerp.web.LoginForm.include({
|
||||
start: function () {
|
||||
var self = this;
|
||||
this.signup_enabled = false;
|
||||
this.reset_password_enabled = false;
|
||||
return this._super().always(function() {
|
||||
|
||||
// Switches the login box to the select mode whith mode == [default|signup|reset]
|
||||
self.on('change:login_mode', self, function() {
|
||||
var mode = self.get('login_mode') || 'default';
|
||||
self.$('*[data-modes]').each(function() {
|
||||
var modes = $(this).data('modes').split(/\s+/);
|
||||
$(this).toggle(modes.indexOf(mode) > -1);
|
||||
});
|
||||
self.$('a.oe_signup_signup:visible').toggle(self.signup_enabled);
|
||||
self.$('a.oe_signup_reset_password:visible').toggle(self.reset_password_enabled);
|
||||
});
|
||||
|
||||
// to switch between the signup and regular login form
|
||||
self.$('a.oe_signup_signup').click(function(ev) {
|
||||
self.set('login_mode', 'signup');
|
||||
this.$el.on('submit', function () {
|
||||
var password = self.get_password_field('password');
|
||||
var confirm_password = self.get_password_field('confirm_password');
|
||||
if (password && confirm_password && (password.value != confirm_password.value)) {
|
||||
alert("Passwords do not match; please retype them.");
|
||||
return false;
|
||||
});
|
||||
self.$('a.oe_signup_back').click(function(ev) {
|
||||
self.set('login_mode', 'default');
|
||||
delete self.params.token;
|
||||
return false;
|
||||
});
|
||||
|
||||
var dbname = self.selected_db;
|
||||
|
||||
// if there is an error message in params, show it then forget it
|
||||
if (self.params.error_message) {
|
||||
self.show_error(self.params.error_message);
|
||||
delete self.params.error_message;
|
||||
}
|
||||
|
||||
if (dbname && self.params.login) {
|
||||
self.$("form input[name=login]").val(self.params.login);
|
||||
}
|
||||
|
||||
// bind reset password link
|
||||
self.$('a.oe_signup_reset_password').click(self.do_reset_password);
|
||||
|
||||
if (dbname) {
|
||||
self.rpc("/auth_signup/get_config", {dbname: dbname}).then(function(result) {
|
||||
self.signup_enabled = result.signup;
|
||||
self.reset_password_enabled = result.reset_password;
|
||||
if (!self.signup_enabled || self.$("form input[name=login]").val()){
|
||||
self.set('login_mode', self.params.type || 'default');
|
||||
} else {
|
||||
self.set('login_mode', 'signup');
|
||||
}
|
||||
|
||||
// in case of a signup, retrieve the user information from the token
|
||||
if (self.params.token) {
|
||||
self.rpc("/auth_signup/retrieve", {dbname: dbname, token: self.params.token})
|
||||
.then(self.on_token_loaded, self.on_token_failed);
|
||||
}
|
||||
|
||||
});
|
||||
} else {
|
||||
// TODO: support multiple database mode
|
||||
self.set('login_mode', self.params.type || 'default');
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
on_token_loaded: function(result) {
|
||||
// select the right the database
|
||||
this.selected_db = result.db;
|
||||
this.on_db_loaded([result.db]);
|
||||
if (result.token) {
|
||||
// switch to signup mode, set user name and login
|
||||
this.set('login_mode', (this.params.type === 'reset' ? 'reset' : 'signup'));
|
||||
this.$("form input[name=name]").val(result.name).attr("readonly", "readonly");
|
||||
if (result.login) {
|
||||
this.$("form input[name=login]").val(result.login).attr("readonly", "readonly");
|
||||
} else {
|
||||
this.$("form input[name=login]").val(result.email);
|
||||
}
|
||||
} else {
|
||||
// remain in login mode, set login if present
|
||||
delete this.params.token;
|
||||
this.set('login_mode', 'default');
|
||||
this.$("form input[name=login]").val(result.login || "");
|
||||
}
|
||||
},
|
||||
|
||||
on_token_failed: function(result, ev) {
|
||||
if (ev) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
this.show_error(_t("Invalid signup token"));
|
||||
delete this.params.db;
|
||||
delete this.params.token;
|
||||
this.set('login_mode', 'default');
|
||||
},
|
||||
|
||||
get_params: function(){
|
||||
// signup user (or reset password)
|
||||
var db = this.$("form [name=db]").val();
|
||||
var name = this.$("form input[name=name]").val();
|
||||
var login = this.$("form input[name=login]").val();
|
||||
var password = this.$("form input[name=password]").val();
|
||||
var confirm_password = this.$("form input[name=confirm_password]").val();
|
||||
if (!db) {
|
||||
this.do_warn(_t("Login"), _t("No database selected !"));
|
||||
return false;
|
||||
} else if (!name) {
|
||||
this.do_warn(_t("Login"), _t("Please enter a name."));
|
||||
return false;
|
||||
} else if (!login) {
|
||||
this.do_warn(_t("Login"), _t("Please enter a username."));
|
||||
return false;
|
||||
} else if (!password || !confirm_password) {
|
||||
this.do_warn(_t("Login"), _t("Please enter a password and confirm it."));
|
||||
return false;
|
||||
} else if (password !== confirm_password) {
|
||||
this.do_warn(_t("Login"), _t("Passwords do not match; please retype them."));
|
||||
return false;
|
||||
}
|
||||
var params = {
|
||||
dbname : db,
|
||||
token: this.params.token || "",
|
||||
name: name,
|
||||
login: login,
|
||||
password: password,
|
||||
};
|
||||
return params;
|
||||
},
|
||||
|
||||
on_submit: function(ev) {
|
||||
if (ev) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
var login_mode = this.get('login_mode');
|
||||
if (login_mode === 'signup' || login_mode === 'reset') {
|
||||
var params = this.get_params();
|
||||
if (_.isEmpty(params)){
|
||||
return false;
|
||||
}
|
||||
var self = this,
|
||||
super_ = this._super;
|
||||
this.rpc('/auth_signup/signup', params)
|
||||
.done(function(result) {
|
||||
if (result.error) {
|
||||
self.show_error(result.error);
|
||||
} else {
|
||||
super_.apply(self, [ev]);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// regular login
|
||||
this._super(ev);
|
||||
}
|
||||
},
|
||||
|
||||
do_reset_password: function(ev) {
|
||||
if (ev) {
|
||||
ev.preventDefault();
|
||||
}
|
||||
var self = this;
|
||||
var db = this.$("form [name=db]").val();
|
||||
var login = this.$("form input[name=login]").val();
|
||||
if (!db) {
|
||||
this.do_warn(_t("Login"), _t("No database selected !"));
|
||||
return $.Deferred().reject();
|
||||
} else if (!login) {
|
||||
this.do_warn(_t("Login"), _t("Please enter a username or email address."));
|
||||
return $.Deferred().reject();
|
||||
}
|
||||
return self.rpc("/auth_signup/reset_password", { dbname: db, login: login }).done(function(result) {
|
||||
self.show_error(_t("An email has been sent with credentials to reset your password"));
|
||||
self.set('login_mode', 'default');
|
||||
}).fail(function(result, ev) {
|
||||
ev.preventDefault();
|
||||
self.show_error(result.message);
|
||||
});
|
||||
get_password_field: function (field) {
|
||||
var selector = 'input[name="' + field + '"][type="password"]:visible';
|
||||
return this.$(selector)[0];
|
||||
},
|
||||
});
|
||||
};
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- vim:fdl=1:
|
||||
-->
|
||||
<templates id="template" xml:space="preserve">
|
||||
|
||||
<t t-extend="Login">
|
||||
<t t-jquery="form ul:first li:contains('Username')" t-operation="before">
|
||||
<li data-modes="signup reset">Name</li>
|
||||
<li data-modes="signup reset"><input name="name" type="text"/></li>
|
||||
</t>
|
||||
<t t-jquery="form ul:first li:contains('Username')" t-operation="replace">
|
||||
<li data-modes="default">Username</li>
|
||||
<li data-modes="signup reset">Username (Email)</li>
|
||||
</t>
|
||||
<t t-jquery="form ul:first li:has(input[name=login], input[name=password]), form ul:first li:contains('Password')">
|
||||
this.attr('data-modes', 'default signup reset');
|
||||
</t>
|
||||
<t t-jquery="form ul:first li:has(input[name=password])" t-operation="after">
|
||||
<li data-modes="signup reset">Confirm Password</li>
|
||||
<li data-modes="signup reset"><input name="confirm_password" type="password"/></li>
|
||||
</t>
|
||||
<t t-jquery="form ul:first li:has(button[name=submit])" t-operation="replace">
|
||||
<li>
|
||||
<button name="submit">
|
||||
<span data-modes="default">Log in</span>
|
||||
<span data-modes="signup">Sign Up</span>
|
||||
<span data-modes="reset">Reset password</span>
|
||||
</button>
|
||||
<a class="oe_signup_signup" data-modes="default" href="#">Sign Up</a>
|
||||
<a class="oe_signup_back" data-modes="signup reset" href="#">Back to Login</a>
|
||||
<a class="oe_signup_reset_password" data-modes="default" href="#">Reset password</a>
|
||||
</li>
|
||||
</t>
|
||||
<t t-jquery=".oe_login_manage_db">
|
||||
this.attr('data-modes', 'default');
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
|
@ -0,0 +1,90 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- vim:fdn=3:
|
||||
-->
|
||||
<openerp>
|
||||
<data>
|
||||
<template id="auth_signup.login" inherit_id="web.login" name="Login (overloaded by auth_signup)">
|
||||
<xpath expr="//button[@type='submit']" position="before">
|
||||
<a t-if="signup" t-attf-href="?mode=signup{{ '&debug' if debug else '' }}" class="btn btn-default pull-left">Sign up</a>
|
||||
<a t-if="reset" t-attf-href="?mode=reset{{ '&debug' if debug else '' }}" class="btn btn-default pull-left">Reset Password</a>
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
<template id="auth_signup.signup" name="Sinup">
|
||||
<t t-call="web.login_layout">
|
||||
<t t-set="head">
|
||||
<t t-foreach="css" t-as="css_file">
|
||||
<link rel="stylesheet" t-att-href="css_file"/>
|
||||
</t>
|
||||
<t t-foreach="js" t-as="js_file">
|
||||
<script type="text/javascript" t-att-src="js_file"></script>
|
||||
</t>
|
||||
</t>
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
var s = new openerp.init(<t t-raw="modules"/>);
|
||||
var login_form = new openerp.web.LoginForm($('.oe_signup_form'));
|
||||
});
|
||||
</script>
|
||||
|
||||
<t t-set="reset_without_token" t-value="mode == 'reset' and not token"/>
|
||||
|
||||
<form class="oe_signup_form" role="form" t-attf-action="/web/login{{ '?debug' if debug else '' }}" method="post">
|
||||
<div class="form-group field-name" t-if="not reset_without_token">
|
||||
<label for="name" class="control-label">Name</label>
|
||||
<input type="text" name="name" t-att-value="name" id="name" class="form-control" placeholder="Enter your name"
|
||||
required="required" autofocus="autofocus" t-att-disabled="'disabled' if mode == 'reset' and token else None"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group field-login">
|
||||
<label for="login" class="control-label">Username (email)</label>
|
||||
<input type="text" name="login" t-att-value="login" id="login" class="form-control" placeholder="Enter login"
|
||||
t-att-autofocus="'autofocus' if reset_without_token else None"
|
||||
required="required" t-att-disabled="'disabled' if mode == 'reset' and token else None"/>
|
||||
<input type="hidden" name="login" t-att-value="login" t-if="mode == 'reset' and token"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group field-password" t-if="not reset_without_token">
|
||||
<label for="password" class="control-label">Password</label>
|
||||
<input type="password" name="password" id="password" class="form-control" placeholder="Password"
|
||||
required="required" t-att-autofocus="'autofocus' if mode == 'reset' and token else None"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group field-confirm_password" t-if="not reset_without_token">
|
||||
<label for="confirm_password" class="control-label">Confirm Password</label>
|
||||
<input type="password" name="confirm_password" id="confirm_password" class="form-control" placeholder="Confirm your password" required="required"/>
|
||||
</div>
|
||||
|
||||
<p class="alert alert-danger" t-if="error">
|
||||
<t t-esc="error"/>
|
||||
</p>
|
||||
<p class="alert alert-success" t-if="message">
|
||||
<t t-esc="message"/>
|
||||
</p>
|
||||
|
||||
<hr/>
|
||||
<input type="hidden" name="redirect" t-att-value="redirect"/>
|
||||
<input type="hidden" name="mode" t-att-value="mode"/>
|
||||
<input type="hidden" name="token" t-att-value="token"/>
|
||||
<div class="clearfix oe_login_buttons">
|
||||
<a href="/web/login" class="btn btn-default pull-left">Back to Login</a>
|
||||
<button type="submit" class="btn btn-primary pull-right">
|
||||
<t t-if="mode == 'signup'">Signup</t>
|
||||
<t t-if="mode == 'reset'">Reset password</t>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
<div class="oe_single_form_footer" t-if="not disable_footer">
|
||||
<t t-if="not disable_database_manager">
|
||||
<a class="oe_login_manage_db" t-attf-href="/web/database/manager{{ '?debug' if debug else '' }}">Manage Databases</a>
|
||||
<span class="oe_footer_seperator"> | </span>
|
||||
</t>
|
||||
<a href="http://www.openerp.com" target="_blank">Powered by <span>OpenERP</span></a>
|
||||
</div>
|
||||
|
||||
</t>
|
||||
</template>
|
||||
|
||||
</data>
|
||||
</openerp>
|
|
@ -1,6 +1,7 @@
|
|||
openerp.edi = function(instance) {
|
||||
var _t = instance.web._t;
|
||||
instance.edi = {}
|
||||
instance.edi = {};
|
||||
|
||||
|
||||
instance.edi.EdiImport = instance.web.Widget.extend({
|
||||
|
||||
|
@ -10,11 +11,7 @@ instance.edi.EdiImport = instance.web.Widget.extend({
|
|||
},
|
||||
start: function() {
|
||||
if (!this.session.session_is_valid()) {
|
||||
this.show_login();
|
||||
this.session.on_session_valid.add({
|
||||
callback: this.proxy('show_import'),
|
||||
unique: true,
|
||||
});
|
||||
instance.redirect('/web/login?redir=' + encodeURIComponent(window.location));
|
||||
} else {
|
||||
this.show_import();
|
||||
}
|
||||
|
@ -25,12 +22,6 @@ instance.edi.EdiImport = instance.web.Widget.extend({
|
|||
this.do_import();
|
||||
},
|
||||
|
||||
show_login: function() {
|
||||
this.destroy_content();
|
||||
this.login = new instance.web.Login(this);
|
||||
this.login.appendTo(this.$el);
|
||||
},
|
||||
|
||||
destroy_content: function() {
|
||||
_.each(_.clone(this.getChildren()), function(el) {
|
||||
el.destroy();
|
||||
|
|
|
@ -20,7 +20,7 @@ import openerp
|
|||
from openerp.osv import fields
|
||||
from openerp.addons.website.models import website
|
||||
from openerp.addons.web import http
|
||||
from openerp.addons.web.http import request
|
||||
from openerp.addons.web.http import request, LazyResponse
|
||||
|
||||
from ..utils import slugify
|
||||
|
||||
|
@ -42,6 +42,14 @@ class Website(openerp.addons.web.controllers.main.Home):
|
|||
pass
|
||||
return self.page("website.homepage")
|
||||
|
||||
@http.route(website=True, auth="public", multilang=True)
|
||||
def web_login(self, *args, **kw):
|
||||
response = super(Website, self).web_login(*args, **kw)
|
||||
if isinstance(response, LazyResponse):
|
||||
values = dict(response.params['values'], disable_footer=True)
|
||||
response = request.website.render(response.params['template'], values)
|
||||
return response
|
||||
|
||||
@http.route('/pagenew/<path:path>', type='http', auth="user")
|
||||
def pagenew(self, path, noredirect=NOPE):
|
||||
web = request.registry['website']
|
||||
|
|
|
@ -491,3 +491,8 @@ span[data-oe-type="monetary"] {
|
|||
-o-column-count: 3;
|
||||
column-count: 3;
|
||||
}
|
||||
|
||||
.oe_website_login_container {
|
||||
width: 400px;
|
||||
margin: 40px auto;
|
||||
}
|
||||
|
|
|
@ -392,3 +392,6 @@ span[data-oe-type="monetary"]
|
|||
.oe_template_fallback
|
||||
@include column-count(3)
|
||||
|
||||
.oe_website_login_container
|
||||
width: 400px
|
||||
margin: 40px auto
|
||||
|
|
|
@ -263,7 +263,7 @@
|
|||
dom_ready.then(function () {
|
||||
|
||||
/* ----- BOOTSTRAP STUFF ---- */
|
||||
$('.js_tooltip').bstooltip();
|
||||
// $('.js_tooltip').bstooltip();
|
||||
|
||||
/* ----- PUBLISHING STUFF ---- */
|
||||
$(document).on('click', '.js_publish_management .js_publish_btn', function () {
|
||||
|
|
|
@ -48,8 +48,8 @@ class CrawlSuite(unittest2.TestSuite):
|
|||
self.opener.add_handler(urllib2.UnknownHandler())
|
||||
self.opener.add_handler(urllib2.HTTPHandler())
|
||||
self.opener.add_handler(urllib2.HTTPSHandler())
|
||||
self.opener.add_handler(RedirectHandler())
|
||||
self.opener.add_handler(urllib2.HTTPCookieProcessor())
|
||||
self.opener.add_handler(RedirectHandler())
|
||||
|
||||
self._authenticate(user, password)
|
||||
self.user = user
|
||||
|
|
|
@ -146,6 +146,6 @@ def full_path(pyfile, filename):
|
|||
|
||||
def load_tests(loader, base, _):
|
||||
base.addTest(WebsiteUiSuite(full_path(__file__, 'dummy_test.js'), {}, 5.0))
|
||||
base.addTest(WebsiteUiSuite(full_path(__file__, 'simple_dom_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
|
||||
base.addTest(WebsiteUiSuite(full_path(__file__, 'homepage_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
|
||||
base.addTest(WebsiteUiSuite(full_path(__file__, 'simple_dom_test.js'), {'redirect': '/page/website.homepage'}, 60.0))
|
||||
base.addTest(WebsiteUiSuite(full_path(__file__, 'homepage_test.js'), {'redirect': '/page/website.homepage'}, 60.0))
|
||||
return base
|
||||
|
|
|
@ -30,15 +30,16 @@ function run (test) {
|
|||
var scheme = options.scheme ? options.scheme+'://' : 'http://';
|
||||
var host = options.host ? options.host : 'localhost';
|
||||
var port = options.port ? ':'+options.port : '';
|
||||
var path = options.path ? options.path : '/web';
|
||||
var path = options.path ? options.path : '/login';
|
||||
|
||||
var queryParams = [];
|
||||
if (options.db) queryParams.push('db='+options.db);
|
||||
if (options.user) queryParams.push('login='+options.user);
|
||||
if (options.password) queryParams.push('key='+options.password);
|
||||
if (options.redirect) queryParams.push('redirect='+options.redirect);
|
||||
var query = queryParams.length > 0 ? '?'+queryParams.join('&') : '';
|
||||
|
||||
var hashParams = [];
|
||||
if (options.user) hashParams.push('login='+options.user);
|
||||
if (options.password) hashParams.push('password='+options.password);
|
||||
if (options.action) hashParams.push('action='+options.action);
|
||||
var hash = hashParams.length > 0 ? '#'+hashParams.join('&') : '';
|
||||
|
||||
|
|
|
@ -255,11 +255,19 @@
|
|||
</xpath>
|
||||
</template>
|
||||
|
||||
<template id="login_layout" inherit_id="web.login_layout" name="Website Login Layout">
|
||||
<xpath expr="t" position="replace">
|
||||
<t t-call="website.layout">
|
||||
<div class="oe_website_login_container" t-raw="0"/>
|
||||
</t>
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
<template id="show_sign_in" inherit_option_id="website.layout" inherit_id="website.layout" name="Show Sign In" groups="base.group_public">
|
||||
<xpath expr="//ul[@id='top_menu']" position="inside">
|
||||
<li class="divider"/>
|
||||
<li>
|
||||
<a t-attf-href="/web#redirect=#{ quote_plus(url_for('', keep_query='*')) }">
|
||||
<a t-attf-href="/web/login">
|
||||
<b>Sign in</b>
|
||||
</a>
|
||||
</li>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import openerp.addons.website.tests.test_ui as test_ui
|
||||
|
||||
def load_tests(loader, base, _):
|
||||
base.addTest(test_ui.WebsiteUiSuite(test_ui.full_path(__file__,'post_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
|
||||
return base
|
||||
base.addTest(test_ui.WebsiteUiSuite(test_ui.full_path(__file__,'post_test.js'), {'redirect': '/page/website.homepage'}, 60.0))
|
||||
return base
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import openerp.addons.website.tests.test_ui as test_ui
|
||||
|
||||
def load_tests(loader, base, _):
|
||||
base.addTest(test_ui.WebsiteUiSuite(test_ui.full_path(__file__,'event_test.js'), { 'action': 'website.action_website_homepage' }, 60.0))
|
||||
return base
|
||||
base.addTest(test_ui.WebsiteUiSuite(test_ui.full_path(__file__,'event_test.js'), {'redirect': '/page/website.homepage'}, 60.0))
|
||||
return base
|
||||
|
|
Loading…
Reference in New Issue