Merge lp:~openerp-dev/openobject-addons/trunk-project-customer-tde into lp:openobject-addons

Proposed by Thibault Delavallée (OpenERP)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-project-customer-tde
Merge into: lp:openobject-addons
Diff against target: 378 lines (+143/-33)
15 files modified
portal/portal_demo.xml (+1/-0)
portal_project/__openerp__.py (+4/-2)
portal_project/project.py (+1/-1)
portal_project/project_demo.xml (+10/-0)
portal_project/security/ir.model.access.csv (+8/-7)
portal_project/security/portal_security.xml (+16/-3)
portal_project/tests/test_access_rights.py (+22/-3)
portal_project_gtd/__init__.py (+20/-0)
portal_project_gtd/__openerp__.py (+20/-0)
portal_project_gtd/security/ir.model.access.csv (+5/-0)
portal_project_issue/security/ir.model.access.csv (+3/-2)
portal_project_issue/security/portal_security.xml (+22/-9)
portal_project_long_term/__openerp__.py (+1/-1)
project_gtd/project_gtd.py (+8/-3)
project_issue_sheet/project_issue_sheet.py (+2/-2)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-project-customer-tde
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+185028@code.launchpad.net

Description of the change

[IMP] portal_project: improved 'followers' project, allowing portal users in this kind
of project to create, write and unlink tasks.
Due to some cleaning in mail_thread.message_subscribe(), the rules now apply
more cleanly.
Added tests.

To post a comment you must log in.
8892. By Thibault Delavallée (OpenERP)

[MERGE] Sync with trunk

8893. By Thibault Delavallée (OpenERP)

[REV] Reverted some changes

8894. By Thibault Delavallée (OpenERP)

[CLEAN] portal_project: re-added two noupdate back in some data

8895. By Thibault Delavallée (OpenERP)

[FIX] mail_thread: fixed message_follower_ids pre-population, could receive False or None, should not use it as a list

8896. By Thibault Delavallée (OpenERP)

[FIX] portal: dmeo user should be in the right company

8897. By Thibault Delavallée (OpenERP)

[IMP] portal_porject: improved rule name

8898. By Thibault Delavallée (OpenERP)

[IMP] portal_project_issue: portal users can now create / write / unlink task in a Followers only project they follow

8899. By Thibault Delavallée (OpenERP)

[ADD] Added portal_project_gtd, adding necessary access rights for gtd-related models.

8900. By Thibault Delavallée (OpenERP)

[REM] portal_project_gtd: removed useless file

8901. By Thibault Delavallée (OpenERP)

[IMP] project_issue_sheet: analytic stuff on task is now only for regular employees. This allows to avoid adding acces rules for portal users that they should not receive.

8902. By Thibault Delavallée (OpenERP)

[FIX] portal_project_issue: fixed a rule whose model was not the correct one due to copy and paste: was task instead of issue

8903. By Thibault Delavallée (OpenERP)

[FIX] portal_project_gtd, portal_project_long_term: try to solve some issues with instal order

8904. By Thibault Delavallée (OpenERP)

[FIX] project_gtd: default value should not crash but be void if user has no read access rights

8905. By Thibault Delavallée (OpenERP)

[MERGE] Sync with trunk

8906. By Thibault Delavallée (OpenERP)

[MERGE] Sync witu upstream (trunk)

Unmerged revisions

8906. By Thibault Delavallée (OpenERP)

[MERGE] Sync witu upstream (trunk)

8905. By Thibault Delavallée (OpenERP)

[MERGE] Sync with trunk

8904. By Thibault Delavallée (OpenERP)

[FIX] project_gtd: default value should not crash but be void if user has no read access rights

8903. By Thibault Delavallée (OpenERP)

[FIX] portal_project_gtd, portal_project_long_term: try to solve some issues with instal order

8902. By Thibault Delavallée (OpenERP)

[FIX] portal_project_issue: fixed a rule whose model was not the correct one due to copy and paste: was task instead of issue

8901. By Thibault Delavallée (OpenERP)

