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,4 +3,4 @@ from django.apps import AppConfig
|
|||
|
||||
class CoursesConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'courses'
|
||||
name = 'courses'
|
||||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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&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 %}
|
||||
{% 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 %}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue