Affichage de la progression utilisateur dans les cours suivis et amélioration des templates associés.

This commit is contained in:
mrtoine 2025-12-16 13:55:14 +01:00
parent 81b42b8b4a
commit 8f0fad45be
4 changed files with 65 additions and 29 deletions

View file

@ -12,7 +12,7 @@ class CourseSitemap(sitemaps.Sitemap):
priority = 0.9 priority = 0.9
def items(self): def items(self):
return Course.objects.filter(enable=True) # Exemple de filtre return Course.objects.filter(enable=True).order_by('id')
def location(self, item): def location(self, item):
# Assure-toi que ton modèle Course a bien une méthode get_absolute_url # Assure-toi que ton modèle Course a bien une méthode get_absolute_url

View file

@ -6,12 +6,27 @@
{% endblock %} {% endblock %}
<div class="profile-details"> <div class="profile-details">
<h2>Mes cours</h2> <h2>Mes cours</h2>
<p>Retrouvez ici la liste de tous les cours que vous suivez.</p> <p>Retrouvez ici la liste de tous les cours que vous suivez et votre progression.</p>
<ul>
{% for course in user_courses %} {% if progress_list %}
<li><a href="{% url 'courses:show' course.name|slugify course.id %}">{{ course.name }}</a></li> <ul class="profile-courses">
{% endfor %} {% for p in progress_list %}
</ul> {% with course=p.course %}
<li>
<a href="{% url 'courses:show' course.name|slugify course.id %}">
{% if course.thumbnail %}
<img src="/{{ course.thumbnail }}" alt="{{ course.name }}" class="course-thumb-mini">
{% endif %}
<span>{{ course.name }}</span>
</a>
<div class="muted small">Progression: {{ p.percent_completed }}%</div>
</li>
{% endwith %}
{% endfor %}
</ul>
{% else %}
<p class="muted">Vous ne suivez aucun cours pour le moment.</p>
{% endif %}
</div> </div>
</section> </section>
{% endblock %} {% endblock %}

View file

@ -22,24 +22,27 @@
<div class="profile-card"> <div class="profile-card">
<h3>Mes cours</h3> <h3>Mes cours</h3>
{% with courses=user.course_set.all %} {% with progress_list=latest_progress %}
{% if courses %} {% if progress_list %}
<ul class="profile-courses"> <ul class="profile-courses">
{% for course in courses|slice:":6" %} {% for p in progress_list %}
<li> {% with course=p.course %}
<a href="{% url 'courses:show' course_id=course.id course_name=course.slug %}"> <li>
<img src="/{{ course.thumbnail }}" alt="{{ course.name }}" class="course-thumb-mini"> <a href="{% url 'courses:show' course_id=course.id course_name=course.slug %}">
<span>{{ course.name }}</span> <img src="/{{ course.thumbnail }}" alt="{{ course.name }}" class="course-thumb-mini">
</a> <span>{{ course.name }}</span>
</li> </a>
{% endfor %} <div class="muted small">Progression: {{ p.percent_completed }}%</div>
</ul> </li>
<div class="text-right"> {% endwith %}
<a class="btn btn-secondary btn-sm" href="{% url 'user_courses' %}">Voir tous mes cours</a> {% endfor %}
</div> </ul>
{% else %} <div class="text-right">
<p class="muted">Aucun cours suivi pour le moment.</p> <a class="btn btn-secondary btn-sm" href="{% url 'user_courses' %}">Voir tous mes cours</a>
{% endif %} </div>
{% else %}
<p class="muted">Aucun cours suivi pour le moment.</p>
{% endif %}
{% endwith %} {% endwith %}
</div> </div>

View file

@ -3,6 +3,7 @@ from django.contrib import messages
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
from django.contrib.auth.models import User from django.contrib.auth.models import User
from courses.models import Course from courses.models import Course
from progression.models import Progression
from .forms import UserRegistrationForm, UserLoginForm, UserUpdateForm, ProfileUpdateForm, CompleteProfileForm from .forms import UserRegistrationForm, UserLoginForm, UserUpdateForm, ProfileUpdateForm, CompleteProfileForm
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.mail import send_mail from django.core.mail import send_mail
@ -81,7 +82,17 @@ def logout(request):
def profile(request): def profile(request):
if not hasattr(request.user, 'profile'): if not hasattr(request.user, 'profile'):
return redirect('complete_profile') return redirect('complete_profile')
return render(request, 'users/profile.html')
latest_progress = (
Progression.objects
.filter(user=request.user)
.select_related('course')
.prefetch_related('completed_lessons')
.order_by('-updated_at')[:5]
)
# Affiche les 5 derniers cours regardés avec leur progression
return render(request, 'users/profile.html', {'latest_progress': latest_progress})
@login_required(login_url='login') @login_required(login_url='login')
def complete_profile(request): def complete_profile(request):
@ -130,9 +141,16 @@ def account_update(request):
@login_required(login_url='login') @login_required(login_url='login')
def my_courses(request): def my_courses(request):
user_courses = Course.objects.filter(author=request.user.id) # Liste tous les cours suivis par l'utilisateur avec leur progression
print(user_courses) progress_list = (
return render(request, 'users/my_courses.html', {'user_courses' : user_courses}) Progression.objects
.filter(user=request.user)
.select_related('course')
.prefetch_related('completed_lessons')
.order_by('-updated_at')
)
return render(request, 'users/my_courses.html', {'progress_list': progress_list})
def create_post(request): def create_post(request):
# Implement post creation logic here # Implement post creation logic here