diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py
index 36e9b0feaee..4d75b063a35 100644
--- a/addons/base/controllers/main.py
+++ b/addons/base/controllers/main.py
@@ -566,10 +566,36 @@ class ListView(View):
rows = DataSet().do_search_read(request, model,
offset=offset, limit=limit,
domain=domain)
- # rows pipe
- # process_attrs
- # process_colors
- return rows
+ eval_context = request.session.evaluation_context(
+ request.context)
+ return [
+ {'data': row,
+ 'attrs': self.process_attrs(view, row, eval_context),
+ 'color': self.process_colors(view, row, eval_context)}
+ for row in rows
+ ]
+
+ def process_attrs(self, view, row, context):
+ pass
+
+ def process_colors(self, view, row, context):
+ colors = view['arch']['attrs'].get('colors')
+
+ if not colors:
+ return None
+
+ color = [
+ pair.split(':')[0]
+ for pair in colors.split(';')
+ if eval(pair.split(':')[1], dict(context, **row))
+ ]
+
+ if not color:
+ return None
+ elif len(color) == 1:
+ return color[0]
+ return 'maroon'
+
class SearchView(View):
_cp_path = "/base/searchview"
diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml
index caf463cf4e0..8a71b8ebc7a 100644
--- a/addons/base/static/src/xml/base.xml
+++ b/addons/base/static/src/xml/base.xml
@@ -197,9 +197,14 @@