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