Skip to content

Commit

Permalink
Merge pull request #796 from prathamesh920/lesson-statistics-update
Browse files Browse the repository at this point in the history
Modify Lesson Statistics
  • Loading branch information
adityacp authored Nov 11, 2020
2 parents 530fb70 + b6f78c5 commit 11a6ffb
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 25 deletions.
75 changes: 72 additions & 3 deletions stats/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,91 @@
from yaksh.models import Course, Lesson


def str_to_datetime(s):
return timezone.datetime.strptime(s, '%H:%M:%S')


def str_to_time(s):
return timezone.datetime.strptime(s, '%H:%M:%S').time()


def time_to_seconds(time):
return timezone.timedelta(hours=time.hour, minutes=time.minute,
seconds=time.second).total_seconds()


class TrackLesson(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE)
current_time = models.CharField(max_length=100, default="00:00:00")
video_duration = models.CharField(max_length=100, default="00:00:00")
creation_time = models.DateTimeField(auto_now_add=True)
watched = models.BooleanField(default=False)

class Meta:
unique_together = ('user', 'course', 'lesson')

def get_last_access_time_and_vists(self):
def get_log_counter(self):
return self.lessonlog_set.count()

def get_current_time(self):
if self.current_time == '00:00:00':
return 'just started'
return self.current_time

def get_video_duration(self):
if self.video_duration == '00:00:00':
return 'will be available after 25% completion'
return self.video_duration

def set_current_time(self, ct):
t = timezone.datetime.strptime(ct, '%H:%M:%S').time()
current = timezone.datetime.strptime(self.current_time,
'%H:%M:%S').time()
if t > current:
self.current_time = ct

def get_percentage_complete(self):
if self.current_time == '00:00:00' and self.video_duration == '00:00:00':
return 'less than 25%'
duration = str_to_time(self.video_duration)
watch_time = str_to_time(self.current_time)
duration_seconds = time_to_seconds(duration)
watched_seconds = time_to_seconds(watch_time)
percentage = round((watched_seconds / duration_seconds) * 100)
return 'approx {0} %'.format(percentage)


def get_last_access_time(self):
lesson_logs = self.lessonlog_set
last_access_time = None
last_access_time = self.creation_time
if lesson_logs.exists():
last_access_time = lesson_logs.last().last_access_time
return last_access_time, lesson_logs.count()
return last_access_time

def set_watched(self):
if self.current_time != '00:00:00' and self.video_duration != '00:00:00':
duration = str_to_time(self.video_duration)
watch_time = (str_to_datetime(self.current_time) + timezone.timedelta(
seconds=10)).time()
self.watched = watch_time >= duration

def get_watched(self):
if not self.watched:
self.set_watched()
self.save()
return self.watched


def time_spent(self):
if self.video_duration != '00:00:00':
hits = self.get_log_counter()
duration = str_to_time(self.video_duration)
hit_duration = int((time_to_seconds(duration))/4)
total_duration = hits * hit_duration
return str(timezone.timedelta(seconds=total_duration))
return self.get_current_time()

def __str__(self):
return (f"Track {self.lesson} in {self.course} "
Expand All @@ -32,4 +100,5 @@ def __str__(self):

class LessonLog(models.Model):
track = models.ForeignKey(TrackLesson, on_delete=models.CASCADE)
current_time = models.CharField(max_length=20, default="00:00:00")
last_access_time = models.DateTimeField(default=timezone.now)
29 changes: 10 additions & 19 deletions stats/templates/view_lesson_tracking.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,6 @@

$(document).ready(function() {
$("#stats-table").tablesorter({});
$('#stats-table tr').each(function() {
var td = $(this).find("td");
var elapsed = td.eq(4).html();
var duration = td.eq(5).html();
if (elapsed != undefined || duration != undefined) {
percent = (get_time_in_seconds(elapsed) / get_time_in_seconds(duration)) * 100;
td.eq(6).html(Math.round(percent));
}
});
});
</script>
{% endblock %}
Expand All @@ -49,27 +40,27 @@ <h4><strong>{{total}} student(s) viewed this lesson</strong></h4>
<th>Started on&nbsp;<i class="fa fa-sort"></i></th>
<th>Current Duration&nbsp;<i class="fa fa-sort"></i></th>
<th>Video Duration&nbsp;<i class="fa fa-sort"></i></th>
<th>Percentage watched&nbsp;<i class="fa fa-sort"></i></th>
<th>Total visits&nbsp;<i class="fa fa-sort"></i></th>
<th>Percentage Watched&nbsp;<i class="fa fa-sort"></i></th>
<th>Watched Once Completely&nbsp;<i class="fa fa-sort"></i></th>
<th>Total Time Spent&nbsp;<i class="fa fa-sort"></i></th>
</tr>
</thead>
{% for track in trackings %}
<tr>
<td>{{ forloop.counter0|add:objects.start_index }}</td>
<td>{{track.user.get_full_name}}</td>
{% with track.get_last_access_time_and_vists as time_and_visits %}
<td>{{time_and_visits.0}}</td>
<td>{{track.get_last_access_time}}</td>
<td>{{track.creation_time}}</td>
<td>{{track.current_time}}</td>
<td>{{track.video_duration}}</td>
<td></td>
<td>{{time_and_visits.1}}</td>
{% endwith %}
<td>{{track.get_current_time}}</td>
<td>{{track.get_video_duration}}</td>
<td>{{track.get_percentage_complete}}</td>
<td>{{track.get_watched}}</td>
<td>{{track.time_spent}}</td>
</tr>
{% endfor %}
</table>
{% endwith %}
<br>
{% include "yaksh/paginator.html" %}
</div>
{% endblock %}
{% endblock %}
10 changes: 7 additions & 3 deletions stats/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from django.http import Http404

# Local Imports
from stats.models import TrackLesson, LessonLog
from stats.models import TrackLesson, LessonLog, str_to_time, time_to_seconds
from yaksh.models import Course
from yaksh.decorators import email_verified

Expand All @@ -25,12 +25,16 @@ def add_tracker(request, tracker_id):
video_duration = request.POST.get('video_duration')
current_time = request.POST.get('current_video_time')
if current_time:
track.current_time = current_time
track.set_current_time(current_time)
track.video_duration = video_duration
LessonLog.objects.create(
track_id=track.id, last_access_time=timezone.now()
track_id=track.id, current_time=current_time,
last_access_time=timezone.now()
)
track.save()
if not track.watched:
track.set_watched()
track.save()
success = True
else:
success = False
Expand Down

0 comments on commit 11a6ffb

Please sign in to comment.