[MERGE] res.users inherits res.partner

bzr revid: al@openerp.com-20120815184804-54oh31i61thgmzmw
This commit is contained in:
Antony Lesuisse 2012-08-15 20:48:04 +02:00
commit 50275e9ec9
51 changed files with 306 additions and 252 deletions

View File

@ -19,10 +19,10 @@
# #
############################################################################## ##############################################################################
import partner
import account import account
import installer import installer
import project import project
import partner
import account_invoice import account_invoice
import account_bank_statement import account_bank_statement
import account_bank import account_bank

View File

@ -38,7 +38,7 @@
<!--Email template --> <!--Email template -->
<record id="email_template_edi_invoice" model="email.template"> <record id="email_template_edi_invoice" model="email.template">
<field name="name">Automated Invoice Notification Mail</field> <field name="name">Automated Invoice Notification Mail</field>
<field name="email_from">${object.user_id.user_email or object.company_id.email or 'noreply@localhost'}</field> <field name="email_from">${object.user_id.email or object.company_id.email or 'noreply@localhost'}</field>
<field name="subject">${object.company_id.name} Invoice (Ref ${object.number or 'n/a' })</field> <field name="subject">${object.company_id.name} Invoice (Ref ${object.number or 'n/a' })</field>
<field name="email_to">${object.partner_id.email or ''}</field> <field name="email_to">${object.partner_id.email or ''}</field>
<field name="model_id" ref="account.model_account_invoice"/> <field name="model_id" ref="account.model_account_invoice"/>
@ -58,7 +58,7 @@
% if object.origin: % if object.origin:
&nbsp;&nbsp;Order reference: ${object.origin}<br /> &nbsp;&nbsp;Order reference: ${object.origin}<br />
% endif % endif
&nbsp;&nbsp;Your contact: <a href="mailto:${object.user_id.user_email or ''}?subject=Invoice%20${object.number}">${object.user_id.name}</a> &nbsp;&nbsp;Your contact: <a href="mailto:${object.user_id.email or ''}?subject=Invoice%20${object.number}">${object.user_id.name}</a>
</p> </p>
<p> <p>
@ -133,7 +133,7 @@ A new invoice is available for ${object.partner_id.name}:
% if object.origin: % if object.origin:
| Order reference: ${object.origin} | Order reference: ${object.origin}
% endif % endif
| Your contact: ${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''} | Your contact: ${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''}
You can view the invoice document, download it and pay online using the following link: You can view the invoice document, download it and pay online using the following link:
${ctx.get('edi_web_url_view') or 'n/a'} ${ctx.get('edi_web_url_view') or 'n/a'}
@ -160,7 +160,7 @@ Thank you for choosing ${object.company_id.name}!
-- --
${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''} ${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''}
${object.company_id.name} ${object.company_id.name}
% if object.company_id.street: % if object.company_id.street:
${object.company_id.street or ''} ${object.company_id.street or ''}

View File

@ -53,7 +53,7 @@ class analytic_account(osv.osv):
('name', 'not ilike', 'maintenance'), ('name', 'not ilike', 'maintenance'),
('partner_id', '!=', False), ('partner_id', '!=', False),
('user_id', '!=', False), ('user_id', '!=', False),
('user_id.user_email', '!=', False), ('user_id.email', '!=', False),
('state', 'in', ('draft', 'open')), ('state', 'in', ('draft', 'open')),
'|', ('date', '<', time.strftime('%Y-%m-%d')), ('date', '=', False), '|', ('date', '<', time.strftime('%Y-%m-%d')), ('date', '=', False),
] ]
@ -70,7 +70,7 @@ class analytic_account(osv.osv):
for user, data in users.iteritems(): for user, data in users.iteritems():
subject = '[OPENERP] Reporting: Analytic Accounts' subject = '[OPENERP] Reporting: Analytic Accounts'
body = Template(MAKO_TEMPLATE).render_unicode(user=user, partners=data) body = Template(MAKO_TEMPLATE).render_unicode(user=user, partners=data)
tools.email_send('noreply@openerp.com', [user.user_email, ], subject, body) tools.email_send('noreply@openerp.com', [user.email, ], subject, body)
return True return True

View File

@ -255,7 +255,7 @@ class users(osv.osv):
cr, SUPERUSER_ID, conf, login, entry) cr, SUPERUSER_ID, conf, login, entry)
if user_id: if user_id:
cr.execute("""UPDATE res_users cr.execute("""UPDATE res_users
SET date=now() AT TIME ZONE 'UTC' SET login_date=now() AT TIME ZONE 'UTC'
WHERE login=%s""", WHERE login=%s""",
(tools.ustr(login),)) (tools.ustr(login),))
cr.commit() cr.commit()

View File

@ -66,7 +66,7 @@ class res_users(osv.osv):
else: else:
with utils.cursor(db) as cr: with utils.cursor(db) as cr:
cr.execute("""UPDATE res_users cr.execute("""UPDATE res_users
SET date=now() AT TIME ZONE 'UTC' SET login_date=now() AT TIME ZONE 'UTC'
WHERE login=%s AND openid_key=%s AND active=%s RETURNING id""", WHERE login=%s AND openid_key=%s AND active=%s RETURNING id""",
(tools.ustr(login), tools.ustr(password), True)) (tools.ustr(login), tools.ustr(password), True))
res = cr.fetchone() res = cr.fetchone()

View File

@ -1,2 +1,23 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
##############################################################################
import res_config import res_config
import auth_signup import auth_signup

View File

