1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2009-Today OpenERP SA (<http://www.openerp.com>)
7 # This program is free software: you can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as
9 # published by the Free Software Foundation, either version 3 of the
10 # License, or (at your option) any later version
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>
20 ##############################################################################
22 from openerp.osv import fields, osv
23 from openerp import SUPERUSER_ID
24 from openerp.tools.translate import _
26 class res_users(osv.Model):
27 """ Update of res.users class
28 - add a preference about sending emails about notifications
29 - make a new user follow itself
30 - add a welcome message
33 _inherit = ['res.users']
34 _inherits = {'mail.alias': 'alias_id'}
37 'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="restrict", required=True,
38 help="Email address internally associated with this user. Incoming "\
39 "emails will appear in the user's notifications."),
43 'alias_domain': False, # always hide alias during creation
46 def __init__(self, pool, cr):
47 """ Override of __init__ to add access rights on notification_email_send
48 and alias fields. Access rights are disabled by default, but allowed
49 on some specific fields defined in self.SELF_{READ/WRITE}ABLE_FIELDS.
51 init_res = super(res_users, self).__init__(pool, cr)
52 # duplicate list to avoid modifying the original reference
53 self.SELF_WRITEABLE_FIELDS = list(self.SELF_WRITEABLE_FIELDS)
54 self.SELF_WRITEABLE_FIELDS.append('notification_email_send')
55 # duplicate list to avoid modifying the original reference
56 self.SELF_READABLE_FIELDS = list(self.SELF_READABLE_FIELDS)
57 self.SELF_READABLE_FIELDS.extend(['notification_email_send', 'alias_domain', 'alias_name'])
60 def _auto_init(self, cr, context=None):
61 """ Installation hook: aliases, partner following themselves """
62 # create aliases for all users and avoid constraint errors
63 return self.pool.get('mail.alias').migrate_to_alias(cr, self._name, self._table, super(res_users, self)._auto_init,
64 self._columns['alias_id'], 'login', alias_force_key='id', context=context)
66 def create(self, cr, uid, data, context=None):
67 # create default alias same as the login
68 if not data.get('login', False):
69 raise osv.except_osv(_('Invalid Action!'), _('You may not create a user. To create new users, you should use the "Settings > Users" menu.'))
71 mail_alias = self.pool.get('mail.alias')
72 alias_id = mail_alias.create_unique_alias(cr, uid, {'alias_name': data['login']}, model_name=self._name, context=context)
73 data['alias_id'] = alias_id
74 data.pop('alias_name', None) # prevent errors during copy()
77 user_id = super(res_users, self).create(cr, uid, data, context=context)
78 user = self.browse(cr, uid, user_id, context=context)
80 mail_alias.write(cr, SUPERUSER_ID, [alias_id], {"alias_force_thread_id": user_id}, context)
81 # create a welcome message
82 self._create_welcome_message(cr, uid, user, context=context)
85 def _create_welcome_message(self, cr, uid, user, context=None):
86 if not self.has_group(cr, uid, 'base.group_user'):
88 company_name = user.company_id.name if user.company_id else ''
89 body = _('%s has joined the %s network.') % (user.name, company_name)
90 # TODO change SUPERUSER_ID into user.id but catch errors
91 return self.pool.get('res.partner').message_post(cr, SUPERUSER_ID, [user.partner_id.id],
92 body=body, context=context)
94 def write(self, cr, uid, ids, vals, context=None):
95 # User alias is sync'ed with login
97 vals['alias_name'] = vals['login']
98 return super(res_users, self).write(cr, uid, ids, vals, context=context)
100 def unlink(self, cr, uid, ids, context=None):
101 # Cascade-delete mail aliases as well, as they should not exist without the user.
102 alias_pool = self.pool.get('mail.alias')
103 alias_ids = [user.alias_id.id for user in self.browse(cr, uid, ids, context=context) if user.alias_id]
104 res = super(res_users, self).unlink(cr, uid, ids, context=context)
105 alias_pool.unlink(cr, uid, alias_ids, context=context)
108 def _message_post_get_pid(self, cr, uid, thread_id, context=None):
109 assert thread_id, "res.users does not support posting global messages"
110 if context and 'thread_model' in context:
111 context['thread_model'] = 'res.partner'
112 if isinstance(thread_id, (list, tuple)):
113 thread_id = thread_id[0]
114 return self.browse(cr, SUPERUSER_ID, thread_id).partner_id.id
116 def message_post(self, cr, uid, thread_id, context=None, **kwargs):
117 """ Redirect the posting of message on res.users to the related partner.
118 This is done because when giving the context of Chatter on the
119 various mailboxes, we do not have access to the current partner_id. """
120 partner_id = self._message_post_get_pid(cr, uid, thread_id, context=context)
121 return self.pool.get('res.partner').message_post(cr, uid, partner_id, context=context, **kwargs)
123 def message_update(self, cr, uid, ids, msg_dict, update_vals=None, context=None):
125 partner_id = self.browse(cr, SUPERUSER_ID, id).partner_id.id
126 self.pool.get('res.partner').message_update(cr, uid, [partner_id], msg_dict, update_vals=update_vals, context=context)
129 def message_subscribe(self, cr, uid, ids, partner_ids, subtype_ids=None, context=None):
131 partner_id = self.browse(cr, SUPERUSER_ID, id).partner_id.id
132 self.pool.get('res.partner').message_subscribe(cr, uid, [partner_id], partner_ids, subtype_ids=subtype_ids, context=context)
135 def message_get_partner_info_from_emails(self, cr, uid, emails, link_mail=False, context=None):
136 return self.pool.get('res.partner').message_get_partner_info_from_emails(cr, uid, emails, link_mail=link_mail, context=context)
138 def message_get_suggested_recipients(self, cr, uid, ids, context=None):
141 partner_ids.append(self.browse(cr, SUPERUSER_ID, id).partner_id.id)
142 return self.pool.get('res.partner').message_get_suggested_recipients(cr, uid, partner_ids, context=context)
144 #------------------------------------------------------
145 # Compatibility methods: do not use
146 # TDE TODO: remove me in 8.0
147 #------------------------------------------------------
149 def message_post_user_api(self, cr, uid, thread_id, context=None, **kwargs):
150 """ Redirect the posting of message on res.users to the related partner.
151 This is done because when giving the context of Chatter on the
152 various mailboxes, we do not have access to the current partner_id. """
153 partner_id = self._message_post_get_pid(cr, uid, thread_id, context=context)
154 return self.pool.get('res.partner').message_post_user_api(cr, uid, partner_id, context=context, **kwargs)
156 def message_create_partners_from_emails(self, cr, uid, emails, context=None):
157 return self.pool.get('res.partner').message_create_partners_from_emails(cr, uid, emails, context=context)
160 class res_users_mail_group(osv.Model):
161 """ Update of res.users class
162 - if adding groups to an user, check mail.groups linked to this user
163 group, and the user. This is done by overriding the write method.
166 _inherit = ['res.users']
168 # FP Note: to improve, post processing may be better ?
169 def write(self, cr, uid, ids, vals, context=None):
170 write_res = super(res_users_mail_group, self).write(cr, uid, ids, vals, context=context)
171 if vals.get('groups_id'):
172 # form: {'group_ids': [(3, 10), (3, 3), (4, 10), (4, 3)]} or {'group_ids': [(6, 0, [ids]}
173 user_group_ids = [command[1] for command in vals['groups_id'] if command[0] == 4]
174 user_group_ids += [id for command in vals['groups_id'] if command[0] == 6 for id in command[2]]
175 mail_group_obj = self.pool.get('mail.group')
176 mail_group_ids = mail_group_obj.search(cr, uid, [('group_ids', 'in', user_group_ids)], context=context)
177 mail_group_obj.message_subscribe_users(cr, uid, mail_group_ids, ids, context=context)
180 class res_groups_mail_group(osv.Model):
181 """ Update of res.groups class
182 - if adding users from a group, check mail.groups linked to this user
183 group and subscribe them. This is done by overriding the write method.
186 _inherit = 'res.groups'
188 # FP Note: to improve, post processeing, after the super may be better
189 def write(self, cr, uid, ids, vals, context=None):
190 write_res = super(res_groups_mail_group, self).write(cr, uid, ids, vals, context=context)
191 if vals.get('users'):
192 # form: {'group_ids': [(3, 10), (3, 3), (4, 10), (4, 3)]} or {'group_ids': [(6, 0, [ids]}
193 user_ids = [command[1] for command in vals['users'] if command[0] == 4]
194 user_ids += [id for command in vals['users'] if command[0] == 6 for id in command[2]]
195 mail_group_obj = self.pool.get('mail.group')
196 mail_group_ids = mail_group_obj.search(cr, uid, [('group_ids', 'in', ids)], context=context)
197 mail_group_obj.message_subscribe_users(cr, uid, mail_group_ids, user_ids, context=context)