odoo18/addons_extensions/project_task_timesheet_exte.../hooks.py

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()