def course_activity_view(request, course_id, activity_id): course = can_view_course(request, course_id) activity = Activity.objects.get(pk=activity_id) # log the activity in the tracker tracker = Tracker() tracker.user = request.user tracker.course = course tracker.type = activity.type tracker.data = "" tracker.ip = request.META.get('REMOTE_ADDR','0.0.0.0') tracker.agent = request.META.get('HTTP_USER_AGENT','unknown') tracker.activity_title = activity.title tracker.section_title = activity.section.title tracker.save() if activity.type == "page": activity_content_file = activity.get_content() with codecs.open(settings.MEDIA_ROOT + "courses/" + course.shortname + "/" + activity_content_file, "r", "utf-8") as f: s = f.read() template = re.compile('\<body(?P<body>.*?)>(?P<content>.*)\<\/body\>', re.DOTALL) activity_content = template.search(s).group('content') activity_content = activity_content.replace("images/",settings.MEDIA_URL + "courses/" + course.shortname + "/images/") return render_to_response('oppia/preview/course_activity_page.html', {'course': course, 'activity': activity , 'content' : activity_content }, context_instance=RequestContext(request)) else: activity_content= None return render_to_response('oppia/preview/course_activity_not_supported.html', {'course': course, 'activity': activity , 'content' : activity_content }, context_instance=RequestContext(request))
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) get_user(self.request, self.object.pk) #TODO: Change permissions check course = can_view_course(self.request, self.kwargs['course_id']) act_quizzes = Activity.objects \ .filter(section__course=course, type=Activity.QUIZ) \ .order_by('section__order', 'order') quizzes_attempted = 0 quizzes_passed = 0 course_pretest = None quizzes = [] for aq in act_quizzes: quiz, course_pretest, quizzes_attempted, quizzes_passed = \ process_quiz_activity(self.object, aq, course_pretest, quizzes_attempted, quizzes_passed) quizzes.append(quiz) activities_completed = course.get_activities_completed( course, self.object) activities_total = course.get_no_activities() activities_percent = (activities_completed * 100) / activities_total start_date, end_date = self.get_daterange() activity = get_tracker_activities(start_date, end_date, self.object, course=course) order_options = [ 'quiz_order', 'no_attempts', 'max_score', 'min_score', 'first_score', 'latest_score', 'avg_score' ] default_order = 'quiz_order' ordering = self.request.GET.get('order_by', default_order) inverse_order = ordering.startswith('-') if inverse_order: ordering = ordering[1:] if ordering not in order_options: ordering = default_order inverse_order = False quizzes.sort(key=operator.itemgetter(ordering), reverse=inverse_order) context['page_ordering'] = ('-' if inverse_order else '') + ordering context['course'] = course context['quizzes'] = quizzes context['quizzes_passed'] = quizzes_passed context['quizzes_attempted'] = quizzes_attempted context['pretest_score'] = course_pretest context['activities_completed'] = activities_completed context['activities_total'] = activities_total context['activities_percent'] = activities_percent context['activity_graph_data'] = activity return context
def download_media_file(request, course_id, media_id): course = can_view_course(request, course_id) media = Media.objects.get(pk=media_id) uploaded = UploadedMedia.objects.filter(md5=media.digest).first() response = HttpResponse() response['Content-Disposition'] = 'attachment; filename="%s"' \ % (media.filename) return response
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) digest = self.request.GET.get('digest') course_shortname = self.request.GET.get('course') if digest: context['digest'] = digest activity = Activity.objects.filter(digest=digest).first() if activity: context['activity'] = activity else: context['misconfigured'] = True context['activity_notfound'] = True elif course_shortname: context['course_shortname'] = course_shortname course = Course.objects.filter(shortname=course_shortname).first() if course: try: permissions.can_view_course(self.request, course.id) context['course'] = course context['download_stats'] = UserCourseSummary.objects \ .filter(course=course) \ .aggregated_stats('total_downloads', single=True) except Http404: # The user does not have permissions to view this course context['misconfigured'] = True context['course_notpermissions'] = True else: context['misconfigured'] = True context['course_notfound'] = True else: context['misconfigured'] = True context['param_missing'] = True return context
def get(self, request, course_id): course = can_view_course(request, course_id) file_to_download = course.getAbsPath() binary_file = open(file_to_download, 'rb') response = HttpResponse(binary_file.read(), content_type='application/zip') binary_file.close() response['Content-Length'] = os.path.getsize(file_to_download) response['Content-Disposition'] = 'attachment; filename="%s"' \ % (course.filename) course_downloaded.send(sender=self, course=course, request=request) return response
def course_activity_view(request, course_id, activity_id): course = can_view_course(request, course_id) activity = Activity.objects.get(pk=activity_id) # log the activity in the tracker tracker = Tracker() tracker.user = request.user tracker.course = course tracker.type = activity.type tracker.data = "" tracker.ip = request.META.get('REMOTE_ADDR', '0.0.0.0') tracker.agent = request.META.get('HTTP_USER_AGENT', 'unknown') tracker.activity_title = activity.title tracker.section_title = activity.section.title tracker.save() if activity.type == "page": activity_content_file = activity.get_content() with codecs.open( settings.MEDIA_ROOT + "courses/" + course.shortname + "/" + activity_content_file, "r", "utf-8") as f: s = f.read() template = re.compile('\<body(?P<body>.*?)>(?P<content>.*)\<\/body\>', re.DOTALL) activity_content = template.search(s).group('content') activity_content = activity_content.replace( "images/", settings.MEDIA_URL + "courses/" + course.shortname + "/images/") return render_to_response('oppia/preview/course_activity_page.html', { 'course': course, 'activity': activity, 'content': activity_content }, context_instance=RequestContext(request)) else: activity_content = None return render_to_response( 'oppia/preview/course_activity_not_supported.html', { 'course': course, 'activity': activity, 'content': activity_content }, context_instance=RequestContext(request))
def download_course_media(request, course_id): course = can_view_course(request, course_id) digests = Media.objects.filter(course=course).values_list('digest', flat=True) media = UploadedMedia.objects.filter(md5__in=digests) filename = course.shortname + "_media.zip" path = handler.zip_course_media(filename, media) if path: with open(path, 'rb') as package: response = HttpResponse(package.read(), content_type='application/zip') response['Content-Length'] = os.path.getsize(path) response['Content-Disposition'] = 'attachment; filename="%s"' \ % (filename) return response else: return redirect( reverse('av:course_media', kwargs={'course_id': course.pk}) + '?error=no_media')
def course_home_view(request, id): course = can_view_course(request, id) return render_to_response('oppia/preview/course_home.html', {'course': course }, context_instance=RequestContext(request))
def user_course_activity_view(request, user_id, course_id): view_user = get_user(request, user_id) dashboard_accessed.send(sender=None, request=request, data=None) course = can_view_course(request, course_id) act_quizzes = Activity.objects \ .filter(section__course=course, type=Activity.QUIZ) \ .order_by('section__order', 'order') quizzes_attempted = 0 quizzes_passed = 0 course_pretest = None quizzes = [] for aq in act_quizzes: quiz, course_pretest, quizzes_attempted, quizzes_passed = \ process_quiz_activity(view_user, aq, course_pretest, quizzes_attempted, quizzes_passed) quizzes.append(quiz) activities_completed = course.get_activities_completed(course, view_user) activities_total = course.get_no_activities() activities_percent = (activities_completed * 100) / activities_total start_date = timezone.now() - datetime.timedelta(days=31) end_date = timezone.now() activity = get_tracker_activities(start_date, end_date, view_user, course=course) order_options = [ 'quiz_order', 'no_attempts', 'max_score', 'min_score', 'first_score', 'latest_score', 'avg_score' ] default_order = 'quiz_order' ordering = request.GET.get('order_by', default_order) inverse_order = ordering.startswith('-') if inverse_order: ordering = ordering[1:] if ordering not in order_options: ordering = default_order inverse_order = False quizzes.sort(key=operator.itemgetter(ordering), reverse=inverse_order) return render( request, 'profile/user-course-scorecard.html', { 'view_user': view_user, 'course': course, 'quizzes': quizzes, 'quizzes_passed': quizzes_passed, 'quizzes_attempted': quizzes_attempted, 'pretest_score': course_pretest, 'activities_completed': activities_completed, 'activities_total': activities_total, 'activities_percent': activities_percent, 'page_ordering': ('-' if inverse_order else '') + ordering, 'activity_graph_data': activity })
def user_course_activity_view(request, user_id, course_id): view_user, response = get_user(request, user_id) if response is not None: return response dashboard_accessed.send(sender=None, request=request, data=None) course = can_view_course(request, course_id) act_quizzes = Activity.objects.filter(section__course=course, type=Activity.QUIZ).order_by( 'section__order', 'order') quizzes_attempted = 0 quizzes_passed = 0 course_pretest = None quizzes = [] for aq in act_quizzes: try: quizobjs = Quiz.objects.filter(quizprops__value=aq.digest, quizprops__name="digest") if quizobjs.count() <= 0: continue else: quiz = quizobjs[0] except Quiz.DoesNotExist: quiz = None no_attempts = quiz.get_no_attempts_by_user(quiz, view_user) attempts = QuizAttempt.objects.filter(quiz=quiz, user=view_user) passed = False if no_attempts > 0: quiz_maxscore = float(attempts[0].maxscore) attemps_stats = attempts.aggregate(max=Max('score'), min=Min('score'), avg=Avg('score')) max_score = 100 * float(attemps_stats['max']) / quiz_maxscore min_score = 100 * float(attemps_stats['min']) / quiz_maxscore avg_score = 100 * float(attemps_stats['avg']) / quiz_maxscore first_date = attempts.aggregate(date=Min('attempt_date'))['date'] recent_date = attempts.aggregate(date=Max('attempt_date'))['date'] first_score = 100 * float( attempts.filter( attempt_date=first_date)[0].score) / quiz_maxscore latest_score = 100 * float( attempts.filter( attempt_date=recent_date)[0].score) / quiz_maxscore passed = max_score is not None and max_score > 75 if aq.section.order == 0: course_pretest = first_score else: quizzes_attempted += 1 quizzes_passed = (quizzes_passed + 1) if passed else quizzes_passed else: max_score = None min_score = None avg_score = None first_score = None latest_score = None quiz = { 'quiz': aq, 'quiz_order': aq.order, 'no_attempts': no_attempts, 'max_score': max_score, 'min_score': min_score, 'first_score': first_score, 'latest_score': latest_score, 'avg_score': avg_score, 'passed': passed } quizzes.append(quiz) activities_completed = course.get_activities_completed(course, view_user) activities_total = course.get_no_activities() activities_percent = (activities_completed * 100) / activities_total start_date = timezone.now() - datetime.timedelta(days=31) end_date = timezone.now() activity = get_tracker_activities(start_date, end_date, view_user, course=course) order_options = [ 'quiz_order', 'no_attempts', 'max_score', 'min_score', 'first_score', 'latest_score', 'avg_score' ] default_order = 'quiz_order' ordering = request.GET.get('order_by', default_order) inverse_order = ordering.startswith('-') if inverse_order: ordering = ordering[1:] if ordering not in order_options: ordering = default_order inverse_order = False quizzes.sort(key=operator.itemgetter(ordering), reverse=inverse_order) return render( request, 'profile/user-course-scorecard.html', { 'view_user': view_user, 'course': course, 'quizzes': quizzes, 'quizzes_passed': quizzes_passed, 'quizzes_attempted': quizzes_attempted, 'pretest_score': course_pretest, 'activities_completed': activities_completed, 'activities_total': activities_total, 'activities_percent': activities_percent, 'page_ordering': ('-' if inverse_order else '') + ordering, 'activity_graph_data': activity })
def user_course_activity_view(request, user_id, course_id): view_user, response = get_user(request, user_id) if response is not None: return response dashboard_accessed.send(sender=None, request=request, data=None) course = can_view_course(request, course_id) act_quizzes = Activity.objects.filter(section__course=course, type=Activity.QUIZ).order_by( 'section__order', 'order') quizzes = [] for aq in act_quizzes: quiz = Quiz.objects.get(quizprops__value=aq.digest, quizprops__name="digest") attempts = QuizAttempt.objects.filter( quiz=quiz, user=view_user).order_by( 'submitted_date')[:settings.ISCHOOL_MAX_QUIZ_ATTEMPTS] max_score = None min_score = None avg_score = None first_score = None latest_score = None if attempts.count() > 0: max_score = 100 * float( attempts.aggregate(max=Max('score'))['max']) / float( attempts[0].maxscore) min_score = 100 * float( attempts.aggregate(min=Min('score'))['min']) / float( attempts[0].maxscore) avg_score = 100 * float( attempts.aggregate(avg=Avg('score'))['avg']) / float( attempts[0].maxscore) first_date = attempts.aggregate(date=Min('attempt_date'))['date'] recent_date = attempts.aggregate(date=Max('attempt_date'))['date'] first_score = 100 * float( attempts.filter(attempt_date=first_date)[0].score) / float( attempts[0].maxscore) latest_score = 100 * float( attempts.filter(attempt_date=recent_date)[0].score) / float( attempts[0].maxscore) else: max_score = None min_score = None avg_score = None first_score = None latest_score = None quiz = { 'quiz': aq, 'no_attempts': attempts.count(), 'max_score': max_score, 'min_score': min_score, 'first_score': first_score, 'latest_score': latest_score, 'avg_score': avg_score, } quizzes.append(quiz) activity = [] start_date = timezone.now() - datetime.timedelta(days=31) end_date = timezone.now() no_days = (end_date - start_date).days + 1 trackers = Tracker.objects.filter(course=course, user=view_user, tracker_date__gte=start_date, tracker_date__lte=end_date) \ .extra({'activity_date':"date(tracker_date)"}) \ .values('activity_date') \ .annotate(count=Count('id')) for i in range(0, no_days, +1): temp = start_date + datetime.timedelta(days=i) count = next( (dct['count'] for dct in trackers if dct['activity_date'] == temp.date()), 0) activity.append([temp.strftime("%d %b %Y"), count]) return render_to_response('oppia/profile/user-course-scorecard.html', { 'view_user': view_user, 'course': course, 'quizzes': quizzes, 'activity_graph_data': activity }, context_instance=RequestContext(request))
def course_home_view(request, id): course = can_view_course(request, id) return render_to_response('oppia/preview/course_home.html', {'course': course}, context_instance=RequestContext(request))
def course_home_view(request, id): course = can_view_course(request, id) return render(request, 'oppia/preview/course_home.html', {'course': course})
def user_course_activity_view(request, user_id, course_id): view_user, response = get_user(request, user_id) if response is not None: return response dashboard_accessed.send(sender=None, request=request, data=None) course = can_view_course(request, course_id) act_quizzes = Activity.objects.filter(section__course=course, type=Activity.QUIZ).order_by('section__order', 'order') quizzes_attempted = 0 quizzes_passed = 0 course_pretest = None quizzes = [] for aq in act_quizzes: try: quizobjs = Quiz.objects.filter(quizprops__value=aq.digest, quizprops__name="digest") if quizobjs.count() <= 0: continue else: quiz = quizobjs[0] except Quiz.DoesNotExist: quiz = None no_attempts = quiz.get_no_attempts_by_user(quiz, view_user) attempts = QuizAttempt.objects.filter(quiz=quiz, user=view_user) passed = False if no_attempts > 0: quiz_maxscore = float(attempts[0].maxscore) attemps_stats = attempts.aggregate(max=Max('score'), min=Min('score'), avg=Avg('score')) max_score = 100 * float(attemps_stats['max']) / quiz_maxscore min_score = 100 * float(attemps_stats['min']) / quiz_maxscore avg_score = 100 * float(attemps_stats['avg']) / quiz_maxscore first_date = attempts.aggregate(date=Min('attempt_date'))['date'] recent_date = attempts.aggregate(date=Max('attempt_date'))['date'] first_score = 100 * float(attempts.filter(attempt_date=first_date)[0].score) / quiz_maxscore latest_score = 100 * float(attempts.filter(attempt_date=recent_date)[0].score) / quiz_maxscore passed = max_score is not None and max_score > 75 if aq.section.order == 0: course_pretest = first_score else: quizzes_attempted += 1 quizzes_passed = (quizzes_passed + 1) if passed else quizzes_passed else: max_score = None min_score = None avg_score = None first_score = None latest_score = None quiz = {'quiz': aq, 'quiz_order': aq.order, 'no_attempts': no_attempts, 'max_score': max_score, 'min_score': min_score, 'first_score': first_score, 'latest_score': latest_score, 'avg_score': avg_score, 'passed': passed } quizzes.append(quiz) activities_completed = course.get_activities_completed(course, view_user) activities_total = course.get_no_activities() activities_percent = (activities_completed * 100) / activities_total start_date = timezone.now() - datetime.timedelta(days=31) end_date = timezone.now() activity = get_tracker_activities(start_date, end_date, view_user, course=course) order_options = ['quiz_order', 'no_attempts', 'max_score', 'min_score', 'first_score', 'latest_score', 'avg_score'] default_order = 'quiz_order' ordering = request.GET.get('order_by', default_order) inverse_order = ordering.startswith('-') if inverse_order: ordering = ordering[1:] if ordering not in order_options: ordering = default_order inverse_order = False quizzes.sort(key=operator.itemgetter(ordering), reverse=inverse_order) return render(request, 'oppia/profile/user-course-scorecard.html', {'view_user': view_user, 'course': course, 'quizzes': quizzes, 'quizzes_passed': quizzes_passed, 'quizzes_attempted': quizzes_attempted, 'pretest_score': course_pretest, 'activities_completed': activities_completed, 'activities_total': activities_total, 'activities_percent': activities_percent, 'page_ordering': ('-' if inverse_order else '') + ordering, 'activity_graph_data': activity})
def user_course_activity_view(request, user_id, course_id): view_user, response = get_user(request, user_id) if response is not None: return response dashboard_accessed.send(sender=None, request=request, data=None) course = can_view_course(request, course_id) act_quizzes = Activity.objects.filter(section__course=course,type=Activity.QUIZ).order_by('section__order','order') quizzes_attempted = 0 quizzes_passed = 0 course_pretest = None quizzes = [] for aq in act_quizzes: try: quiz = Quiz.objects.get(quizprops__value=aq.digest, quizprops__name="digest") except Quiz.DoesNotExist: quiz = None attempts = QuizAttempt.objects.filter(quiz=quiz, user=view_user) num_attempts = attempts.count() passed = False if num_attempts > 0: quiz_maxscore = float(attempts[0].maxscore) attemps_stats = attempts.aggregate(max=Max('score'), min=Min('score'), avg=Avg('score')) max_score = 100*float(attemps_stats['max']) / quiz_maxscore min_score = 100*float(attemps_stats['min']) / quiz_maxscore avg_score = 100*float(attemps_stats['avg']) / quiz_maxscore first_date = attempts.aggregate(date=Min('attempt_date'))['date'] recent_date = attempts.aggregate(date=Max('attempt_date'))['date'] first_score = 100*float(attempts.filter(attempt_date = first_date)[0].score) / quiz_maxscore latest_score = 100*float(attempts.filter(attempt_date = recent_date)[0].score) / quiz_maxscore passed = max_score is not None and max_score > 75 if aq.section.order == 0: course_pretest = first_score else: quizzes_attempted += 1 quizzes_passed = (quizzes_passed + 1) if passed else quizzes_passed else: max_score = None min_score = None avg_score = None first_score = None latest_score = None quiz = {'quiz': aq, 'quiz_order': aq.order, 'no_attempts': num_attempts, 'max_score': max_score, 'min_score': min_score, 'first_score': first_score, 'latest_score': latest_score, 'avg_score': avg_score, 'passed': passed } quizzes.append(quiz) activities_completed = course.get_activities_completed(course,view_user) activities_total = course.get_no_activities() activities_percent = (activities_completed * 100) / activities_total activity = [] start_date = timezone.now() - datetime.timedelta(days=31) end_date = timezone.now() no_days = (end_date-start_date).days + 1 trackers = Tracker.objects.filter(course=course, user=view_user, tracker_date__gte=start_date, tracker_date__lte=end_date) \ .extra({'activity_date':"date(tracker_date)"}) \ .values('activity_date') \ .annotate(count=Count('id')) for i in range(0,no_days,+1): temp = start_date + datetime.timedelta(days=i) count = next((dct['count'] for dct in trackers if dct['activity_date'] == temp.date()), 0) activity.append([temp.strftime("%d %b %Y"),count]) order_options = ['quiz_order', 'no_attempts', 'max_score', 'min_score', 'first_score', 'latest_score', 'avg_score'] default_order = 'quiz_order' ordering = request.GET.get('order_by', default_order) inverse_order = ordering.startswith('-') if inverse_order: ordering = ordering[1:] if ordering not in order_options: ordering = default_order inverse_order = False quizzes.sort(key=operator.itemgetter(ordering), reverse=inverse_order) return render_to_response('oppia/profile/user-course-scorecard.html', {'view_user': view_user, 'course': course, 'quizzes': quizzes, 'quizzes_passed':quizzes_passed, 'quizzes_attempted':quizzes_attempted, 'pretest_score': course_pretest, 'activities_completed': activities_completed, 'activities_total': activities_total, 'activities_percent': activities_percent, 'page_ordering': ('-' if inverse_order else '') + ordering, 'activity_graph_data': activity }, context_instance=RequestContext(request))
def user_course_activity_view(request, user_id, course_id): view_user, response = get_user(request, user_id) if response is not None: return response dashboard_accessed.send(sender=None, request=request, data=None) course = can_view_course(request, course_id) act_quizzes = Activity.objects.filter(section__course=course,type=Activity.QUIZ).order_by('section__order','order') quizzes = [] for aq in act_quizzes: quiz = Quiz.objects.get(quizprops__value=aq.digest, quizprops__name="digest") attempts = QuizAttempt.objects.filter(quiz=quiz, user=view_user).order_by('submitted_date')[:settings.ISCHOOL_MAX_QUIZ_ATTEMPTS] max_score = None min_score = None avg_score = None first_score = None latest_score = None if attempts.count() > 0: max_score = 100*float(attempts.aggregate(max=Max('score'))['max']) / float(attempts[0].maxscore) min_score = 100*float(attempts.aggregate(min=Min('score'))['min']) / float(attempts[0].maxscore) avg_score = 100*float(attempts.aggregate(avg=Avg('score'))['avg']) / float(attempts[0].maxscore) first_date = attempts.aggregate(date=Min('attempt_date'))['date'] recent_date = attempts.aggregate(date=Max('attempt_date'))['date'] first_score = 100*float(attempts.filter(attempt_date = first_date)[0].score) / float(attempts[0].maxscore) latest_score = 100*float(attempts.filter(attempt_date = recent_date)[0].score) / float(attempts[0].maxscore) else: max_score = None min_score = None avg_score = None first_score = None latest_score = None quiz = {'quiz': aq, 'no_attempts': attempts.count(), 'max_score': max_score, 'min_score': min_score, 'first_score': first_score, 'latest_score': latest_score, 'avg_score': avg_score, } quizzes.append(quiz); activity = [] start_date = timezone.now() - datetime.timedelta(days=31) end_date = timezone.now() no_days = (end_date-start_date).days + 1 trackers = Tracker.objects.filter(course=course, user=view_user, tracker_date__gte=start_date, tracker_date__lte=end_date) \ .extra({'activity_date':"date(tracker_date)"}) \ .values('activity_date') \ .annotate(count=Count('id')) for i in range(0,no_days,+1): temp = start_date + datetime.timedelta(days=i) count = next((dct['count'] for dct in trackers if dct['activity_date'] == temp.date()), 0) activity.append([temp.strftime("%d %b %Y"),count]) return render_to_response('oppia/profile/user-course-scorecard.html', {'view_user': view_user, 'course': course, 'quizzes': quizzes, 'activity_graph_data': activity }, context_instance=RequestContext(request))
def user_course_activity_view(request, user_id, course_id): view_user, response = get_user(request, user_id) if response is not None: return response dashboard_accessed.send(sender=None, request=request, data=None) course = can_view_course(request, course_id) act_quizzes = Activity.objects.filter(section__course=course, type=Activity.QUIZ).order_by( 'section__order', 'order') quizzes_attempted = 0 quizzes_passed = 0 course_pretest = None quizzes = [] for aq in act_quizzes: try: quiz = Quiz.objects.get(quizprops__value=aq.digest, quizprops__name="digest") except Quiz.DoesNotExist: quiz = None attempts = QuizAttempt.objects.filter(quiz=quiz, user=view_user) num_attempts = attempts.count() passed = False if num_attempts > 0: quiz_maxscore = float(attempts[0].maxscore) attemps_stats = attempts.aggregate(max=Max('score'), min=Min('score'), avg=Avg('score')) max_score = 100 * float(attemps_stats['max']) / quiz_maxscore min_score = 100 * float(attemps_stats['min']) / quiz_maxscore avg_score = 100 * float(attemps_stats['avg']) / quiz_maxscore first_date = attempts.aggregate(date=Min('attempt_date'))['date'] recent_date = attempts.aggregate(date=Max('attempt_date'))['date'] first_score = 100 * float( attempts.filter( attempt_date=first_date)[0].score) / quiz_maxscore latest_score = 100 * float( attempts.filter( attempt_date=recent_date)[0].score) / quiz_maxscore passed = max_score is not None and max_score > 75 if aq.section.order == 0: course_pretest = first_score else: quizzes_attempted += 1 quizzes_passed = (quizzes_passed + 1) if passed else quizzes_passed else: max_score = None min_score = None avg_score = None first_score = None latest_score = None quiz = { 'quiz': aq, 'quiz_order': aq.order, 'no_attempts': num_attempts, 'max_score': max_score, 'min_score': min_score, 'first_score': first_score, 'latest_score': latest_score, 'avg_score': avg_score, 'passed': passed } quizzes.append(quiz) activities_completed = course.get_activities_completed(course, view_user) activities_total = course.get_no_activities() activities_percent = (activities_completed * 100) / activities_total activity = [] start_date = timezone.now() - datetime.timedelta(days=31) end_date = timezone.now() no_days = (end_date - start_date).days + 1 trackers = Tracker.objects.filter(course=course, user=view_user, tracker_date__gte=start_date, tracker_date__lte=end_date) \ .extra({'activity_date':"date(tracker_date)"}) \ .values('activity_date') \ .annotate(count=Count('id')) for i in range(0, no_days, +1): temp = start_date + datetime.timedelta(days=i) count = next( (dct['count'] for dct in trackers if dct['activity_date'] == temp.date()), 0) activity.append([temp.strftime("%d %b %Y"), count]) order_options = [ 'quiz_order', 'no_attempts', 'max_score', 'min_score', 'first_score', 'latest_score', 'avg_score' ] default_order = 'quiz_order' ordering = request.GET.get('order_by', default_order) inverse_order = ordering.startswith('-') if inverse_order: ordering = ordering[1:] if ordering not in order_options: ordering = default_order inverse_order = False quizzes.sort(key=operator.itemgetter(ordering), reverse=inverse_order) return render_to_response( 'oppia/profile/user-course-scorecard.html', { 'view_user': view_user, 'course': course, 'quizzes': quizzes, 'quizzes_passed': quizzes_passed, 'quizzes_attempted': quizzes_attempted, 'pretest_score': course_pretest, 'activities_completed': activities_completed, 'activities_total': activities_total, 'activities_percent': activities_percent, 'page_ordering': ('-' if inverse_order else '') + ordering, 'activity_graph_data': activity }, context_instance=RequestContext(request))