diff --git a/runbot/models/build_error.py b/runbot/models/build_error.py
index a20480d9..159c2ffb 100644
--- a/runbot/models/build_error.py
+++ b/runbot/models/build_error.py
@@ -353,6 +353,7 @@ class BuildErrorContent(models.Model):
trigger_ids = fields.Many2many('runbot.trigger', compute='_compute_trigger_ids', string='Triggers', search='_search_trigger_ids')
tag_ids = fields.Many2many('runbot.build.error.tag', string='Tags')
qualifiers = JsonDictField('Qualifiers', index=True)
+ similar_ids = fields.One2many('runbot.build.error.content', compute='_compute_similar_ids')
responsible = fields.Many2one(related='error_id.responsible')
customer = fields.Many2one(related='error_id.customer')
@@ -442,6 +443,22 @@ class BuildErrorContent(models.Model):
for error_content in self:
error_content.error_display_id = error_content.error_id.id
+ @api.depends('qualifiers')
+ def _compute_similar_ids(self):
+ """error contents having the exactly the same qualifiers"""
+ for record in self:
+ if record.qualifiers:
+ query = SQL(
+ r"""SELECT id FROM runbot_build_error_content WHERE id != %s AND qualifiers @> %s AND qualifiers <@ %s""",
+ record.id,
+ json.dumps(self.qualifiers.dict),
+ json.dumps(self.qualifiers.dict),
+ )
+ self.env.cr.execute(query)
+ record.similar_ids = self.env['runbot.build.error.content'].browse([rec[0] for rec in self.env.cr.fetchall()])
+ else:
+ record.similar_ids = False
+
@api.model
def _digest(self, s):
"""
@@ -565,6 +582,7 @@ class BuildErrorContent(models.Model):
self._qualify()
+
class BuildErrorTag(models.Model):
_name = "runbot.build.error.tag"
diff --git a/runbot/views/build_error_views.xml b/runbot/views/build_error_views.xml
index b6d38776..39d62c48 100644
--- a/runbot/views/build_error_views.xml
+++ b/runbot/views/build_error_views.xml
@@ -145,6 +145,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+