@ -1,3 +1,24 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2009-today OpenERP SA (<http://www.openerp.com>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
##############################################################################
{ {
'name': 'Signup', 'name': 'Signup',
'description': 'Allow users to sign up', 'description': 'Allow users to sign up',

View File

@ -1,12 +1,26 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
##############################################################################
from openerp.osv import osv, fields from openerp.osv import osv, fields
class res_users(osv.Model):
_inherit = 'res.users'
_sql_constraints = [
('email_uniq', 'UNIQUE (user_email)', 'You can not have two users with the same email!')
]
class signup_signup(osv.TransientModel): class signup_signup(osv.TransientModel):
_name = 'auth.signup' _name = 'auth.signup'
@ -24,7 +38,7 @@ class signup_signup(osv.TransientModel):
new_user = { new_user = {
'name': values['name'], 'name': values['name'],
'login': values['email'], 'login': values['email'],
'user_email': values['email'], 'email': values['email'],
'password': values['password'], 'password': values['password'],
'active': True, 'active': True,
} }

View File

@ -1,3 +1,24 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2012-today OpenERP SA (<http://www.openerp.com>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
##############################################################################
from openerp.osv import osv, fields from openerp.osv import osv, fields
class base_config_settings(osv.TransientModel): class base_config_settings(osv.TransientModel):

View File

@ -292,7 +292,7 @@ the rule to mark CC(mail to any other person defined in actions)."),
'object_description': hasattr(obj, 'description') and obj.description or False, 'object_description': hasattr(obj, 'description') and obj.description or False,
'object_user': hasattr(obj, 'user_id') and (obj.user_id and obj.user_id.name) or '/', 'object_user': hasattr(obj, 'user_id') and (obj.user_id and obj.user_id.name) or '/',
'object_user_email': hasattr(obj, 'user_id') and (obj.user_id and \ 'object_user_email': hasattr(obj, 'user_id') and (obj.user_id and \
obj.user_id.user_email) or '/', obj.user_id.email) or '/',
'object_user_phone': hasattr(obj, 'partner_address_id') and (obj.partner_address_id and \ 'object_user_phone': hasattr(obj, 'partner_address_id') and (obj.partner_address_id and \
obj.partner_address_id.phone) or '/', obj.partner_address_id.phone) or '/',
'partner': hasattr(obj, 'partner_id') and (obj.partner_id and obj.partner_id.name) or '/', 'partner': hasattr(obj, 'partner_id') and (obj.partner_id and obj.partner_id.name) or '/',
@ -319,8 +319,8 @@ the rule to mark CC(mail to any other person defined in actions)."),
mail_message = self.pool.get('mail.message') mail_message = self.pool.get('mail.message')
body = self.format_mail(obj, body) body = self.format_mail(obj, body)
if not emailfrom: if not emailfrom:
if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.user_email: if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email:
emailfrom = obj.user_id.user_email emailfrom = obj.user_id.email
name = '[%d] %s' % (obj.id, tools.ustr(obj.name)) name = '[%d] %s' % (obj.id, tools.ustr(obj.name))
emailfrom = tools.ustr(emailfrom) emailfrom = tools.ustr(emailfrom)
@ -419,7 +419,7 @@ the rule to mark CC(mail to any other person defined in actions)."),
emails = [] emails = []
if hasattr(obj, 'user_id') and action.act_mail_to_user: if hasattr(obj, 'user_id') and action.act_mail_to_user:
if obj.user_id: if obj.user_id:
emails.append(obj.user_id.user_email) emails.append(obj.user_id.email)
if action.act_mail_to_watchers: if action.act_mail_to_watchers:
emails += (action.act_email_cc or '').split(',') emails += (action.act_email_cc or '').split(',')

View File

@ -245,7 +245,7 @@ class calendar_attendee(osv.osv):
continue continue
else: else:
result[id][name] = self._get_address(attdata.sent_by_uid.name, \ result[id][name] = self._get_address(attdata.sent_by_uid.name, \
attdata.sent_by_uid.user_email) attdata.sent_by_uid.email)
if name == 'cn': if name == 'cn':
if attdata.user_id: if attdata.user_id:
@ -289,7 +289,7 @@ class calendar_attendee(osv.osv):
if name == 'language': if name == 'language':
user_obj = self.pool.get('res.users') user_obj = self.pool.get('res.users')
lang = user_obj.read(cr, uid, uid, ['context_lang'], context=context)['context_lang'] lang = user_obj.read(cr, uid, uid, ['lang'], context=context)['lang']
result[id][name] = lang.replace('_', '-') result[id][name] = lang.replace('_', '-')
return result return result
@ -434,7 +434,7 @@ property or property parameter."),
if not organizer: if not organizer:
organizer = event_obj.user_id organizer = event_obj.user_id
event_org.params['CN'] = [organizer.name] event_org.params['CN'] = [organizer.name]
event_org.value = 'MAILTO:' + (organizer.user_email or organizer.name) event_org.value = 'MAILTO:' + (organizer.email or organizer.name)
if event_obj.alarm_id: if event_obj.alarm_id:
# computes alarm data # computes alarm data
@ -535,7 +535,7 @@ property or property parameter."),
return {'value': {'email': ''}} return {'value': {'email': ''}}
usr_obj = self.pool.get('res.users') usr_obj = self.pool.get('res.users')
user = usr_obj.browse(cr, uid, user_id, *args) user = usr_obj.browse(cr, uid, user_id, *args)
return {'value': {'email': user.user_email, 'availability':user.availability}} return {'value': {'email': user.email, 'availability':user.availability}}
def do_tentative(self, cr, uid, ids, context=None, *args): def do_tentative(self, cr, uid, ids, context=None, *args):
""" Makes event invitation as Tentative """ Makes event invitation as Tentative
@ -891,9 +891,9 @@ From:
""" % (alarm.name, alarm.trigger_date, alarm.description, \ """ % (alarm.name, alarm.trigger_date, alarm.description, \
alarm.user_id.name, alarm.user_id.signature) alarm.user_id.name, alarm.user_id.signature)
mail_to = [alarm.user_id.user_email] mail_to = [alarm.user_id.email]
for att in alarm.attendee_ids: for att in alarm.attendee_ids:
mail_to.append(att.user_id.user_email) mail_to.append(att.user_id.email)
if mail_to: if mail_to:
mail_message.schedule_with_attach(cr, uid, mail_message.schedule_with_attach(cr, uid,
tools.config.get('email_from', False), tools.config.get('email_from', False),
@ -947,7 +947,7 @@ class calendar_event(osv.osv):
value['duration'] = duration value['duration'] = duration
# change start_date's time to 00:00:00 in the user's timezone # change start_date's time to 00:00:00 in the user's timezone
user = self.pool.get('res.users').browse(cr, uid, uid) user = self.pool.get('res.users').browse(cr, uid, uid)
tz = pytz.timezone(user.context_tz) if user.context_tz else pytz.utc tz = pytz.timezone(user.tz) if user.tz else pytz.utc
start = pytz.utc.localize(start).astimezone(tz) # convert start in user's timezone start = pytz.utc.localize(start).astimezone(tz) # convert start in user's timezone
start = start.replace(hour=0, minute=0, second=0) # change start's time to 00:00:00 start = start.replace(hour=0, minute=0, second=0) # change start's time to 00:00:00
start = start.astimezone(pytz.utc) # convert start back to utc start = start.astimezone(pytz.utc) # convert start back to utc
@ -1097,8 +1097,8 @@ rule or repeating pattern of time to exclude from the recurring rule."),
user_pool = self.pool.get('res.users') user_pool = self.pool.get('res.users')
user = user_pool.browse(cr, uid, uid, context=context) user = user_pool.browse(cr, uid, uid, context=context)
res = user.name res = user.name
if user.user_email: if user.email:
res += " <%s>" %(user.user_email) res += " <%s>" %(user.email)
return res return res
_defaults = { _defaults = {

View File

@ -99,12 +99,12 @@ send an Email to Invited Person')
user = user_obj.browse(cr, uid, user_id) user = user_obj.browse(cr, uid, user_id)
res = { res = {
'user_id': user_id, 'user_id': user_id,
'email': user.user_email 'email': user.email
} }
res.update(ref) res.update(ref)
vals.append(res) vals.append(res)
if user.user_email: if user.email:
mail_to.append(user.user_email) mail_to.append(user.email)
elif type == 'external' and datas.get('email'): elif type == 'external' and datas.get('email'):
res = {'email': datas['email']} res = {'email': datas['email']}
@ -143,7 +143,7 @@ send an Email to Invited Person')
self._columns['type'].selection)) self._columns['type'].selection))
raise osv.except_osv(_('Error!'), _("%s must have an email address to send mail.") %(name[0])) raise osv.except_osv(_('Error!'), _("%s must have an email address to send mail.") %(name[0]))
att_obj._send_mail(cr, uid, attendees, mail_to, \ att_obj._send_mail(cr, uid, attendees, mail_to, \
email_from = current_user.user_email or tools.config.get('email_from', False)) email_from = current_user.email or tools.config.get('email_from', False))
return {'type': 'ir.actions.act_window_close'} return {'type': 'ir.actions.act_window_close'}

View File

@ -213,7 +213,7 @@ class users(osv.osv):
# Check if the encrypted password matches against the one in the db. # Check if the encrypted password matches against the one in the db.
cr.execute("""UPDATE res_users cr.execute("""UPDATE res_users
SET date=now() AT TIME ZONE 'UTC' SET login_date=now() AT TIME ZONE 'UTC'
WHERE id=%s AND password=%s AND active WHERE id=%s AND password=%s AND active
RETURNING id""", RETURNING id""",
(int(id), encrypted_pw.encode('utf-8'))) (int(id), encrypted_pw.encode('utf-8')))

View File

@ -50,7 +50,7 @@ class specify_partner_terminology(osv.osv_memory):
def make_translations(self, cr, uid, ids, name, type, src, value, res_id=0, context=None): def make_translations(self, cr, uid, ids, name, type, src, value, res_id=0, context=None):
trans_obj = self.pool.get('ir.translation') trans_obj = self.pool.get('ir.translation')
user_obj = self.pool.get('res.users') user_obj = self.pool.get('res.users')
context_lang = user_obj.browse(cr, uid, uid, context=context).context_lang context_lang = user_obj.browse(cr, uid, uid, context=context).lang
existing_trans_ids = trans_obj.search(cr, uid, [('name','=',name), ('lang','=',context_lang), ('type','=',type), ('src','=',src), ('res_id','=',res_id)]) existing_trans_ids = trans_obj.search(cr, uid, [('name','=',name), ('lang','=',context_lang), ('type','=',type), ('src','=',src), ('res_id','=',res_id)])
if existing_trans_ids: if existing_trans_ids:
trans_obj.write(cr, uid, existing_trans_ids, {'value': value}, context=context) trans_obj.write(cr, uid, existing_trans_ids, {'value': value}, context=context)

View File

@ -57,7 +57,7 @@ class base_stage(object):
if not context or not context.get('portal'): if not context or not context.get('portal'):
return False return False
user = self.pool.get('res.users').browse(cr, uid, uid, context=context) user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
return user.user_email return user.email
def _get_default_user(self, cr, uid, context=None): def _get_default_user(self, cr, uid, context=None):
""" Gives current user id """ Gives current user id
@ -301,15 +301,15 @@ class base_stage(object):
for case in self.browse(cr, uid, ids, context=context): for case in self.browse(cr, uid, ids, context=context):
if not destination and not case.email_from: if not destination and not case.email_from:
return False return False
if not case.user_id.user_email: if not case.user_id.email:
return False return False
if destination and case.section_id.user_id: if destination and case.section_id.user_id:
case_email = case.section_id.user_id.user_email case_email = case.section_id.user_id.email
else: else:
case_email = case.user_id.user_email case_email = case.user_id.email
src = case_email src = case_email
dest = case.user_id.user_email or "" dest = case.user_id.email or ""
body = case.description or "" body = case.description or ""
for message in case.message_ids: for message in case.message_ids:
if message.email_from and message.body_text: if message.email_from and message.body_text:
@ -366,8 +366,8 @@ class base_stage(object):
l=[] l=[]
if case.email_cc: if case.email_cc:
l.append(case.email_cc) l.append(case.email_cc)
if case.user_id and case.user_id.user_email: if case.user_id and case.user_id.email:
l.append(case.user_id.user_email) l.append(case.user_id.email)
res[case.id] = l res[case.id] = l
return res return res

View File

@ -55,7 +55,7 @@ class base_state(object):
if not context or not context.get('portal'): if not context or not context.get('portal'):
return False return False
user = self.pool.get('res.users').browse(cr, uid, uid, context=context) user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
return user.user_email return user.email
def _get_default_user(self, cr, uid, context=None): def _get_default_user(self, cr, uid, context=None):
""" Gives current user id """ Gives current user id

View File

@ -49,8 +49,8 @@ class base_action_rule(osv.osv):
mail_message = self.pool.get('mail.message') mail_message = self.pool.get('mail.message')
body = self.format_mail(obj, body) body = self.format_mail(obj, body)
if not emailfrom: if not emailfrom:
if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.user_email: if hasattr(obj, 'user_id') and obj.user_id and obj.user_id.email:
emailfrom = obj.user_id.user_email emailfrom = obj.user_id.email
name = '[%d] %s' % (obj.id, tools.ustr(obj.name)) name = '[%d] %s' % (obj.id, tools.ustr(obj.name))
emailfrom = tools.ustr(emailfrom) emailfrom = tools.ustr(emailfrom)

View File

@ -243,7 +243,7 @@ class crm_lead(base_stage, osv.osv):
'partner_address_name': fields.related('partner_id', 'name', type='char', string='Partner Contact Name', readonly=True), 'partner_address_name': fields.related('partner_id', 'name', type='char', string='Partner Contact Name', readonly=True),
'partner_address_email': fields.related('partner_id', 'email', type='char', string='Partner Contact Email', readonly=True), 'partner_address_email': fields.related('partner_id', 'email', type='char', string='Partner Contact Email', readonly=True),
'company_currency': fields.related('company_id', 'currency_id', 'symbol', type='char', string='Company Currency', readonly=True), 'company_currency': fields.related('company_id', 'currency_id', 'symbol', type='char', string='Company Currency', readonly=True),
'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True), 'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True),
'user_login': fields.related('user_id', 'login', type='char', string='User Login', readonly=True), 'user_login': fields.related('user_id', 'login', type='char', string='User Login', readonly=True),
# Fields for address, due to separation from crm and res.partner # Fields for address, due to separation from crm and res.partner
@ -692,11 +692,11 @@ class crm_lead(base_stage, osv.osv):
""" """
#TOFIX: mail template should be used here instead of fix subject, body text. #TOFIX: mail template should be used here instead of fix subject, body text.
message = self.pool.get('mail.message') message = self.pool.get('mail.message')
email_to = lead.user_id and lead.user_id.user_email email_to = lead.user_id and lead.user_id.email
if not email_to: if not email_to:
return False return False
email_from = lead.section_id and lead.section_id.user_id and lead.section_id.user_id.user_email or email_to email_from = lead.section_id and lead.section_id.user_id and lead.section_id.user_id.email or email_to
partner = lead.partner_id and lead.partner_id.name or lead.partner_name partner = lead.partner_id and lead.partner_id.name or lead.partner_name
subject = "lead %s converted into opportunity" % lead.name subject = "lead %s converted into opportunity" % lead.name
body = "Info \n Id : %s \n Subject: %s \n Partner: %s \n Description : %s " % (lead.id, lead.name, lead.partner_id.name, lead.description) body = "Info \n Id : %s \n Subject: %s \n Partner: %s \n Description : %s " % (lead.id, lead.name, lead.partner_id.name, lead.description)

View File

@ -43,16 +43,13 @@ class crm_lead_forward_to_partner(osv.osv_memory):
_defaults = { _defaults = {
'send_to' : 'email', 'send_to' : 'email',
'history': 'latest', 'history': 'latest',
'email_from': lambda self, cr, uid, *a: self.pool.get('res.users')._get_email_from(cr, uid, uid)[uid], 'email_from': lambda s, cr, uid, c: s.pool.get('res.users').browse(cr, uid, uid, c).email,
} }
def on_change_email(self, cr, uid, ids, user, context=None):
def on_change_email(self, cr, uid, ids, user):
if not user: if not user:
return {'value': {'email_to': False}} return {'value': {'email_to': False}}
email = self.pool.get('res.users')._get_email_from(cr, uid, [user])[user] return {'value': {'email_to': self.pool.get('res.users').browse(cr, uid, uid, context=context).email}}
return {'value': {'email_to': email}}
def on_change_history(self, cr, uid, ids, history_type, context=None): def on_change_history(self, cr, uid, ids, history_type, context=None):
"""Gives message body according to type of history selected """Gives message body according to type of history selected
@ -80,7 +77,7 @@ class crm_lead_forward_to_partner(osv.osv_memory):
partner = partner_obj.browse(cr, uid, [partner_id]) partner = partner_obj.browse(cr, uid, [partner_id])
user_id = partner and partner[0].user_id or False user_id = partner and partner[0].user_id or False
data.update({'email_from': partner and partner[0].email or "", data.update({'email_from': partner and partner[0].email or "",
'email_cc' : user_id and user_id.user_email or '', 'email_cc' : user_id and user_id.user or '',
'user_id': user_id and user_id.id or False}) 'user_id': user_id and user_id.id or False})
return {'value' : data} return {'value' : data}
@ -185,7 +182,7 @@ class crm_lead_forward_to_partner(osv.osv_memory):
if partner_assigned_id: if partner_assigned_id:
assigned_partner = partner.browse(cr, uid, partner_assigned_id, context=context) assigned_partner = partner.browse(cr, uid, partner_assigned_id, context=context)
user_id = assigned_partner.user_id and assigned_partner.user_id.id or False user_id = assigned_partner.user_id and assigned_partner.user_id.id or False
email_cc = assigned_partner.user_id and assigned_partner.user_id.user_email or '' email_cc = assigned_partner.user_id and assigned_partner.user_id.email or ''
email = assigned_partner.email email = assigned_partner.email
res.update({ res.update({

View File

@ -4,7 +4,7 @@
<record id="confirmation_event" model="email.template"> <record id="confirmation_event" model="email.template">
<field name="name">Confirmation of the Event</field> <field name="name">Confirmation of the Event</field>
<field name="model_id" ref="event.model_event_registration"/> <field name="model_id" ref="event.model_event_registration"/>
<field name="email_from" >${object.user_id.user_email or object.company_id.email or 'noreply@' + object.company_id.name + '.com'}</field> <field name="email_from" >${object.user_id.email or object.company_id.email or 'noreply@' + object.company_id.name + '.com'}</field>
<field name="email_to" >${object.email}</field> <field name="email_to" >${object.email}</field>
<field name="subject">Your registration at ${object.event_id.name}</field> <field name="subject">Your registration at ${object.event_id.name}</field>
<field name="body_text"> <field name="body_text">
@ -24,7 +24,7 @@
<record id="confirmation_registration" model="email.template"> <record id="confirmation_registration" model="email.template">
<field name="name">Confirmation of the Registration</field> <field name="name">Confirmation of the Registration</field>
<field name="model_id" ref="event.model_event_registration"/> <field name="model_id" ref="event.model_event_registration"/>
<field name="email_from" >${object.user_id.user_email or object.company_id.email or 'noreply@' + object.company_id.name + '.com'}</field> <field name="email_from" >${object.user_id.email or object.company_id.email or 'noreply@' + object.company_id.name + '.com'}</field>
<field name="email_to" >${object.email}</field> <field name="email_to" >${object.email}</field>
<field name="subject">Your registration at ${object.event_id.name}</field> <field name="subject">Your registration at ${object.event_id.name}</field>
<field name="body_text"> <field name="body_text">

View File

@ -230,7 +230,7 @@ class event_event(osv.osv):
curr_reg_ids = register_pool.search(cr, uid, [('user_id', '=', user.id), ('event_id', '=' , ids[0])]) curr_reg_ids = register_pool.search(cr, uid, [('user_id', '=', user.id), ('event_id', '=' , ids[0])])
#the subscription is done with SUPERUSER_ID because in case we share the kanban view, we want anyone to be able to subscribe #the subscription is done with SUPERUSER_ID because in case we share the kanban view, we want anyone to be able to subscribe
if not curr_reg_ids: if not curr_reg_ids:
curr_reg_ids = [register_pool.create(cr, SUPERUSER_ID, {'event_id': ids[0] ,'email': user.user_email, 'name':user.name, 'user_id': user.id, 'nb_register': num_of_seats})] curr_reg_ids = [register_pool.create(cr, SUPERUSER_ID, {'event_id': ids[0] ,'email': user.email, 'name':user.name, 'user_id': user.id, 'nb_register': num_of_seats})]
else: else:
register_pool.write(cr, uid, curr_reg_ids, {'nb_register': num_of_seats}, context=context) register_pool.write(cr, uid, curr_reg_ids, {'nb_register': num_of_seats}, context=context)
return register_pool.confirm_registration(cr, SUPERUSER_ID, curr_reg_ids, context=context) return register_pool.confirm_registration(cr, SUPERUSER_ID, curr_reg_ids, context=context)

View File

@ -252,7 +252,7 @@ class hr_employee(osv.osv):
def onchange_user(self, cr, uid, ids, user_id, context=None): def onchange_user(self, cr, uid, ids, user_id, context=None):
work_email = False work_email = False
if user_id: if user_id:
work_email = self.pool.get('res.users').browse(cr, uid, user_id, context=context).user_email work_email = self.pool.get('res.users').browse(cr, uid, user_id, context=context).email
return {'value': {'work_email' : work_email}} return {'value': {'work_email' : work_email}}
def _get_default_image(self, cr, uid, context=None): def _get_default_image(self, cr, uid, context=None):

View File

@ -228,7 +228,7 @@ class hr_applicant(base_stage, osv.Model):
multi='day_close', type="float", store=True), multi='day_close', type="float", store=True),
'color': fields.integer('Color Index'), 'color': fields.integer('Color Index'),
'emp_id': fields.many2one('hr.employee', 'employee'), 'emp_id': fields.many2one('hr.employee', 'employee'),
'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True), 'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True),
} }
_defaults = { _defaults = {

View File

@ -877,7 +877,7 @@ class sugar_import(import_framework):
else: else:
val['password'] = 'sugarcrm' #default password for all user #TODO needed in documentation val['password'] = 'sugarcrm' #default password for all user #TODO needed in documentation
val['context_lang'] = self.context.get('lang','en_US') val['lang'] = self.context.get('lang','en_US')
return val return val
def get_users_department(self, val): def get_users_department(self, val):
@ -895,10 +895,10 @@ class sugar_import(import_framework):
'map' : { 'map' : {
'name': concat('first_name', 'last_name'), 'name': concat('first_name', 'last_name'),
'login': value('user_name', fallback='last_name'), 'login': value('user_name', fallback='last_name'),
'context_lang' : 'context_lang', 'lang' : 'context_lang',
'password' : 'password', 'password' : 'password',
'.id' : '.id', '.id' : '.id',
'user_email' : 'email1', 'email' : 'email1',
} }
} }
@ -964,7 +964,7 @@ class import_sugarcrm(osv.osv):
} }
def _get_email_id(self, cr, uid, context=None): def _get_email_id(self, cr, uid, context=None):
return self.pool.get('res.users').browse(cr, uid, uid, context=context).user_email return self.pool.get('res.users').browse(cr, uid, uid, context=context).email
def _module_installed(self, cr, uid, model, context=None): def _module_installed(self, cr, uid, model, context=None):
module_id = self.pool.get('ir.module.module').search(cr, uid, [('name', '=', model), ('state', "=", "installed")], context=context) module_id = self.pool.get('ir.module.module').search(cr, uid, [('name', '=', model), ('state', "=", "installed")], context=context)

