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

0
messagerie/__init__.py Normal file
View file

3
messagerie/admin.py Normal file
View file

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

6
messagerie/apps.py Normal file
View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class MessagerieConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'messagerie'

View file

@ -0,0 +1,24 @@
from .models import PrivateMessageSubject, PrivateMessage
from django.db.models import Q
def pending_pm_count(request):
if request.user.is_authenticated:
# Filtrer les sujets de messages où l'utilisateur est soit le receiver soit le sender
pm_subjects = PrivateMessageSubject.objects.filter(
Q(receiver=request.user) | Q(sender=request.user)
)
# Initialiser le compteur de messages non lus
count = 0
# Parcourir chaque sujet de message
for subject in pm_subjects:
# Récupérer le dernier message du sujet
last_message = subject.messages.order_by('-date_sent').first()
# Vérifier si le dernier message n'est pas de l'utilisateur actuel et si le sujet n'est pas lu
if last_message and last_message.author != request.user and not subject.is_read:
count += 1
return {'pending_pm_count': count}
return {'pending_pm_count': 0}

23
messagerie/forms.py Normal file
View file

@ -0,0 +1,23 @@
# Forms pour la messagerie
from django import forms
from .models import PrivateMessageSubject, PrivateMessage
class PrivateMessageSubjectForm(forms.ModelForm):
class Meta:
model = PrivateMessageSubject
fields = ['receiver', 'subject']
labels = {
'receiver': 'Destinataire',
'subject': 'Sujet'
}
class PrivateMessageForm(forms.ModelForm):
class Meta:
model = PrivateMessage
fields = ['message']
labels = {
'message': ''
}
widgets = {
'message': forms.Textarea(attrs={'placeholder': 'Votre message'})
}

View file

@ -0,0 +1,34 @@
# Generated by Django 4.2.17 on 2025-01-06 10:49
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='PrivateMessage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('subject', models.CharField(max_length=100)),
('message', models.TextField()),
('date_sent', models.DateTimeField(auto_now_add=True)),
('is_read', models.BooleanField(default=False)),
('receiver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_messages', to=settings.AUTH_USER_MODEL)),
('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sent_messages', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Message privé',
'verbose_name_plural': 'Messages privés',
'ordering': ['-date_sent'],
},
),
]

View file

@ -0,0 +1,53 @@
# Generated by Django 4.2.17 on 2025-01-06 11:33
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('messagerie', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='privatemessage',
name='is_read',
),
migrations.RemoveField(
model_name='privatemessage',
name='receiver',
),
migrations.RemoveField(
model_name='privatemessage',
name='sender',
),
migrations.AddField(
model_name='privatemessage',
name='author',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='author_messages', to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='privatemessage',
name='id',
field=models.AutoField(primary_key=True, serialize=False),
),
migrations.CreateModel(
name='PrivateMessageSubject',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('subject', models.CharField(max_length=100)),
('is_read', models.BooleanField(default=False)),
('receiver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_messages', to=settings.AUTH_USER_MODEL)),
('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sent_messages', to=settings.AUTH_USER_MODEL)),
],
),
migrations.AlterField(
model_name='privatemessage',
name='subject',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='messagerie.privatemessagesubject'),
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 4.2.17 on 2025-01-06 13:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('messagerie', '0002_remove_privatemessage_is_read_and_more'),
]
operations = [
migrations.AddField(
model_name='privatemessagesubject',
name='is_active',
field=models.BooleanField(default=True),
),
]

View file

28
messagerie/models.py Normal file
View file

@ -0,0 +1,28 @@
from django.db import models
from users.models import User
# Création d'une messagerie privée pour les membres
class PrivateMessageSubject(models.Model):
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_messages')
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sent_messages')
subject = models.CharField(max_length=100)
is_read = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
def __str__(self):
return f'Sujet: {self.subject} (De: {self.sender.username} À: {self.receiver.username})'
class PrivateMessage(models.Model):
id = models.AutoField(primary_key=True)
subject = models.ForeignKey(PrivateMessageSubject, on_delete=models.CASCADE, related_name='messages')
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author_messages', default=1)
message = models.TextField()
date_sent = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.author.username} ({self.date_sent})'
class Meta:
verbose_name = 'Message privé'
verbose_name_plural = 'Messages privés'
ordering = ['-date_sent']

