First Commit

This commit is contained in:
mrtoine 2025-09-12 11:11:44 +02:00
commit ce0758fbbb
496 changed files with 52062 additions and 0 deletions

308
users/views.py Executable file
View file

@ -0,0 +1,308 @@
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login as auth_login
from django.contrib.auth.forms import AuthenticationForm
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import PostForm, UserRegistrationForm, UserLoginForm, UserUpdateForm, ProfileUpdateForm
from posts.models import Post
from django.utils.text import slugify
from django.template.loader import render_to_string
from django.core.mail import send_mail
from django.conf import settings
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes, force_str
from .models import User, UserLevel
from django.db.models import F
import urllib.request
import json
def register(request):
from messagerie.models import PrivateMessageSubject, PrivateMessage
if request.user.is_authenticated:
return redirect('profile')
if request.method == "POST":
form = UserRegistrationForm(request.POST)
recaptcha = request.POST.get('g-recaptcha-response')
if form.is_valid():
url = 'https://www.google.com/recaptcha/api/siteverify'
values = {
'secret': settings.GOOGLE_PRIVATE_KEY,
'response': recaptcha
}
data = urllib.parse.urlencode(values).encode()
req = urllib.request.Request(url, data=data)
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode())
if result['success']:
user = User.objects.create_user(
username=form.cleaned_data['username'],
email=form.cleaned_data['email'],
password=form.cleaned_data['password1'],
theme='00s',
active=True
)
messages.success(request, f"Bonjour et bienvenue {user.username} ! Ton compte à été créer avec succès. Tu peux désormais te connecter.")
subject = PrivateMessageSubject.objects.create(
receiver=user,
sender=User.objects.get(username='RetroBot'),
subject="Bienvenue sur PassionRetro !"
)
PrivateMessage.objects.create(
subject=subject,
author=User.objects.get(username='RetroBot'),
message=f"""[b]Bienvenue sur Passion Retro ![/b]
Salut [b]{user.username}[/b] !,
Merci de nous avoir rejoints dans cette aventure dédiée aux passionnés de rétro ! Que tu sois fan de consoles vintage, collectionneur d'objets d'époque ou simple curieux, tu es ici chez toi.
[b]Découvre tout ce que Passion Retro a à offrir :[/b]
Plonge dans nos articles pour en apprendre plus sur les trésors du passé, participe aux discussions sur le forum et teste tes connaissances avec nos jeux rétro. Chaque section est pour te permettre de partager ta passion et d'en apprendre davantage.
🚀 [b]Rejoins la communauté :[/b]
Ton avis et tes contributions sont précieux ! Nhésite pas à lancer une discussion sur le forum, à réagir aux articles ou à défier les autres membres sur nos jeux. Plus nous sommes actifs, plus lexpérience sera enrichissante pour tous.
Si tu as des questions ou des suggestions pour améliorer le site, contacte-nous. Nous sommes pour t'accompagner !
Encore une fois, bienvenue parmi nous et prépare-toi à replonger dans lunivers du rétro !
À bientôt,
[b]L'équipe Passion Retro[/b]""")
return redirect('login')
else:
messages.error(request, f"On y est presque ! Vérifie bien le captcha pour finaliser ton inscription.")
form = UserRegistrationForm()
return render(request, 'users/register.html', {'form': form, 'GOOGLE_PUBLIC_KEY': settings.GOOGLE_PUBLIC_KEY})
def register_with_token(request):
# Si l'utilisateur est deja connecté, on le redirige vers la page de pr>
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']
)
genToken = PasswordResetTokenGenerator()
token = genToken.make_token(user)
uid = urlsafe_base64_encode(force_bytes(user.pk))
activation_link = request.build_absolute_uri(f"/users/activate/{uid}/{token}")
email_subject = 'Activation de votre compte'
email_body = render_to_string('emails/activation_account.html', {
'user': user,
'activation_link': activation_link,
})
send_mail(
email_subject,
email_body,
settings.DEFAULT_FROM_EMAIL,
[user.email],
fail_silently=False,
)
messages.success(request, f"Ton compte a été créé avec succès, {user.username}! Un email d'activation t'a été envoyé pour valider ton inscription.")
return redirect('login')
else:
form = UserRegistrationForm()
return render(request, 'users/register.html', {'form': form})
def activate(request, uidb64, token):
uid = None # Initialisation de la variable uid
try:
uid = force_str(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
token_generator = PasswordResetTokenGenerator()
if user is not None and token_generator.check_token(user, token):
user.active = True
user.save()
messages.success(request, "Votre compte a été activé avec succès.")
return redirect('login')
else:
messages.error(request, "Le lien d'activation est invalide.")
return redirect('register')
def login(request):
if request.method == 'POST':
form = UserLoginForm(data=request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is None:
messages.error(request, "Nom d'utilisateur ou mot de passe incorrect.")
return redirect('login')
if user.active == False:
messages.error(request, "Votre compte n'est pas activé. Veuillez vérifier votre boîte mail.")
return redirect('login')
auth_login(request, user)
messages.success(request, f"Bienvenue, {username}!")
return redirect('home')
else:
messages.error(request, "Nom d'utilisateur ou mot de passe incorrect.")
else:
form = UserLoginForm()
return render(request, 'users/login.html', {'form': form})
def profile(request):
from forum.models import Topic, Post
from posts.models import Post
user = User.objects.get(id=request.user.id)
# On compte le nombre de topics du forum de l'utilisateur
topics = Topic.objects.filter(author=user).count()
forum_posts = Post.objects.filter(author=user).count()
posts = Post.objects.filter(author=user).count()
return render(request, 'users/profile.html', { 'user': user, 'topics': topics, 'forum_posts': forum_posts, 'posts': posts })
def another_profile(request, user_id):
from forum.models import Topic, Post
from posts.models import Post
user = User.objects.get(id=user_id)
# On compte le nombre de topics du forum de l'utilisateur
topics = Topic.objects.filter(author=user).count()
forum_posts = Post.objects.filter(author=user).count()
posts = Post.objects.filter(author=user).count()
return render(request, 'users/profile.html', {'user': user, 'topics': topics, 'forum_posts': forum_posts, 'posts': posts})
@login_required(login_url='login')
def profile_update(request):
if request.method == 'POST':
user_form = UserUpdateForm(request.POST, request.FILES, instance=request.user)
if user_form.is_valid():
user_form.save()
messages.success(request, 'Votre profil a été mis à jour avec succès !')
return redirect('profile')
else:
user_form = UserUpdateForm(instance=request.user)
return render(request, 'users/profile_update.html', {'user_form': user_form})
@login_required
def contribute(request):
return render(request, "users/contribute.html")
@login_required(login_url='register')
def form_contribute(request, type):
if request.method == 'POST':
# Initialisation des articles
form = PostForm(request.POST)
posts = []
# Traite l'article principal (parent)
main_title = request.POST.get('title') # Titre principal du formulaire Django
main_content = request.POST.get('content') # Contenu principal
parent_post = None
if main_title and main_content:
# Crée le parent
parent_post = Post.objects.create(
title=main_title,
slug=slugify(main_title),
content=main_content,
type=type,
author=request.user,
contribution=True,
parent=True
)
posts.append(parent_post)
UserLevel.objects.update(user=request.user, experience=F('experience') + 10)
# Vérifie si des articles dynamiques existent (type_form = multiple)
type_form = request.POST.get('type_form')
if type_form == 'multiple':
# Parcourt les champs dynamiques ajoutés en JS
for key in request.POST:
if key.startswith('title-post-'):
# Récupère le numéro de l'article
article_number = key.split('-')[-1]
# Récupère les données de l'article enfant
title = request.POST.get(f'title-post-{article_number}')
content = request.POST.get(f'content-post-{article_number}')
if title and content:
# Crée l'article enfant
child_post = Post.objects.create(
title=title,
slug=slugify(title),
content=content,
type=type,
author=request.user,
contribution=True,
parent=False,
post_parent=parent_post
)
posts.append(child_post)
UserLevel.objects.update(user=request.user, experience=F('experience') + 5)
messages.success(request, "Vos articles ont été soumis avec succès !")
context = {
'type': type,
'form': PostForm(),
}
return render(request, "users/form_contribute.html", context)
@login_required()
def contributions(request):
posts = Post.objects.filter(author=request.user)
return render(request, "users/contributions.html", {'posts':posts})
@login_required
def new_feature_user(request):
# On créer une entree dans la table user_level pour l'utilisateur si il n'en a pas
if not request.user.level:
request.user.levels.create(level=1)
return render(request, "features/new_feature_user_level.html")
if not request.user.inventory.exists():
request.user.inventory.create(item_id=1, quantity=100)
return render(request, "features/new_feature_user_inventory.html")
@login_required
def use_item(request, item_id):
item = request.user.inventory.get(item_id=item_id)
# On slugify le nom de l'item pour l'utiliser dans les conditions
item_name = slugify(item.item.name)
if item.quantity > 0:
if item.item.category.name == 'cadres':
request.user.border_avatar = item_name
if item.item.category.name == 'themes':
request.user.theme_active = item_name
if item.item.category.name == 'Décoration pseudo':
request.user.username_decoration = item_name
request.user.save()
messages.success(request, f"Vous avez utilisé {item.item.name}.")
else:
messages.error(request, f"Vous n'avez pass de {item.item.name}.")
return redirect('profile')