From c842d58f94de634516d4beb5d200467c93040a07 Mon Sep 17 00:00:00 2001 From: Henrry Pulgarin <39854568+Henrrypg@users.noreply.github.com> Date: Thu, 20 Oct 2022 07:43:20 -0500 Subject: [PATCH 1/2] feat: add cli command to generate report (#277) Co-authored-by: Alejandro Cardenas --- openedx/features/survey_report/application.py | 6 +++++ .../survey_report/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../management/commands/generate_report.py | 26 +++++++++++++++++++ .../management/commands/tests/__init__.py | 0 .../commands/tests/test_generate_report.py | 13 ++++++++++ 6 files changed, 45 insertions(+) create mode 100644 openedx/features/survey_report/application.py create mode 100644 openedx/features/survey_report/management/__init__.py create mode 100644 openedx/features/survey_report/management/commands/__init__.py create mode 100644 openedx/features/survey_report/management/commands/generate_report.py create mode 100644 openedx/features/survey_report/management/commands/tests/__init__.py create mode 100644 openedx/features/survey_report/management/commands/tests/test_generate_report.py diff --git a/openedx/features/survey_report/application.py b/openedx/features/survey_report/application.py new file mode 100644 index 000000000000..9ebba689351e --- /dev/null +++ b/openedx/features/survey_report/application.py @@ -0,0 +1,6 @@ +""" +Contains the logic for manage a survey report. +""" + +def generate_report() -> None: + """ Generate a report with relevant data.""" diff --git a/openedx/features/survey_report/management/__init__.py b/openedx/features/survey_report/management/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/openedx/features/survey_report/management/commands/__init__.py b/openedx/features/survey_report/management/commands/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/openedx/features/survey_report/management/commands/generate_report.py b/openedx/features/survey_report/management/commands/generate_report.py new file mode 100644 index 000000000000..29e9bb89bb93 --- /dev/null +++ b/openedx/features/survey_report/management/commands/generate_report.py @@ -0,0 +1,26 @@ +""" +CLI command to generate survey report. +""" + +from django.core.management.base import BaseCommand, CommandError +from openedx.features.survey_report.application import generate_report + +class Command(BaseCommand): + """ + Management command to generate a new survey report with + non-sensitive data. + """ + + help = """ + This command will create a new survey report using some + models to get the total number oof courses offered, currently active learners, + learners ever registered, and generated certificates. + """ + + def handle(self, *args, **options): + try: + generate_report() + except Exception as error: + raise CommandError('An error has ocurred while report was generating.') from error + + self.stdout.write(self.style.SUCCESS('Survey report has been generated successfully.')) diff --git a/openedx/features/survey_report/management/commands/tests/__init__.py b/openedx/features/survey_report/management/commands/tests/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/openedx/features/survey_report/management/commands/tests/test_generate_report.py b/openedx/features/survey_report/management/commands/tests/test_generate_report.py new file mode 100644 index 000000000000..ab2982301e59 --- /dev/null +++ b/openedx/features/survey_report/management/commands/tests/test_generate_report.py @@ -0,0 +1,13 @@ +""" +Test for generate_report command. +""" + +from io import StringIO +from django.core.management import call_command +from django.test import TestCase + +class GenerateReportTest(TestCase): + def test_command_output(self): + out = StringIO() + call_command('generate_report', stdout=out) + self.assertIn('Survey report has been generated successfully.', out.getvalue()) From 1566c343b1b2706d037276fed7eccc1ae98df9b3 Mon Sep 17 00:00:00 2001 From: henrrypg Date: Wed, 19 Oct 2022 14:43:32 -0500 Subject: [PATCH 2/2] feat: add method to get unique courses offered --- openedx/features/survey_report/application.py | 5 +++- openedx/features/survey_report/queries.py | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 openedx/features/survey_report/queries.py diff --git a/openedx/features/survey_report/application.py b/openedx/features/survey_report/application.py index 9ebba689351e..f22ac11bb12c 100644 --- a/openedx/features/survey_report/application.py +++ b/openedx/features/survey_report/application.py @@ -1,6 +1,9 @@ """ -Contains the logic for manage a survey report. +Contains the logic to manage survey report model. """ +from openedx.features.survey_report.queries import get_unique_courses_offered + def generate_report() -> None: """ Generate a report with relevant data.""" + courses_offered=get_unique_courses_offered() diff --git a/openedx/features/survey_report/queries.py b/openedx/features/survey_report/queries.py new file mode 100644 index 000000000000..497687b47657 --- /dev/null +++ b/openedx/features/survey_report/queries.py @@ -0,0 +1,27 @@ +""" +Queries to get data from database. +""" + +from datetime import datetime +from openedx.core.djangoapps.content.course_overviews.models import CourseOverview +from common.djangoapps.student.models import CourseEnrollment + + +from django.db.models import Q, Subquery, OuterRef, Count + +def get_unique_courses_offered() -> int: + """ + Get total number of unique courses offered. + """ + return CourseOverview.objects.annotate( + count = Subquery( + CourseEnrollment.objects + .filter(course_id=OuterRef('id')) + .values('course_id') + .annotate(count=Count('course_id')) + .values('count') + ))\ + .filter(count__gt=5)\ + .filter(start__lt=datetime.now())\ + .filter(Q(end__isnull=True)|Q(end__gt=datetime.now()))\ + .count()