3
messagerie/tests.py Normal file
View file

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

13
messagerie/urls.py Normal file
View file

@ -0,0 +1,13 @@
# urls messagerie
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='pm_home'),
path('view/<int:message_id>/', views.view_message, name='pm_view'),
path('new/', views.new_message, name='pm_new'),
path('delete/<int:message_id>/', views.delete_subject, name='pm_delete'),
path('send_all_users/', views.send_all_users, name='pm_send_all_users'),
]

122
messagerie/views.py Normal file
View file

@ -0,0 +1,122 @@
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import PrivateMessage, PrivateMessageSubject
from django.db import models
from django.db.models import Max
from .forms import PrivateMessageForm, PrivateMessageSubjectForm
from django.contrib import messages
@login_required
def home(request):
private_messages = PrivateMessageSubject.objects.filter(
(models.Q(receiver=request.user) | models.Q(sender=request.user)) & models.Q(is_active=True)
).annotate(last_message_date=Max('messages__date_sent')).order_by('-last_message_date')
return render(request, 'messagerie/home.html', {'private_messages': private_messages})
@login_required
def view_message(request, message_id):
pm_message = PrivateMessageSubject.objects.get(pk=message_id)
if (pm_message.receiver != request.user and pm_message.sender != request.user) or not pm_message.is_active:
return redirect('pm_home')
private_messages = PrivateMessage.objects.filter(subject=pm_message).order_by('date_sent')
form = PrivateMessageForm(request.POST or None)
if not pm_message.is_read and pm_message.messages.first().author != request.user:
pm_message.is_read = True
pm_message.save()
if form.is_valid():
message = form.save(commit=False)
message.author = request.user
message.subject = pm_message
message.save()
pm_message.is_read = False
pm_message.save()
form = PrivateMessageForm()
return render(request, 'messagerie/view_message.html', {'pm_message': pm_message, 'private_messages': private_messages, 'form': form})
return render(request, 'messagerie/view_message.html', {'pm_message': pm_message, 'private_messages': private_messages, 'form': form})
@login_required
def new_message(request):
form_subject = PrivateMessageSubjectForm(request.POST or None)
form_message = PrivateMessageForm(request.POST or None)
if form_subject.is_valid() and form_message.is_valid():
if form_subject.cleaned_data['receiver'] == request.user:
messages.error(request, 'Vous ne pouvez pas vous envoyer un message à vous-même')
return redirect('pm_home')
subject = form_subject.save(commit=False)
subject.sender = request.user
subject.is_read = False
subject.save()
message = form_message.save(commit=False)
message.author = request.user
message.subject = subject
message.save()
return redirect('pm_view', message_id=message.id)
return render(request, 'messagerie/new_message.html', {'form_subject': form_subject, 'form_message': form_message})
def delete_subject(request, message_id):
pm_message = PrivateMessageSubject.objects.get(pk=message_id)
if pm_message.receiver != request.user and pm_message.sender != request.user:
return redirect('pm_home')
pm_message.is_active = False
pm_message.is_read = True
pm_message.save()
messages.success(request, 'Le sujet a bien été supprimé')
return redirect('pm_home')
@login_required
def send_all_users(request):
from users.models import User
all_users = User.objects.all()
sender = User.objects.get(username='RetroBot')
for user in all_users:
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]""")
subject = PrivateMessageSubject.objects.create(receiver=user, sender=sender, subject='Bienvenue sur la messagerie privée')
PrivateMessage.objects.create(
subject=subject,
author=sender,
message=f"Cher [b]{user.username}[/b],\n\nBienvenue sur la messagerie privée de passion-retro. Tu peux désormais échanger des messages privés avec les autres membres du site.\n\nQuant a moi, je suis un nouvel utilisateur du site venu de la planète [b]Retronia[/b] ! J'ai été investis de la mission la plus importante de ma longue vie : [u]être le meilleur assistant de passion-retro[/u] ! J'espère sincèrement y parvenir !\n\nJe suis encore en orbite actuellement, mais guette les infos car je serait bientôt présent !\n\nCordialement,\n{sender.username}"
)
return redirect('pm_home')