feat: play_history

This commit is contained in:
raiot 2024-03-19 21:47:13 +08:00
parent 9d7edd63b2
commit 9b485d14e1
5 changed files with 112 additions and 5 deletions

View File

@ -10,8 +10,8 @@ app_name = 'courses'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('course/<int:pk>/', views.CourseDetailView.as_view(), name='course-detail'),
path('course/<int:pk>/lesson/<int:lesson_pk>/', views.LessonDetailView.as_view(), name='lesson-detail'),
path('course/<int:course_pk>/lesson/<int:lesson_pk>/', views.LessonDetailView.as_view(), name='lesson-detail'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -1,6 +1,11 @@
import json
from django.http import HttpResponse, JsonResponse
from django.shortcuts import render
from django.views import View
from apps.courses.models import Course, Lesson
from apps.users.models import User, PlayHistory
# Create your views here.
@ -24,7 +29,27 @@ class CourseDetailView(View):
class LessonDetailView(View):
def get(self, request, pk, lesson_pk):
def get(self, request, course_pk, lesson_pk):
lesson = Lesson.objects.get(pk=lesson_pk)
context = {'lesson': lesson}
return render(request, 'courses/lesson_detail.html', context)
play_history = PlayHistory.objects.filter(lesson=lesson, user=request.user).first()
if play_history:
play_time = play_history.time
else:
play_time = 0
print(play_time)
context = {'lesson': lesson, 'play_time': play_time}
return render(request, 'courses/lesson_detail.html', context)
def post(self, request, course_pk, lesson_pk):
# print the post data
print(json.loads(request.body))
play_time = json.loads(request.body)['time']
PlayHistory.objects.update_or_create(
lesson=Lesson.objects.get(pk=lesson_pk),
user=User.objects.get(id=request.user.id),
defaults={'time': play_time}
)
return JsonResponse({'status': 'ok'}, status=200)

View File

@ -0,0 +1,26 @@
# Generated by Django 5.0.3 on 2024-03-19 13:19
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('courses', '0004_lesson_cover'),
('users', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='PlayHistory',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('time', models.IntegerField()),
('update_time', models.DateTimeField(auto_now=True)),
('lesson', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='courses.lesson')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@ -1,7 +1,19 @@
from django.db import models
from django.contrib.auth.models import AbstractUser
from apps.courses.models import Course, Lesson
# Create your models here.
class User(AbstractUser):
pass
class PlayHistory(models.Model):
lesson = models.ForeignKey(Lesson, on_delete=models.SET_NULL, null=True)
time = models.IntegerField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
update_time = models.DateTimeField(auto_now=True)

View File

@ -18,10 +18,54 @@
<script src="https://cdn.plyr.io/3.7.8/plyr.polyfilled.js"></script>
<script>
const player = new Plyr('#player');
player.currentTime = {{ play_time }};
console.log('Current time:', player.currentTime);
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
let cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
let cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
let csrftoken = getCookie('csrftoken');
let url = '{{ lesson.get_absolute_url }}';
function postData(url = '', data = {}) {
return fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrftoken
},
body: JSON.stringify(data)
})
.then(response => response.json());
}
// print current time on play every 10 seconds
setInterval(() => {
console.log('Current time:', player.currentTime);
let data = {
user: '{{ request.user.id }}',
lesson: '{{ lesson.id }}',
time: player.currentTime};
postData(url, data)
.then(data => {
console.log(data);
});
}, 10000);
player.on('pause', event => {
console.log('Video paused', player.currentTime);
});