diff --git a/openedx/features/survey_report/application.py b/openedx/features/survey_report/application.py index 31ddf52e1486..6c9bd19b016e 100644 --- a/openedx/features/survey_report/application.py +++ b/openedx/features/survey_report/application.py @@ -2,10 +2,17 @@ Contains the logic to manage survey report model. """ -from openedx.features.survey_report.queries import get_unique_courses_offered, currently_learners, learners_registered +from openedx.features.survey_report.queries import ( + currently_learners, + genarated_certificates, + get_unique_courses_offered, + learners_registered +) + def generate_report() -> None: """ Generate a report with relevant data.""" - courses_offered=get_unique_courses_offered() - learners=currently_learners() - registered=learners_registered() + courses_offered = get_unique_courses_offered() + learners = currently_learners() + registered = learners_registered() + certificates = genarated_certificates() diff --git a/openedx/features/survey_report/management/commands/generate_report.py b/openedx/features/survey_report/management/commands/generate_report.py index 29e9bb89bb93..3c6c031eac13 100644 --- a/openedx/features/survey_report/management/commands/generate_report.py +++ b/openedx/features/survey_report/management/commands/generate_report.py @@ -3,8 +3,10 @@ """ 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 @@ -17,10 +19,10 @@ class Command(BaseCommand): learners ever registered, and generated certificates. """ - def handle(self, *args, **options): + def handle(self, *_args, **_options): try: generate_report() except Exception as error: - raise CommandError('An error has ocurred while report was generating.') from error + raise CommandError('An error has occurred 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/test_generate_report.py b/openedx/features/survey_report/management/commands/tests/test_generate_report.py index ab2982301e59..0bcfa9301424 100644 --- a/openedx/features/survey_report/management/commands/tests/test_generate_report.py +++ b/openedx/features/survey_report/management/commands/tests/test_generate_report.py @@ -3,9 +3,11 @@ """ 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() diff --git a/openedx/features/survey_report/models.py b/openedx/features/survey_report/models.py index a9b3c2dd017b..d95411438650 100644 --- a/openedx/features/survey_report/models.py +++ b/openedx/features/survey_report/models.py @@ -2,9 +2,8 @@ Survey Report models. """ -from jsonfield import JSONField - from django.db import models +from jsonfield import JSONField class SurveyReport(models.Model): diff --git a/openedx/features/survey_report/queries.py b/openedx/features/survey_report/queries.py index 43ae50619e15..c1df820bdf98 100644 --- a/openedx/features/survey_report/queries.py +++ b/openedx/features/survey_report/queries.py @@ -3,37 +3,49 @@ """ from datetime import datetime, timedelta -from openedx.core.djangoapps.content.course_overviews.models import CourseOverview + +from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user +from django.db.models import Count, OuterRef, Q, Subquery + from common.djangoapps.student.models import CourseEnrollment -from django.contrib.auth.models import User +from lms.djangoapps.grades.models import PersistentCourseGrade +from openedx.core.djangoapps.content.course_overviews.models import CourseOverview -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( + count=Subquery( CourseEnrollment.objects - .filter(course_id=OuterRef('id')) - .values('course_id') - .annotate(count=Count('course_id')) - .values('count') - ))\ + .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()))\ + .filter(Q(end__isnull=True) | Q(end__gt=datetime.now()))\ .count() + def currently_learners() -> int: """ Get total number of learners with last login in the last 3 weeks. """ return User.objects.filter(last_login__gte=datetime.now() - timedelta(weeks=3)).count() -def learners_registered()-> int: + +def learners_registered() -> int: """ Get count of learners registered. """ return User.objects.filter(is_active=1).count() + + +def generated_certificates() -> int: + """ + Get count of generated certificates. + """ + return PersistentCourseGrade.objects.filter(passed_timestamp__isnull=False).count()