Skip to content
Merged
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
4 changes: 4 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ Unreleased

=========================

[10.8.1] - 2025-02-20
---------------------
* feat: Added 2 new columns in module performance report model and exposed them via associated REST API.

[10.7.8] - 2025-02-18
---------------------
* chore: bump version from 10.7.7 to 10.7.8 for dependency upgrades
Expand Down
2 changes: 1 addition & 1 deletion enterprise_data/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
Enterprise data api application. This Django app exposes API endpoints used by enterprises.
"""

__version__ = "10.7.8"
__version__ = "10.8.1"
14 changes: 14 additions & 0 deletions enterprise_data/api/v1/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
EnterpriseOffer,
EnterpriseSubsidyBudget,
)
from enterprise_data.utils import calculate_percentage_difference


class EnterpriseLearnerEnrollmentSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -231,6 +232,7 @@ class EnterpriseExecEdLCModulePerformanceSerializer(serializers.ModelSerializer)
Serializer for EnterpriseExecEdLCModulePerformance model.
"""
extensions_requested = serializers.SerializerMethodField()
avg_lo_percentage_difference = serializers.SerializerMethodField()

class Meta:
model = EnterpriseExecEdLCModulePerformance
Expand All @@ -240,6 +242,18 @@ def get_extensions_requested(self, obj):
"""Return extensions_requested if not None, otherwise return 0"""
return obj.extensions_requested if obj.extensions_requested is not None else 0

def get_avg_lo_percentage_difference(self, obj):
"""
Return percentage difference between `avg_before_lo_score` and `avg_after_lo_score` if not None,
otherwise return None
"""
if obj.avg_before_lo_score is None or obj.avg_after_lo_score is None:
return None
return round(
calculate_percentage_difference(obj.avg_before_lo_score, obj.avg_after_lo_score),
2
)


class EnterpriseBudgetSerializer(serializers.ModelSerializer):
"""
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 4.2.15 on 2025-02-20 08:08

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('enterprise_data', '0046_enterprisegroupmembership'),
]

operations = [
migrations.AddField(
model_name='enterpriseexecedlcmoduleperformance',
name='avg_after_lo_score',
field=models.DecimalField(decimal_places=6, max_digits=38, null=True),
),
migrations.AddField(
model_name='enterpriseexecedlcmoduleperformance',
name='avg_before_lo_score',
field=models.DecimalField(decimal_places=6, max_digits=38, null=True),
),
migrations.AddField(
model_name='enterpriseexecedlcmoduleperformance',
name='question_name',
field=models.CharField(max_length=500, null=True),
),
]
3 changes: 3 additions & 0 deletions enterprise_data/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,9 @@ class Meta:
discussion_forum_activities_completed_count = models.PositiveIntegerField(null=True)
discussion_forum_activities_total_count = models.PositiveIntegerField(null=True)
pass_grade = models.DecimalField(max_digits=38, decimal_places=2, null=True)
question_name = models.CharField(max_length=500, null=True)
avg_before_lo_score = models.DecimalField(max_digits=38, decimal_places=6, null=True)
avg_after_lo_score = models.DecimalField(max_digits=38, decimal_places=6, null=True)

def __str__(self):
"""
Expand Down
19 changes: 19 additions & 0 deletions enterprise_data/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,22 @@ def find_first(iterable, condition):
return next(item for item in iterable if condition(item))
except StopIteration:
return None


def calculate_percentage_difference(first, second):
"""
Calculate the percentage difference between two numbers.

It will calculate the percentage difference between the two numbers using the formula:
((second - first) / (first + second)/2) * 100

Arguments:
first (float): The first number.
second (float): The second number.

Returns:
float: The percentage difference between the two numbers.
"""
if first == 0 and second == 0:
return 0
return ((second - first) / ((first + second) / 2)) * 100
Loading