From 54192e464889002269f39850a52e2ea54af0f5a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= <tde@odoo.com>
Date: Thu, 1 Aug 2019 13:21:02 +0000
Subject: [PATCH] [IMP] website_slides: add a new kanban view for ratings

PURPOSE

eLearning should have its own application in manager. Indeed this is becoming
a big application and having it embedded inside Website application is not
enough anymore. It should also hold updated and easy-to-use menus,
navigation, actions and views in backend.

SPECIFICATIONS

Add in menu Courses, a new entry Reviews
  * Kanban view, full width, no default group by
    * Order by date (most recent on top)
    * See: https://drive.google.com/a/odoo.com/file/d/1IYE1QBIJa26BLugRiafyBop-srkYwndC/view?usp=drivesdk
    * add a tag for unpublished comments
    * Add the pic of the user above the stars
    * Click on card, send to front-end and able to (un)publish the comment
    * Kind of what's on the front-end:  https://drive.google.com/a/odoo.com/file/d/1e9aQSWvUM2QOynRT08XSUzIjFiGnjsv8/view?usp=drivesdk

LINKS

Task 1978729
PR #35061
---
 addons/website_slides/models/slide_channel.py |  6 ++
 .../static/src/scss/rating_rating_views.scss  | 11 ++++
 addons/website_slides/views/assets.xml        |  5 ++
 .../views/rating_rating_views.xml             | 59 ++++++++++++++++++-
 4 files changed, 80 insertions(+), 1 deletion(-)
 create mode 100644 addons/website_slides/static/src/scss/rating_rating_views.scss

diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py
index caf356b90ffc..4496c59b391c 100644
--- a/addons/website_slides/models/slide_channel.py
+++ b/addons/website_slides/models/slide_channel.py
@@ -120,6 +120,7 @@ class Channel(models.Model):
     total_views = fields.Integer('# Views', compute='_compute_slides_statistics', store=True)
     total_votes = fields.Integer('# Votes', compute='_compute_slides_statistics', store=True)
     total_time = fields.Float('# Hours', compute='_compute_slides_statistics', digits=(10, 4), store=True)
