[TESTS] project: refactored tests. Moved surviving yml tests into unittest; added mailgateway test.
bzr revid: tde@openerp.com-20130710101508-62eh89gzq22qvpq5
This commit is contained in:
parent
6310275541
commit
9b41f8fadc
|
@ -77,9 +77,6 @@ Dashboard / Reports for Project Management will include:
|
||||||
],
|
],
|
||||||
'demo': ['project_demo.xml'],
|
'demo': ['project_demo.xml'],
|
||||||
'test': [
|
'test': [
|
||||||
'test/project_demo.yml',
|
|
||||||
'test/project_process.yml',
|
|
||||||
'test/task_process.yml',
|
|
||||||
],
|
],
|
||||||
'installable': True,
|
'installable': True,
|
||||||
'auto_install': False,
|
'auto_install': False,
|
||||||
|
|
|
@ -19,6 +19,7 @@ access_project_task_history,project.task.history project,project.model_project_t
|
||||||
access_project_task_history_cumulative,project.task.history project,project.model_project_task_history_cumulative,project.group_project_manager,1,0,0,0
|
access_project_task_history_cumulative,project.task.history project,project.model_project_task_history_cumulative,project.group_project_manager,1,0,0,0
|
||||||
access_project_task_history_cumulative,project.task.history project,project.model_project_task_history_cumulative,project.group_project_user,1,0,0,0
|
access_project_task_history_cumulative,project.task.history project,project.model_project_task_history_cumulative,project.group_project_user,1,0,0,0
|
||||||
access_resource_calendar,project.resource_calendar manager,resource.model_resource_calendar,project.group_project_manager,1,0,0,0
|
access_resource_calendar,project.resource_calendar manager,resource.model_resource_calendar,project.group_project_manager,1,0,0,0
|
||||||
|
access_resource_calendar_leaves_user,resource.calendar.leaves user,resource.model_resource_calendar_leaves,project.group_project_user,1,1,1,1
|
||||||
access_project_category,project.project_category,model_project_category,,1,0,0,0
|
access_project_category,project.project_category,model_project_category,,1,0,0,0
|
||||||
access_project_category_manager,project.project_category,model_project_category,project.group_project_manager,1,1,1,1
|
access_project_category_manager,project.project_category,model_project_category,project.group_project_manager,1,1,1,1
|
||||||
access_mail_alias,mail.alias,mail.model_mail_alias,project.group_project_manager,1,1,1,1
|
access_mail_alias,mail.alias,mail.model_mail_alias,project.group_project_manager,1,1,1,1
|
||||||
|
|
|
|
@ -1,12 +0,0 @@
|
||||||
-
|
|
||||||
!record {model: project.project, id: project_project_1, view: False}:
|
|
||||||
partner_id: base.res_partner_2
|
|
||||||
-
|
|
||||||
!record {model: project.task, id: project_task_1, view: False}:
|
|
||||||
remaining_hours: 10.00
|
|
||||||
-
|
|
||||||
!record {model: project.task, id: project_task_1, view: False}:
|
|
||||||
planned_hours: 10.00
|
|
||||||
-
|
|
||||||
!record {model: project.task, id: project_task_1, view: False}:
|
|
||||||
project_id: project_project_1
|
|
|
@ -1,70 +0,0 @@
|
||||||
-
|
|
||||||
In order to Test Process of Project Management,
|
|
||||||
-
|
|
||||||
I create duplicate template.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
new_template = self.duplicate_template(cr, uid, [ref("project_project_1")])
|
|
||||||
assert new_template, "duplicate template is not created"
|
|
||||||
template = self.browse(cr, uid, new_template['res_id'], context=context)
|
|
||||||
assert template.state == 'open', "Duplicate template must be in open state."
|
|
||||||
-
|
|
||||||
I convert template into real Project.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
self.reset_project(cr, uid, [ref("project_project_1")])
|
|
||||||
-
|
|
||||||
I check project details after convert from template.
|
|
||||||
-
|
|
||||||
!assert {model: project.project, id: project_project_1, severity: error, string: Project should be active}:
|
|
||||||
- state == "open"
|
|
||||||
-
|
|
||||||
I put project in pending.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
self.set_pending(cr, uid, [ref("project_project_1")])
|
|
||||||
-
|
|
||||||
I check state after put in pending.
|
|
||||||
-
|
|
||||||
!assert {model: project.project, id: project_project_1, severity: error, string: Project should be in pending state}:
|
|
||||||
- state == "pending"
|
|
||||||
-
|
|
||||||
I re-open the project.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
self.set_open(cr, uid, [ref("project_project_1")])
|
|
||||||
-
|
|
||||||
I check state after reopen.
|
|
||||||
-
|
|
||||||
!assert {model: project.project, id: project_project_1, severity: error, string: Project should be open.}:
|
|
||||||
- state == "open"
|
|
||||||
-
|
|
||||||
I close the project.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
self.set_done(cr, uid, [ref("project_project_1")])
|
|
||||||
-
|
|
||||||
I check state after closed.
|
|
||||||
-
|
|
||||||
!assert {model: project.project, id: project_project_1, severity: error, string: Project should be close.}:
|
|
||||||
- state == "close"
|
|
||||||
-
|
|
||||||
I set project into template.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
self.set_template(cr, uid, [ref("project_project_1")])
|
|
||||||
-
|
|
||||||
I schedule tasks of project.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
self.schedule_tasks(cr, uid, [ref("project_project_1")], context=context)
|
|
||||||
-
|
|
||||||
I copy the tasks of project.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
self.copy(cr, uid, ref("project_project_1"))
|
|
||||||
-
|
|
||||||
I cancel Project.
|
|
||||||
-
|
|
||||||
!python {model: project.project}: |
|
|
||||||
self.set_cancel(cr, uid, [ref("project_project_2")])
|
|
|
@ -1,23 +0,0 @@
|
||||||
-
|
|
||||||
I open a delegation wizard.
|
|
||||||
-
|
|
||||||
!python {model: project.task}: |
|
|
||||||
context.update({"active_id": ref("project_task_1")})
|
|
||||||
-
|
|
||||||
ze
|
|
||||||
-
|
|
||||||
!record {model: project.task.delegate, id: delegate_id}:
|
|
||||||
user_id: base.user_demo
|
|
||||||
planned_hours: 12.0
|
|
||||||
planned_hours_me: 2.0
|
|
||||||
-
|
|
||||||
Now I delegate task to team member.
|
|
||||||
-
|
|
||||||
!python {model: project.task.delegate}: |
|
|
||||||
self.delegate(cr, uid, [ref("delegate_id")], {"active_id": ref("project_task_1")})
|
|
||||||
-
|
|
||||||
I check delegated task details.
|
|
||||||
-
|
|
||||||
!python {model: project.task}: |
|
|
||||||
task = self.browse(cr, uid, ref("project_task_1"), context=context)
|
|
||||||
assert task.planned_hours == 2.0, "Planning hours is not correct after delegated."
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Business Applications
|
||||||
|
# Copyright (c) 2013-TODAY 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 . import test_project_flow
|
||||||
|
|
||||||
|
checks = [
|
||||||
|
test_project_flow,
|
||||||
|
]
|
||||||
|
|
||||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,92 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Business Applications
|
||||||
|
# Copyright (c) 2013-TODAY 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 openerp.addons.mail.tests.test_mail_base import TestMailBase
|
||||||
|
|
||||||
|
|
||||||
|
class TestProjectBase(TestMailBase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(TestProjectBase, self).setUp()
|
||||||
|
cr, uid = self.cr, self.uid
|
||||||
|
|
||||||
|
# Usefull models
|
||||||
|
self.project_project = self.registry('project.project')
|
||||||
|
self.project_task = self.registry('project.task')
|
||||||
|
self.project_task_delegate = self.registry('project.task.delegate')
|
||||||
|
|
||||||
|
# Find Project User group
|
||||||
|
group_project_user_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'project', 'group_project_user')
|
||||||
|
self.group_project_user_id = group_project_user_ref and group_project_user_ref[1] or False
|
||||||
|
|
||||||
|
# Find Project Manager group
|
||||||
|
group_project_manager_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'project', 'group_project_manager')
|
||||||
|
self.group_project_manager_id = group_project_manager_ref and group_project_manager_ref[1] or False
|
||||||
|
|
||||||
|
# Test partners to use through the various tests
|
||||||
|
self.project_partner_id = self.res_partner.create(cr, uid, {
|
||||||
|
'name': 'Gertrude AgrolaitPartner',
|
||||||
|
'email': 'gertrude.partner@agrolait.com',
|
||||||
|
})
|
||||||
|
self.email_partner_id = self.res_partner.create(cr, uid, {
|
||||||
|
'name': 'Patrick Ratatouille',
|
||||||
|
'email': 'patrick.ratatouille@agrolait.com',
|
||||||
|
})
|
||||||
|
|
||||||
|
# Test users to use through the various tests
|
||||||
|
self.user_projectuser_id = self.res_users.create(cr, uid, {
|
||||||
|
'name': 'Armande ProjectUser',
|
||||||
|
'login': 'Armande',
|
||||||
|
'alias_name': 'armande',
|
||||||
|
'email': 'armande.projectuser@example.com',
|
||||||
|
'groups_id': [(6, 0, [self.group_employee_id, self.group_project_user_id])]
|
||||||
|
})
|
||||||
|
self.user_projectmanager_id = self.res_users.create(cr, uid, {
|
||||||
|
'name': 'Bastien ProjectManager',
|
||||||
|
'login': 'bastien',
|
||||||
|
'alias_name': 'bastien',
|
||||||
|
'email': 'bastien.projectmanager@example.com',
|
||||||
|
'groups_id': [(6, 0, [self.group_employee_id, self.group_project_manager_id])]
|
||||||
|
})
|
||||||
|
self.user_projectuser = self.res_users.browse(cr, uid, self.user_projectuser_id)
|
||||||
|
self.user_projectmanager = self.res_users.browse(cr, uid, self.user_projectmanager_id)
|
||||||
|
self.partner_projectuser_id = self.user_projectuser.partner_id.id
|
||||||
|
self.partner_projectmanager_id = self.user_projectmanager.partner_id.id
|
||||||
|
|
||||||
|
# Test 'Pigs' project
|
||||||
|
self.project_pigs_id = self.project_project.create(cr, uid, {
|
||||||
|
'name': 'Pigs',
|
||||||
|
'privacy_visibility': 'public',
|
||||||
|
'alias_name': 'project+pigs',
|
||||||
|
'partner_id': self.partner_raoul_id,
|
||||||
|
}, {'mail_create_nolog': True})
|
||||||
|
|
||||||
|
# Already-existing tasks in Pigs
|
||||||
|
self.task_1_id = self.project_task.create(cr, uid, {
|
||||||
|
'name': 'Pigs UserTask',
|
||||||
|
'user_id': self.user_projectuser_id,
|
||||||
|
'project_id': self.project_pigs_id,
|
||||||
|
}, {'mail_create_nolog': True})
|
||||||
|
self.task_2_id = self.project_task.create(cr, uid, {
|
||||||
|
'name': 'Pigs ManagerTask',
|
||||||
|
'user_id': self.user_projectmanager_id,
|
||||||
|
'project_id': self.project_pigs_id,
|
||||||
|
}, {'mail_create_nolog': True})
|
|
@ -0,0 +1,160 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Business Applications
|
||||||
|
# Copyright (c) 2013-TODAY 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 openerp.addons.project.tests.test_project_base import TestProjectBase
|
||||||
|
from openerp.osv.orm import except_orm
|
||||||
|
from openerp.tools import mute_logger
|
||||||
|
|
||||||
|
|
||||||
|
EMAIL_TPL = """Return-Path: <whatever-2a840@postmaster.twitter.com>
|
||||||
|
X-Original-To: {email_to}
|
||||||
|
Delivered-To: {email_to}
|
||||||
|
To: {email_to}
|
||||||
|
Received: by mail1.openerp.com (Postfix, from userid 10002)
|
||||||
|
id 5DF9ABFB2A; Fri, 10 Aug 2012 16:16:39 +0200 (CEST)
|
||||||
|
Message-ID: {msg_id}
|
||||||
|
Date: Tue, 29 Nov 2011 12:43:21 +0530
|
||||||
|
From: {email_from}
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Subject: {subject}
|
||||||
|
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
|
||||||
|
|
||||||
|
Hello,
|
||||||
|
|
||||||
|
This email should create a new entry in your module. Please check that it
|
||||||
|
effectively works.
|
||||||
|
|
||||||
|
Thanks,
|
||||||
|
|
||||||
|
--
|
||||||
|
Raoul Boitempoils
|
||||||
|
Integrator at Agrolait"""
|
||||||
|
|
||||||
|
|
||||||
|
class TestProjectFlow(TestProjectBase):
|
||||||
|
|
||||||
|
@mute_logger('openerp.addons.base.ir.ir_model', 'openerp.osv.orm')
|
||||||
|
def test_00_project_process(self):
|
||||||
|
""" Testing project management """
|
||||||
|
cr, uid, user_projectuser_id, user_projectmanager_id, project_pigs_id = self.cr, self.uid, self.user_projectuser_id, self.user_projectmanager_id, self.project_pigs_id
|
||||||
|
|
||||||
|
# ProjectUser: set project as template -> raise
|
||||||
|
self.assertRaises(except_orm, self.project_project.set_template, cr, user_projectuser_id, [project_pigs_id])
|
||||||
|
|
||||||
|
# Other tests are done using a ProjectManager
|
||||||
|
project = self.project_project.browse(cr, user_projectmanager_id, project_pigs_id)
|
||||||
|
self.assertNotEqual(project.state, 'template', 'project: incorrect state, should not be a template')
|
||||||
|
|
||||||
|
# Set test project as template
|
||||||
|
self.project_project.set_template(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
project.refresh()
|
||||||
|
self.assertEqual(project.state, 'template', 'project: set_template: project state should be template')
|
||||||
|
self.assertEqual(len(project.tasks), 0, 'project: set_template: project tasks should have been set inactive')
|
||||||
|
|
||||||
|
# Duplicate template
|
||||||
|
new_template_act = self.project_project.duplicate_template(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
new_project = self.project_project.browse(cr, user_projectmanager_id, new_template_act['res_id'])
|
||||||
|
self.assertEqual(new_project.state, 'open', 'project: incorrect duplicate_template')
|
||||||
|
self.assertEqual(len(new_project.tasks), 2, 'project: duplicating a project template should duplicate its tasks')
|
||||||
|
|
||||||
|
# Convert into real project
|
||||||
|
self.project_project.reset_project(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
project.refresh()
|
||||||
|
self.assertEqual(project.state, 'open', 'project: resetted project should be in open state')
|
||||||
|
self.assertEqual(len(project.tasks), 2, 'project: reset_project: project tasks should have been set active')
|
||||||
|
|
||||||
|
# Put as pending
|
||||||
|
self.project_project.set_pending(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
project.refresh()
|
||||||
|
self.assertEqual(project.state, 'pending', 'project: should be in pending state')
|
||||||
|
|
||||||
|
# Re-open
|
||||||
|
self.project_project.set_open(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
project.refresh()
|
||||||
|
self.assertEqual(project.state, 'open', 'project: reopened project should be in open state')
|
||||||
|
|
||||||
|
# Close project
|
||||||
|
self.project_project.set_done(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
project.refresh()
|
||||||
|
self.assertEqual(project.state, 'close', 'project: closed project should be in close state')
|
||||||
|
|
||||||
|
# Re-open
|
||||||
|
self.project_project.set_open(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
project.refresh()
|
||||||
|
|
||||||
|
# Re-convert into a template and schedule tasks
|
||||||
|
self.project_project.set_template(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
self.project_project.schedule_tasks(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
|
||||||
|
# Copy the project
|
||||||
|
new_project_id = self.project_project.copy(cr, user_projectmanager_id, project_pigs_id)
|
||||||
|
new_project = self.project_project.browse(cr, user_projectmanager_id, new_project_id)
|
||||||
|
self.assertEqual(len(new_project.tasks), 2, 'project: copied project should have copied task')
|
||||||
|
|
||||||
|
# Cancel the project
|
||||||
|
self.project_project.set_cancel(cr, user_projectmanager_id, [project_pigs_id])
|
||||||
|
self.assertEqual(project.state, 'cancelled', 'project: cancelled project should be in cancel state')
|
||||||
|
|
||||||
|
def test_10_task_process(self):
|
||||||
|
""" Testing task creation and management """
|
||||||
|
cr, uid, user_projectuser_id, user_projectmanager_id, project_pigs_id = self.cr, self.uid, self.user_projectuser_id, self.user_projectmanager_id, self.project_pigs_id
|
||||||
|
|
||||||
|
def format_and_process(template, email_to='project+pigs@mydomain.com, other@gmail.com', subject='Frogs',
|
||||||
|
email_from='Patrick Ratatouille <patrick.ratatouille@agrolait.com>',
|
||||||
|
msg_id='<1198923581.41972151344608186760.JavaMail@agrolait.com>'):
|
||||||
|
self.assertEqual(self.project_task.search(cr, uid, [('name', '=', subject)]), [])
|
||||||
|
mail = template.format(email_to=email_to, subject=subject, email_from=email_from, msg_id=msg_id)
|
||||||
|
self.mail_thread.message_process(cr, uid, None, mail)
|
||||||
|
return self.project_task.search(cr, uid, [('name', '=', subject)])
|
||||||
|
|
||||||
|
# Do: incoming mail from an unknown partner on an alias creates a new task 'Frogs'
|
||||||
|
frogs = format_and_process(EMAIL_TPL)
|
||||||
|
|
||||||
|
# Test: one task created by mailgateway administrator
|
||||||
|
self.assertEqual(len(frogs), 1, 'project: message_process: a new project.task should have been created')
|
||||||
|
task = self.project_task.browse(cr, user_projectuser_id, frogs[0])
|
||||||
|
res = self.project_task.perm_read(cr, uid, [task.id], details=False)
|
||||||
|
self.assertEqual(res[0].get('create_uid'), uid,
|
||||||
|
'project: message_process: task should have been created by uid as alias_user_id is False on the alias')
|
||||||
|
# Test: messages
|
||||||
|
self.assertEqual(len(task.message_ids), 2,
|
||||||
|
'project: message_process: newly created task should have 2 messages: creation and email')
|
||||||
|
self.assertEqual(task.message_ids[1].subtype_id.name, 'Task Created',
|
||||||
|
'project: message_process: first message of new task should have Task Created subtype')
|
||||||
|
self.assertEqual(task.message_ids[0].author_id.id, self.email_partner_id,
|
||||||
|
'project: message_process: second message should be the one from Agrolait (partner failed)')
|
||||||
|
self.assertEqual(task.message_ids[0].subject, 'Frogs',
|
||||||
|
'project: message_process: second message should be the one from Agrolait (subject failed)')
|
||||||
|
# Test: task content
|
||||||
|
self.assertEqual(task.name, 'Frogs', 'project_task: name should be the email subject')
|
||||||
|
self.assertEqual(task.project_id.id, self.project_pigs_id, 'project_task: incorrect project')
|
||||||
|
|
||||||
|
# Open the delegation wizard
|
||||||
|
delegate_id = self.project_task_delegate.create(cr, user_projectuser_id, {
|
||||||
|
'user_id': user_projectuser_id,
|
||||||
|
'planned_hours': 12.0,
|
||||||
|
'planned_hours_me': 2.0,
|
||||||
|
}, {'active_id': task.id})
|
||||||
|
self.project_task_delegate.delegate(cr, user_projectuser_id, [delegate_id], {'active_id': task.id})
|
||||||
|
|
||||||
|
# Check delegation details
|
||||||
|
task.refresh()
|
||||||
|
self.assertEqual(task.planned_hours, 2, 'project_task_delegate: planned hours is not correct after delegation')
|
|
@ -4,9 +4,6 @@ access_project_user_allocation,project.user.allocation,model_project_user_alloca
|
||||||
access_project_phase_manager,project.phase manager,model_project_phase,project.group_project_manager,1,1,1,1
|
access_project_phase_manager,project.phase manager,model_project_phase,project.group_project_manager,1,1,1,1
|
||||||
access_project_user_allocation_manager,project.user.allocation manager,model_project_user_allocation,project.group_project_manager,1,1,1,1
|
access_project_user_allocation_manager,project.user.allocation manager,model_project_user_allocation,project.group_project_manager,1,1,1,1
|
||||||
access_resource_resource_user,user.user user,resource.model_resource_resource,project.group_project_user,1,0,0,0
|
access_resource_resource_user,user.user user,resource.model_resource_resource,project.group_project_user,1,0,0,0
|
||||||
access_resource_calendar_leaves_user,user.calendar.leaves user,resource.model_resource_calendar_leaves,project.group_project_user,1,1,1,1
|
|
||||||
access_resource_resource_manager,user.user manager,resource.model_resource_resource,project.group_project_manager,1,1,1,1
|
access_resource_resource_manager,user.user manager,resource.model_resource_resource,project.group_project_manager,1,1,1,1
|
||||||
access_project_user_allocation_manager,project.user.allocation.manager,model_project_user_allocation,project.group_project_manager,1,1,1,1
|
access_project_user_allocation_manager,project.user.allocation.manager,model_project_user_allocation,project.group_project_manager,1,1,1,1
|
||||||
access_project_resource_calendar_attendance,resource.calendar.attendance,resource.model_resource_calendar_attendance,project.group_project_manager,1,0,0,0
|
access_project_resource_calendar_attendance,resource.calendar.attendance,resource.model_resource_calendar_attendance,project.group_project_manager,1,0,0,0
|
||||||
|
|
||||||
|
|
||||||
|
|
|
Loading…
Reference in New Issue