Fonction "list" de la vue des cours rennommée en "list_courses" pour éviter des erreurs de nommage. Ajout de boutons de navigation (suivant et précédent) pour les vidéos.
This commit is contained in:
parent
c70c5574cd
commit
22e19033ff
5 changed files with 42 additions and 7 deletions
|
|
@ -3,7 +3,7 @@ from . import views
|
||||||
|
|
||||||
app_name = 'courses'
|
app_name = 'courses'
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.list, name='list'),
|
path('', views.list_courses, name='list'),
|
||||||
# Lesson detail: /courses/<course>/<module>/<lesson>/
|
# Lesson detail: /courses/<course>/<module>/<lesson>/
|
||||||
path('<slug:course_slug>/<slug:module_slug>/<slug:lesson_slug>/', views.lesson_detail, name='lesson_detail'),
|
path('<slug:course_slug>/<slug:module_slug>/<slug:lesson_slug>/', views.lesson_detail, name='lesson_detail'),
|
||||||
path('<slug:course_name>-<int:course_id>/', views.show, name="show"),
|
path('<slug:course_name>-<int:course_id>/', views.show, name="show"),
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from django.db.models import Prefetch
|
||||||
from .models import Course, Lesson, Module, Comment
|
from .models import Course, Lesson, Module, Comment
|
||||||
from .forms import CommentForm
|
from .forms import CommentForm
|
||||||
|
|
||||||
def list(request):
|
def list_courses(request):
|
||||||
courses = Course.objects.all()
|
courses = Course.objects.all()
|
||||||
return render(request, 'courses/list.html', {'courses': courses})
|
return render(request, 'courses/list.html', {'courses': courses})
|
||||||
|
|
||||||
|
|
@ -82,6 +82,20 @@ def lesson_detail(request, course_slug, module_slug, lesson_slug):
|
||||||
.order_by('order')
|
.order_by('order')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Compute previous and next lessons within the ordered course lessons
|
||||||
|
prev_lesson = None
|
||||||
|
next_lesson = None
|
||||||
|
try:
|
||||||
|
ids = list(lessons.values_list('id', flat=True))
|
||||||
|
idx = ids.index(lesson.id)
|
||||||
|
if idx > 0:
|
||||||
|
prev_lesson = next(l for l in lessons if l.id == ids[idx - 1])
|
||||||
|
if idx < len(ids) - 1:
|
||||||
|
next_lesson = next(l for l in lessons if l.id == ids[idx + 1])
|
||||||
|
except ValueError:
|
||||||
|
# current lesson not in list — keep prev/next as None
|
||||||
|
pass
|
||||||
|
|
||||||
# Public comments for the current lesson (top-level) and their replies
|
# Public comments for the current lesson (top-level) and their replies
|
||||||
replies_qs = Comment.objects.filter(is_active=True).select_related('user').order_by('created_at')
|
replies_qs = Comment.objects.filter(is_active=True).select_related('user').order_by('created_at')
|
||||||
comments = (
|
comments = (
|
||||||
|
|
@ -98,5 +112,7 @@ def lesson_detail(request, course_slug, module_slug, lesson_slug):
|
||||||
'lessons': lessons,
|
'lessons': lessons,
|
||||||
'comments': comments,
|
'comments': comments,
|
||||||
'comment_form': form,
|
'comment_form': form,
|
||||||
|
'prev_lesson': prev_lesson,
|
||||||
|
'next_lesson': next_lesson,
|
||||||
}
|
}
|
||||||
return render(request, 'courses/lesson.html', context)
|
return render(request, 'courses/lesson.html', context)
|
||||||
|
|
@ -71,7 +71,6 @@ TEMPLATES = [
|
||||||
'APP_DIRS': True,
|
'APP_DIRS': True,
|
||||||
'OPTIONS': {
|
'OPTIONS': {
|
||||||
'context_processors': [
|
'context_processors': [
|
||||||
'django.template.context_processors.debug',
|
|
||||||
'django.template.context_processors.request',
|
'django.template.context_processors.request',
|
||||||
'django.contrib.auth.context_processors.auth',
|
'django.contrib.auth.context_processors.auth',
|
||||||
'django.contrib.messages.context_processors.messages',
|
'django.contrib.messages.context_processors.messages',
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,26 @@
|
||||||
{% if lesson.video_id %}
|
{% if lesson.video_id %}
|
||||||
{% if not lesson.is_premium %}
|
{% if not lesson.is_premium %}
|
||||||
<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/{{ lesson.video_id }}?badge=0&autopause=0&player_id=0&app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="1"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
|
<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/{{ lesson.video_id }}?badge=0&autopause=0&player_id=0&app_id=58479" frameborder="0" allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share" referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;top:0;left:0;width:100%;height:100%;" title="1"></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
|
||||||
|
<div class="videoNav" style="display:flex; justify-content:space-between; gap:12px; margin:12px 0 20px 0;">
|
||||||
|
<div>
|
||||||
|
{% if prev_lesson %}
|
||||||
|
<a class="btn btn-secondary" href="{% url 'courses:lesson_detail' course.slug prev_lesson.module.slug prev_lesson.slug %}">
|
||||||
|
← Vidéo précédente
|
||||||
|
</a>
|
||||||
|
{% else %}
|
||||||
|
<span class="btn btn-secondary" aria-disabled="true" style="opacity:.5; pointer-events:none;">← Vidéo précédente</span>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{% if next_lesson %}
|
||||||
|
<a class="btn btn-primary" href="{% url 'courses:lesson_detail' course.slug next_lesson.module.slug next_lesson.slug %}">
|
||||||
|
Vidéo suivante →
|
||||||
|
</a>
|
||||||
|
{% else %}
|
||||||
|
<span class="btn btn-primary" aria-disabled="true" style="opacity:.5; pointer-events:none;">Vidéo suivante →</span>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if not user.profile.is_premium %}
|
{% if not user.profile.is_premium %}
|
||||||
<div class="alert premium-lock" role="note" aria-live="polite">
|
<div class="alert premium-lock" role="note" aria-live="polite">
|
||||||
|
|
@ -47,7 +67,6 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ lesson.content|safe }}
|
{{ lesson.content|safe }}
|
||||||
</article>
|
|
||||||
<h3 id="comments">Commentaires</h3>
|
<h3 id="comments">Commentaires</h3>
|
||||||
<div class="lessonComments">
|
<div class="lessonComments">
|
||||||
{% if comments %}
|
{% if comments %}
|
||||||
|
|
@ -229,8 +248,9 @@
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
</div>
|
</div> <!-- /.lessonComments -->
|
||||||
</div>
|
</div> <!-- /.lesson -->
|
||||||
|
</div> <!-- /.lessonInline -->
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</li>
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue