[IMP] project, task, issues: improvement of ir rules. Still a bit WIP.
bzr revid: tde@openerp.com-20130410160139-vx9z4rsmfiji1vu9
This commit is contained in:
@@ -19,3 +19,4 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import project
|
||||
|
||||
@@ -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']),
|
||||
'&',
|
||||
('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']),
|
||||
'&',
|
||||
('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']),
|
||||
'&',
|
||||
('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'),
|
||||
'&',
|
||||
('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'),
|
||||
'&',
|
||||
('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']),
|
||||
'&',
|
||||
('project_id.visibility', '=', 'followers'),
|
||||
('message_follower_ids', 'in', [user.id]),
|
||||
('user_id', '=', user.id),
|
||||
]</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -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
@@ -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 ?
|
||||
|
||||
@@ -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 & 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')])]"/>
|
||||
|
||||
@@ -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']}"/>
|
||||
|
||||
@@ -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']),
|
||||
'&',
|
||||
('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']),
|
||||
'&',
|
||||
('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>
|
||||
|
||||
Reference in New Issue
Block a user