From 120a4a15b25bb18a7876e9d64771ec0acdad0432 Mon Sep 17 00:00:00 2001 From: henrrypg Date: Wed, 19 Oct 2022 15:13:36 -0500 Subject: [PATCH 1/2] feat: add method to get generated certificates --- openedx/features/survey_report/application.py | 3 ++- openedx/features/survey_report/queries.py | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/openedx/features/survey_report/application.py b/openedx/features/survey_report/application.py index 31ddf52e1486..1a531c05ea11 100644 --- a/openedx/features/survey_report/application.py +++ b/openedx/features/survey_report/application.py @@ -2,10 +2,11 @@ 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 get_unique_courses_offered, currently_learners, learners_registered, genarated_certificates def generate_report() -> None: """ Generate a report with relevant data.""" courses_offered=get_unique_courses_offered() learners=currently_learners() registered=learners_registered() + certificates=genarated_certificates() diff --git a/openedx/features/survey_report/queries.py b/openedx/features/survey_report/queries.py index 43ae50619e15..a1f2af69c929 100644 --- a/openedx/features/survey_report/queries.py +++ b/openedx/features/survey_report/queries.py @@ -4,8 +4,9 @@ from datetime import datetime, timedelta from openedx.core.djangoapps.content.course_overviews.models import CourseOverview +from lms.djangoapps.grades.models import PersistentCourseGrade from common.djangoapps.student.models import CourseEnrollment -from django.contrib.auth.models import User +from django.contrib.auth.models import User # lint-amnesty, pylint: disable=imported-auth-user from django.db.models import Q, Subquery, OuterRef, Count @@ -37,3 +38,9 @@ def learners_registered()-> int: Get count of learners registered. """ return User.objects.filter(is_active=1).count() + +def genarated_certificates()-> int: + """ + Get count of generated certificates. + """ + return PersistentCourseGrade.objects.filter(passed_timestamp__isnull=False).count() From 9446dce4d4ff691f122e470b2854621f17d4665d Mon Sep 17 00:00:00 2001 From: henrrypg Date: Thu, 20 Oct 2022 22:19:16 -0500 Subject: [PATCH 2/2] chore: fix quality issues --- openedx/features/survey_report/application.py | 16 +++++++--- .../management/commands/generate_report.py | 6 ++-- .../commands/tests/test_generate_report.py | 2 ++ openedx/features/survey_report/models.py | 3 +- openedx/features/survey_report/queries.py | 31 +++++++++++-------- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/openedx/features/survey_report/application.py b/openedx/features/survey_report/application.py index 1a531c05ea11..6c9bd19b016e 100644 --- a/openedx/features/survey_report/application.py +++ b/openedx/features/survey_report/application.py @@ -2,11 +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, genarated_certificates +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() - certificates=genarated_certificates() + 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 a1f2af69c929..c1df820bdf98 100644 --- a/openedx/features/survey_report/queries.py +++ b/openedx/features/survey_report/queries.py @@ -3,43 +3,48 @@ """ from datetime import datetime, timedelta -from openedx.core.djangoapps.content.course_overviews.models import CourseOverview -from lms.djangoapps.grades.models import PersistentCourseGrade -from common.djangoapps.student.models import CourseEnrollment + 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 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 genarated_certificates()-> int: + +def generated_certificates() -> int: """ Get count of generated certificates. """