7 changed files with 176 additions and 17 deletions
-
2apps/account/models/user.py
-
51apps/chat/admin.py
-
49apps/chat/migrations/0002_auto_20241125_1219.py
-
68apps/chat/models.py
-
3apps/course/apps.py
-
19apps/course/signals.py
-
1config/urls.py
@ -1,3 +1,52 @@ |
|||||
from django.contrib import admin |
from django.contrib import admin |
||||
|
|
||||
# Register your models here. |
|
||||
|
from apps.chat.models import RoomMessage, ChatMessage |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
@admin.register(RoomMessage) |
||||
|
class RoomMessageAdmin(admin.ModelAdmin): |
||||
|
list_display = ( |
||||
|
'name', 'room_type', 'course', 'initiator', 'recipient', 'created_at', |
||||
|
) |
||||
|
list_filter = ('room_type', 'created_at', 'updated_at', 'course') |
||||
|
search_fields = ('name', 'description', 'course__title', 'initiator__username', 'recipient__username') |
||||
|
ordering = ('-created_at',) |
||||
|
readonly_fields = ('created_at', 'updated_at') |
||||
|
fieldsets = ( |
||||
|
(None, { |
||||
|
'fields': ('name', 'description', 'room_type') |
||||
|
}), |
||||
|
('Relations', { |
||||
|
'fields': ('course', 'initiator', 'recipient') |
||||
|
}), |
||||
|
('Timestamps', { |
||||
|
'fields': ('created_at', 'updated_at') |
||||
|
}), |
||||
|
) |
||||
|
|
||||
|
|
||||
|
@admin.register(ChatMessage) |
||||
|
class ChatMessageAdmin(admin.ModelAdmin): |
||||
|
list_display = ( |
||||
|
'room', 'sender', 'content_type', 'content_size', 'sent_at', 'is_deleted' |
||||
|
) |
||||
|
list_filter = ('content_type', 'is_deleted', 'sent_at', 'updated_at') |
||||
|
search_fields = ('room__name', 'sender__username', 'content') |
||||
|
ordering = ('-sent_at',) |
||||
|
readonly_fields = ('sent_at', 'updated_at') |
||||
|
fieldsets = ( |
||||
|
(None, { |
||||
|
'fields': ('room', 'sender', 'content', 'content_type') |
||||
|
}), |
||||
|
('Additional Info', { |
||||
|
'fields': ('content_size',) |
||||
|
}), |
||||
|
('Status', { |
||||
|
'fields': ('is_deleted', 'deleted_at') |
||||
|
}), |
||||
|
('Timestamps', { |
||||
|
'fields': ('sent_at', 'updated_at') |
||||
|
}), |
||||
|
) |
||||
@ -0,0 +1,49 @@ |
|||||
|
# Generated by Django 3.2.4 on 2024-11-25 12:19 |
||||
|
|
||||
|
from django.conf import settings |
||||
|
from django.db import migrations, models |
||||
|
import django.db.models.deletion |
||||
|
|
||||
|
|
||||
|
class Migration(migrations.Migration): |
||||
|
|
||||
|
dependencies = [ |
||||
|
('course', '0004_auto_20241122_1913'), |
||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL), |
||||
|
('chat', '0001_initial'), |
||||
|
] |
||||
|
|
||||
|
operations = [ |
||||
|
migrations.RemoveField( |
||||
|
model_name='chatmessage', |
||||
|
name='course', |
||||
|
), |
||||
|
migrations.RemoveField( |
||||
|
model_name='chatmessage', |
||||
|
name='is_to_professor', |
||||
|
), |
||||
|
migrations.RemoveField( |
||||
|
model_name='chatmessage', |
||||
|
name='recipient', |
||||
|
), |
||||
|
migrations.CreateModel( |
||||
|
name='RoomMessage', |
||||
|
fields=[ |
||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
||||
|
('name', models.CharField(max_length=255, verbose_name='Room Name')), |
||||
|
('description', models.TextField(blank=True, null=True, verbose_name='Description')), |
||||
|
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), |
||||
|
('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), |
||||
|
('room_type', models.CharField(choices=[('group', 'Group'), ('private', 'Private')], default='group', max_length=10, verbose_name='Room Type')), |
||||
|
('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='room_messages', to='course.course', verbose_name='Course')), |
||||
|
('initiator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='initiated_rooms', to=settings.AUTH_USER_MODEL, verbose_name='Initiator')), |
||||
|
('recipient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='messages_received', to=settings.AUTH_USER_MODEL, verbose_name='Recipient')), |
||||
|
], |
||||
|
), |
||||
|
migrations.AddField( |
||||
|
model_name='chatmessage', |
||||
|
name='room', |
||||
|
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='chat.roommessage', verbose_name='Room'), |
||||
|
preserve_default=False, |
||||
|
), |
||||
|
] |
||||
@ -0,0 +1,19 @@ |
|||||
|
|
||||
|
from django.db.models.signals import post_save |
||||
|
from django.dispatch import receiver |
||||
|
from apps.course.models import Course |
||||
|
from apps.chat.models import RoomMessage |
||||
|
|
||||
|
|
||||
|
@receiver(post_save, sender=Course) |
||||
|
def create_room_message_for_course(sender, instance, created, **kwargs): |
||||
|
if created: # فقط برای موارد جدید اجرا شود |
||||
|
RoomMessage.objects.create( |
||||
|
name=f"{instance.title} - Group", |
||||
|
description=f"Group chat for course: {instance.title}", |
||||
|
initiator=instance.professor, # استاد بهعنوان سازنده اتاق |
||||
|
course=instance, |
||||
|
room_type=RoomMessage.RoomTypeChoices.GROUP |
||||
|
) |
||||
|
|
||||
|
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue