Commit 39e18c41 by Chris Dodge Committed by Jonathan Piacenti

add social metrics to the comment client

add some better error handling

switch over
parent 16603cc2
...@@ -12,6 +12,7 @@ urlpatterns = patterns( ...@@ -12,6 +12,7 @@ urlpatterns = patterns(
url(r'^(?P<user_id>[0-9]+)/courses/*$', users_views.UsersCoursesList.as_view(), name='users-courses-list'), url(r'^(?P<user_id>[0-9]+)/courses/*$', users_views.UsersCoursesList.as_view(), name='users-courses-list'),
url(r'^(?P<user_id>[0-9]+)/courses/(?P<course_id>[^/]+/[^/]+/[^/]+)$', users_views.UsersCoursesDetail.as_view(), name='users-courses-detail'), url(r'^(?P<user_id>[0-9]+)/courses/(?P<course_id>[^/]+/[^/]+/[^/]+)$', users_views.UsersCoursesDetail.as_view(), name='users-courses-detail'),
url(r'^(?P<user_id>[0-9]+)/courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/grades$', users_views.UsersCoursesGradesDetail.as_view(), name='users-courses-grades-detail'), url(r'^(?P<user_id>[0-9]+)/courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/grades$', users_views.UsersCoursesGradesDetail.as_view(), name='users-courses-grades-detail'),
url(r'^(?P<user_id>[0-9]+)/courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/metrics/social/$', users_views.UsersSocialMetrics.as_view(), name='users-social-metrics'),
url(r'^(?P<user_id>[0-9]+)/groups/*$', users_views.UsersGroupsList.as_view(), name='users-groups-list'), url(r'^(?P<user_id>[0-9]+)/groups/*$', users_views.UsersGroupsList.as_view(), name='users-groups-list'),
url(r'^(?P<user_id>[0-9]+)/groups/(?P<group_id>[0-9]+)$', users_views.UsersGroupsDetail.as_view(), name='users-groups-detail'), url(r'^(?P<user_id>[0-9]+)/groups/(?P<group_id>[0-9]+)$', users_views.UsersGroupsDetail.as_view(), name='users-groups-detail'),
url(r'^(?P<user_id>[0-9]+)/preferences$', users_views.UsersPreferences.as_view(), name='users-preferences-list'), url(r'^(?P<user_id>[0-9]+)/preferences$', users_views.UsersPreferences.as_view(), name='users-preferences-list'),
......
...@@ -37,6 +37,9 @@ from util.bad_request_rate_limiter import BadRequestRateLimiter ...@@ -37,6 +37,9 @@ from util.bad_request_rate_limiter import BadRequestRateLimiter
from courseware import grades from courseware import grades
from courseware.courses import get_course from courseware.courses import get_course
from lms.lib.comment_client.user import User as CommentUser
from lms.lib.comment_client.utils import CommentClientRequestError
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
AUDIT_LOG = logging.getLogger("audit") AUDIT_LOG = logging.getLogger("audit")
...@@ -913,3 +916,33 @@ class UsersWorkgroupsList(SecureListAPIView): ...@@ -913,3 +916,33 @@ class UsersWorkgroupsList(SecureListAPIView):
if course_id: if course_id:
queryset = queryset.filter(project__course_id=course_id) queryset = queryset.filter(project__course_id=course_id)
return queryset return queryset
class UsersSocialMetrics(SecureListAPIView):
"""
### The UsersSocialMetrics view allows clients to query about the activity of a user in the
forums
- URI: ```/api/users/{user_id}/courses/{course_id}/metrics/social/```
- GET: Returns a list of social metrics for that user in the specified course
"""
def get(self, request, user_id, course_id): # pylint: disable=W0613
try:
user = User.objects.get(id=user_id)
except ObjectDoesNotExist:
return Response({}, status.HTTP_404_NOT_FOUND)
comment_user = CommentUser.from_django_user(user)
comment_user.course_id = course_id
try:
data = comment_user.social_stats()
http_status = status.HTTP_200_OK
except CommentClientRequestError, e:
data = {
"err_msg": str(e)
}
http_status = status.HTTP_500_INTERNAL_SERVER_ERROR
return Response(data, http_status)
...@@ -115,6 +115,19 @@ class User(models.Model): ...@@ -115,6 +115,19 @@ class User(models.Model):
) )
return response.get('collection', []), response.get('page', 1), response.get('num_pages', 1) return response.get('collection', []), response.get('page', 1), response.get('num_pages', 1)
def social_stats(self):
if not self.course_id:
raise CommentClientRequestError("Must provide course_id when retrieving social stats for the user")
url = _url_for_user_social_stats(self.id)
params = {'course_id': self.course_id}
response = perform_request(
'get',
url,
params
)
return response
def _retrieve(self, *args, **kwargs): def _retrieve(self, *args, **kwargs):
url = self.url(action='get', params=self.attributes) url = self.url(action='get', params=self.attributes)
retrieve_params = self.default_retrieve_params.copy() retrieve_params = self.default_retrieve_params.copy()
...@@ -166,3 +179,10 @@ def _url_for_user_active_threads(user_id): ...@@ -166,3 +179,10 @@ def _url_for_user_active_threads(user_id):
def _url_for_user_subscribed_threads(user_id): def _url_for_user_subscribed_threads(user_id):
return "{prefix}/users/{user_id}/subscribed_threads".format(prefix=settings.PREFIX, user_id=user_id) return "{prefix}/users/{user_id}/subscribed_threads".format(prefix=settings.PREFIX, user_id=user_id)
def _url_for_user_stats(user_id,course_id):
return "{prefix}/users/{user_id}/stats?course_id={course_id}".format(prefix=settings.PREFIX, user_id=user_id,course_id=course_id)
def _url_for_user_social_stats(user_id):
return "{prefix}/users/{user_id}/social_stats".format(prefix=settings.PREFIX, user_id=user_id)
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