[REF] website_slides_forum: improve integration into eLeaning application
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 menu after Courses
* Forum
* Forums: add columns to list view: Posts (questions count), Views
(sum of views of each post), Answers (sum of child_count on each post),
Favorites (sum of favourite_count on each post)
* Posts: add columns to list view: Views / Answers / Favourites
Add menu entry inside Reporting
* Forum: graph view on forum.post model
Area chart: # Posts created by months, color=forum
LINKS
Task 1978729
PR #35061
Co-Authored-By: Thibault Delavallée <tde@odoo.com>
Co-Authored-By: Jérémy Hennecart <jeh@odoo.com>
This commit is contained in:
committed by
Thibault Delavallée
co-authored by
Thibault Delavallée
parent
313a7d9eb2
commit
2e707935f1
@@ -80,6 +80,12 @@ class Forum(models.Model):
|
||||
help='After posting the user will be proposed to share its question '
|
||||
'or answer on social networks, enabling social network propagation '
|
||||
'of the forum content.')
|
||||
# posts statistics
|
||||
post_ids = fields.One2many('forum.post', 'forum_id', string='Posts')
|
||||
total_posts = fields.Integer('Post Count', compute='_compute_slides_statistics')
|
||||
total_views = fields.Integer('Views Count', compute='_compute_slides_statistics')
|
||||
total_answers = fields.Integer('Answers Count', compute='_compute_slides_statistics')
|
||||
total_favorites = fields.Integer('Favorites Count', compute='_compute_slides_statistics')
|
||||
count_posts_waiting_validation = fields.Integer(string="Number of posts waiting for validation", compute='_compute_count_posts_waiting_validation')
|
||||
count_flagged_posts = fields.Integer(string='Number of flagged posts', compute='_compute_count_flagged_posts')
|
||||
# karma generation
|
||||
@@ -120,6 +126,24 @@ class Forum(models.Model):
|
||||
karma_post = fields.Integer(string='Ask questions without validation', default=100)
|
||||
karma_moderate = fields.Integer(string='Moderate posts', default=1000)
|
||||
|
||||
@api.depends('post_ids.state', 'post_ids.views', 'post_ids.child_count', 'post_ids.favourite_count')
|
||||
def _compute_slides_statistics(self):
|
||||
result = dict((cid, dict(total_posts=0, total_views=0, total_answers=0, total_favorites=0)) for cid in self.ids)
|
||||
read_group_res = self.env['forum.post'].read_group(
|
||||
[('forum_id', 'in', self.ids), ('state', 'in', ('active', 'close'))],
|
||||
['forum_id', 'views', 'child_count', 'favourite_count'],
|
||||
groupby=['forum_id'],
|
||||
lazy=False)
|
||||
for res_group in read_group_res:
|
||||
cid = res_group['forum_id'][0]
|
||||
result[cid]['total_posts'] += res_group.get('__count', 0)
|
||||
result[cid]['total_views'] += res_group.get('views', 0)
|
||||
result[cid]['total_answers'] += res_group.get('child_count', 0)
|
||||
result[cid]['total_favorites'] += res_group.get('favourite_count', 0)
|
||||
|
||||
for record in self:
|
||||
record.update(result[record.id])
|
||||
|
||||
def _compute_count_posts_waiting_validation(self):
|
||||
for forum in self:
|
||||
domain = [('forum_id', '=', forum.id), ('state', '=', 'pending')]
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="website_id" groups="website.group_multi_website"/>
|
||||
<field name="total_posts"/>
|
||||
<field name="total_views"/>
|
||||
<field name="total_answers"/>
|
||||
<field name="total_favorites"/>
|
||||
<field name="active" invisible="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
@@ -43,7 +47,7 @@
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Options">
|
||||
<group string="Order">
|
||||
<group string="Order" name="group_order">
|
||||
<field name="default_order"/>
|
||||
<label for="relevancy_post_vote" string="Relevance Computation" groups="base.group_no_one" attrs="{'invisible':[('default_order','!=','relevancy desc')]}"/>
|
||||
<div groups="base.group_no_one" class="o_row" attrs="{'invisible':[('default_order','!=','relevancy desc')]}">
|
||||
@@ -136,6 +140,9 @@
|
||||
<field name="name"/>
|
||||
<field name="active" invisible="1"/>
|
||||
<field name="forum_id"/>
|
||||
<field name="views"/>
|
||||
<field name="child_count"/>
|
||||
<field name="favourite_count"/>
|
||||
<field name="website_id" groups="website.group_multi_website"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
@@ -12,9 +12,11 @@
|
||||
'website_forum'
|
||||
],
|
||||
'data': [
|
||||
'views/forum_views.xml',
|
||||
'views/slide_channel_views.xml',
|
||||
'views/website_slides_templates.xml',
|
||||
'views/website_slides_menu_views.xml',
|
||||
'views/assets.xml',
|
||||
'views/website_slides_templates.xml',
|
||||
'views/website_slides_forum_templates.xml'
|
||||
],
|
||||
'demo': [
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<record id="forum_forum_view_form" model="ir.ui.view">
|
||||
<field name="name">forum.forum.view.form.inherit.slides</field>
|
||||
<field name="model">forum.forum</field>
|
||||
<field name="inherit_id" ref="website_forum.view_forum_forum_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//group[@name='group_order']" position="after">
|
||||
<group string="eLearning" name="group_slides">
|
||||
<field name="slide_channel_id" readonly="True"/>
|
||||
</group>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="forum_forum_action_channel" model="ir.actions.act_window">
|
||||
<field name="name">eLearning Forums</field>
|
||||
<field name="res_model">forum.forum</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('slide_channel_ids', '!=', 'False')]</field>
|
||||
</record>
|
||||
|
||||
<record id="forum_post_action_channel" model="ir.actions.act_window">
|
||||
<field name="name">eLearning Forum Posts</field>
|
||||
<field name="res_model">forum.post</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[('forum_id.slide_channel_ids', '!=', 'False')]</field>
|
||||
<field name="context">{'search_default_questions': 1}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a new forum post
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="forum_post_view_graph_slides" model="ir.ui.view">
|
||||
<field name="name">forum.post.view.graph.slides</field>
|
||||
<field name="model">forum.post</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="eLearning Forum Posts">
|
||||
<field name="create_date" interval="month" type="col"/>
|
||||
<field name="forum_id" type="row"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="forum_post_action_report" model="ir.actions.act_window">
|
||||
<field name="name">eLearning Forum Posts</field>
|
||||
<field name="res_model">forum.post</field>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="forum_post_view_graph_slides"/>
|
||||
<field name="domain">[('forum_id.slide_channel_ids', '!=', 'False')]</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<menuitem name="Forum"
|
||||
id="website_slides_menu_forum"
|
||||
parent="website_slides.website_slides_menu_root"
|
||||
sequence="2"/>
|
||||
<menuitem name="Forums"
|
||||
id="website_slides_menu_forum_forum"
|
||||
parent="website_slides_menu_forum"
|
||||
sequence="1"
|
||||
action="forum_forum_action_channel"/>
|
||||
<menuitem name="Posts"
|
||||
id="website_slides_menu_forum_post"
|
||||
parent="website_slides_menu_forum"
|
||||
sequence="2"
|
||||
action="forum_post_action_channel"/>
|
||||
|
||||
<menuitem name="Forum"
|
||||
id="website_slides_menu_report_forum"
|
||||
parent="website_slides.website_slides_menu_report"
|
||||
sequence="8"
|
||||
action="forum_post_action_report"/>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user