+    rating_avg_stars = fields.Float("Rating Average (Stars)", compute='_compute_rating_stats', digits=(16, 1))
     # configuration
     allow_comment = fields.Boolean(
         "Allow rating on Course", default=False,
@@ -231,6 +232,11 @@ class Channel(models.Model):
                 result[cid]['total_slides'] += res_group.get('slide_type', '') == slide_type and res_group['__count'] or 0
         return result
 
+    def _compute_rating_stats(self):
+        super(Channel, self)._compute_rating_stats()
+        for record in self:
+            record.rating_avg_stars = record.rating_avg / 2
+
     @api.depends('slide_partner_ids', 'total_slides')
     def _compute_user_statistics(self):
         current_user_info = self.env['slide.channel.partner'].sudo().search(
diff --git a/addons/website_slides/static/src/scss/rating_rating_views.scss b/addons/website_slides/static/src/scss/rating_rating_views.scss
new file mode 100644
index 000000000000..49886be92f55
--- /dev/null
+++ b/addons/website_slides/static/src/scss/rating_rating_views.scss
@@ -0,0 +1,11 @@
+$o-kanban-large-record-width: 350px;
+
+.o_kanban_view.o_slide_rating_kanban {
+    .o_kanban_record {
+		width: $o-kanban-large-record-width
+    }
+
+    .o_slide_rating_kanban_left {
+    	min-width: 80px;
+    }
+}
diff --git a/addons/website_slides/views/assets.xml b/addons/website_slides/views/assets.xml
index 3e596427b517..1c990e7ad502 100644
--- a/addons/website_slides/views/assets.xml
+++ b/addons/website_slides/views/assets.xml
@@ -1,6 +1,11 @@
 <?xml version="1.0" ?>
 <odoo>
     <data>
+        <template id="assets_backend" name="Slides Backend Assets" inherit_id="web.assets_backend">
+            <xpath expr="." position="inside">
+                <link rel="stylesheet" type="text/scss" href="/website_slides/static/src/scss/rating_rating_views.scss"/>
+            </xpath>
+        </template>
 
         <template id="assets_frontend" inherit_id="website.assets_frontend" name="Slide">
             <xpath expr="//link[last()]" position="after">
diff --git a/addons/website_slides/views/rating_rating_views.xml b/addons/website_slides/views/rating_rating_views.xml
index b3128c56460e..599a217109b3 100644
--- a/addons/website_slides/views/rating_rating_views.xml
+++ b/addons/website_slides/views/rating_rating_views.xml
@@ -1,5 +1,61 @@
 <?xml version="1.0" encoding="utf-8"?>
 <odoo>
+    <record id="rating_rating_view_kanban_slide_channel" model="ir.ui.view">
+        <field name="name">rating.rating.view.kanban.slides</field>
+        <field name="model">rating.rating</field>
+        <field name="priority">20</field>
+        <field name="arch" type="xml">
+            <kanban create="false" class="o_slide_rating_kanban">
+                <field name="rating"/>
+                <field name="res_name"/>
+                <field name="feedback"/>
+                <field name="partner_id"/>
+                <templates>
+                    <t t-name="kanban-box">
+                        <t t-set="val_stars" t-value="record.rating.raw_value / 2"/>
+                        <t t-set="val_integer" t-value="Math.floor(val_stars)"/>
+                        <t t-set="val_decimal" t-value="val_stars - val_integer"/>
+                        <t t-set="empty_star" t-value="5 - (val_integer + Math.ceil(val_decimal))"/>
+                        <div class="oe_kanban_card oe_kanban_global_click">
+                            <div class="d-flex flex-row">
+                                <div class="o_slide_rating_kanban_left">
+                                    <t t-foreach="_.range(0, val_integer)" t-as="num">
+                                        <i class="fa fa-star" role="img" aria-label="One star" title="One star"></i>
+                                    </t>
+                                    <t t-if="val_decimal">
+                                        <i class="fa fa-star-half-o" role="img" aria-label="Half a star" title="Half a star"></i>
+                                    </t>
+                                    <t t-foreach="_.range(0, empty_star)" t-as="num" role="img" t-attf-aria-label="#{empty_star} on 5" t-attf-title="#{empty_star} on 5">
+                                        <i class="fa fa-star text-black-25"></i>
+                                    </t>
+                                </div>
+                                <div>
+                                    <div class="o_kanban_card_header">
+                                        <div class="o_kanban_card_header_title">
+                                            <span class="font-weight-bold"><field name="partner_id"/></span>
+                                        </div>
+                                    </div>
+                                    <div class="o_kanban_card_content mt0 d-flex flex-column">
+                                        <span>for
+                                            <a type="object" name="action_open_rated_object" t-att-title="record.res_name.raw_value">
+                                                <field name="res_name" />
+                                            </a>
+                                        </span>
+                                        <span><i class="fa fa-clock-o mr-2"/>on <field name="create_date" /></span>
+                                        <div class="d-flex mt-2">
+                                            <i t-if="record.feedback.raw_value" class="fa fa-comment mr-2" t-att-title="record.feedback.raw_value"  t-att-aria-label="record.feedback.raw_value" role="img"/>
+                                            <span t-esc="record.feedback.raw_value"/>
+                                        </div>
+                                    </div>
+                                </div>
+                             </div>
+                         </div>
+                    </t>
+                </templates>
+            </kanban>
+        </field>
+    </record>
+
     <record id="rating_rating_view_search_slide_channel" model="ir.ui.view">
         <field name="name">rating.rating.view.search.slides</field>
         <field name="model">rating.rating</field>
@@ -34,8 +90,9 @@
         <field name="res_model">rating.rating</field>
         <field name="view_mode">kanban,tree,graph,pivot,form</field>
         <field name="domain">[('consumed', '=', True), ('res_model', '=', 'slide.channel')]</field>
-        <field name="context">{'search_default_groupby_course': 1}</field>
+        <field name="context">{}</field>
         <field name="search_view_id" ref="rating_rating_view_search_slide_channel"/>
+        <field name="view_id" ref="rating_rating_view_kanban_slide_channel"/>
         <field name="help" type="html">
             <p class="o_view_nocontent_empty_folder">
                 There is no rating for those courses at the moment
-- 
GitLab