First commit

This commit is contained in:
mrtoine 2025-09-12 11:07:53 +02:00
commit 440f5a7df4
1563 changed files with 217996 additions and 0 deletions

0
users/__init__.py Normal file
View file

3
users/admin.py Normal file
View file

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

9
users/apps.py Normal file
View file

@ -0,0 +1,9 @@
from django.apps import AppConfig
class UsersConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'users'
def ready(self):
import users.signals

56
users/forms.py Normal file
View file

@ -0,0 +1,56 @@
from django import forms
from django.contrib.auth.models import User
from .models import Profile
class UserRegistrationForm(forms.Form):
username = forms.CharField(
label='Username',
max_length=150,
widget=forms.TextInput(attrs={'class': 'form-group'})
)
email = forms.EmailField(
label='Email',
widget=forms.EmailInput(attrs={'class': 'form-group'})
)
password1 = forms.CharField(
label='Password',
widget=forms.PasswordInput(attrs={'class': 'form-group'})
)
password2 = forms.CharField(
label='Confirm Password',
widget=forms.PasswordInput(attrs={'class': 'form-group'})
)
def clean(self):
cleaned_data = super().clean()
password1 = cleaned_data.get("password1")
password2 = cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords do not match")
class UserLoginForm(forms.Form):
username = forms.CharField(
label='Username',
max_length=150,
widget=forms.TextInput(attrs={'class': 'form-group'})
)
password = forms.CharField(
label='Password',
widget=forms.PasswordInput(attrs={'class': 'form-group'})
)
class UserUpdateForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'email']
class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['avatar', 'biography']
class CompleteProfileForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['avatar', 'first_name', 'last_name', 'birth_date', 'biography']

9
users/middleware.py Normal file
View file

@ -0,0 +1,9 @@
class StoreCurrentUrlMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.method == 'GET' and not request.headers.get('X-Requested-With') == 'XMLHttpRequest':
request.session['previous_url'] = request.get_full_path()
response = self.get_response(request)
return response

View file

@ -0,0 +1,29 @@
# Generated by Django 4.2.17 on 2024-12-13 10:29
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Profile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('avatar', models.ImageField(default='default.jpg', upload_to='static/uploads/avatars/')),
('first_name', models.CharField(blank=True, max_length=64)),
('last_name', models.CharField(blank=True, max_length=64)),
('birth_date', models.DateField(blank=True, null=True)),
('biography', models.TextField(blank=True)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View file

@ -0,0 +1,19 @@
# Generated by Django 4.2.17 on 2024-12-14 09:46
from django.db import migrations, models
import users.models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='profile',
name='avatar',
field=models.ImageField(default='default.jpg', upload_to=users.models.user_avatar_path),
),
]

View file

16
users/models.py Normal file
View file

@ -0,0 +1,16 @@
from django.db import models
from django.contrib.auth.models import User
def user_avatar_path(instance, filename):
return f'static/uploads/avatars/{instance.user.id}/{filename}'
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(upload_to=user_avatar_path, default='default.jpg')
first_name = models.CharField(max_length=64, blank=True)
last_name = models.CharField(max_length=64, blank=True)
birth_date = models.DateField(null=True, blank=True)
biography = models.TextField(blank=True)
def __str__(self):
return self.user.username

15
users/signals.py Normal file
View file

@ -0,0 +1,15 @@
# signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
if hasattr(instance, 'profile'):
instance.profile.save()

3
users/tests.py Normal file
View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

19
users/urls.py Normal file
View file

@ -0,0 +1,19 @@
# webapp/auth/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.register, name='register'),
path('login/', views.login, name='login'),
path('logout/', views.logout, name='logout'),
path('profile/view/<int:user_id>/', views.another_profile, name='another_profile'),
path('complete-profile/', views.complete_profile, name='complete_profile'),
path('profile/', views.profile, name='profile'),
path('profile/update', views.profile_update, name='profile_update'),
path('profile/account/update', views.account_update, name='account_update'),
path('profile/account/mycourses', views.my_courses, name='user_courses'),
path('profile/page/post', views.create_post, name='profile_create_post'),
path('profile/<path:page>', views.profile, name='profile_page'),
path('profile/<int:user_id>/<path:page>/', views.profile, name='profile_id_page'),
]

108
users/views.py Normal file
View file

@ -0,0 +1,108 @@
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
from django.contrib.auth.models import User
from courses.models import Course
from .forms import UserRegistrationForm, UserLoginForm, UserUpdateForm, ProfileUpdateForm, CompleteProfileForm
from django.contrib.auth.decorators import login_required
def register(request):
# Si l'utilisateur est deja connecté, on le redirige vers la page de profil
if request.user.is_authenticated:
return redirect('profile')
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
email=form.cleaned_data['email'],
password=form.cleaned_data['password1']
)
auth_login(request, user)
return redirect('profile')
else:
form = UserRegistrationForm()
return render(request, 'users/register.html', {'form': form})
def login(request):
if request.method == 'POST':
form = UserLoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(request, username=username, password=password)
if user is not None:
auth_login(request, user)
return redirect('profile')
else:
form = UserLoginForm()
return render(request, 'users/login.html', {'form': form})
def logout(request):
auth_logout(request)
return redirect('login')
@login_required(login_url='login')
def profile(request):
if not hasattr(request.user, 'profile'):
return redirect('complete_profile')
return render(request, 'users/profile.html')
@login_required(login_url='login')
def complete_profile(request):
if hasattr(request.user, 'profile'):
return redirect('profile') # Redirige si le profil existe déjà
if request.method == 'POST':
form = CompleteProfileForm(request.POST)
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.save()
messages.success(request, 'Votre profil a été créé avec succès !')
return redirect('profile')
else:
form = CompleteProfileForm()
return render(request, 'users/complete_profile.html', {'form': form})
@login_required(login_url='login')
def profile_update(request):
if request.method == 'POST':
user_form = UserUpdateForm(request.POST, instance=request.user)
profile_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
if profile_form.is_valid():
profile_form.save()
messages.success(request, 'Votre profil a été mis à jour avec succès !')
return redirect('profile')
else:
user_form = UserUpdateForm(instance=request.user)
profile_form = ProfileUpdateForm(instance=request.user.profile)
return render(request, 'users/profile_update.html', {'user_form': user_form, 'profile_form': profile_form})
@login_required(login_url='login')
def account_update(request):
if request.method == 'POST':
user_form = UserUpdateForm(request.POST, instance=request.user)
if user_form.is_valid():
user_form.save()
# On affiche un message flash pour confirmer la modification
messages.success(request, 'Les paramètre de votre compte ont été mis à jour avec succès !')
return redirect('profile')
else:
user_form = UserUpdateForm(instance=request.user)
return render(request, 'users/account_update.html', {'user_form': user_form})
@login_required(login_url='login')
def my_courses(request):
user_courses = Course.objects.filter(author=request.user.id)
print(user_courses)
return render(request, 'users/my_courses.html', {'user_courses' : user_courses})
def create_post(request):
# Implement post creation logic here
return render(request, 'users/create_post.html')
def another_profile(request, user_id):
user = User.objects.get(id=user_id)
return render(request, 'users/another_profile.html', {'user': user})