View File

@ -103,7 +103,7 @@
<td> <td>
<para style="terp_default_8">[[ user.name ]] </para> <para style="terp_default_8">[[ user.name ]] </para>
<para style="terp_default_8">[[ user.login ]]</para> <para style="terp_default_8">[[ user.login ]]</para>
<para style="terp_default_8">[[ user.user_email ]]</para> <para style="terp_default_8">[[ user.email ]]</para>
</td> </td>
</tr> </tr>
</blockTable> </blockTable>

View File

@ -25,8 +25,8 @@ import mail_thread
import mail_group import mail_group
import mail_subscription import mail_subscription
import ir_needaction import ir_needaction
import res_users
import res_partner import res_partner
import res_users
import report import report
import wizard import wizard
import res_config import res_config

View File

@ -19,7 +19,7 @@
<value>Welcome to OpenERP!</value> <value>Welcome to OpenERP!</value>
<value>Your homepage is a summary of messages you received and key information about documents you follow. <value>Your homepage is a summary of messages you received and key information about documents you follow.
The top menu bar contains all applications you installed. You can use this &lt;i&gt;Settings&lt;/i&gt; menu to intall more applications, activate others features or give access to new users. The top menu bar contains all applications you installed. You can use this &lt;i&gt;Settings&lt;/i&gt; menu to install more applications, activate others features or give access to new users.
To setup your preferences (name, email signature, avatar), click on the top right corner.</value> To setup your preferences (name, email signature, avatar), click on the top right corner.</value>
</function> </function>

