summaryrefslogtreecommitdiff
path: root/stats/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'stats/models.py')
-rw-r--r--stats/models.py140
1 files changed, 140 insertions, 0 deletions
diff --git a/stats/models.py b/stats/models.py
new file mode 100644
index 0000000..84ac7ae
--- /dev/null
+++ b/stats/models.py
@@ -0,0 +1,140 @@
+# Python Imports
+import pandas as pd
+
+# Django Imports
+from django.db import models
+from django.utils import timezone
+from django.contrib.auth.models import User
+from django.db.models import F
+
+# Local Imports
+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 TrackLessonManager(models.Manager):
+ def get_percentage_data(self, tracked_lessons):
+ percentage_data = {"1": 0, "2": 0, "3": 0, "4": 0}
+ for tracked in tracked_lessons:
+ percent = tracked.get_percentage_complete()
+ if percent < 25:
+ percentage_data["1"] = percentage_data["1"] + 1
+ elif percent >= 25 and percent < 50:
+ percentage_data["2"] = percentage_data["2"] + 1
+ elif percent >= 50 and percent < 75:
+ percentage_data["3"] = percentage_data["3"] + 1
+ elif percent >= 75:
+ percentage_data["4"] = percentage_data["4"] + 1
+ return percentage_data
+
+
+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)
+
+ objects = TrackLessonManager()
+
+ class Meta:
+ unique_together = ('user', 'course', 'lesson')
+
+ def get_log_counter(self):
+ return self.lessonlog_set.count()
+
+ def get_current_time(self):
+ if self.current_time == '00:00:00':
+ return '00:00:00'
+ return self.current_time
+
+ def get_video_duration(self):
+ if self.video_duration == '00:00:00':
+ return '00:00:00'
+ 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):
+ ctime = self.current_time
+ vduration = self.video_duration
+ if ctime == '00:00:00' and vduration == '00:00:00':
+ return 0
+ duration = str_to_time(vduration)
+ watch_time = str_to_time(ctime)
+ duration_seconds = time_to_seconds(duration)
+ watched_seconds = time_to_seconds(watch_time)
+ percentage = round((watched_seconds / duration_seconds) * 100)
+ return percentage
+
+ def get_last_access_time(self):
+ lesson_logs = self.lessonlog_set
+ last_access_time = self.creation_time
+ if lesson_logs.exists():
+ last_access_time = lesson_logs.last().last_access_time
+ return last_access_time
+
+ def set_watched(self):
+ ctime = self.current_time
+ vduration = self.video_duration
+ if ctime != '00:00:00' and vduration != '00:00:00':
+ duration = str_to_time(vduration)
+ watch_time = (str_to_datetime(ctime) + timezone.timedelta(
+ seconds=120)).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 get_no_of_vists(self):
+ lesson_logs = self.lessonlog_set.values("last_access_time").annotate(
+ visits=F('last_access_time')
+ )
+ df = pd.DataFrame(lesson_logs)
+ visits = 1
+ if not df.empty:
+ visits = df.groupby(
+ [df['visits'].dt.date]
+ ).first().count()['visits']
+ return visits
+
+ def __str__(self):
+ return (f"Track {self.lesson} in {self.course} "
+ f"for {self.user.get_full_name()}")
+
+
+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)