diff --git a/project_task_sequence_number/__manifest__.py b/project_task_sequence_number/__manifest__.py index ed8938dd0..7faf66893 100644 --- a/project_task_sequence_number/__manifest__.py +++ b/project_task_sequence_number/__manifest__.py @@ -21,7 +21,7 @@ ############################################################################### { 'name': 'Project & Project Task Sequence Number', - 'version': '17.0.1.0.0', + 'version': '17.0.1.0.1', 'category': 'Project', 'summary': 'Add dynamic sequence number for project and task.', 'description': 'This helps to give unique sequence number to project and ' @@ -35,7 +35,7 @@ 'data': [ 'data/ir_sequence_data.xml', 'views/project_project_views.xml', - 'views/project_task_views.xml' + 'views/project_task_views.xml', ], 'images': ['static/description/banner.jpg'], 'license': 'AGPL-3', diff --git a/project_task_sequence_number/doc/RELEASE_NOTES.md b/project_task_sequence_number/doc/RELEASE_NOTES.md index 056e22925..f928eb939 100644 --- a/project_task_sequence_number/doc/RELEASE_NOTES.md +++ b/project_task_sequence_number/doc/RELEASE_NOTES.md @@ -3,3 +3,8 @@ #### Version 17.0.1.0.0 #### ADD - Initial commit for Project & Project Task Sequence Number + +#### 18.06.2025 +#### Version 17.0.1.0.1 +#### BUG FIX +- Added a sequence for sub-tasks also. \ No newline at end of file diff --git a/project_task_sequence_number/models/project_task.py b/project_task_sequence_number/models/project_task.py index d14d5011b..006adcfec 100644 --- a/project_task_sequence_number/models/project_task.py +++ b/project_task_sequence_number/models/project_task.py @@ -19,62 +19,67 @@ # If not, see . # ############################################################################### -from odoo import api, fields, models +from odoo import api, fields, models +# +# class ProjectTask(models.Model): - """In ProjectTask class, which will add a new field for task sequence. - When we create the record, the sequence will be based on the - task_sequence.""" _inherit = 'project.task' - task_sequence = fields.Char(string='Task Sequence', readonly=True, - copy=False, default='New', - help='Unique sequence number of the task.') + task_sequence = fields.Char(string='Task Sequence', readonly=True, copy=False, default='New', + help='Hierarchical sequence number of the task.') @api.model_create_multi - def create(self, vals): - """Overwrite the function create to calculate the sequence value based - on the given prefix""" - for records in vals: - if not records['project_id']: - if records.get('task_sequence', 'New') == 'New': - records['task_sequence'] = self.env['ir.sequence']. \ - next_by_code( - 'project.task') or 'New' - else: - project = self.env['project.project'].browse( - records['project_id']) - if project.task_sequence_id.prefix: - records['task_sequence'] = '%s/%s/%s' % \ - (project.project_sequence, - project.task_sequence_id.prefix, - self.env['ir.sequence']. - next_by_code('project.task') or - 'New') - else: - records['task_sequence'] = '%s/%s' % \ - (project.project_sequence, - self.env['ir.sequence']. - next_by_code( - 'project.task') or - 'New') - return super(ProjectTask, self).create(records) + def create(self, vals_list): + tasks = super(ProjectTask, self).create(vals_list) + for task in tasks: + task.with_context(bypass_sequence=True)._compute_custom_sequence() + return tasks def write(self, vals): - """Overwrite the function to update the sequence """ - if vals.get('project_id'): - project = self.env['project.project'].browse(vals.get( - 'project_id')) - if project.task_sequence_id.prefix: - vals['task_sequence'] = '%s/%s/%s' % \ - (project.project_sequence, - project.task_sequence_id.prefix, - self.env['ir.sequence'].next_by_code( - 'project.task') or 'New') + result = super(ProjectTask, self).write(vals) + if not self.env.context.get('bypass_sequence'): + for task in self: + task.with_context(bypass_sequence=True)._compute_custom_sequence() + return result + + def _compute_custom_sequence(self): + for task in self: + task_seq = self.env['ir.sequence'].next_by_code('project.task') or 'New' + + if not task.project_id or not task.project_id.project_sequence: + continue # Skip if missing project data + + if task.parent_id: + parent_seq = task.parent_id.task_sequence or task.parent_id.name + subtask_number = task._get_sibling_count(task.parent_id) + + # Use sub-task name if provided + # subtask_name = (task.name or '').split(',')[0].strip() + # if subtask_name: + # sequence = f"{parent_seq}/{subtask_name}" + # else: + sequence = f"{parent_seq}/Sub Task {subtask_number}" else: - vals['task_sequence'] = '%s/%s' % \ - (project.project_sequence, - self.env['ir.sequence']. - next_by_code('project.task') or 'New') - return super(ProjectTask, self).write(vals) + task_number = task._get_task_count(task.project_id) + formatted_task_number = str(task_number).zfill(4) + + sequence = self.env['ir.sequence'].search([('code', '=', 'project.task')], limit=1) + task_prefix = sequence.prefix if sequence else '' + sequence = f"{task.project_id.project_sequence}-{task_prefix}{formatted_task_number}" + + # Avoid recursion + task.sudo().write({'task_sequence': sequence}) + + def _get_task_count(self, project): + return self.search_count([ + ('project_id', '=', project.id), + ('parent_id', '=', False) + ]) + + def _get_sibling_count(self, parent_task): + return self.search_count([ + ('parent_id', '=', parent_task.id), + ('id', '!=', self.id) + ]) + 1 diff --git a/project_task_sequence_number/static/description/assets/screenshots/img.png b/project_task_sequence_number/static/description/assets/screenshots/img.png new file mode 100644 index 000000000..435634360 Binary files /dev/null and b/project_task_sequence_number/static/description/assets/screenshots/img.png differ diff --git a/project_task_sequence_number/static/description/assets/screenshots/task7.png b/project_task_sequence_number/static/description/assets/screenshots/task7.png new file mode 100644 index 000000000..df8c4a9bf Binary files /dev/null and b/project_task_sequence_number/static/description/assets/screenshots/task7.png differ diff --git a/project_task_sequence_number/static/description/index.html b/project_task_sequence_number/static/description/index.html index 5a6241176..441911efa 100644 --- a/project_task_sequence_number/static/description/index.html +++ b/project_task_sequence_number/static/description/index.html @@ -212,7 +212,8 @@ We can specify 'Prefix' of the task. -
+
@@ -229,6 +230,23 @@
+ +
+
+
+ +
+
+

+ When a sub-task is created, the sequence should be

+
+
+