View File

@ -93,6 +93,9 @@ class mail_message_common(osv.TransientModel):
return result return result
def name_get(self, cr, uid, ids, context=None): def name_get(self, cr, uid, ids, context=None):
# name_get may receive int id instead of an id list
if isinstance(ids, (int, long)):
ids = [ids]
res = [] res = []
for message in self.browse(cr, uid, ids, context=context): for message in self.browse(cr, uid, ids, context=context):
name = '' name = ''
@ -208,12 +211,13 @@ class mail_message(osv.Model):
'partner_id': fields.many2one('res.partner', 'Related partner', 'partner_id': fields.many2one('res.partner', 'Related partner',
help="Deprecated field. Use partner_ids instead."), help="Deprecated field. Use partner_ids instead."),
'partner_ids': fields.many2many('res.partner', 'partner_ids': fields.many2many('res.partner',
'mail_message_destination_partner_rel', 'mail_message_res_partner_rel',
'message_id', 'partner_id', 'Destination partners', 'message_id', 'partner_id', 'Destination partners',
help="When sending emails through the social network composition wizard"\ help="When sending emails through the social network composition wizard"\
"you may choose to send a copy of the mail to partners."), "you may choose to send a copy of the mail to partners."),
'user_id': fields.many2one('res.users', 'Related User', readonly=1), 'user_id': fields.many2one('res.users', 'Related User', readonly=1),
'attachment_ids': fields.many2many('ir.attachment', 'message_attachment_rel', 'message_id', 'attachment_id', 'Attachments'), 'attachment_ids': fields.many2many('ir.attachment', 'message_attachment_rel',
'message_id', 'attachment_id', 'Attachments'),
'mail_server_id': fields.many2one('ir.mail_server', 'Outgoing mail server', readonly=1), 'mail_server_id': fields.many2one('ir.mail_server', 'Outgoing mail server', readonly=1),
'state': fields.selection([ 'state': fields.selection([
('outgoing', 'Outgoing'), ('outgoing', 'Outgoing'),
@ -371,7 +375,8 @@ class mail_message(osv.Model):
} }
email_msg_id = self.create(cr, uid, msg_vals, context) email_msg_id = self.create(cr, uid, msg_vals, context)
attachment_ids = [] attachment_ids = []
for fname, fcontent in attachments.iteritems(): for attachment in attachments:
fname, fcontent = attachment
attachment_data = { attachment_data = {
'name': fname, 'name': fname,
'datas_fname': fname, 'datas_fname': fname,

View File

@ -794,7 +794,7 @@ class mail_thread(osv.Model):
for thread in self.browse(cr, uid, ids, context=context): for thread in self.browse(cr, uid, ids, context=context):
l = set() l = set()
for message in thread.message_ids: for message in thread.message_ids:
l.add((message.user_id and message.user_id.user_email) or '') l.add((message.user_id and message.user_id.email) or '')
l.add(message.email_from or '') l.add(message.email_from or '')
l.add(message.email_cc or '') l.add(message.email_cc or '')
res[thread.id] = filter(None, l) res[thread.id] = filter(None, l)
@ -1007,9 +1007,9 @@ class mail_thread(osv.Model):
if not user.notification_email_pref == 'all' and \ if not user.notification_email_pref == 'all' and \
not (user.notification_email_pref == 'to_me' and user.id in user_to_push_from_parse_ids): not (user.notification_email_pref == 'to_me' and user.id in user_to_push_from_parse_ids):
continue continue
if not user.user_email: if not user.email:
continue continue
email_to = '%s, %s' % (email_to, user.user_email) email_to = '%s, %s' % (email_to, user.email)
email_to = email_to.lstrip(', ') email_to = email_to.lstrip(', ')
# did not find any email address: not necessary to create an email # did not find any email address: not necessary to create an email
@ -1020,7 +1020,7 @@ class mail_thread(osv.Model):
current_user = res_users_obj.browse(cr, uid, [uid], context=context)[0] current_user = res_users_obj.browse(cr, uid, [uid], context=context)[0]
email_from = new_msg_values.get('email_from') email_from = new_msg_values.get('email_from')
if not email_from: if not email_from:
email_from = current_user.user_email email_from = current_user.email
# get email content, create it (with mail_message.create) # get email content, create it (with mail_message.create)
email_values = self.message_create_notify_get_email_dict(cr, uid, new_msg_values, email_from, email_to, context) email_values = self.message_create_notify_get_email_dict(cr, uid, new_msg_values, email_from, email_to, context)

View File

@ -20,20 +20,28 @@
############################################################################## ##############################################################################
from osv import osv from osv import osv
from osv import fields
class res_partner_mail(osv.osv): class res_partner_mail(osv.Model):
""" Inherits partner and adds CRM information in the partner form """ """ Inherits partner and adds CRM information in the partner form """
_name = "res.partner" _name = "res.partner"
_inherit = ['res.partner', 'mail.thread'] _inherit = ['res.partner', 'mail.thread']
def message_search_get_domain(self, cr, uid, ids, context=None): def message_search_get_domain(self, cr, uid, ids, context=None):
""" Override of message_search_get_domain for partner discussion page. """ Override of message_search_get_domain for partner discussion page.
The purpose is to add messages directly sent to the partner. The purpose is to add messages directly sent to the partner. It also
adds messages pushed to the related user, if any, using @login.
""" """
initial_domain = super(res_partner_mail, self).message_search_get_domain(cr, uid, ids, context=context) initial_domain = super(res_partner_mail, self).message_search_get_domain(cr, uid, ids, context=context)
if self._name == 'res.partner': # to avoid models inheriting from res.partner # to avoid models inheriting from res.partner
if self._name != 'res.partner':
return initial_domain
# add message linked to the partner
search_domain = ['|'] + initial_domain + ['|', ('partner_id', 'in', ids), ('partner_ids', 'in', ids)] search_domain = ['|'] + initial_domain + ['|', ('partner_id', 'in', ids), ('partner_ids', 'in', ids)]
# if partner is linked to a user: find @login
res_users_obj = self.pool.get('res.users')
user_ids = res_users_obj.search(cr, uid, [('partner_id', 'in', ids)], context=context)
for user in res_users_obj.browse(cr, uid, user_ids, context=context):
search_domain = ['|'] + search_domain + ['|', ('body_text', 'like', '@%s' % (user.login)), ('body_html', 'like', '@%s' % (user.login))]
return search_domain return search_domain
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -28,28 +28,27 @@ from tools.translate import _
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class res_users(osv.osv): class res_users(osv.Model):
""" Update of res.users class """ Update of res.users class
- add a preference about sending emails about notifications - add a preference about sending emails about notifications
- make a new user follow itself - make a new user follow itself
- add a welcome message - add a welcome message
""" """
_name = 'res.users' _name = 'res.users'
_inherit = ['res.users', 'mail.thread'] _inherit = ['res.users']
_inherits = {'mail.alias': 'alias_id'} _inherits = {'mail.alias': 'alias_id'}
_columns = { _columns = {
'notification_email_pref': fields.selection([ 'notification_email_pref': fields.selection([
('all', 'All feeds'), ('all', 'All Feeds'),
('comments', 'Only comments'), ('to_me', 'Only send directly to me'),
('to_me', 'Only when sent directly to me'),
('none', 'Never') ('none', 'Never')
], 'Receive Feeds by Email', required=True, ], 'Receive Feeds by Email', required=True,
help="Choose in which case you want to receive an email when you "\ help="Choose in which case you want to receive an email when you "\
"receive new feeds."), "receive new feeds."),
'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="cascade", required=True, 'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="cascade", required=True,
help="Email address internally associated with this user. Incoming emails will appear " help="Email address internally associated with this user. Incoming "\
"in the user's notifications."), "emails will appear in the user's notifications."),
} }
_defaults = { _defaults = {
@ -100,25 +99,29 @@ class res_users(osv.osv):
self._columns['alias_id'].required = True self._columns['alias_id'].required = True
def create(self, cr, uid, data, context=None): def create(self, cr, uid, data, context=None):
# create default alias same as the login # create default alias same as the login
mail_alias = self.pool.get('mail.alias') mail_alias = self.pool.get('mail.alias')
alias_id = mail_alias.create_unique_alias(cr, uid, {'alias_name': data['login']}, model_name=self._name, context=context) alias_id = mail_alias.create_unique_alias(cr, uid, {'alias_name': data['login']}, model_name=self._name, context=context)
data['alias_id'] = alias_id data['alias_id'] = alias_id
data.pop('alias_name', None) # prevent errors during copy() data.pop('alias_name', None) # prevent errors during copy()
# create user that follows its related partner
user_id = super(res_users, self).create(cr, uid, data, context=context) user_id = super(res_users, self).create(cr, uid, data, context=context)
mail_alias.write(cr, SUPERUSER_ID, [alias_id], {"alias_force_thread_id": user_id}, context)
user = self.browse(cr, uid, user_id, context=context) user = self.browse(cr, uid, user_id, context=context)
# make user follow itself self.pool.get('res.partner').message_subscribe(cr, uid, [user.partner_id.id], [user_id], context=context)
self.message_subscribe(cr, uid, [user_id], [user_id], context=context) # alias
mail_alias.write(cr, SUPERUSER_ID, [alias_id], {"alias_force_thread_id": user_id}, context)
# create a welcome message # create a welcome message
company_name = user.company_id.name if user.company_id else _('the company') self.create_welcome_message(cr, uid, user, context=context)
message = _('%s joined the %s network! Take a moment to welcome %s.') % (user.name, company_name, user.name)
self.message_append_note(cr, uid, [user_id], body=message, type='comment', context=context)
return user_id return user_id
def create_welcome_message(self, cr, uid, user, context=None):
company_name = user.company_id.name if user.company_id else _('the company')
subject = '''%s has joined %s.''' % (user.name, company_name)
body = '''Welcome to OpenERP !'''
return self.pool.get('res.partner').message_append_note(cr, user.id, [user.partner_id.id],
subject=subject, body=body, type='comment', content_subtype='html', context=context)
def write(self, cr, uid, ids, vals, context=None): def write(self, cr, uid, ids, vals, context=None):
# User alias is sync'ed with login # User alias is sync'ed with login
if vals.get('login'): vals['alias_name'] = vals['login'] if vals.get('login'): vals['alias_name'] = vals['login']
@ -132,27 +135,55 @@ class res_users(osv.osv):
alias_pool.unlink(cr, uid, alias_ids, context=context) alias_pool.unlink(cr, uid, alias_ids, context=context)
return res return res
def message_search_get_domain(self, cr, uid, ids, context=None): # --------------------------------------------------
""" Override of message_search_get_domain for partner discussion page. # Wrappers on partner methods for Chatter
The purpose is to add messages directly sent to user using # #FIXME: another branch holds a refactoring of mail.thread
@user_login. # that should help cleaning those wrappers
""" # --------------------------------------------------
initial_domain = super(res_users, self).message_search_get_domain(cr, uid, ids, context=context)
custom_domain = []
for user in self.browse(cr, uid, ids, context=context):
if custom_domain:
custom_domain += ['|']
custom_domain += ['|', ('body_text', 'like', '@%s' % (user.login)), ('body_html', 'like', '@%s' % (user.login))]
return ['|'] + initial_domain + custom_domain
class res_users_mail_group(osv.osv): def message_append(self, cr, uid, threads, subject, body_text=None, body_html=None,
type='email', email_date=None, parent_id=False,
content_subtype='plain', state=None,
partner_ids=None, email_from=False, email_to=False,
email_cc=None, email_bcc=None, reply_to=None,
headers=None, message_id=False, references=None,
attachments=None, original=None, context=None):
for user in self.browse(cr, uid, threads, context=context):
user.partner_id.message_append(subject, body_text, body_html, type, email_date, parent_id,
content_subtype, state, partner_ids, email_from, email_to, email_cc, email_bcc, reply_to,
headers, message_id, references, attachments, original)
def message_read(self, cr, uid, ids, fetch_ancestors=False, ancestor_ids=None,
limit=100, offset=0, domain=None, context=None):
for user in self.browse(cr, uid, ids, context=context):
return user.partner_id.message_read(fetch_ancestors, ancestor_ids, limit, offset, domain)
def message_read_subscribers(self, cr, uid, ids, fields=['id', 'name', 'image_small'], context=None):
for user in self.browse(cr, uid, ids, context=context):
return user.partner_id.message_read_subscribers(fields)
def message_search(self, cr, uid, ids, fetch_ancestors=False, ancestor_ids=None,
limit=100, offset=0, domain=None, count=False, context=None):
for user in self.browse(cr, uid, ids, context=context):
return user.partner_id.message_search(fetch_ancestors, ancestor_ids, limit, offset, domain, count)
def message_subscribe(self, cr, uid, ids, user_ids = None, context=None):
for user in self.browse(cr, uid, ids, context=context):
return user.partner_id.message_subscribe(user_ids)
def message_unsubscribe(self, cr, uid, ids, user_ids = None, context=None):
for user in self.browse(cr, uid, ids, context=context):
return user.partner_id.message_unsubscribe(user_ids)
class res_users_mail_group(osv.Model):
""" Update of res.groups class """ Update of res.groups class
- if adding/removing users from a group, check mail.groups linked to - if adding/removing users from a group, check mail.groups linked to
this user group, and subscribe / unsubscribe them from the discussion this user group, and subscribe / unsubscribe them from the discussion
group. This is done by overriding the write method. group. This is done by overriding the write method.
""" """
_name = 'res.users' _name = 'res.users'
_inherit = ['res.users', 'mail.thread'] _inherit = ['res.users']
def write(self, cr, uid, ids, vals, context=None): def write(self, cr, uid, ids, vals, context=None):
write_res = super(res_users_mail_group, self).write(cr, uid, ids, vals, context=context) write_res = super(res_users_mail_group, self).write(cr, uid, ids, vals, context=context)
@ -165,8 +196,7 @@ class res_users_mail_group(osv.osv):
mail_group_obj.message_subscribe(cr, uid, mail_group_ids, ids, context=context) mail_group_obj.message_subscribe(cr, uid, mail_group_ids, ids, context=context)
return write_res return write_res
class res_groups_mail_group(osv.Model):
class res_groups_mail_group(osv.osv):
""" Update of res.groups class """ Update of res.groups class
- if adding/removing users from a group, check mail.groups linked to - if adding/removing users from a group, check mail.groups linked to
this user group, and subscribe / unsubscribe them from the discussion this user group, and subscribe / unsubscribe them from the discussion
@ -184,3 +214,5 @@ class res_groups_mail_group(osv.osv):
mail_group_ids = mail_group_obj.search(cr, uid, [('group_ids', 'in', ids)], context=context) mail_group_ids = mail_group_obj.search(cr, uid, [('group_ids', 'in', ids)], context=context)
mail_group_obj.message_subscribe(cr, uid, mail_group_ids, user_ids, context=context) mail_group_obj.message_subscribe(cr, uid, mail_group_ids, user_ids, context=context)
return super(res_groups_mail_group, self).write(cr, uid, ids, vals, context=context) return super(res_groups_mail_group, self).write(cr, uid, ids, vals, context=context)
# vim:et:

View File

@ -9,7 +9,7 @@
<field name="inherit_id" ref="base.view_users_form_simple_modif"/> <field name="inherit_id" ref="base.view_users_form_simple_modif"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<data> <data>
<field name="user_email" position="before"> <field name="email" position="before">
<field name="notification_email_pref" readonly="0"/> <field name="notification_email_pref" readonly="0"/>
</field> </field>
</data> </data>
@ -23,15 +23,10 @@
<field name="inherit_id" ref="base.view_users_form"/> <field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<data> <data>
<field name="user_email" position="before"> <field name="email" position="before">
<field name="notification_email_pref"/> <field name="notification_email_pref"/>
</field> </field>
<xpath expr="/form/sheet" position="after"> <field name="email" position="after">
<div class="oe_chatter">
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
</div>
</xpath>
<field name="user_email" position="after">
<field name="alias_domain" invisible="1"/> <field name="alias_domain" invisible="1"/>
<field name="alias_id" readonly="1" required="0" attrs="{'invisible': [('alias_domain', '=', False)]}"/> <field name="alias_id" readonly="1" required="0" attrs="{'invisible': [('alias_domain', '=', False)]}"/>
</field> </field>

View File

@ -1021,7 +1021,6 @@ openerp.mail = function(session) {
if (this.compose_message_widget) { if (this.compose_message_widget) {
this.compose_message_widget.destroy(); this.compose_message_widget.destroy();
} }
debugger;
this.compose_message_widget = new mail.ComposeMessage(this, { this.compose_message_widget = new mail.ComposeMessage(this, {
'extended_mode': false, 'uid': this.session.uid, 'res_model': this.params.res_model, 'extended_mode': false, 'uid': this.session.uid, 'res_model': this.params.res_model,
'res_id': this.params.res_id, 'mode': mode || 'comment', 'msg_id': msg_id }); 'res_id': this.params.res_id, 'mode': mode || 'comment', 'msg_id': msg_id });

View File

@ -100,7 +100,7 @@ class mail_compose_message(osv.TransientModel):
# Try to provide default email_from if not specified yet # Try to provide default email_from if not specified yet
if not result.get('email_from'): if not result.get('email_from'):
current_user = self.pool.get('res.users').browse(cr, uid, uid, context=context) current_user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
result['email_from'] = current_user.user_email or False result['email_from'] = current_user.email or False
return result return result
_columns = { _columns = {
@ -133,7 +133,7 @@ class mail_compose_message(osv.TransientModel):
result.update({ result.update({
'model': model, 'model': model,
'res_id': res_id, 'res_id': res_id,
'email_from': user.user_email or tools.config.get('email_from', False), 'email_from': user.email or tools.config.get('email_from', False),
'body_html': False, 'body_html': False,
'body_text': False, 'body_text': False,
'subject': False, 'subject': False,
@ -223,7 +223,7 @@ class mail_compose_message(osv.TransientModel):
'dest_partner_ids': dest_partner_ids, 'dest_partner_ids': dest_partner_ids,
'model': message_data.model or False, 'model': message_data.model or False,
'res_id': message_data.res_id or False, 'res_id': message_data.res_id or False,
'email_from': current_user.user_email or message_data.email_to or False, 'email_from': current_user.email or message_data.email_to or False,
'email_to': message_data.reply_to or message_data.email_from or False, 'email_to': message_data.reply_to or message_data.email_from or False,
'email_cc': message_data.email_cc or False, 'email_cc': message_data.email_cc or False,
'user_id': uid, 'user_id': uid,

View File

@ -21,7 +21,6 @@
import portal import portal
import wizard import wizard
import res_user
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -43,7 +43,6 @@ very handy when used in combination with the module 'share'.
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'portal_view.xml', 'portal_view.xml',
'portal_data.xml', 'portal_data.xml',
'res_user_view.xml',
'wizard/portal_wizard_view.xml', 'wizard/portal_wizard_view.xml',
'wizard/share_wizard_view.xml', 'wizard/share_wizard_view.xml',
], ],

View File

@ -1,34 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2011 OpenERP S.A (<http://www.openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import osv, fields
class res_users(osv.osv):
_inherit = 'res.users'
_columns = {
'partner_id': fields.many2one('res.partner',
string='Related Partner'),
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- add partner field in user form -->
<record id="view_users_form" model="ir.ui.view">
<field name="name">res.portal.users.form</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml">
<field name="active" position="before">
<field name="partner_id"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@ -26,7 +26,7 @@ from osv import osv, fields
from tools.misc import email_re from tools.misc import email_re
from tools.translate import _ from tools.translate import _
from base.res.res_users import _lang_get from base.res.res_partner import _lang_get
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -62,9 +62,9 @@ def random_password():
random.shuffle(chars) random.shuffle(chars)
return ''.join(chars) return ''.join(chars)
def extract_email(user_email): def extract_email(email):
""" extract the email address from a user-friendly email address """ """ extract the email address from a user-friendly email address """
m = email_re.search(user_email or "") m = email_re.search(email or "")
return m and m.group(0) or "" return m and m.group(0) or ""
@ -102,7 +102,7 @@ class wizard(osv.osv_memory):
return{ return{
'name': address.name, 'name': address.name,
'user_email': extract_email(address.email), 'email': extract_email(address.email),
'lang': lang, 'lang': lang,
'partner_id': partner_id, 'partner_id': partner_id,
} }
@ -136,7 +136,7 @@ class wizard(osv.osv_memory):
user_obj = self.pool.get('res.users') user_obj = self.pool.get('res.users')
user = user_obj.browse(cr, ROOT_UID, uid, context0) user = user_obj.browse(cr, ROOT_UID, uid, context0)
if not user.user_email: if not user.email:
raise osv.except_osv(_('Email required'), raise osv.except_osv(_('Email required'),
_('You must have an email address in your User Preferences' _('You must have an email address in your User Preferences'
' to send emails.')) ' to send emails.'))
@ -144,7 +144,7 @@ class wizard(osv.osv_memory):
portal_obj = self.pool.get('res.portal') portal_obj = self.pool.get('res.portal')
for wiz in self.browse(cr, uid, ids, context): for wiz in self.browse(cr, uid, ids, context):
# determine existing users # determine existing users
login_cond = [('login', 'in', [u.user_email for u in wiz.user_ids])] login_cond = [('login', 'in', [u.email for u in wiz.user_ids])]
existing_uids = user_obj.search(cr, ROOT_UID, login_cond) existing_uids = user_obj.search(cr, ROOT_UID, login_cond)
existing_users = user_obj.browse(cr, ROOT_UID, existing_uids) existing_users = user_obj.browse(cr, ROOT_UID, existing_uids)
existing_logins = [u.login for u in existing_users] existing_logins = [u.login for u in existing_users]
@ -152,15 +152,15 @@ class wizard(osv.osv_memory):
# create new users in portal (skip existing logins) # create new users in portal (skip existing logins)
new_users_data = [ { new_users_data = [ {
'name': u.name, 'name': u.name,
'login': u.user_email, 'login': u.email,
'password': random_password(), 'password': random_password(),
'user_email': u.user_email, 'email': u.email,
'context_lang': u.lang, 'lang': u.lang,
'share': True, 'share': True,
'action_id': wiz.portal_id.home_action_id and wiz.portal_id.home_action_id.id or False, 'action_id': wiz.portal_id.home_action_id and wiz.portal_id.home_action_id.id or False,
'partner_id': u.partner_id and u.partner_id.id, 'partner_id': u.partner_id and u.partner_id.id,
'groups_id': [(6, 0, [])], 'groups_id': [(6, 0, [])],
} for u in wiz.user_ids if u.user_email not in existing_logins ] } for u in wiz.user_ids if u.email not in existing_logins ]
portal_obj.write(cr, ROOT_UID, [wiz.portal_id.id], portal_obj.write(cr, ROOT_UID, [wiz.portal_id.id],
{'users': [(0, 0, data) for data in new_users_data]}, context0) {'users': [(0, 0, data) for data in new_users_data]}, context0)
@ -175,13 +175,13 @@ class wizard(osv.osv_memory):
dest_uids = user_obj.search(cr, ROOT_UID, login_cond) dest_uids = user_obj.search(cr, ROOT_UID, login_cond)
dest_users = user_obj.browse(cr, ROOT_UID, dest_uids) dest_users = user_obj.browse(cr, ROOT_UID, dest_uids)
for dest_user in dest_users: for dest_user in dest_users:
context['lang'] = dest_user.context_lang context['lang'] = dest_user.lang
data['login'] = dest_user.login data['login'] = dest_user.login
data['password'] = dest_user.password data['password'] = dest_user.password
data['name'] = dest_user.name data['name'] = dest_user.name
email_from = user.user_email email_from = user.email
email_to = dest_user.user_email email_to = dest_user.email
subject = _(WELCOME_EMAIL_SUBJECT) % data subject = _(WELCOME_EMAIL_SUBJECT) % data
body = _(WELCOME_EMAIL_BODY) % data body = _(WELCOME_EMAIL_BODY) % data
res = mail_message_obj.schedule_with_attach(cr, uid, email_from , [email_to], subject, body, context=context) res = mail_message_obj.schedule_with_attach(cr, uid, email_from , [email_to], subject, body, context=context)
@ -208,7 +208,7 @@ class wizard_user(osv.osv_memory):
'name': fields.char(size=64, required=True, 'name': fields.char(size=64, required=True,
string='User Name', string='User Name',
help="The user's real name"), help="The user's real name"),
'user_email': fields.char(size=64, required=True, 'email': fields.char(size=64, required=True,
string='Email', string='Email',
help="Will be used as user login. " help="Will be used as user login. "
"Also necessary to send the account information to new users"), "Also necessary to send the account information to new users"),
@ -222,7 +222,7 @@ class wizard_user(osv.osv_memory):
def _check_email(self, cr, uid, ids): def _check_email(self, cr, uid, ids):
""" check syntax of email address """ """ check syntax of email address """
for wuser in self.browse(cr, uid, ids): for wuser in self.browse(cr, uid, ids):
if not email_re.match(wuser.user_email): return False if not email_re.match(wuser.email): return False
return True return True
_constraints = [ _constraints = [

View File

@ -41,7 +41,7 @@
editable in the web client 6.0 --> editable in the web client 6.0 -->
<tree string="Portal Users" editable="bottom"> <tree string="Portal Users" editable="bottom">
<field name="name"/> <field name="name"/>
<field name="user_email"/> <field name="email"/>
<field name="partner_id"/> <field name="partner_id"/>
</tree> </tree>
</field> </field>
@ -55,7 +55,7 @@
<form string="Portal User" version="7.0"> <form string="Portal User" version="7.0">
<group colspan="2" col="2"> <group colspan="2" col="2">
<field name="name"/> <field name="name"/>
<field name="user_email"/> <field name="email"/>
<field name="lang"/> <field name="lang"/>
<field name="partner_id"/> <field name="partner_id"/>
</group> </group>

View File

@ -50,7 +50,7 @@ class crm_contact_us(osv.TransientModel):
user = self.pool.get('res.users').browse(cr, uid, uid, context=context) user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
if (user.login != 'anonymous'): if (user.login != 'anonymous'):
return user.user_email return user.email
else: else:
return None return None

View File

@ -131,7 +131,7 @@ class procurement_order(osv.osv):
Exceptions:\n""") % (start_date, end_date, report_total, report_except, report_later) Exceptions:\n""") % (start_date, end_date, report_total, report_except, report_later)
summary += '\n'.join(report) summary += '\n'.join(report)
self.pool.get('res.users').message_append_note(cr, uid, [uid], body=summary, context=context) procurement_obj.message_append_note(cr, uid, ids, body=summary, context=context)
if use_new_cursor: if use_new_cursor:
cr.commit() cr.commit()
@ -234,7 +234,6 @@ class procurement_order(osv.osv):
location_obj = self.pool.get('stock.location') location_obj = self.pool.get('stock.location')
procurement_obj = self.pool.get('procurement.order') procurement_obj = self.pool.get('procurement.order')
wf_service = netsvc.LocalService("workflow") wf_service = netsvc.LocalService("workflow")
report = []
offset = 0 offset = 0
ids = [1] ids = [1]
if automatic: if automatic:
@ -288,9 +287,6 @@ class procurement_order(osv.osv):
offset += len(ids) offset += len(ids)
if use_new_cursor: if use_new_cursor:
cr.commit() cr.commit()
if user_id and report:
# Chatter: old res.request is now a chatter on res.users, id=uid
self.pool.get('res.users').message_append_note(cr, uid, [user_id], body='\n'.join(report), subject=_('Orderpoint report'), context=context)
if use_new_cursor: if use_new_cursor:
cr.commit() cr.commit()
cr.close() cr.close()

View File

@ -797,7 +797,7 @@ class task(base_stage, osv.osv):
'company_id': fields.many2one('res.company', 'Company'), 'company_id': fields.many2one('res.company', 'Company'),
'id': fields.integer('ID', readonly=True), 'id': fields.integer('ID', readonly=True),
'color': fields.integer('Color Index'), 'color': fields.integer('Color Index'),
'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True), 'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True),
} }
_defaults = { _defaults = {

View File

@ -256,7 +256,7 @@ class project_issue(base_stage, osv.osv):
'inactivity_days': fields.function(_compute_day, string='Days since last action', \ 'inactivity_days': fields.function(_compute_day, string='Days since last action', \
multi='compute_day', type="integer", help="Difference in days between last action and current date"), multi='compute_day', type="integer", help="Difference in days between last action and current date"),
'color': fields.integer('Color Index'), 'color': fields.integer('Color Index'),
'user_email': fields.related('user_id', 'user_email', type='char', string='User Email', readonly=True), 'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True),
'date_action_last': fields.datetime('Last Action', readonly=1), 'date_action_last': fields.datetime('Last Action', readonly=1),
'date_action_next': fields.datetime('Next Action', readonly=1), 'date_action_next': fields.datetime('Next Action', readonly=1),
'progress': fields.function(_hours_get, string='Progress (%)', multi='hours', group_operator="avg", help="Computed as: Time Spent / Total Time.", 'progress': fields.function(_hours_get, string='Progress (%)', multi='hours', group_operator="avg", help="Computed as: Time Spent / Total Time.",

View File

@ -73,7 +73,7 @@ class project_tasks(osv.osv):
followers = super(project_tasks,self).message_thread_followers(cr, uid, ids, context=context) followers = super(project_tasks,self).message_thread_followers(cr, uid, ids, context=context)
for task in self.browse(cr, uid, followers.keys(), context=context): for task in self.browse(cr, uid, followers.keys(), context=context):
task_followers = set(followers[task.id]) task_followers = set(followers[task.id])
task_followers.add(task.user_id.user_email) task_followers.add(task.user_id.email)
followers[task.id] = filter(None, task_followers) followers[task.id] = filter(None, task_followers)
return followers return followers

View File

@ -3,9 +3,8 @@
- -
!record {model: res.users, id: res_users_hrmanager0}: !record {model: res.users, id: res_users_hrmanager0}:
company_id: base.main_company company_id: base.main_company
context_lang: en_US
login: hr
name: HR Manager name: HR Manager
login: hr
password: hr password: hr
groups_id: groups_id:
- base.group_hr_manager - base.group_hr_manager

View File

@ -38,7 +38,7 @@
<!--Email template --> <!--Email template -->
<record id="email_template_edi_purchase" model="email.template"> <record id="email_template_edi_purchase" model="email.template">
<field name="name">Automated Purchase Order Notification Mail</field> <field name="name">Automated Purchase Order Notification Mail</field>
<field name="email_from">${object.validator.user_email or ''}</field> <field name="email_from">${object.validator.email or ''}</field>
<field name="subject">${object.company_id.name} Order (Ref ${object.name or 'n/a' })</field> <field name="subject">${object.company_id.name} Order (Ref ${object.name or 'n/a' })</field>
<field name="email_to">${object.partner_id.email}</field> <field name="email_to">${object.partner_id.email}</field>
<field name="model_id" ref="purchase.model_purchase_order"/> <field name="model_id" ref="purchase.model_purchase_order"/>
@ -61,7 +61,7 @@
% if object.partner_ref: % if object.partner_ref:
&nbsp;&nbsp;Your reference: ${object.partner_ref}<br /> &nbsp;&nbsp;Your reference: ${object.partner_ref}<br />
% endif % endif
&nbsp;&nbsp;Your contact: <a href="mailto:${object.validator.user_email or ''}?subject=Order%20${object.name}">${object.validator.name}</a> &nbsp;&nbsp;Your contact: <a href="mailto:${object.validator.email or ''}?subject=Order%20${object.name}">${object.validator.name}</a>
</p> </p>
<p> <p>
@ -121,7 +121,7 @@ Here is a ${object.state in ('draft', 'sent') and 'request for quotation' or 'pu
% if object.partner_ref: % if object.partner_ref:
| Your reference: ${object.partner_ref}<br /> | Your reference: ${object.partner_ref}<br />
% endif % endif
| Your contact: ${object.validator.name} ${object.validator.user_email and '<%s>'%(object.validator.user_email) or ''} | Your contact: ${object.validator.name} ${object.validator.email and '<%s>'%(object.validator.email) or ''}
You can view the ${object.state in ('draft', 'sent') and 'request for quotation' or 'order confirmation'} and download it using the following link: You can view the ${object.state in ('draft', 'sent') and 'request for quotation' or 'order confirmation'} and download it using the following link:
${ctx.get('edi_web_url_view') or 'n/a'} ${ctx.get('edi_web_url_view') or 'n/a'}
@ -132,7 +132,7 @@ Thank you!
-- --
${object.validator.name} ${object.validator.user_email and '<%s>'%(object.validator.user_email) or ''} ${object.validator.name} ${object.validator.email and '<%s>'%(object.validator.email) or ''}
${object.company_id.name} ${object.company_id.name}
% if object.company_id.street: % if object.company_id.street:
${object.company_id.street or ''} ${object.company_id.street or ''}

View File

@ -37,7 +37,7 @@
<!--Email template --> <!--Email template -->
<record id="email_template_edi_sale" model="email.template"> <record id="email_template_edi_sale" model="email.template">
<field name="name">Automated Sale Order Notification Mail</field> <field name="name">Automated Sale Order Notification Mail</field>
<field name="email_from">${object.user_id.user_email or ''}</field> <field name="email_from">${object.user_id.email or ''}</field>
<field name="subject">${object.company_id.name} Order (Ref ${object.name or 'n/a' })</field> <field name="subject">${object.company_id.name} Order (Ref ${object.name or 'n/a' })</field>
<field name="email_to">${object.partner_invoice_id.email}</field> <field name="email_to">${object.partner_invoice_id.email}</field>
<field name="model_id" ref="sale.model_sale_order"/> <field name="model_id" ref="sale.model_sale_order"/>
@ -60,7 +60,7 @@
% if object.client_order_ref: % if object.client_order_ref:
&nbsp;&nbsp;Your reference: ${object.client_order_ref}<br /> &nbsp;&nbsp;Your reference: ${object.client_order_ref}<br />
% endif % endif
&nbsp;&nbsp;Your contact: <a href="mailto:${object.user_id.user_email or ''}?subject=Order%20${object.name}">${object.user_id.name}</a> &nbsp;&nbsp;Your contact: <a href="mailto:${object.user_id.email or ''}?subject=Order%20${object.name}">${object.user_id.name}</a>
</p> </p>
<p> <p>
@ -139,7 +139,7 @@ Here is your ${object.state in ('draft', 'sent') and 'quotation' or 'order confi
% if object.client_order_ref: % if object.client_order_ref:
| Your reference: ${object.client_order_ref}<br /> | Your reference: ${object.client_order_ref}<br />
% endif % endif
| Your contact: ${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''} | Your contact: ${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''}
You can view the ${object.state in ('draft', 'sent') and 'quotation' or 'order confirmation'}, download it and even pay online using the following link: You can view the ${object.state in ('draft', 'sent') and 'quotation' or 'order confirmation'}, download it and even pay online using the following link:
${ctx.get('edi_web_url_view') or 'n/a'} ${ctx.get('edi_web_url_view') or 'n/a'}
@ -166,7 +166,7 @@ Thank you for choosing ${object.company_id.name}!
-- --
${object.user_id.name} ${object.user_id.user_email and '<%s>'%(object.user_id.user_email) or ''} ${object.user_id.name} ${object.user_id.email and '<%s>'%(object.user_id.email) or ''}
${object.company_id.name} ${object.company_id.name}
% if object.company_id.street: % if object.company_id.street:
${object.company_id.street or ''} ${object.company_id.street or ''}

View File

@ -196,7 +196,7 @@ class share_wizard(osv.TransientModel):
} }
def has_email(self, cr, uid, context=None): def has_email(self, cr, uid, context=None):
return bool(self.pool.get('res.users').browse(cr, uid, uid, context=context).user_email) return bool(self.pool.get('res.users').browse(cr, uid, uid, context=context).email)
def go_step_1(self, cr, uid, ids, context=None): def go_step_1(self, cr, uid, ids, context=None):
wizard_data = self.browse(cr,uid,ids,context)[0] wizard_data = self.browse(cr,uid,ids,context)[0]
@ -241,7 +241,7 @@ class share_wizard(osv.TransientModel):
if not wizard_data.invite: if not wizard_data.invite:
existing = user_obj.search(cr, UID_ROOT, [('login', '=', new_user)]) existing = user_obj.search(cr, UID_ROOT, [('login', '=', new_user)])
else: else:
existing = user_obj.search(cr, UID_ROOT, [('user_email', '=', new_user)]) existing = user_obj.search(cr, UID_ROOT, [('email', '=', new_user)])
existing_ids.extend(existing) existing_ids.extend(existing)
if existing: if existing:
new_line = { 'user_id': existing[0], new_line = { 'user_id': existing[0],
@ -253,7 +253,7 @@ class share_wizard(osv.TransientModel):
'login': new_user, 'login': new_user,
'password': new_pass, 'password': new_pass,
'name': new_user, 'name': new_user,
'user_email': new_user, 'email': new_user,
'groups_id': [(6,0,[group_id])], 'groups_id': [(6,0,[group_id])],
'share': True, 'share': True,
'message_email_pref': 'all', 'message_email_pref': 'all',
@ -825,12 +825,12 @@ class share_wizard(osv.TransientModel):
message_obj = self.pool.get('mail.message') message_obj = self.pool.get('mail.message')
notification_obj = self.pool.get('mail.notification') notification_obj = self.pool.get('mail.notification')
user = self.pool.get('res.users').browse(cr, UID_ROOT, uid) user = self.pool.get('res.users').browse(cr, UID_ROOT, uid)
if not user.user_email: if not user.email:
raise osv.except_osv(_('Email required'), _('The current user must have an email address configured in User Preferences to be able to send outgoing emails.')) raise osv.except_osv(_('Email required'), _('The current user must have an email address configured in User Preferences to be able to send outgoing emails.'))
# TODO: also send an HTML version of this mail # TODO: also send an HTML version of this mail
for result_line in wizard_data.result_line_ids: for result_line in wizard_data.result_line_ids:
email_to = result_line.user_id.user_email email_to = result_line.user_id.email
if not email_to: if not email_to:
continue continue
subject = _('Invitation to collaborate about %s') % (wizard_data.record_name) subject = _('Invitation to collaborate about %s') % (wizard_data.record_name)
@ -849,20 +849,20 @@ class share_wizard(osv.TransientModel):
body += "--\n" body += "--\n"
body += _("OpenERP is a powerful and user-friendly suite of Business Applications (CRM, Sales, HR, etc.)\n" body += _("OpenERP is a powerful and user-friendly suite of Business Applications (CRM, Sales, HR, etc.)\n"
"It is open source and can be found on http://www.openerp.com.") "It is open source and can be found on http://www.openerp.com.")
msg_id = message_obj.schedule_with_attach(cr, uid, user.user_email, [email_to], subject, body, model='', context=context) msg_id = message_obj.schedule_with_attach(cr, uid, user.email, [email_to], subject, body, model='', context=context)
notification_obj.create(cr, uid, {'user_id': result_line.user_id.id, 'message_id': msg_id}, context=context) notification_obj.create(cr, uid, {'user_id': result_line.user_id.id, 'message_id': msg_id}, context=context)
def send_emails(self, cr, uid, wizard_data, context=None): def send_emails(self, cr, uid, wizard_data, context=None):
_logger.info('Sending share notifications by email...') _logger.info('Sending share notifications by email...')
mail_message = self.pool.get('mail.message') mail_message = self.pool.get('mail.message')
user = self.pool.get('res.users').browse(cr, UID_ROOT, uid) user = self.pool.get('res.users').browse(cr, UID_ROOT, uid)
if not user.user_email: if not user.email:
raise osv.except_osv(_('Email required'), _('The current user must have an email address configured in User Preferences to be able to send outgoing emails.')) raise osv.except_osv(_('Email required'), _('The current user must have an email address configured in User Preferences to be able to send outgoing emails.'))
# TODO: also send an HTML version of this mail # TODO: also send an HTML version of this mail
msg_ids = [] msg_ids = []
for result_line in wizard_data.result_line_ids: for result_line in wizard_data.result_line_ids:
email_to = result_line.user_id.user_email email_to = result_line.user_id.email
if not email_to: if not email_to:
continue continue
subject = wizard_data.name subject = wizard_data.name
@ -883,7 +883,7 @@ class share_wizard(osv.TransientModel):
body += "--\n" body += "--\n"
body += _("OpenERP is a powerful and user-friendly suite of Business Applications (CRM, Sales, HR, etc.)\n" body += _("OpenERP is a powerful and user-friendly suite of Business Applications (CRM, Sales, HR, etc.)\n"
"It is open source and can be found on http://www.openerp.com.") "It is open source and can be found on http://www.openerp.com.")
msg_ids.append(mail_message.schedule_with_attach(cr, uid, user.user_email, [email_to], subject, body, model='share.wizard', context=context)) msg_ids.append(mail_message.schedule_with_attach(cr, uid, user.email, [email_to], subject, body, model='share.wizard', context=context))
# force direct delivery, as users expect instant notification # force direct delivery, as users expect instant notification
mail_message.send(cr, uid, msg_ids, context=context) mail_message.send(cr, uid, msg_ids, context=context)
_logger.info('%d share notification(s) sent.', len(msg_ids)) _logger.info('%d share notification(s) sent.', len(msg_ids))

View File

@ -740,7 +740,7 @@ class survey_request(osv.osv):
if user_id: if user_id:
user_obj = self.pool.get('res.users') user_obj = self.pool.get('res.users')
user = user_obj.browse(cr, uid, user_id, context=context) user = user_obj.browse(cr, uid, user_id, context=context)
return {'value': {'email': user.user_email}} return {'value': {'email': user.email}}
return {} return {}
survey_request() survey_request()

View File

@ -414,8 +414,8 @@ class survey_question_wiz(osv.osv_memory):
file.close() file.close()
os.remove(addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf") os.remove(addons.get_module_resource('survey', 'report') + survey_data.title + ".pdf")
user_email = user_obj.browse(cr, uid, uid, context).user_email user_email = user_obj.browse(cr, uid, uid, context).email
resp_email = survey_data.responsible_id and survey_data.responsible_id.user_email or False resp_email = survey_data.responsible_id and survey_data.responsible_id.email or False
if user_email and resp_email: if user_email and resp_email:
user_name = user_obj.browse(cr, uid, uid, context=context).name user_name = user_obj.browse(cr, uid, uid, context=context).name