Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions openedx/features/survey_report/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.'))
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
3 changes: 1 addition & 2 deletions openedx/features/survey_report/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
Survey Report models.
"""

from jsonfield import JSONField

from django.db import models
from jsonfield import JSONField


class SurveyReport(models.Model):
Expand Down
34 changes: 23 additions & 11 deletions openedx/features/survey_report/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()