def update_summary(self, last_tracker_pk=0, newest_tracker_pk=0, # range of tracker ids to process last_points_pk=0, newest_points_pk=0 # range of points ids to process ): first_tracker = (last_tracker_pk == 0) first_points = (last_points_pk == 0) t = time.time() selfTrackers = Tracker.objects.filter(user=self.user, course=self.course, pk__gt=last_tracker_pk, pk__lte=newest_tracker_pk) ### Add the values that are directly obtained from the last pks self.total_activity = (0 if first_tracker else self.total_activity) + selfTrackers.count() self.total_downloads = (0 if first_tracker else self.total_downloads) + selfTrackers.filter(type='download').count() new_points = Points.objects if newest_points_pk > 0: new_points = new_points.filter(pk__gt=last_points_pk, pk__lte=newest_points_pk, course=self.course,user=self.user) else: new_points = new_points.filter(pk__gt=last_points_pk, course=self.course,user=self.user) new_points = new_points.aggregate(total=Sum('points'))['total'] if new_points: self.points = (0 if first_points else self.points) + new_points ### Values that need to be recalculated (as the course digests may vary) self.pretest_score = Course.get_pre_test_score(self.course, self.user) self.quizzes_passed = Course.get_no_quizzes_completed(self.course, self.user) self.badges_achieved = Course.get_badges(self.course, self.user) self.completed_activities = Course.get_activities_completed(self.course, self.user) ### Update the data in the database self.save() elapsed_time = time.time() - t print('took %.2f seconds' % elapsed_time)