[IMP] project, task, issues: improvement of ir rules. Still a bit WIP.

bzr revid: tde@openerp.com-20130410160139-vx9z4rsmfiji1vu9
This commit is contained in:
Thibault Delavallée
2013-04-10 18:01:39 +02:00
parent 7c026132ff
commit 3519e2c19f
10 changed files with 197 additions and 64 deletions
+1
View File
@@ -19,3 +19,4 @@
#
##############################################################################
import project
+1 -1
View File
@@ -30,7 +30,7 @@ This module adds project menu and features (tasks) to your portal if project and
======================================================================================================
""",
'author': 'OpenERP SA',
'depends': ['project','portal'],
'depends': ['project', 'portal'],
'data': [
'security/portal_security.xml',
'security/ir.model.access.csv',
@@ -1,20 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- <data noupdate="1"> -->
<data>
<record id="portal_project_rule" model="ir.rule">
<field name="name">Portal Projects</field>
<field ref="project.model_project_project" name="model_id"/>
<field name="domain_force">['|', ('privacy_visibility', 'in', ['public', 'publicall']), ('message_follower_ids', 'in', [user.partner_id.id])]</field>
<record model="ir.rule" id="project.project_user_rule">
<field name="name">Project: employees: public, portal, employees or following</field>
<field name="domain_force">['|',
('visibility', 'in', ['public', 'portal', 'employees']),
'&amp;',
('visibility', '=', 'followers'),
('message_follower_ids', 'in', [user.id]),
]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
<record model="ir.rule" id="project_portal_rule">
<field name="name">Project: portal users: public, portal or following</field>
<field name="model_id" ref="project.model_project_project"/>
<field name="domain_force">['|',
('visibility', 'in', ['public', 'portal']),
'&amp;',
('visibility', '=', 'followers'),
('message_follower_ids', 'in', [user.id]),
]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
<record id="portal_task_rule" model="ir.rule">
<field name="name">Portal Tasks</field>
<field ref="project.model_project_task" name="model_id"/>
<field name="domain_force">['|', ('project_id.privacy_visibility', '=', 'publicall'), ('message_follower_ids','in', [user.partner_id.id])]</field>
<record model="ir.rule" id="project_anonymous_rule">
<field name="name">Project: anonymous users: public only</field>
<field name="model_id" ref="project.model_project_project"/>
<field name="domain_force">[('visibility', '=', 'public')]</field>
<field name="groups" eval="[(4, ref('portal.group_anonymous'))]"/>
</record>
<record model="ir.rule" id="project.task_user_rule">
<field name="name">Project/Task: employees: public, portal, employee or following or assigned</field>
<field name="domain_force">['|',
'|',
('project_id.visibility', 'in', ['public', 'portal', 'employees']),
'&amp;',
('project_id.visibility', '=', 'followers'),
('message_follower_ids', 'in', [user.id]),
('user_id', '=', user.id),
]</field>
</record>
<record model="ir.rule" id="task_portal_rule">
<field name="name">Project/Task: portal users: public or portal and following</field>
<field name="model_id" ref="project.model_project_task"/>
<field name="domain_force">['|',
'|',
('project_id.visibility', '=', 'public'),
'&amp;',
('project_id.visibility', 'in', ['portal', 'followers']),
('message_follower_ids','in', [user.partner_id.id]),
('user_id', '=', user.id),
]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
<record model="ir.rule" id="task_anonymous_rule">
<field name="name">Project/Task: anonymous users: public only</field>
<field name="model_id" ref="project.model_project_task"/>
<field name="domain_force">[('project_id.visibility', '=', 'public')]</field>
<field name="groups" eval="[(4, ref('portal.group_anonymous'))]"/>
</record>
</data>
</openerp>
@@ -1,11 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- <data noupdate="1"> -->
<data>
<record id="portal_issue_rule" model="ir.rule">
<field name="name">Portal Personal Issues</field>
<field ref="project_issue.model_project_issue" name="model_id"/>
<field name="domain_force">['|', ('project_id.privacy_visibility', '=', 'publicall'), ('message_follower_ids','in', [user.partner_id.id])]</field>
<record model="ir.rule" id="issue_portal_user_rule">
<field name="name">Project/Issue: portal users: public or portal and following</field>
<field name="model_id" ref="project_issue.model_project_issue"/>
<field name="domain_force">['|',
'|',
('project_id.visibility', '=', 'public'),
'&amp;',
('project_id.visibility', 'in', ['portal', 'followers']),
('message_follower_ids','in', [user.partner_id.id]),
('user_id', '=', user.id),
]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
<field eval="1" name="perm_unlink"/>
<field eval="1" name="perm_write"/>
@@ -13,5 +21,17 @@
<field eval="0" name="perm_create"/>
</record>
<record model="ir.rule" id="project_issue.issue_user_rule">
<field name="name">Project/Issue: employees: public, portal, employee or following or assigned</field>
<field name="domain_force">['|',
'|',
('project_id.visibility', 'in', ['public', 'portal', 'employees']),
'&amp;',
('project_id.visibility', '=', 'followers'),
('message_follower_ids', 'in', [user.id]),
('user_id', '=', user.id),
]</field>
</record>
</data>
</openerp>
+2 -1
View File
@@ -76,8 +76,9 @@ Dashboard / Reports for Project Management will include:
'report/project_cumulative.xml',
'board_project_view.xml',
'res_config_view.xml',
'project_demo.xml',
],
'demo': ['project_demo.xml'],
# 'demo': ['project_demo.xml'],
'test': [
'test/project_demo.yml',
'test/project_process.yml',
+18 -10
View File
@@ -173,7 +173,6 @@ class project(osv.osv):
res[id]['progress_rate'] = 0.0
return res
def unlink(self, cr, uid, ids, context=None):
alias_ids = []
mail_alias = self.pool.get('mail.alias')
@@ -183,10 +182,10 @@ class project(osv.osv):
_('You cannot delete a project containing tasks. You can either delete all the project\'s tasks and then delete the project or simply deactivate the project.'))
elif proj.alias_id:
alias_ids.append(proj.alias_id.id)
res = super(project, self).unlink(cr, uid, ids, context=context)
res = super(project, self).unlink(cr, uid, ids, context=context)
mail_alias.unlink(cr, uid, alias_ids, context=context)
return res
def _get_attached_docs(self, cr, uid, ids, field_name, arg, context):
res = {}
attachment = self.pool.get('ir.attachment')
@@ -197,7 +196,7 @@ class project(osv.osv):
task_attachments = attachment.search(cr, uid, [('res_model', '=', 'project.task'), ('res_id', 'in', task_ids)], context=context, count=True)
res[id] = (project_attachments or 0) + (task_attachments or 0)
return res
def _task_count(self, cr, uid, ids, field_name, arg, context=None):
res = dict.fromkeys(ids, 0)
task_ids = self.pool.get('project.task').search(cr, uid, [('project_id', 'in', ids)])
@@ -206,16 +205,21 @@ class project(osv.osv):
return res
def _get_alias_models(self, cr, uid, context=None):
"""Overriden in project_issue to offer more options"""
""" Overriden in project_issue to offer more options """
return [('project.task', "Tasks")]
def _get_visibility_selection(self, cr, uid, context=None):
""" Overriden in project_issue to offer more options """
return [('public', 'All Users'),
('employees', 'Employees Only'),
('followers', 'Followers Only')]
def attachment_tree_view(self, cr, uid, ids, context):
task_ids = self.pool.get('project.task').search(cr, uid, [('project_id', 'in', ids)])
domain = [
'|',
'|',
'&', ('res_model', '=', 'project.project'), ('res_id', 'in', ids),
'&', ('res_model', '=', 'project.task'), ('res_id', 'in', task_ids)
]
'&', ('res_model', '=', 'project.task'), ('res_id', 'in', task_ids)]
res_id = ids and ids[0] or False
return {
'name': _('Attachments'),
@@ -228,8 +232,11 @@ class project(osv.osv):
'limit': 80,
'context': "{'default_res_model': '%s','default_res_id': %d}" % (self._name, res_id)
}
# Lambda indirection method to avoid passing a copy of the overridable method when declaring the field
_alias_models = lambda self, *args, **kwargs: self._get_alias_models(*args, **kwargs)
_visibility_selection = lambda self, *args, **kwargs: self._get_visibility_selection(*args, **kwargs)
_columns = {
'complete_name': fields.function(_complete_name, string="Project Name", type='char', size=250),
'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the project without removing it."),
@@ -268,7 +275,8 @@ class project(osv.osv):
"with Tasks (or optionally Issues if the Issue Tracker module is installed)."),
'alias_model': fields.selection(_alias_models, "Alias Model", select=True, required=True,
help="The kind of document created when an email is received on this project's email alias"),
'privacy_visibility': fields.selection([('publicall', 'All users will see all tasks'), ('public','All users'), ('employees','All employees'), ('followers','Followers Only')], 'Privacy / Visibility', required=True),
'visibility': fields.selection(_visibility_selection, 'Privacy / Visibility',
select=True, required=True, oldname="privacy_visibility"),
'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','Pending'),('close','Closed')], 'Status', required=True,),
'doc_count':fields.function(_get_attached_docs, string="Number of documents attached", type='int')
}
@@ -286,7 +294,7 @@ class project(osv.osv):
'sequence': 10,
'type_ids': _get_type_common,
'alias_model': 'project.task',
'privacy_visibility': 'public',
'visibility': 'public',
}
# TODO: Why not using a SQL contraints ?
+10 -4
View File
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- <data noupdate="1"> -->
<data>
<!-- Users -->
<record id="base.user_demo" model="res.users">
@@ -29,7 +30,7 @@
<field name="color">3</field>
<field name="partner_id" ref="base.res_partner_10"/>
<field name="parent_id" ref="all_projects_account"/>
<field name="privacy_visibility">public</field>
<field name="visibility">public</field>
<field name="members" eval="[(6, 0, [
ref('base.user_root'),
ref('base.user_demo')])]"/>
@@ -46,9 +47,12 @@
<record id="project_project_2" model="project.project">
<field name="name">Research &amp; Development</field>
<field name="parent_id" ref="all_projects_account"/>
<field name="privacy_visibility">public</field>
<field name="visibility">followers</field>
<field name="user_id" ref="base.user_demo"/>
<field name="alias_model">project.task</field>
<field name="message_follower_ids" eval="[(6, 0, [
ref('base.user_root'),
ref('base.user_demo')])]"/>
</record>
<!-- We assign after so that default values applies -->
@@ -62,7 +66,7 @@
<field name="name">E-Learning Integration</field>
<field name="user_id" ref="base.user_demo"/>
<field name="alias_model">project.task</field>
<field name="privacy_visibility">public</field>
<field name="visibility">public</field>
<field name="members" eval="[(4, ref('base.user_root')), (4, ref('base.user_demo'))]"/>
</record>
@@ -75,6 +79,7 @@
<field name="parent_id" ref="all_projects_account"/>
<field name="name">Website Design Templates</field>
<field name="user_id" ref="base.user_root"/>
<field name="visibility">followers</field>
<field name="alias_model">project.task</field>
<field name="members" eval="[(4, ref('base.user_root')), (4,ref('base.user_demo'))]"/>
</record>
@@ -89,6 +94,7 @@
<field name="partner_id" ref="base.res_partner_7"/>
<field name="name">Data Import/Export Plugin</field>
<field name="alias_model">project.task</field>
<field name="visibility">employees</field>
<field name="members" eval="[(6, 0, [
ref('base.user_root'),
ref('base.user_demo')])]"/>
+1 -1
View File
@@ -111,7 +111,7 @@
</div>
<group>
<group>
<field name="privacy_visibility" widget="radio"/>
<field name="visibility" widget="radio"/>
<field name="user_id" string="Project Manager"
attrs="{'readonly':[('state','in',['close', 'cancelled'])]}"
context="{'default_groups_ref': ['base.group_user', 'project.group_project_manager']}"/>
+56 -32
View File
@@ -35,41 +35,65 @@
</record>
</data>
<data noupdate="1">
<record model="ir.rule" id="project_comp_rule">
<field name="name">Project multi-company</field>
<field name="model_id" ref="model_project_project"/>
<field name="global" eval="True"/>
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
</record>
<!-- <data noupdate="1"> -->
<data>
<record model="ir.rule" id="project_company_rule">
<field name="name">Project: multi-company</field>
<field name="model_id" ref="model_project_project"/>
<field name="global" eval="True"/>
<field name="domain_force">['|',
('company_id', '=', False),
('company_id', 'child_of', [user.company_id.id]),
]</field>
</record>
<record model="ir.rule" id="project_public_members_rule">
<field name="name">Public Members</field>
<field name="model_id" ref="model_project_project"/>
<field name="domain_force">['|',('privacy_visibility','in',['public', 'publicall', 'employees']),('message_follower_ids','in',[user.partner_id.id])]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
<record model="ir.rule" id="project_project_manager_rule">
<field name="name">Project: project manager: see all</field>
<field name="model_id" ref="model_project_project"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4,ref('project.group_project_manager'))]"/>
</record>
<record model="ir.rule" id="task_comp_rule">
<field name="name" >Task multi-company</field>
<field name="model_id" ref="model_project_task"/>
<field name="global" eval="True"/>
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
</record>
<record model="ir.rule" id="project_user_rule">
<field name="name">Project: employees: public, employees or followers</field>
<field name="model_id" ref="model_project_project"/>
<field name="domain_force">['|',
('visibility', 'in', ['public', 'employees']),
('message_follower_ids', 'in', [user.partner_id.id])
]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
<record model="ir.rule" id="task_visibility_rule">
<field name="name" >Tasks According to User and Project</field>
<field name="model_id" ref="model_project_task"/>
<field name="domain_force">['|','|','|','|',('project_id.privacy_visibility', '=', 'publicall'),('user_id','=',False),('user_id','=',user.id),('project_id.members','in', [user.id]),('project_id.user_id','=',user.id)]</field>
<field name="groups" eval="[(4,ref('project.group_project_user'))]"/>
</record>
<record model="ir.rule" id="task_company_rule">
<field name="name">Project/Task: multi-company</field>
<field name="model_id" ref="model_project_task"/>
<field name="global" eval="True"/>
<field name="domain_force">['|',
('company_id', '=', False),
('company_id', 'child_of', [user.company_id.id]),
]</field>
</record>
<record model="ir.rule" id="project_manager_all_project_tasks_rule">
<field name="name">Project Managers: all tasks from all projects</field>
<field name="model_id" ref="model_project_task"/>
<field name="domain_force">[(1,'=',1)]</field>
<field name="groups" eval="[(4,ref('project.group_project_manager'))]"/>
</record>
</data>
<record model="ir.rule" id="task_user_rule">
<field name="name">Project/Task: employees: public or employee or following or assigned</field>
<field name="model_id" ref="model_project_task"/>
<field name="domain_force">['|',
'|',
('project_id.visibility', 'in', ['public', 'employees']),
'&amp;',
('project_id.visibility', '=', 'followers'),
('message_follower_ids', 'in', [user.id]),
('user_id', '=', user.id),
]</field>
<field name="groups" eval="[(4,ref('base.group_user'))]"/>
</record>
<record model="ir.rule" id="task_project_manager_rule">
<field name="name">Project/Task: project manager: see all</field>
<field name="model_id" ref="model_project_task"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4,ref('project.group_project_manager'))]"/>
</record>
</data>
</openerp>
@@ -1,5 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- <data noupdate="1"> -->
<data>
<record model="ir.rule" id="issue_project_manager_rule">
<field name="name">Project/Issue: project manager: see all</field>
<field name="model_id" ref="model_project_issue"/>
<field name="domain_force">[(1, '=', 1)]</field>
<field name="groups" eval="[(4,ref('project.group_project_manager'))]"/>
</record>
<record model="ir.rule" id="issue_user_rule">
<field name="name">Project/Issue: employees: public or employee or following or assigned</field>
<field name="model_id" ref="model_project_issue"/>
<field name="domain_force">['|',
'|',
('project_id.visibility', 'in', ['public', 'employees']),
'&amp;',
('project_id.visibility', '=', 'followers'),
('message_follower_ids', 'in', [user.id]),
('user_id', '=', user.id),
]</field>
<field name="groups" eval="[(4,ref('project.group_user'))]"/>
</record>
</data>
</openerp>