diff --git a/child_compassion/__manifest__.py b/child_compassion/__manifest__.py index 7f3aefd60..383dc924f 100644 --- a/child_compassion/__manifest__.py +++ b/child_compassion/__manifest__.py @@ -29,7 +29,7 @@ # pylint: disable=C8101 { "name": "Compassion Children", - "version": "14.0.1.5.0", + "version": "14.0.1.6.0", "category": "Compassion", "author": "Compassion CH", "license": "AGPL-3", diff --git a/child_compassion/migrations/14.0.1.6.0/post-migration.py b/child_compassion/migrations/14.0.1.6.0/post-migration.py new file mode 100644 index 000000000..22c1975f0 --- /dev/null +++ b/child_compassion/migrations/14.0.1.6.0/post-migration.py @@ -0,0 +1,24 @@ +import logging + +from odoo import SUPERUSER_ID, api + +_logger = logging.getLogger(__name__) + + +def migrate(cr, version): + """ + Recompute the lifecycle state & date of an FCP project + """ + + env = api.Environment(cr, SUPERUSER_ID, {}) + + # Fetch all projects: + projects = env["compassion.project"].search([]) + + # Invalidate cache + projects.invalidate_cache(["last_lifecycle_id", "status", "suspension"]) + + projects._compute_last_lifecycle() + projects._compute_suspension() + + _logger.info("Successfully recomputed lifecycle states for %s FCPs.", len(projects)) diff --git a/child_compassion/models/project_compassion.py b/child_compassion/models/project_compassion.py index 38c226ca2..d37de91e6 100644 --- a/child_compassion/models/project_compassion.py +++ b/child_compassion/models/project_compassion.py @@ -477,13 +477,26 @@ def _get_months(self): @api.depends("lifecycle_ids", "lifecycle_ids.date") def _compute_last_lifecycle(self): for project in self: - last_info = project.lifecycle_ids[:1] - reactivation_lifecycle = project.lifecycle_ids.filtered( + if not project.lifecycle_ids: + project.last_lifecycle_id = False + continue + + # Sort lifecycle events by date descending + sorted_events = project.lifecycle_ids.sorted( + key=lambda r: (str(r.date or ""), r.id), reverse=True + ) + # Take first (newest) event + last_info = sorted_events[0] + + reactivation_lifecycle = sorted_events.filtered( lambda r, _last=last_info: r.date == _last.date and r.type == "Reactivation" - )[:1] + ) + # If it exists, lifecycle with type 'Reactivation' is determinant - project.last_lifecycle_id = reactivation_lifecycle or last_info + project.last_lifecycle_id = ( + reactivation_lifecycle[0] if reactivation_lifecycle else last_info + ) @api.depends("lifecycle_ids", "lifecycle_ids.write_date") def _compute_suspension(self): diff --git a/child_compassion/views/project_compassion_view.xml b/child_compassion/views/project_compassion_view.xml index a77a72538..e11488a99 100644 --- a/child_compassion/views/project_compassion_view.xml +++ b/child_compassion/views/project_compassion_view.xml @@ -87,7 +87,9 @@ - +