diff --git a/addons/website_slides/__manifest__.py b/addons/website_slides/__manifest__.py
index 5373f5bd6de..1da8adc4eee 100644
--- a/addons/website_slides/__manifest__.py
+++ b/addons/website_slides/__manifest__.py
@@ -29,6 +29,7 @@ Featuring
'views/res_config_settings_views.xml',
'views/res_partner_views.xml',
'views/rating_rating_views.xml',
+ 'views/res_partner_views.xml',
'views/slide_question_views.xml',
'views/slide_slide_views.xml',
'views/slide_channel_partner_views.xml',
diff --git a/addons/website_slides/models/res_config_settings.py b/addons/website_slides/models/res_config_settings.py
index fa9e7508afc..8085cd407c8 100644
--- a/addons/website_slides/models/res_config_settings.py
+++ b/addons/website_slides/models/res_config_settings.py
@@ -8,6 +8,6 @@ class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
website_slide_google_app_key = fields.Char(related='website_id.website_slide_google_app_key', readonly=False)
- module_website_sale_slides = fields.Boolean(string="Sell courses")
- module_website_slides_forum = fields.Boolean(string="Forum on Courses")
+ module_website_sale_slides = fields.Boolean(string="Sell on eCommerce")
+ module_website_slides_forum = fields.Boolean(string="Forum")
module_website_slides_survey = fields.Boolean(string="Certifications")
diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py
index 4496c59b391..78c32b55b74 100644
--- a/addons/website_slides/models/slide_channel.py
+++ b/addons/website_slides/models/slide_channel.py
@@ -73,6 +73,7 @@ class ChannelUsersRelation(models.Model):
def _post_completion_hook(self):
pass
+
class Channel(models.Model):
""" A channel is a container of slides. """
_name = 'slide.channel'
@@ -96,6 +97,7 @@ class Channel(models.Model):
string="Course type", default="documentation", required=True)
sequence = fields.Integer(default=10, help='Display order')
user_id = fields.Many2one('res.users', string='Responsible', default=lambda self: self.env.uid)
+ color = fields.Integer('Color Index', default=0, help='Used to decorate kanban view')
tag_ids = fields.Many2many(
'slide.channel.tag', 'slide_channel_tag_rel', 'channel_id', 'tag_id',
string='Tags', help='Used to categorize and filter displayed channels/courses')
@@ -151,6 +153,7 @@ class Channel(models.Model):
'res.partner', 'slide_channel_partner', 'channel_id', 'partner_id',
string='Members', help="All members of the channel.", context={'active_test': False})
members_count = fields.Integer('Attendees count', compute='_compute_members_count')
+ members_done_count = fields.Integer('Attendees Done Count', compute='_compute_members_done_count')
is_member = fields.Boolean(string='Is Member', compute='_compute_is_member')
channel_partner_ids = fields.One2many('slide.channel.partner', 'channel_id', string='Members Information', groups='website.group_website_publisher')
upload_group_ids = fields.Many2many(
@@ -184,6 +187,13 @@ class Channel(models.Model):
for channel in self:
channel.members_count = data.get(channel.id, 0)
+ @api.depends('channel_partner_ids.channel_id', 'channel_partner_ids.completed')
+ def _compute_members_done_count(self):
+ read_group_res = self.env['slide.channel.partner'].sudo().read_group(['&', ('channel_id', 'in', self.ids), ('completed', '=', True)], ['channel_id'], 'channel_id')
+ data = dict((res['channel_id'][0], res['channel_id_count']) for res in read_group_res)
+ for channel in self:
+ channel.members_done_count = data.get(channel.id, 0)
+
@api.depends('channel_partner_ids.partner_id')
@api.model
def _compute_is_member(self):
@@ -366,21 +376,34 @@ class Channel(models.Model):
# Business / Actions
# ---------------------------------------------------------
- def action_redirect_to_members(self):
- action = self.env.ref('website_slides.slide_channel_partner_action').read()[0]
- action['view_mode'] = 'tree'
- action['domain'] = [('channel_id', 'in', self.ids)]
+ def action_redirect_to_members(self, state=None):
+ action = self.env.ref('website_slides.res_partner_action_slide_channel').read()[0]
+ action['context'] = {'active_test': False}
+ if state == 'running':
+ action['domain'] = [('id', 'in', self.env['slide.channel.partner'].sudo().search([
+ ('channel_id', 'in', self.ids),
+ ('completed', '=', False)
+ ]).mapped('partner_id').ids)]
+ elif state == 'completed':
+ action['domain'] = [('id', 'in', self.env['slide.channel.partner'].sudo().search([
+ ('channel_id', 'in', self.ids),
+ ('completed', '=', True)
+ ]).mapped('partner_id').ids)]
+ else:
+ action['domain'] = [('id', 'in', self.mapped('partner_ids').ids)]
if len(self) == 1:
- action['context'] = {'default_channel_id': self.id}
-
+ action['display_name'] = _('Attendees of %s') % self.name
+ action['context'] = {'active_test': False, 'default_channel_id': self.id}
return action
+ def action_redirect_to_running_members(self):
+ return self.action_redirect_to_members('running')
+
+ def action_redirect_to_done_members(self):
+ return self.action_redirect_to_members('completed')
+
def action_channel_invite(self):
self.ensure_one()
-
- if self.enroll != 'invite':
- raise UserError(_("You cannot send invitations for channels that are not set as 'invite'."))
-
template = self.env.ref('website_slides.mail_template_slide_channel_invite', raise_if_not_found=False)
local_context = dict(
@@ -474,6 +497,27 @@ class Channel(models.Model):
if removed_channel_partner_domain:
self.env['slide.channel.partner'].sudo().search(removed_channel_partner_domain).unlink()
+ def action_view(self):
+ return {
+ 'type': 'ir.actions.act_window',
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'slide.channel',
+ 'res_id': self.id,
+ }
+
+ def action_view_slides(self):
+ action = self.env.ref('website_slides.slide_slide_action').read()[0]
+ action['context'] = {'default_channel_id': self.id}
+ action['domain'] = [('channel_id', "=", self.id)]
+ return action
+
+ def action_view_ratings(self):
+ action = self.env.ref('website_slides.rating_rating_action_slide_channel').read()[0]
+ action['name'] = _('Rating of %s') % (self.name)
+ action['domain'] = [('res_id', 'in', self.ids)]
+ return action
+
# ---------------------------------------------------------
# Rating Mixin API
# ---------------------------------------------------------
diff --git a/addons/website_slides/static/src/scss/slide_channel_views.scss b/addons/website_slides/static/src/scss/slide_channel_views.scss
new file mode 100644
index 00000000000..3bd8203c4eb
--- /dev/null
+++ b/addons/website_slides/static/src/scss/slide_channel_views.scss
@@ -0,0 +1,7 @@
+$o-kanban-large-record-width: 400px;
+
+.o_kanban_view.o_slide_channel_kanban {
+ .o_kanban_record {
+ width: $o-kanban-large-record-width
+ }
+}
diff --git a/addons/website_slides/views/assets.xml b/addons/website_slides/views/assets.xml
index 1c990e7ad50..62129e58e6b 100644
--- a/addons/website_slides/views/assets.xml
+++ b/addons/website_slides/views/assets.xml
@@ -4,6 +4,7 @@
Create a course diff --git a/addons/website_slides_survey/views/slide_channel_views.xml b/addons/website_slides_survey/views/slide_channel_views.xml index e28b67997cf..2b93ef0dd2a 100644 --- a/addons/website_slides_survey/views/slide_channel_views.xml +++ b/addons/website_slides_survey/views/slide_channel_views.xml @@ -10,4 +10,19 @@