Skip to content
Closed
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
13 changes: 13 additions & 0 deletions openedx/features/survey_report/application.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""
Contains the logic for manage a survey report.
"""

from openedx.features.survey_report.queries import get_unique_courses_offered, currently_learners

def generate_report() -> None:
""" Generate a report with relevant data."""
courses_offered=get_unique_courses_offered()
learners=currently_learners()

print(f"Unique courses offered: {courses_offered}")
print(f"Currently learners: {learners}")
Empty file.
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""
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):
"""
Command to generate survey report.
"""

help = 'This command will generate survey report.'

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.'))
Empty file.
Original file line number Diff line number Diff line change
@@ -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())
34 changes: 34 additions & 0 deletions openedx/features/survey_report/queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"""
Queries to get data from de database.
"""

from datetime import datetime, timedelta
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from common.djangoapps.student.models import CourseEnrollment
from django.contrib.auth.models import User

from django.db.models import Q, Subquery, OuterRef, Count


def get_unique_courses_offered()-> int:
Comment thread
Henrrypg marked this conversation as resolved.
"""
Get the 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()

def currently_learners()-> int:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
def currently_learners()-> int:
def currently_learners() -> int:

"""
Get count of learners with last login in the last 3 weeks.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Get count of learners with last login in the last 3 weeks.
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()