First commit
This commit is contained in:
commit
440f5a7df4
1563 changed files with 217996 additions and 0 deletions
0
users/__init__.py
Normal file
0
users/__init__.py
Normal file
3
users/admin.py
Normal file
3
users/admin.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
9
users/apps.py
Normal file
9
users/apps.py
Normal 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
56
users/forms.py
Normal 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
9
users/middleware.py
Normal 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
|
||||
29
users/migrations/0001_initial.py
Normal file
29
users/migrations/0001_initial.py
Normal 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)),
|
||||
],
|
||||
),
|
||||
]
|
||||
19
users/migrations/0002_alter_profile_avatar.py
Normal file
19
users/migrations/0002_alter_profile_avatar.py
Normal 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),
|
||||
),
|
||||
]
|
||||
0
users/migrations/__init__.py
Normal file
0
users/migrations/__init__.py
Normal file
16
users/models.py
Normal file
16
users/models.py
Normal 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
15
users/signals.py
Normal 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
3
users/tests.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
19
users/urls.py
Normal file
19
users/urls.py
Normal 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
108
users/views.py
Normal 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})
|
||||
Loading…
Add table
Add a link
Reference in a new issue