Commit 646ad4a1 by Clinton Blackburn

Merge pull request #34 from edx/opaque-keys

Updated Course ID Regex and CSV filename
parents 29437878 66914fa0
import re
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from analytics_data_api.v0.views import courses as views from analytics_data_api.v0.views import courses as views
COURSE_ID_PATTERN = r'(?P<course_id>[^/+]+[/+][^/+]+[/+][^/]+)'
COURSE_URLS = [ COURSE_URLS = [
('activity', views.CourseActivityWeeklyView, 'activity'), ('activity', views.CourseActivityWeeklyView, 'activity'),
('recent_activity', views.CourseActivityMostRecentWeekView, 'recent_activity'), ('recent_activity', views.CourseActivityMostRecentWeekView, 'recent_activity'),
...@@ -18,4 +16,5 @@ COURSE_URLS = [ ...@@ -18,4 +16,5 @@ COURSE_URLS = [
urlpatterns = [] urlpatterns = []
for path, view, name in COURSE_URLS: for path, view, name in COURSE_URLS:
urlpatterns += patterns('', url(r'^(?P<course_id>.+)/' + re.escape(path) + r'/$', view.as_view(), name=name)) regex = r'^{0}/{1}/$'.format(COURSE_ID_PATTERN, path)
urlpatterns += patterns('', url(regex, view.as_view(), name=name))
...@@ -8,6 +8,7 @@ from django.db.models import Max ...@@ -8,6 +8,7 @@ from django.db.models import Max
from django.http import Http404 from django.http import Http404
from django.utils.timezone import make_aware, utc from django.utils.timezone import make_aware, utc
from rest_framework import generics from rest_framework import generics
from opaque_keys.edx.keys import CourseKey
from analytics_data_api.v0 import models, serializers from analytics_data_api.v0 import models, serializers
...@@ -15,8 +16,11 @@ from analytics_data_api.v0 import models, serializers ...@@ -15,8 +16,11 @@ from analytics_data_api.v0 import models, serializers
class BaseCourseView(generics.ListAPIView): class BaseCourseView(generics.ListAPIView):
start_date = None start_date = None
end_date = None end_date = None
course_id = None
slug = None
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.course_id = self.kwargs.get('course_id')
start_date = request.QUERY_PARAMS.get('start_date') start_date = request.QUERY_PARAMS.get('start_date')
end_date = request.QUERY_PARAMS.get('end_date') end_date = request.QUERY_PARAMS.get('end_date')
timezone = utc timezone = utc
...@@ -44,12 +48,21 @@ class BaseCourseView(generics.ListAPIView): ...@@ -44,12 +48,21 @@ class BaseCourseView(generics.ListAPIView):
raise NotImplementedError raise NotImplementedError
def get_queryset(self): def get_queryset(self):
course_id = self.kwargs.get('course_id') self.verify_course_exists_or_404(self.course_id)
self.verify_course_exists_or_404(course_id) queryset = self.model.objects.filter(course_id=self.course_id)
queryset = self.model.objects.filter(course_id=course_id)
queryset = self.apply_date_filtering(queryset) queryset = self.apply_date_filtering(queryset)
return queryset return queryset
def get_csv_filename(self):
course_key = CourseKey.from_string(self.course_id)
course_id = u'-'.join([course_key.org, course_key.course, course_key.run])
return u'{0}--{1}.csv'.format(course_id, self.slug)
def finalize_response(self, request, response, *args, **kwargs):
if request.META.get('HTTP_ACCEPT') == u'text/csv':
response['Content-Disposition'] = u'attachment; filename={}'.format(self.get_csv_filename())
return super(BaseCourseView, self).finalize_response(request, response, *args, **kwargs)
# pylint: disable=line-too-long # pylint: disable=line-too-long
class CourseActivityWeeklyView(BaseCourseView): class CourseActivityWeeklyView(BaseCourseView):
...@@ -80,6 +93,7 @@ class CourseActivityWeeklyView(BaseCourseView): ...@@ -80,6 +93,7 @@ class CourseActivityWeeklyView(BaseCourseView):
end_date -- Date before which all data should be returned (exclusive) end_date -- Date before which all data should be returned (exclusive)
""" """
slug = u'engagement-activity'
model = models.CourseActivityWeekly model = models.CourseActivityWeekly
serializer_class = serializers.CourseActivityWeeklySerializer serializer_class = serializers.CourseActivityWeeklySerializer
...@@ -244,6 +258,7 @@ class CourseEnrollmentByBirthYearView(BaseCourseEnrollmentView): ...@@ -244,6 +258,7 @@ class CourseEnrollmentByBirthYearView(BaseCourseEnrollmentView):
end_date -- Date before which all data should be returned (exclusive) end_date -- Date before which all data should be returned (exclusive)
""" """
slug = u'enrollment-age'
serializer_class = serializers.CourseEnrollmentByBirthYearSerializer serializer_class = serializers.CourseEnrollmentByBirthYearSerializer
model = models.CourseEnrollmentByBirthYear model = models.CourseEnrollmentByBirthYear
...@@ -263,6 +278,7 @@ class CourseEnrollmentByEducationView(BaseCourseEnrollmentView): ...@@ -263,6 +278,7 @@ class CourseEnrollmentByEducationView(BaseCourseEnrollmentView):
start_date -- Date after which all data should be returned (inclusive) start_date -- Date after which all data should be returned (inclusive)
end_date -- Date before which all data should be returned (exclusive) end_date -- Date before which all data should be returned (exclusive)
""" """
slug = u'enrollment-education'
serializer_class = serializers.CourseEnrollmentByEducationSerializer serializer_class = serializers.CourseEnrollmentByEducationSerializer
model = models.CourseEnrollmentByEducation model = models.CourseEnrollmentByEducation
...@@ -287,6 +303,7 @@ class CourseEnrollmentByGenderView(BaseCourseEnrollmentView): ...@@ -287,6 +303,7 @@ class CourseEnrollmentByGenderView(BaseCourseEnrollmentView):
start_date -- Date after which all data should be returned (inclusive) start_date -- Date after which all data should be returned (inclusive)
end_date -- Date before which all data should be returned (exclusive) end_date -- Date before which all data should be returned (exclusive)
""" """
slug = u'enrollment-gender'
serializer_class = serializers.CourseEnrollmentByGenderSerializer serializer_class = serializers.CourseEnrollmentByGenderSerializer
model = models.CourseEnrollmentByGender model = models.CourseEnrollmentByGender
...@@ -304,7 +321,7 @@ class CourseEnrollmentView(BaseCourseEnrollmentView): ...@@ -304,7 +321,7 @@ class CourseEnrollmentView(BaseCourseEnrollmentView):
start_date -- Date after which all data should be returned (inclusive) start_date -- Date after which all data should be returned (inclusive)
end_date -- Date before which all data should be returned (exclusive) end_date -- Date before which all data should be returned (exclusive)
""" """
slug = u'enrollment'
serializer_class = serializers.CourseEnrollmentDailySerializer serializer_class = serializers.CourseEnrollmentDailySerializer
model = models.CourseEnrollmentDaily model = models.CourseEnrollmentDaily
...@@ -329,7 +346,7 @@ class CourseEnrollmentByLocationView(BaseCourseEnrollmentView): ...@@ -329,7 +346,7 @@ class CourseEnrollmentByLocationView(BaseCourseEnrollmentView):
start_date -- Date after which all data should be returned (inclusive) start_date -- Date after which all data should be returned (inclusive)
end_date -- Date before which all data should be returned (exclusive) end_date -- Date before which all data should be returned (exclusive)
""" """
slug = u'enrollment-location'
serializer_class = serializers.CourseEnrollmentByCountrySerializer serializer_class = serializers.CourseEnrollmentByCountrySerializer
model = models.CourseEnrollmentByCountry model = models.CourseEnrollmentByCountry
......
...@@ -7,3 +7,4 @@ ipython==2.1.0 # BSD ...@@ -7,3 +7,4 @@ ipython==2.1.0 # BSD
django-rest-swagger==0.1.14 # BSD django-rest-swagger==0.1.14 # BSD
djangorestframework-csv==1.3.3 # BSD djangorestframework-csv==1.3.3 # BSD
iso3166==0.1 # MIT iso3166==0.1 # MIT
-e git+https://github.com/edx/opaque-keys.git@d45d0bd8d64c69531be69178b9505b5d38806ce0#egg=opaque-keys
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment