Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions setup/website_slides_attendees_completed_time/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)
132 changes: 132 additions & 0 deletions website_slides_attendees_completed_time/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
=======================================
Website Slides Attendees Completed Time
=======================================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e15e26b7cb5d42f02ef1a21ffd984021c19230eeef3ca8c78b7f158110d918a3
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--learning-lightgray.png?logo=github
:target: https://github.com/OCA/e-learning/tree/16.0/website_slides_attendees_completed_time
:alt: OCA/e-learning
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/e-learning-16-0/e-learning-16-0-website_slides_attendees_completed_time
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/e-learning&target_branch=16.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

🕒 Completed Time: Time-Based Completion Tracking per Attendee (in Hours)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This addon enhances Odoo eLearning by introducing a new metric:
**Completed Time**, computed **per attendee**, which represents the
**sum of the completion times (in hours)** of the slides they have
completed.

🔧 What's Built-In vs. What's Added
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

**Built-in (Odoo):**

- **Progress**
``Progress = Number of Completed Slides / Total Number of Slides`` →
A simple ratio, based only on slide count.

**Added by this addon:**

- **Completed Time (in hours)**
``Completed Time = Σ(completion_time of each completed slide)`` → A
cumulative total of time-based effort for each attendee.

💡 Why This Matters
^^^^^^^^^^^^^^^^^^^

- ⏱️ **Duration-Aware Insight** Accurately reflects how much content a
learner has completed, by time spent rather than steps clicked.

- 👤 **Per-Attendee Computation** Each attendee has a personalized
Completed Time value, making metrics more meaningful for trainers and
reports.

- 📊 **Actionable Training Analytics** Trainers can better identify
high-effort learners and tailor support accordingly.

🧪 Example
^^^^^^^^^^

For a course with 10 slides (total 20 hours), if an attendee completes:

- 1 slide of 15 hours → **Progress**: 10% → **Completed Time**: 15h

--------------

This addon is ideal for serious training environments, compliance
programs, and professional development, where **time commitment** is a
better measure than simple slide count.

**Table of contents**

.. contents::
:local:

Usage
=====

After module installation, you will see course's completed time within
attendee views.

.. image:: https://raw.githubusercontent.com/OCA/e-learning/16.0/website_slides_attendees_completed_time/static/description/attendees_tree_view.png
:alt: Attendees Tree View

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-learning/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/e-learning/issues/new?body=module:%20website_slides_attendees_completed_time%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Binhex

Contributors
------------

- Rolando Pérez [email protected] https://binhex.cloud

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/e-learning <https://github.com/OCA/e-learning/tree/16.0/website_slides_attendees_completed_time>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
2 changes: 2 additions & 0 deletions website_slides_attendees_completed_time/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from . import models
from .post_install import channel_partner_recompute_completion
17 changes: 17 additions & 0 deletions website_slides_attendees_completed_time/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Copyright 2025 Binhex
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

{
"name": "Website Slides Attendees Completed Time",
"summary": """Show course completed time in attendee views""",
"version": "16.0.1.0.0",
"license": "AGPL-3",
"author": "Binhex,Odoo Community Association (OCA)",
"website": "https://github.com/OCA/e-learning",
"depends": ["website_slides"],
"post_init_hook": "channel_partner_recompute_completion",
"data": [
"views/slide_channel_partner_views.xml",
],
"demo": [],
}
1 change: 1 addition & 0 deletions website_slides_attendees_completed_time/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import slide_channel_partner
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Copyright 2025 Binhex
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import fields, models


class SlideChannelPartner(models.Model):
_inherit = "slide.channel.partner"

completed_time = fields.Float("Completed Time (hours)")

def _recompute_completion(self):
res = super()._recompute_completion()
read_group_res = (
self.env["slide.slide.partner"]
.sudo()
._read_group(
[
"&",
"&",
("channel_id", "in", self.mapped("channel_id").ids),
("partner_id", "in", self.mapped("partner_id").ids),
("completed", "=", True),
("slide_id.is_published", "=", True),
("slide_id.active", "=", True),
],
["channel_id", "partner_id", "slide_id:array_agg"],
groupby=["channel_id", "partner_id"],
lazy=False,
)
)
mapped_data = dict()
Slide = self.env["slide.slide"]
for item in read_group_res:
mapped_data.setdefault(item["channel_id"][0], dict())
mapped_data[item["channel_id"][0]][item["partner_id"][0]] = sum(
Slide.browse(set(item["slide_id"])).mapped("completion_time"), 0.0
)
for record in self:
record.completed_time = mapped_data.get(record.channel_id.id, dict()).get(
record.partner_id.id, 0.0
)
return res
11 changes: 11 additions & 0 deletions website_slides_attendees_completed_time/post_install.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# © 2025 Binhex - Rolando Pérez <[email protected]>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).


from odoo import SUPERUSER_ID, api


def channel_partner_recompute_completion(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
env["slide.channel.partner"].search([])._recompute_completion()
return
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Rolando Pérez <[email protected]> https://binhex.cloud
38 changes: 38 additions & 0 deletions website_slides_attendees_completed_time/readme/DESCRIPTION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
### 🕒 Completed Time: Time-Based Completion Tracking per Attendee (in Hours)

This addon enhances Odoo eLearning by introducing a new metric: **Completed Time**, computed **per attendee**, which represents the **sum of the completion times (in hours)** of the slides they have completed.

#### 🔧 What's Built-In vs. What's Added

**Built-in (Odoo):**
- **Progress**
`Progress = Number of Completed Slides / Total Number of Slides`
→ A simple ratio, based only on slide count.

**Added by this addon:**
- **Completed Time (in hours)**
`Completed Time = Σ(completion_time of each completed slide)`
→ A cumulative total of time-based effort for each attendee.

#### 💡 Why This Matters

- ⏱️ **Duration-Aware Insight**
Accurately reflects how much content a learner has completed, by time spent rather than steps clicked.

- 👤 **Per-Attendee Computation**
Each attendee has a personalized Completed Time value, making metrics more meaningful for trainers and reports.

- 📊 **Actionable Training Analytics**
Trainers can better identify high-effort learners and tailor support accordingly.

#### 🧪 Example

For a course with 10 slides (total 20 hours), if an attendee completes:

- 1 slide of 15 hours
→ **Progress**: 10%
→ **Completed Time**: 15h

---

This addon is ideal for serious training environments, compliance programs, and professional development, where **time commitment** is a better measure than simple slide count.
3 changes: 3 additions & 0 deletions website_slides_attendees_completed_time/readme/USAGE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
After module installation, you will see course's completed time within attendee views.

![Attendees Tree View](../static/description/attendees_tree_view.png)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading