Commit 509ae29d by Dennis Jen Committed by GitHub

Added course summaries endpoint. (#29)

* Added course summaries endpoint.
parent fb3e1d47
......@@ -5,6 +5,7 @@ import requests.exceptions
from analyticsclient.constants import data_format as DF
from analyticsclient.course import Course
from analyticsclient.course_summaries import CourseSummaries
from analyticsclient.exceptions import ClientError, InvalidRequestError, NotFoundError, TimeoutError
from analyticsclient.module import Module
from analyticsclient.status import Status
......@@ -40,6 +41,7 @@ class Client(object):
self.timeout = timeout
self.status = Status(self)
self.course_summaries = lambda: CourseSummaries(self)
self.courses = lambda course_id: Course(self, course_id)
self.modules = lambda course_id, module_id: Module(self, course_id, module_id)
......
import urllib
import analyticsclient.constants.data_format as DF
class CourseSummaries(object):
"""Course summaries."""
def __init__(self, client):
"""
Initialize the CourseSummaries client.
Arguments:
client (analyticsclient.client.Client): The client to use to access remote resources.
"""
self.client = client
def course_summaries(self, course_ids=None, fields=None, data_format=DF.JSON):
"""
Get list of summaries.
Arguments:
course_ids: Array of course IDs as strings to return. Default is to return all.
fields: Array of fields to return. Default is to return all.
"""
query_params = {}
for query_arg, data in zip(['course_ids', 'fields'], [course_ids, fields]):
if data:
query_params[query_arg] = ','.join(data)
path = 'course_summaries/'
querystring = urllib.urlencode(query_params)
if querystring:
path += '?{0}'.format(querystring)
return self.client.get(path, data_format=data_format)
import ddt
import httpretty
from analyticsclient.tests import ClientTestCase
@ddt.ddt
class CourseSummariesTests(ClientTestCase):
def setUp(self):
super(CourseSummariesTests, self).setUp()
self.base_uri = self.get_api_url('course_summaries/')
self.course_summaries_client = self.client.course_summaries()
httpretty.enable()
def verify_last_querystring_equal(self, expected_query):
"""
Convenience method for asserting the last request was made with the
expected query parameters.
"""
self.assertDictEqual(httpretty.last_request().querystring, expected_query)
def expected_query(self, course_ids=None, fields=None):
"""Packs the query arguments into expected format for http pretty."""
query = {}
for field, data in zip(['course_ids', 'fields'], [course_ids, fields]):
if data is not None:
query[field] = [','.join(data)]
return query
@httpretty.activate
def test_all_summaries_url(self):
"""Course summaries can be called without parameters."""
httpretty.register_uri(httpretty.GET, self.base_uri, body='{}')
self.course_summaries_client.course_summaries()
@httpretty.activate
@ddt.data(
['edx/demo/course'],
['edx/demo/course', 'another/demo/course']
)
def test_courses_ids(self, course_ids):
"""Course summaries can be called with course IDs"""
uri_template = '{uri}?course_ids={ids}'
uri = uri_template.format(uri=self.base_uri, ids=course_ids)
httpretty.register_uri(httpretty.GET, uri, body='{}')
self.course_summaries_client.course_summaries(course_ids=course_ids)
self.verify_last_querystring_equal(self.expected_query(course_ids=course_ids))
@httpretty.activate
@ddt.data(
['course_id'],
['course_id', 'enrollment_modes']
)
def test_fields(self, fields):
"""Course summaries can be called with fields."""
uri_template = '{uri}?fields={fields}'
uri = uri_template.format(uri=self.base_uri, fields=fields[0])
httpretty.register_uri(httpretty.GET, uri, body='{}')
self.course_summaries_client.course_summaries(fields=fields)
self.verify_last_querystring_equal(self.expected_query(fields=fields))
@httpretty.activate
@ddt.data(
(['edx/demo/course'], ['course_id']),
(['edx/demo/course', 'another/demo/course'], ['course_id', 'enrollment_modes'])
)
@ddt.unpack
def test_all_parameters(self, course_ids, fields):
"""Course summaries can be called with both fields and course IDs."""
httpretty.reset()
uri_template = '{uri}?course_ids={ids}fields={fields}'
uri = uri_template.format(uri=self.base_uri, ids=course_ids, fields=fields)
httpretty.register_uri(httpretty.GET, uri, body='{}')
self.course_summaries_client.course_summaries(course_ids=course_ids, fields=fields)
self.verify_last_querystring_equal(self.expected_query(course_ids=course_ids, fields=fields))
......@@ -2,6 +2,7 @@ requests==2.2.0
# Testing
coverage==3.7.1
ddt==1.1.1
nose==1.3.3
httpretty==0.8.0
pep8==1.7.0
......
......@@ -2,7 +2,7 @@ from distutils.core import setup
setup(
name='edx-analytics-data-api-client',
version='0.9.0',
version='0.10.0',
packages=['analyticsclient', 'analyticsclient.constants'],
url='https://github.com/edx/edx-analytics-data-api-client',
description='Client used to access edX analytics data warehouse',
......
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