diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b539897f..e41bc09f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -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 diff --git a/enterprise_data/__init__.py b/enterprise_data/__init__.py index c9c93e77..6cb6e81a 100644 --- a/enterprise_data/__init__.py +++ b/enterprise_data/__init__.py @@ -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" diff --git a/enterprise_data/api/v1/serializers.py b/enterprise_data/api/v1/serializers.py index 66e2ed39..7509542c 100644 --- a/enterprise_data/api/v1/serializers.py +++ b/enterprise_data/api/v1/serializers.py @@ -16,6 +16,7 @@ EnterpriseOffer, EnterpriseSubsidyBudget, ) +from enterprise_data.utils import calculate_percentage_difference class EnterpriseLearnerEnrollmentSerializer(serializers.ModelSerializer): @@ -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 @@ -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): """ diff --git a/enterprise_data/migrations/0047_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py b/enterprise_data/migrations/0047_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py new file mode 100644 index 00000000..e1524cbd --- /dev/null +++ b/enterprise_data/migrations/0047_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more.py @@ -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), + ), + ] diff --git a/enterprise_data/models.py b/enterprise_data/models.py index 164d0345..2b163116 100644 --- a/enterprise_data/models.py +++ b/enterprise_data/models.py @@ -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): """ diff --git a/enterprise_data/utils.py b/enterprise_data/utils.py index 1e28a2ac..d1b11964 100644 --- a/enterprise_data/utils.py +++ b/enterprise_data/utils.py @@ -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