[IMP] project_issue_sheet: analytic stuff on task is now only for regular employees. This allows to avoid adding acces rules for portal users that they should not receive.

8900. By Thibault Delavallée (OpenERP)

[REM] portal_project_gtd: removed useless file

8899. By Thibault Delavallée (OpenERP)

[ADD] Added portal_project_gtd, adding necessary access rights for gtd-related models.

8898. By Thibault Delavallée (OpenERP)

[IMP] portal_project_issue: portal users can now create / write / unlink task in a Followers only project they follow

8897. By Thibault Delavallée (OpenERP)

[IMP] portal_porject: improved rule name

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'portal/portal_demo.xml'
2--- portal/portal_demo.xml 2014-01-22 18:36:30 +0000
3+++ portal/portal_demo.xml 2014-02-10 10:02:38 +0000
4@@ -9,6 +9,7 @@
5 <field name="supplier" eval="False"/>
6 <field name="customer" eval="True"/>
7 <field name="notification_email_send">none</field>
8+ <field name="company_id" ref="base.main_company"/>
9 <field name="city">Vivegnis</field>
10 <field name="zip">4683</field>
11 <field name="country_id" ref="base.be"/>
12
13=== modified file 'portal_project/__openerp__.py'
14--- portal_project/__openerp__.py 2013-10-27 12:31:04 +0000
15+++ portal_project/__openerp__.py 2014-02-10 10:02:38 +0000
16@@ -22,7 +22,7 @@
17
18 {
19 'name': 'Portal Project',
20- 'version': '0.1',
21+ 'version': '1.0',
22 'category': 'Tools',
23 'complexity': 'easy',
24 'description': """
25@@ -36,7 +36,9 @@
26 'security/ir.model.access.csv',
27 'portal_project_view.xml',
28 ],
29- 'demo': [],
30+ 'demo': [
31+ 'project_demo.xml',
32+ ],
33 'installable': True,
34 'auto_install': True,
35 'category': 'Hidden',
36
37=== modified file 'portal_project/project.py'
38--- portal_project/project.py 2013-05-07 09:36:36 +0000
39+++ portal_project/project.py 2014-02-10 10:02:38 +0000
40@@ -23,7 +23,7 @@
41
42
43 class portal_project(osv.Model):
44- """ Update of mail_mail class, to add the signin URL to notifications. """
45+ """ Update of project_project class, to add the portal option in the visibility selection. """
46 _inherit = 'project.project'
47
48 def _get_visibility_selection(self, cr, uid, context=None):
49
50=== added file 'portal_project/project_demo.xml'
51--- portal_project/project_demo.xml 1970-01-01 00:00:00 +0000
52+++ portal_project/project_demo.xml 2014-02-10 10:02:38 +0000
53@@ -0,0 +1,10 @@
54+<?xml version="1.0" encoding="utf-8"?>
55+<openerp>
56+ <data noupdate="1">
57+
58+ <record model="project.project" id="project.project_project_4">
59+ <field name="privacy_visibility">portal</field>
60+ </record>
61+
62+ </data>
63+</openerp>
64
65=== modified file 'portal_project/security/ir.model.access.csv'
66--- portal_project/security/ir.model.access.csv 2013-12-02 15:09:25 +0000
67+++ portal_project/security/ir.model.access.csv 2014-02-10 10:02:38 +0000
68@@ -1,13 +1,14 @@
69 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
70 access_project,project,project.model_project_project,base.group_portal,1,0,0,0
71-access_task,task,project.model_project_task,base.group_portal,1,0,0,0
72+access_task,task,project.model_project_task,base.group_portal,1,1,1,1
73 access_task_type,task_type,project.model_project_task_type,base.group_portal,1,0,0,0
74 access_task_work,task_work,project.model_project_task_work,base.group_portal,1,0,0,0
75+access_task_history,task_history,project.model_project_task_history,base.group_portal,1,1,1,0
76 access_project_category,project_category,project.model_project_category,base.group_portal,1,0,0,0
77 access_account_analytic_account,account_analytic_account,analytic.model_account_analytic_account,base.group_portal,1,0,0,0
78-access_project_public,project,project.model_project_project,base.group_public,1,0,0,0
79-access_task_public,task,project.model_project_task,base.group_public,1,0,0,0
80-access_task_type_public,task_type,project.model_project_task_type,base.group_public,1,0,0,0
81-access_task_work_public,task_work,project.model_project_task_work,base.group_public,1,0,0,0
82-access_project_category_public,project_category,project.model_project_category,base.group_public,1,0,0,0
83-access_account_analytic_account_public,account_analytic_account,analytic.model_account_analytic_account,base.group_public,1,0,0,0
84\ No newline at end of file
85+access_project_anonymous,project,project.model_project_project,base.group_public,1,0,0,0
86+access_task_anonymous,task,project.model_project_task,base.group_public,1,0,0,0
87+access_task_type_anonymous,task_type,project.model_project_task_type,base.group_public,1,0,0,0
88+access_task_work_anonymous,task_work,project.model_project_task_work,base.group_public,1,0,0,0
89+access_project_category_anonymous,project_category,project.model_project_category,base.group_public,1,0,0,0
90+access_account_analytic_account_anonymous,account_analytic_account,analytic.model_account_analytic_account,base.group_public,1,0,0,0
91\ No newline at end of file
92
93=== modified file 'portal_project/security/portal_security.xml'
94--- portal_project/security/portal_security.xml 2013-12-02 15:09:25 +0000
95+++ portal_project/security/portal_security.xml 2014-02-10 10:02:38 +0000
96@@ -13,7 +13,7 @@
97 <field name="groups" eval="[(4, ref('base.group_user'))]"/>
98 </record>
99
100- <record id="portal_project_rule" model="ir.rule">
101+ <record model="ir.rule" id="portal_project_rule">
102 <field name="name">Project: portal users: public, portal or following</field>
103 <field name="model_id" ref="project.model_project_project"/>
104 <field name="domain_force">['|',
105@@ -42,8 +42,8 @@
106 ]</field>
107 </record>
108
109- <record id="portal_task_rule" model="ir.rule">
110- <field name="name">Project/Task: portal users: public or (portal and colleagues following) or (followers and following)</field>
111+ <record model="ir.rule" id="portal_task_rule_read">
112+ <field name="name">Project/Task: portal: read: public or (portal and colleagues following) or (followers and following)</field>
113 <field name="model_id" ref="project.model_project_task"/>
114 <field name="domain_force">['|', '|',
115 ('project_id.privacy_visibility', 'in', ['public']),
116@@ -55,6 +55,19 @@
117 ('message_follower_ids', 'in', [user.partner_id.id]),
118 ]</field>
119 <field name="groups" eval="[(4, ref('base.group_portal'))]"/>
120+ <field name="perm_create" eval="False"/>
121+ <field name="perm_write" eval="False"/>
122+ <field name="perm_unlink" eval="False"/>
123+ </record>
124+ <record model="ir.rule" id="portal_task_rule_create_write">
125+ <field name="name">Project/Task: portal: create/write/unlink: followers and following</field>
126+ <field name="model_id" ref="project.model_project_task"/>
127+ <field name="domain_force">['&amp;',
128+ ('project_id.privacy_visibility', '=', 'followers'),
129+ ('message_follower_ids', 'in', [user.partner_id.id])
130+ ]</field>
131+ <field name="groups" eval="[(4, ref('base.group_portal'))]"/>
132+ <field name="perm_read" eval="False"/>
133 </record>
134
135 <record model="ir.rule" id="task_public_rule">
136
137=== modified file 'portal_project/tests/test_access_rights.py'
138--- portal_project/tests/test_access_rights.py 2014-01-16 10:39:10 +0000
139+++ portal_project/tests/test_access_rights.py 2014-02-10 10:02:38 +0000
140@@ -43,6 +43,7 @@
141 self.user_portal_id = self.res_users.create(cr, uid, {
142 'name': 'Chell Portal',
143 'login': 'chell',
144+ 'email': 'chell@portal.portal',
145 'alias_name': 'chell',
146 'groups_id': [(6, 0, [self.group_portal_id])]
147 })
148@@ -147,7 +148,8 @@
149 # Test: no project task searchable
150 self.assertRaises(AccessError, self.project_task.search, cr, self.user_none_id, [('project_id', '=', pigs_id)])
151
152- # Data: task follower
153+ # Data: project/task follower
154+ self.project_project.message_subscribe_users(cr, self.user_projectmanager_id, [self.project_pigs_id], [self.user_portal_id])
155 self.project_task.message_subscribe_users(cr, self.user_projectuser_id, [self.task_1_id, self.task_3_id], [self.user_portal_id])
156
157 # Do: Chell reads project -> ok (portal ok public)
158@@ -164,7 +166,8 @@
159 task_ids = self.project_task.search(cr, self.user_public_id, [('project_id', '=', pigs_id)])
160 self.assertFalse(task_ids, 'access rights: public user should not see tasks of a portal project')
161
162- # Data: task follower cleaning
163+ # Data: project/task follower cleaning
164+ self.project_project.message_unsubscribe_users(cr, self.user_projectmanager_id, [self.project_pigs_id], [self.user_portal_id])
165 self.project_task.message_unsubscribe_users(cr, self.user_projectuser_id, [self.task_1_id, self.task_3_id], [self.user_portal_id])
166
167 # ----------------------------------------
168@@ -245,5 +248,21 @@
169 self.assertEqual(set(task_ids), test_task_ids,
170 'access rights: employee user should not see followed + assigned tasks of a follower project')
171
172- # Do: Donovan reads project -> ko (public ko follower even if follower)
173+ # Do: Portal creates a task in project -> ok (follower ok follower)
174+ task_id = self.project_task.create(
175+ cr, self.user_portal_id,
176+ {'name': 'PortalTask',
177+ 'project_id': self.project_pigs_id},
178+ {'mail_create_nolog': True}
179+ )
180+ task = self.project_task.browse(cr, self.user_portal_id, task_id)
181+ self.assertEqual(task.name, 'PortalTask', 'access rights: issue when trying to create a task')
182+ # Test: followed + can update it
183+ self.project_task.write(cr, self.user_portal_id, [task_id], {'name': 'NewPortalTask'})
184+ task.refresh()
185+ self.assertEqual(task.name, 'NewPortalTask', 'access rights: issue when trying to write on a follower task with a follower')
186+ # Test: unlink it
187+ self.project_task.unlink(cr, self.user_portal_id, [task_id])
188+
189+ # Do: Donovan reads project -> ko (anonymous ko follower even if follower)
190 self.assertRaises(except_orm, self.project_project.read, cr, self.user_public_id, pigs_id, ['name'])
191
192=== added directory 'portal_project_gtd'
193=== added file 'portal_project_gtd/__init__.py'
194--- portal_project_gtd/__init__.py 1970-01-01 00:00:00 +0000
195+++ portal_project_gtd/__init__.py 2014-02-10 10:02:38 +0000
196@@ -0,0 +1,20 @@
197+# -*- coding: utf-8 -*-
198+##############################################################################
199+#
200+# OpenERP, Open Source Management Solution
201+# Copyright (C) 2010-Today OpenERP S.A. (<http://www.openerp.com>).
202+#
203+# This program is free software: you can redistribute it and/or modify
204+# it under the terms of the GNU Affero General Public License as
205+# published by the Free Software Foundation, either version 3 of the
206+# License, or (at your option) any later version.
207+#
208+# This program is distributed in the hope that it will be useful,
209+# but WITHOUT ANY WARRANTY; without even the implied warranty of
210+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
211+# GNU Affero General Public License for more details.
212+#
213+# You should have received a copy of the GNU Affero General Public License
214+# along with this program. If not, see <http://www.gnu.org/licenses/>.
215+#
216+##############################################################################
217
218=== added file 'portal_project_gtd/__openerp__.py'
219--- portal_project_gtd/__openerp__.py 1970-01-01 00:00:00 +0000
220+++ portal_project_gtd/__openerp__.py 2014-02-10 10:02:38 +0000
221@@ -0,0 +1,20 @@
222+# -*- coding: utf-8 -*-
223+
224+{
225+ 'name': 'Portal Project GTD',
226+ 'version': '1.0',
227+ 'category': 'Tools',
228+ 'complexity': 'easy',
229+ 'description': """
230+This module adds necessary security rules and access rights for project GTD and portal.
231+=======================================================================================
232+ """,
233+ 'author': 'OpenERP SA',
234+ 'depends': ['project_gtd', 'portal_project'],
235+ 'data': [
236+ 'security/ir.model.access.csv',
237+ ],
238+ 'installable': True,
239+ 'auto_install': True,
240+ 'category': 'Hidden',
241+}
242
243=== added directory 'portal_project_gtd/security'
244=== added file 'portal_project_gtd/security/ir.model.access.csv'
245--- portal_project_gtd/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
246+++ portal_project_gtd/security/ir.model.access.csv 2014-02-10 10:02:38 +0000
247@@ -0,0 +1,5 @@
248+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
249+access_project_gtd_context_portal,project.gtd.context.portal,project_gtd.model_project_gtd_context,portal.group_portal,1,0,0,0
250+access_project_gtd_timebox_portal,project.gtd.timebox.portal,project_gtd.model_project_gtd_timebox,portal.group_portal,1,0,0,0
251+access_project_gtd_context_anonymous,project.gtd.context.anonymous,project_gtd.model_project_gtd_context,portal.group_anonymous,1,0,0,0
252+access_project_gtd_timebox_anonymous,project.gtd.timebox.anonymous,project_gtd.model_project_gtd_timebox,portal.group_anonymous,1,0,0,0
253\ No newline at end of file
254
255=== modified file 'portal_project_issue/security/ir.model.access.csv'
256--- portal_project_issue/security/ir.model.access.csv 2013-12-02 15:09:25 +0000
257+++ portal_project_issue/security/ir.model.access.csv 2014-02-10 10:02:38 +0000
258@@ -1,4 +1,5 @@
259 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
260-access_issues,project_issue,project_issue.model_project_issue,base.group_portal,1,0,0,0
261+<<<<<<< TREE
262+access_issues,project_issue,project_issue.model_project_issue,base.group_portal,1,1,1,1
263 access_case_section,crm_case_section,crm.model_crm_case_section,base.group_portal,1,0,0,0
264-access_issues_public,project_issue,project_issue.model_project_issue,base.group_public,1,0,0,0
265\ No newline at end of file
266+access_issues_anonymous,project_issue,project_issue.model_project_issue,base.group_public,1,0,0,0
267\ No newline at end of file
268
269=== modified file 'portal_project_issue/security/portal_security.xml'
270--- portal_project_issue/security/portal_security.xml 2013-12-02 15:09:25 +0000
271+++ portal_project_issue/security/portal_security.xml 2014-02-10 10:02:38 +0000
272@@ -2,7 +2,17 @@
273 <openerp>
274 <data noupdate="1">
275
276- <record id="portal_issue_rule" model="ir.rule">
277+ <record model="ir.rule" id="project_issue.issue_user_rule">
278+ <field name="name">Project/Issue: employees: public, portal, employee or (followers and following)</field>
279+ <field name="domain_force">['|',
280+ ('project_id.privacy_visibility', 'in', ['public', 'portal', 'employees']),
281+ '&amp;',
282+ ('project_id.privacy_visibility', '=', 'followers'),
283+ ('message_follower_ids', 'in', [user.partner_id.id]),
284+ ]</field>
285+ </record>
286+
287+ <record model="ir.rule" id="portal_issue_rule_read">
288 <field name="name">Project/Issue: portal users: public or (portal and colleagues following) or (followers and following)</field>
289 <field name="model_id" ref="project_issue.model_project_issue"/>
290 <field name="domain_force">['|', '|',
291@@ -15,16 +25,19 @@
292 ('message_follower_ids', 'in', [user.partner_id.id]),
293 ]</field>
294 <field name="groups" eval="[(4, ref('base.group_portal'))]"/>
295+ <field name="perm_create" eval="False"/>
296+ <field name="perm_write" eval="False"/>
297+ <field name="perm_unlink" eval="False"/>
298 </record>
299-
300- <record model="ir.rule" id="project_issue.issue_user_rule">
301- <field name="name">Project/Issue: employees: public, portal, employee or (followers and following)</field>
302- <field name="domain_force">['|',
303- ('project_id.privacy_visibility', 'in', ['public', 'portal', 'employees']),
304- '&amp;',
305- ('project_id.privacy_visibility', '=', 'followers'),
306- ('message_follower_ids', 'in', [user.partner_id.id]),
307+ <record model="ir.rule" id="portal_issue_rule_create_write">
308+ <field name="name">Project/Issue: portal: create/write/unlink: followers and following</field>
309+ <field name="model_id" ref="project_issue.model_project_issue"/>
310+ <field name="domain_force">['&amp;',
311+ ('project_id.privacy_visibility', '=', 'followers'),
312+ ('message_follower_ids', 'in', [user.partner_id.id])
313 ]</field>
314+ <field name="groups" eval="[(4, ref('base.group_portal'))]"/>
315+ <field name="perm_read" eval="False"/>
316 </record>
317
318 <record model="ir.rule" id="issue_public_rule">
319
320=== modified file 'portal_project_long_term/__openerp__.py'
321--- portal_project_long_term/__openerp__.py 2013-03-21 09:06:26 +0000
322+++ portal_project_long_term/__openerp__.py 2014-02-10 10:02:38 +0000
323@@ -30,7 +30,7 @@
324 =============================================================================================
325 """,
326 'author': 'OpenERP SA',
327- 'depends': ['project_long_term', 'portal'],
328+ 'depends': ['project_long_term', 'portal_project'],
329 'data': [
330 'security/portal_security.xml',
331 'security/ir.model.access.csv',
332
333=== modified file 'project_gtd/project_gtd.py'
334--- project_gtd/project_gtd.py 2013-10-27 12:31:04 +0000
335+++ project_gtd/project_gtd.py 2014-02-10 10:02:38 +0000
336@@ -21,10 +21,12 @@
337
338 import sys
339
340+from openerp import tools
341 from openerp.osv import fields, osv
342-from openerp import tools
343+from openerp.osv.orm import except_orm
344 from openerp.tools.translate import _
345
346+
347 class project_gtd_context(osv.osv):
348 _name = "project.gtd.context"
349 _description = "Context"
350@@ -66,8 +68,11 @@
351 return super(project_task,self).copy_data(cr, uid, id, default, context)
352
353 def _get_context(self, cr, uid, context=None):
354- ids = self.pool.get('project.gtd.context').search(cr, uid, [], context=context)
355- return ids and ids[0] or False
356+ try:
357+ ids = self.pool.get('project.gtd.context').search(cr, uid, [], context=context)
358+ return ids and ids[0] or False
359+ except except_orm:
360+ return False
361
362 _defaults = {
363 'context_id': _get_context
364
365=== modified file 'project_issue_sheet/project_issue_sheet.py'
366--- project_issue_sheet/project_issue_sheet.py 2013-10-27 12:31:04 +0000
367+++ project_issue_sheet/project_issue_sheet.py 2014-02-10 10:02:38 +0000
368@@ -26,8 +26,8 @@
369 _inherit = 'project.issue'
370 _description = 'project issue'
371 _columns = {
372- 'timesheet_ids': fields.one2many('hr.analytic.timesheet', 'issue_id', 'Timesheets'),
373- 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account'),
374+ 'timesheet_ids': fields.one2many('hr.analytic.timesheet', 'issue_id', 'Timesheets', groups="base.group_user"),
375+ 'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', groups="base.group_user"),
376 }
377
378 def on_change_project(self, cr, uid, ids, project_id, context=None):

Subscribers

People subscribed via source and target branches

to all changes: