Skip to content

Commit

Permalink
feat: add an API for total watch hours of the user
Browse files Browse the repository at this point in the history
  • Loading branch information
Muhammad Faraz Maqsood authored and Muhammad Faraz Maqsood committed Jul 5, 2024
1 parent d7304ad commit f118612
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 3 deletions.
Empty file.
Empty file.
13 changes: 13 additions & 0 deletions openedx/features/sdaia_features/course_progress/api/v1/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""
URLs for User Watch Hours - SDAIA Specific.
"""

from django.urls import path # pylint: disable=unused-import
from .views import UserWatchHoursAPIView


app_name = "nafath_api_v1"

urlpatterns = [
path(r"user_watch_hours", UserWatchHoursAPIView.as_view()),
]
61 changes: 61 additions & 0 deletions openedx/features/sdaia_features/course_progress/api/v1/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
"""
The User Watch Hours API view - SDAIA Specific.
"""

import logging
import requests

from django.conf import settings
from django.utils.decorators import method_decorator
from edx_rest_framework_extensions.auth.jwt.authentication import JwtAuthentication
from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView

from common.djangoapps.util.disable_rate_limit import can_disable_rate_limit
from openedx.core.djangoapps.cors_csrf.decorators import ensure_csrf_cookie_cross_domain
from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser
from openedx.core.lib.api.permissions import ApiKeyHeaderPermissionIsAuthenticated


log = logging.getLogger(__name__)


@can_disable_rate_limit
class UserWatchHoursAPIView(APIView):
authentication_classes = (
JwtAuthentication,
BearerAuthenticationAllowInactiveUser,
EnrollmentCrossDomainSessionAuth,
)
permission_classes = (ApiKeyHeaderPermissionIsAuthenticated,)

def sql_format(template, *args, **kwargs):
args = [sql_escape_string(arg).decode() for arg in args]
kwargs = {
key: sql_escape_string(value).decode() for key, value in kwargs.items()
}
return template.format(*args, **kwargs)

@method_decorator(ensure_csrf_cookie_cross_domain)
def get(self, request):
"""
Gets the total watch hours for a user.
"""
user_id = request.user.id
clickhouse_uri = (
f"{settings.CAIRN_CLICKHOUSE_HTTP_SCHEME}://{settings.CAIRN_CLICKHOUSE_USERNAME}:{settings.CAIRN_CLICKHOUSE_PASSWORD}@"
f"{settings.CAIRN_CLICKHOUSE_HOST}:{settings.CAIRN_CLICKHOUSE_HTTP_PORT}/?database={settings.CAIRN_CLICKHOUSE_DATABASE}"
)
query = self.sql_format(
f"SELECT SUM(duration) as `Watch time` FROM `openedx`.`video_view_segments` WHERE user_id={user_id};"
)
try:
response = requests.get(clickhouse_uri, data=query.encode("utf8"))
watch_time = float(response.content.decode().strip()) / (60 * 60)
return Response(status=status.HTTP_200_OK, data={"watch_time": watch_time})
except Exception as e:
log.error(
f"Unable to fetch watch for user {user_id} due to this exception: {str(e)}"
)
raise HTTPException(status_code=500, detail=str(e))
15 changes: 12 additions & 3 deletions openedx/features/sdaia_features/course_progress/apps.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,28 @@
"""
Progress Updates App Config
"""

from django.apps import AppConfig
from edx_django_utils.plugins import PluginURLs, PluginSettings
from openedx.core.djangoapps.plugins.constants import ProjectType, SettingsType


class CourseProgressConfig(AppConfig):
name = 'openedx.features.sdaia_features.course_progress'
name = "openedx.features.sdaia_features.course_progress"

plugin_app = {
"url_config": {
"lms.djangoapp": {
"namespace": "course_progress",
"regex": r"^sdaia",
"relative_path": "urls",
}
},
PluginSettings.CONFIG: {
ProjectType.LMS: {
SettingsType.COMMON: {PluginSettings.RELATIVE_PATH: 'settings.common'},
SettingsType.COMMON: {PluginSettings.RELATIVE_PATH: "settings.common"},
}
}
},
}

def ready(self):
Expand Down
14 changes: 14 additions & 0 deletions openedx/features/sdaia_features/course_progress/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""
URLs for User Watch Hours - SDAIA Specific.
"""

from django.urls import path # pylint: disable=unused-import
from django.conf.urls import include


urlpatterns = [
path(
"/api/v1/",
include("openedx.features.sdaia_features.course_progress.api.v1.urls", namespace="course_progress_api_v1"),
),
]

0 comments on commit f118612

Please sign in to comment.