diff --git a/addons/portal/wizard.py b/addons/portal/wizard.py
index 5dd8a62b0a5..3c5a5983d2d 100644
--- a/addons/portal/wizard.py
+++ b/addons/portal/wizard.py
@@ -19,13 +19,32 @@
#
##############################################################################
+import logging
+import random
+
from osv import osv, fields
-from tools.misc import email_re
+from tools.misc import email_re, email_send
from tools.translate import _
+
from base.res.res_user import _lang_get
+ROOT_UID = 1
+
+# character sets for passwords, excluding 0, O, o, 1, I, l
+_PASSU = 'ABCDEFGHIJKLMNPQRSTUVWXYZ'
+_PASSL = 'abcdefghijkmnpqrstuvwxyz'
+_PASSD = '23456789'
+
+def random_password():
+ # get 3 uppercase letters, 3 lowercase letters, 2 digits, and shuffle them
+ chars = map(random.choice, [_PASSU] * 3 + [_PASSL] * 3 + [_PASSD] * 2)
+ random.shuffle(chars)
+ return ''.join(chars)
+
+
+
class user_wizard(osv.osv_memory):
"""
A wizard to create a portal user from a res.partner.address. The use
@@ -54,6 +73,7 @@ class user_wizard(osv.osv_memory):
_constraints = [
(lambda self,*args: self._check_email(*args), 'Invalid email address', ['email']),
+ (lambda self,*args: self._check_exist(*args), 'User login already exists', ['email']),
]
def default_get(self, cr, uid, fields, context=None):
@@ -80,6 +100,65 @@ class user_wizard(osv.osv_memory):
if not email_re.match(wizard.email): return False
return True
+ def _check_exist(self, cr, uid, ids):
+ """ check whether login (email) already in use """
+ user_obj = self.pool.get('res.users')
+ for wizard in self.browse(cr, uid, ids):
+ condition = [('login', '=', wizard.email)]
+ if user_obj.search(cr, ROOT_UID, condition): return False
+ return True
+
+ def do_create(self, cr, uid, ids, context=None):
+ """ create a new user in the portal, and notify them by email """
+ # we copy the context to change the language for translating emails
+ context0 = context or {}
+ context = context0.copy()
+
+ user = self.pool.get('res.users').browse(cr, ROOT_UID, uid, context0)
+ if not user.user_email:
+ raise osv.except_osv(_('Email required'),
+ _('You must have an email address in your User Preferences'
+ ' to send emails.'))
+
+ portal_obj = self.pool.get('res.portal')
+ for wizard in self.browse(cr, uid, ids, context):
+ # add a new user in wizard.portal_id
+ user_values = {
+ 'name': wizard.name,
+ 'login': wizard.email,
+ 'password': random_password(),
+ 'user_email': wizard.email,
+ 'address_id': wizard.address_id.id,
+ 'context_lang': wizard.lang,
+ }
+ values = {'users': [(0, 0, user_values)]}
+ portal_obj.write(cr, ROOT_UID, [wizard.portal_id.id], values, context0)
+
+ # send email to new user (translated in language of new user)
+ context['lang'] = user_values['context_lang']
+ user_values['dbname'] = cr.dbname
+ user_values['url'] = "(missing url)"
+
+ email_to = user_values['user_email']
+ subject = _("Your OpenERP account at %s") % user.company_id.name
+ body = _(
+ "Dear %(name)s,\n\n"
+ "You have been created an OpenERP account at %(url)s.\n\n"
+ "Your login account data is:\n"
+ "Database: %(dbname)s\n"
+ "User: %(login)s\n"
+ "Password: %(password)s\n\n"
+ "--\n"
+ "OpenERP - Open Source Business Applications\n"
+ "http://www.openerp.com\n"
+ ) % user_values
+ res = email_send(user.user_email, [email_to], subject, body)
+ if not res:
+ logging.getLogger('res.portal.user_wizard').warning(
+ 'Failed to send email from %s to %s', user.user_email, email_to)
+
+ return {}
+
user_wizard()
diff --git a/addons/portal/wizard_view.xml b/addons/portal/wizard_view.xml
index 996605d9816..f77d55f363f 100644
--- a/addons/portal/wizard_view.xml
+++ b/addons/portal/wizard_view.xml
@@ -27,7 +27,7 @@
-
+