170 lines
7.2 KiB
Python
170 lines
7.2 KiB
Python
# hooks.py
|
|
from odoo import api, SUPERUSER_ID
|
|
|
|
def post_init_hook(env):
|
|
# Create shared project sequence if it doesn't exist
|
|
project_sequence = env['ir.sequence'].sudo().search([('code', '=', 'project.project.sequence')], limit=1)
|
|
if not project_sequence:
|
|
project_sequence = env['ir.sequence'].sudo().create({
|
|
'name': "Project Sequence",
|
|
'implementation': 'no_gap',
|
|
'padding': 3,
|
|
'use_date_range': False,
|
|
'prefix': 'PROJ-',
|
|
'code': 'project.project.sequence',
|
|
})
|
|
|
|
public_rule = env.ref('project.project_public_members_rule', raise_if_not_found=False)
|
|
if public_rule:
|
|
public_rule.write({
|
|
'perm_read': True,
|
|
'perm_write': False,
|
|
'perm_create': False,
|
|
'perm_unlink': False,
|
|
})
|
|
private_task_rule = env.ref('project.ir_rule_private_task', raise_if_not_found=False)
|
|
if private_task_rule:
|
|
private_task_rule.write({
|
|
'domain_force': """[
|
|
'&',
|
|
('project_id', '!=', False),
|
|
('project_id.privacy_visibility', '!=', 'followers'),
|
|
'|',
|
|
'&',
|
|
('is_generic', '=', True),
|
|
'|', '|',
|
|
('project_id', '!=', False),
|
|
('parent_id', '!=', False),
|
|
('user_ids', 'in', user.id),
|
|
'&',
|
|
('is_generic', '=', False),
|
|
('user_ids', 'in', user.id),
|
|
]
|
|
"""
|
|
})
|
|
|
|
task_visibility_rule = env.ref('project.task_visibility_rule', raise_if_not_found=False)
|
|
if task_visibility_rule:
|
|
task_visibility_rule.write({
|
|
'domain_force' : """
|
|
[
|
|
'|',
|
|
'&',
|
|
('project_id', '!=', False),
|
|
'|', '|',
|
|
'&',
|
|
('project_id.privacy_visibility', '!=', 'followers'),
|
|
'|',
|
|
('is_generic', '=', True),
|
|
('user_ids', 'in', user.id),
|
|
'&',
|
|
('project_id.message_partner_ids', 'in', [user.partner_id.id]),
|
|
('is_generic', '=', True),
|
|
'&',
|
|
('user_ids', 'in', user.id),
|
|
('project_id.message_partner_ids', 'in', [user.partner_id.id]),
|
|
'&',
|
|
('project_id', '=', False),
|
|
'|',
|
|
('message_partner_ids', 'in', [user.partner_id.id]),
|
|
('user_ids', 'in', user.id),
|
|
]
|
|
|
|
"""
|
|
})
|
|
|
|
task_visibility_rule_project_user = env.ref('project.task_visibility_rule_project_user', raise_if_not_found=False)
|
|
if task_visibility_rule_project_user:
|
|
task_visibility_rule_project_user.write({
|
|
'domain_force': """
|
|
[
|
|
'|',
|
|
'&',
|
|
('project_id', '!=', False),
|
|
'|', '|',
|
|
'&',
|
|
('project_id.privacy_visibility', '!=', 'followers'),
|
|
'|',
|
|
('is_generic', '=', True),
|
|
('user_ids', 'in', user.id),
|
|
'&',
|
|
('project_id.message_partner_ids', 'in', [user.partner_id.id]),
|
|
('is_generic', '=', True),
|
|
'&',
|
|
('user_ids', 'in', user.id),
|
|
('project_id.message_partner_ids', 'in', [user.partner_id.id]),
|
|
'&',
|
|
('project_id', '=', False),
|
|
'|',
|
|
('message_partner_ids', 'in', [user.partner_id.id]),
|
|
('user_ids', 'in', user.id),
|
|
]
|
|
|
|
"""
|
|
})
|
|
|
|
timesheet_approver_rule = env.ref('hr_timesheet.timesheet_line_rule_approver', raise_if_not_found=False)
|
|
if timesheet_approver_rule:
|
|
timesheet_approver_rule.write({
|
|
'domain_force': """
|
|
['&', '&',
|
|
('project_id', '!=', False),
|
|
('task_id', '!=', False),
|
|
'|',
|
|
'&',
|
|
('project_id.privacy_visibility', '=', 'followers'),
|
|
'|',
|
|
'|',
|
|
('project_id.project_lead', '=', user.id),
|
|
('project_id.user_id', '=', user.id),
|
|
'|',
|
|
'&',
|
|
('task_id.is_generic', '=', False),
|
|
('user_id', 'in', 'task_id.user_ids'),
|
|
'&',
|
|
('task_id.is_generic', '=', True),
|
|
('user_id.partner_id', 'in', 'project_id.message_partner_ids'),
|
|
'&', '&',
|
|
('project_id.privacy_visibility', '!=', 'followers'),
|
|
('task_id.is_generic', '=', False),
|
|
('user_id', 'in', 'task_id.user_ids')
|
|
]
|
|
"""
|
|
})
|
|
# Get all projects without sequence_name, sorted by creation date
|
|
projects = env['project.project'].search([('sequence_name', '=', False)], order='create_date asc')
|
|
|
|
# Assign sequence numbers to projects
|
|
for project in projects:
|
|
project.sequence_name = project_sequence.next_by_id()
|
|
|
|
# Process all projects to ensure they have task sequences
|
|
all_projects = env['project.project'].search([])
|
|
for project in all_projects:
|
|
if not project.task_sequence_id:
|
|
task_sequence = env['ir.sequence'].sudo().create({
|
|
'name': f"Task Sequence for {project.sequence_name}",
|
|
'implementation': 'no_gap',
|
|
'padding': 3,
|
|
'use_date_range': False,
|
|
'prefix': f"{project.sequence_name}/TASK-",
|
|
})
|
|
project.task_sequence_id = task_sequence
|
|
|
|
# Get all tasks without sequence_name, grouped by project
|
|
tasks = env['project.task'].search([('sequence_name', '=', False)], order='create_date asc')
|
|
|
|
# Group tasks by project
|
|
project_tasks = {}
|
|
for task in tasks:
|
|
if task.project_id:
|
|
if task.project_id.id not in project_tasks:
|
|
project_tasks[task.project_id.id] = []
|
|
project_tasks[task.project_id.id].append(task)
|
|
|
|
# Assign sequence numbers to tasks
|
|
for project_id, task_list in project_tasks.items():
|
|
project = env['project.project'].browse(project_id)
|
|
if project.task_sequence_id:
|
|
for task in task_list:
|
|
task.sequence_name = project.task_sequence_id.next_by_id() |