First Commit
This commit is contained in:
commit
ce0758fbbb
496 changed files with 52062 additions and 0 deletions
0
messagerie/__init__.py
Normal file
0
messagerie/__init__.py
Normal file
3
messagerie/admin.py
Normal file
3
messagerie/admin.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
messagerie/apps.py
Normal file
6
messagerie/apps.py
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MessagerieConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'messagerie'
|
||||
24
messagerie/context_processors.py
Normal file
24
messagerie/context_processors.py
Normal 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
23
messagerie/forms.py
Normal 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'})
|
||||
}
|
||||
34
messagerie/migrations/0001_initial.py
Normal file
34
messagerie/migrations/0001_initial.py
Normal 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'],
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
@ -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'),
|
||||
),
|
||||
]
|
||||
|
|
@ -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),
|
||||
),
|
||||
]
|
||||
0
messagerie/migrations/__init__.py
Normal file
0
messagerie/migrations/__init__.py
Normal file
28
messagerie/models.py
Normal file
28
messagerie/models.py
Normal 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
3
messagerie/tests.py
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
13
messagerie/urls.py
Normal file
13
messagerie/urls.py
Normal 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
122
messagerie/views.py
Normal 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 là 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 ! N’hé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 l’expérience sera enrichissante pour tous.
|
||||
|
||||
Si tu as des questions ou des suggestions pour améliorer le site, contacte-nous. Nous sommes là pour t'accompagner !
|
||||
|
||||
Encore une fois, bienvenue parmi nous et prépare-toi à replonger dans l’univers 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')
|
||||
Loading…
Add table
Add a link
Reference in a new issue