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