@@ -76,6 +76,18 @@ def _search(self, operator, value):
7676 return [(f'error_content_ids.{ field_name } ' , operator , value )]
7777 return _search
7878
79+
80+ class BuildErrorStage (models .Model ):
81+ _name = 'runbot.build.error.stage'
82+ _description = 'Build Error Stage'
83+ _order = 'sequence'
84+
85+ name = fields .Char (string = 'Stage Name' , required = True , translate = True )
86+ description = fields .Text (string = 'Stage description' , translate = True )
87+ sequence = fields .Integer ('Sequence' , default = 1 )
88+ fold = fields .Boolean (string = 'Folded in Kanban' , default = False )
89+
90+
7991class BuildError (models .Model ):
8092 _name = "runbot.build.error"
8193 _description = "Build error"
@@ -91,6 +103,7 @@ class BuildError(models.Model):
91103 error_count = fields .Integer ("Error count" , store = True , compute = '_compute_count' )
92104 previous_error_id = fields .Many2one ('runbot.build.error' , string = "Already seen error" )
93105
106+ stage_id = fields .Many2one ('runbot.build.error.stage' , required = True , tracking = True , group_expand = '_read_group_expand_full' , default = lambda self : self .env ['runbot.build.error.stage' ].search ([], limit = 1 ))
94107 responsible = fields .Many2one ('res.users' , 'Assigned fixer' , tracking = True )
95108 customer = fields .Many2one ('res.users' , 'Customer' , tracking = True )
96109 team_id = fields .Many2one ('runbot.team' , 'Assigned team' , tracking = True )
@@ -505,6 +518,37 @@ def action_link_errors(self):
505518 base_error = self_sorted [0 ]
506519 base_error ._merge (self_sorted - base_error )
507520
521+ def _update_stage (self , nbr_day_solved_to_done = 7 , nbr_day_new_to_done = 15 , nbr_day_done_to_archive = 30 ):
522+ """Called automatically by scheduled action to update the stage of the error if necessary"""
523+ now = fields .Datetime .now ()
524+ build_error_stage_new = self .env .ref ('runbot.build_error_stage_new' ).id
525+ build_error_stage_solved = self .env .ref ('runbot.build_error_stage_solved' ).id
526+ build_error_stage_done = self .env .ref ('runbot.build_error_stage_done' ).id
527+
528+ # Very old done error eventually get archived
529+ self .search ([
530+ ('stage_id' , '=' , build_error_stage_done ),
531+ ('last_seen_date' , '<' , now - relativedelta (days = nbr_day_done_to_archive )),
532+ ]).write ({'active' : False })
533+
534+ # Done errors that did happen again recently are moved back to new
535+ self .search ([
536+ ('stage_id' , '=' , build_error_stage_done ),
537+ ('last_seen_date' , '>=' , now - relativedelta (days = nbr_day_new_to_done )),
538+ ]).write ({'stage_id' : build_error_stage_new })
539+
540+ # New error that did not appear after a long time are marked as done
541+ # Solved error that did not appear after a short time are marked as done
542+ self .search ([
543+ '|' ,
544+ '&' ,
545+ ('stage_id' , '=' , build_error_stage_new ),
546+ ('last_seen_date' , '<' , now - relativedelta (days = nbr_day_new_to_done )),
547+ '&' ,
548+ ('stage_id' , '=' , build_error_stage_solved ),
549+ ('last_seen_date' , '<' , now - relativedelta (days = nbr_day_solved_to_done )),
550+ ]).write ({'stage_id' : build_error_stage_done })
551+
508552
509553class BuildErrorContent (models .Model ):
510554
0 commit comments