Skip to content
Snippets Groups Projects
Commit 54192e46 authored by Thibault Delavallée's avatar Thibault Delavallée
Browse files

[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
parent 4587e6a3
No related branches found
No related tags found
No related merge requests found
...@@ -120,6 +120,7 @@ class Channel(models.Model): ...@@ -120,6 +120,7 @@ class Channel(models.Model):
total_views = fields.Integer('# Views', compute='_compute_slides_statistics', store=True) total_views = fields.Integer('# Views', compute='_compute_slides_statistics', store=True)
total_votes = fields.Integer('# Votes', 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) 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 # configuration
allow_comment = fields.Boolean( allow_comment = fields.Boolean(
"Allow rating on Course", default=False, "Allow rating on Course", default=False,
...@@ -231,6 +232,11 @@ class Channel(models.Model): ...@@ -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 result[cid]['total_slides'] += res_group.get('slide_type', '') == slide_type and res_group['__count'] or 0
return result 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') @api.depends('slide_partner_ids', 'total_slides')
def _compute_user_statistics(self): def _compute_user_statistics(self):
current_user_info = self.env['slide.channel.partner'].sudo().search( current_user_info = self.env['slide.channel.partner'].sudo().search(
......
$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;
}
}
<?xml version="1.0" ?> <?xml version="1.0" ?>
<odoo> <odoo>
<data> <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"> <template id="assets_frontend" inherit_id="website.assets_frontend" name="Slide">
<xpath expr="//link[last()]" position="after"> <xpath expr="//link[last()]" position="after">
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <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"> <record id="rating_rating_view_search_slide_channel" model="ir.ui.view">
<field name="name">rating.rating.view.search.slides</field> <field name="name">rating.rating.view.search.slides</field>
<field name="model">rating.rating</field> <field name="model">rating.rating</field>
...@@ -34,8 +90,9 @@ ...@@ -34,8 +90,9 @@
<field name="res_model">rating.rating</field> <field name="res_model">rating.rating</field>
<field name="view_mode">kanban,tree,graph,pivot,form</field> <field name="view_mode">kanban,tree,graph,pivot,form</field>
<field name="domain">[('consumed', '=', True), ('res_model', '=', 'slide.channel')]</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="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"> <field name="help" type="html">
<p class="o_view_nocontent_empty_folder"> <p class="o_view_nocontent_empty_folder">
There is no rating for those courses at the moment There is no rating for those courses at the moment
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment