def get_object(self): # Because we're serializing data from both Elasticsearch and MySQL into # the same JSON object, we have to pass both sources of data in a dict # to our custom course metadata serializer. return { 'es_data': RosterEntry.get_course_metadata(self.course_id), 'engagement_ranges': ModuleEngagementMetricRanges.objects.filter(course_id=self.course_id) }
def get_queryset(self): """ Fetches the user list and last updated from elasticsearch returned returned as a an array of dicts with fields "learner" and "last_updated". """ self._validate_query_params() query_params = self.request.QUERY_PARAMS order_by = query_params.get('order_by') sort_order = query_params.get('sort_order') sort_policies = [{'order_by': order_by, 'sort_order': sort_order}] # Ordering by problem_attempts_per_completed can be ambiguous because # values could be infinite (e.g. divide by zero) if no problems were completed. # Instead, secondary sorting by attempt_ratio_order will produce a sensible ordering. if order_by == 'problem_attempts_per_completed': sort_policies.append({ 'order_by': 'attempt_ratio_order', 'sort_order': 'asc' if sort_order == 'desc' else 'desc' }) params = { 'segments': split_query_argument(query_params.get('segments')), 'ignore_segments': split_query_argument(query_params.get('ignore_segments')), 'cohort': query_params.get('cohort'), 'enrollment_mode': query_params.get('enrollment_mode'), 'text_search': query_params.get('text_search'), 'sort_policies': sort_policies, } # Remove None values from `params` so that we don't overwrite default # parameter values in `get_users_in_course`. params = {key: val for key, val in params.items() if val is not None} try: return RosterEntry.get_users_in_course(self.course_id, **params) except ValueError as e: raise ParameterValueError(e.message)
def get_queryset(self): """ Fetches the user list and last updated from elasticsearch returned returned as a an array of dicts with fields "learner" and "last_updated". """ self._validate_query_params() query_params = self.request.QUERY_PARAMS order_by = query_params.get('order_by') sort_order = query_params.get('sort_order') sort_policies = [{ 'order_by': order_by, 'sort_order': sort_order }] # Ordering by problem_attempts_per_completed can be ambiguous because # values could be infinite (e.g. divide by zero) if no problems were completed. # Instead, secondary sorting by attempt_ratio_order will produce a sensible ordering. if order_by == 'problem_attempts_per_completed': sort_policies.append({ 'order_by': 'attempt_ratio_order', 'sort_order': 'asc' if sort_order == 'desc' else 'desc' }) params = { 'segments': split_query_argument(query_params.get('segments')), 'ignore_segments': split_query_argument(query_params.get('ignore_segments')), 'cohort': query_params.get('cohort'), 'enrollment_mode': query_params.get('enrollment_mode'), 'text_search': query_params.get('text_search'), 'sort_policies': sort_policies, } # Remove None values from `params` so that we don't overwrite default # parameter values in `get_users_in_course`. params = {key: val for key, val in params.items() if val is not None} try: return RosterEntry.get_users_in_course(self.course_id, **params) except ValueError as e: raise ParameterValueError(e.message)
def get_queryset(self): return RosterEntry.get_course_user(self.course_id, self.username)