Skip to content

Commit

Permalink
feat: add an API for total watch hours of the user (#559)
Browse files Browse the repository at this point in the history
* feat: add an API for total watch hours of the user

* address comments

---------

Co-authored-by: Muhammad Faraz  Maqsood <[email protected]>
  • Loading branch information
Faraz32123 and Muhammad Faraz Maqsood authored Jul 5, 2024
1 parent d7304ad commit 8b3ae9f
Show file tree
Hide file tree
Showing 6 changed files with 105 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()),
]
66 changes: 66 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,66 @@
"""
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.djangoapps.enrollments.views import EnrollmentCrossDomainSessionAuth
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):
"""
APIView to get the total watch hours for a user.
**Example Requests**
GET /sdaia/api/v1/user_watch_hours
It return watch_time in hours
Response: {
"watch_time": 0.00043390860160191856
}
"""

authentication_classes = (
JwtAuthentication,
BearerAuthenticationAllowInactiveUser,
EnrollmentCrossDomainSessionAuth,
)
permission_classes = (ApiKeyHeaderPermissionIsAuthenticated,)

@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 = 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 = {
PluginURLs.CONFIG: {
ProjectType.LMS: {
PluginURLs.NAMESPACE: "course_progress",
PluginURLs.REGEX: r"^sdaia",
PluginURLs.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 8b3ae9f

Please sign in to comment.