Launchpad automatic translations update.
[odoo/odoo.git] / addons / mail / res_users.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2009-Today OpenERP SA (<http://www.openerp.com>)
6 #
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
11 #
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
16 #
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/>
19 #
20 ##############################################################################
21
22 from openerp.osv import fields, osv
23 from openerp import SUPERUSER_ID
24 from openerp.tools.translate import _
25
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
31     """
32     _name = 'res.users'
33     _inherit = ['res.users']
34     _inherits = {'mail.alias': 'alias_id'}
35
36     _columns = {
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."),
40     }
41
42     _defaults = {
43         'alias_domain': False,  # always hide alias during creation
44     }
45
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.
50         """
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'])
58         return init_res
59
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)
65
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.'))
70
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()
75
76         # create user
77         user_id = super(res_users, self).create(cr, uid, data, context=context)
78         user = self.browse(cr, uid, user_id, context=context)
79         # alias
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)
83         return user_id
84
85     def _create_welcome_message(self, cr, uid, user, context=None):
86         if not self.has_group(cr, uid, 'base.group_user'):
87             return False
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)
93
94     def write(self, cr, uid, ids, vals, context=None):
95         # User alias is sync'ed with login
96         if vals.get('login'):
97             vals['alias_name'] = vals['login']
98         return super(res_users, self).write(cr, uid, ids, vals, context=context)
99
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)
106         return res
107
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
115
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)
122
123     def message_update(self, cr, uid, ids, msg_dict, update_vals=None, context=None):
124         for id in ids:
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)
127         return True
128
129     def message_subscribe(self, cr, uid, ids, partner_ids, subtype_ids=None, context=None):
130         for id in ids:
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)
133         return True
134
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)
137
138     def message_get_suggested_recipients(self, cr, uid, ids, context=None):
139         partner_ids = []
140         for id in ids:
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)
143
144     #------------------------------------------------------
145     # Compatibility methods: do not use
146     # TDE TODO: remove me in 8.0
147     #------------------------------------------------------
148
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)
155
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)
158
159
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.
164     """
165     _name = 'res.users'
166     _inherit = ['res.users']
167
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)
178         return write_res
179
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.
184     """
185     _name = 'res.groups'
186     _inherit = 'res.groups'
187
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)
198         return write_res