diff --git a/openedx/features/survey_report/application.py b/openedx/features/survey_report/application.py new file mode 100644 index 000000000000..f22ac11bb12c --- /dev/null +++ b/openedx/features/survey_report/application.py @@ -0,0 +1,9 @@ +""" +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/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()) 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()