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:
mrtoine 2025-12-12 10:56:46 +01:00
parent c70c5574cd
commit 22e19033ff
5 changed files with 42 additions and 7 deletions

View file

@ -3,4 +3,4 @@ from django.apps import AppConfig
class CoursesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'courses'
name = 'courses'

View file

@ -3,7 +3,7 @@ from . import views
app_name = 'courses'
urlpatterns = [
path('', views.list, name='list'),
path('', views.list_courses, name='list'),
# 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_name>-<int:course_id>/', views.show, name="show"),

View file

@ -5,7 +5,7 @@ from django.db.models import Prefetch
from .models import Course, Lesson, Module, Comment
from .forms import CommentForm
def list(request):
def list_courses(request):
courses = Course.objects.all()
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')
)
# 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
replies_qs = Comment.objects.filter(is_active=True).select_related('user').order_by('created_at')
comments = (
@ -98,5 +112,7 @@ def lesson_detail(request, course_slug, module_slug, lesson_slug):
'lessons': lessons,
'comments': comments,
'comment_form': form,
'prev_lesson': prev_lesson,
'next_lesson': next_lesson,
}
return render(request, 'courses/lesson.html', context)

View file

@ -71,7 +71,6 @@ TEMPLATES = [
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',

View file

@ -21,6 +21,26 @@
{% if lesson.video_id %}
{% 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&amp;autopause=0&amp;player_id=0&amp;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 %}
{% if not user.profile.is_premium %}
<div class="alert premium-lock" role="note" aria-live="polite">
@ -47,7 +67,6 @@
{% endif %}
{% endif %}
{{ lesson.content|safe }}
</article>
<h3 id="comments">Commentaires</h3>
<div class="lessonComments">
{% if comments %}
@ -229,8 +248,9 @@
});
})();
</script>
</div>
</div>
</div> <!-- /.lessonComments -->
</div> <!-- /.lesson -->
</div> <!-- /.lessonInline -->
{% endif %}
</li>
{% endfor %}