Skip to content
This repository was archived by the owner on Nov 5, 2025. It is now read-only.

Commit a738c69

Browse files
committed
send messages from worker
1 parent d56670d commit a738c69

File tree

16 files changed

+187
-56
lines changed

16 files changed

+187
-56
lines changed

.devcontainer/Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
FROM mcr.microsoft.com/devcontainers/python:3.12-bookworm
2+
3+
# Install django cli
4+
RUN pip install django

.devcontainer/devcontainer.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"build": {
3+
"dockerfile": "Dockerfile",
4+
"context": ".."
5+
},
6+
"features": {
7+
"ghcr.io/defanglabs/devcontainer-feature/defang-cli:1.0.4": {},
8+
"ghcr.io/devcontainers/features/docker-in-docker:2": {}
9+
}
10+
}

.env.dev

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
POSTGRES_PASSWORD=postgres
2+
DJANGO_SECRET_KEY=insecure-default-key-for-dev

.env.local

Lines changed: 0 additions & 3 deletions
This file was deleted.

.github/workflows/deploy.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name: Deploy
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
jobs:
9+
deploy:
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: read
13+
id-token: write
14+
15+
steps:
16+
- name: Checkout Repo
17+
uses: actions/checkout@v4
18+
19+
- name: Deploy
20+
uses: DefangLabs/[email protected]
21+
with:
22+
config-env-vars: DJANGO_SECRET_KEY POSTGRES_PASSWORD
23+
env:
24+
DJANGO_SECRET_KEY: ${{ secrets.DJANGO_SECRET_KEY }}
25+
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}

app/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ENV PYTHONDONTWRITEBYTECODE=1
66
ENV PYTHONUNBUFFERED=1
77

88
RUN apt-get update && \
9-
apt-get install -y --no-install-recommends gcc libpq-dev && \
9+
apt-get install -y --no-install-recommends curl gcc libpq-dev netcat-traditional && \
1010
rm -rf /var/lib/apt/lists/*
1111

1212
COPY requirements.txt .

app/chat/consumers.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,24 +56,7 @@ async def receive(self, text_data):
5656

5757
# Start moderation in background
5858
from .tasks import moderate_message_content
59-
result = moderate_message_content.delay(message_obj.id)
60-
61-
# Wait for moderation result (with timeout)
62-
try:
63-
moderation_result = result.get(timeout=2) # 2 second timeout
64-
if moderation_result.get('is_flagged', False):
65-
# Send moderation result to room group
66-
await self.channel_layer.group_send(
67-
self.room_group_name,
68-
{
69-
'type': 'moderation_update',
70-
'message_id': message_obj.id,
71-
'status': 'flagged',
72-
'notes': moderation_result.get('notes', {})
73-
}
74-
)
75-
except Exception as e:
76-
print(f'Error getting moderation result: {e}')
59+
moderate_message_content.delay(message_obj.id)
7760

7861
async def chat_message(self, event):
7962
# Send message to WebSocket
@@ -86,6 +69,7 @@ async def chat_message(self, event):
8669
}))
8770

8871
async def moderation_update(self, event):
72+
print(f"Moderation update received: {event}")
8973
# Send moderation update to WebSocket
9074
await self.send(text_data=json.dumps({
9175
'type': 'moderation',
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from django.core.management.base import BaseCommand
2+
from django.contrib.auth import get_user_model
3+
4+
class Command(BaseCommand):
5+
def handle(self, *args, **options):
6+
User = get_user_model()
7+
if not User.objects.filter(username='admin').exists():
8+
User.objects.create_superuser('admin', '[email protected]', 'admin')

app/chat/tasks.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
from better_profanity import profanity
66
import nltk
77
from .models import Room, Message
8+
from asgiref.sync import async_to_sync
9+
from channels.layers import get_channel_layer
10+
from django.utils.text import slugify
11+
812

913
# Download required NLTK data
1014
if os.getenv('WORKER') == '1':
@@ -55,13 +59,29 @@ def moderate_message_content(message_id):
5559
message.moderated_at = timezone.now()
5660
message.save()
5761

58-
return {
62+
response = {
5963
'message_id': message_id,
6064
'is_flagged': message.is_flagged,
6165
'status': message.moderation_status,
6266
'notes': moderation_notes
6367
}
6468

69+
channel_layer = get_channel_layer()
70+
room_group_name = f"chat_{slugify(message.room.name)}"
71+
72+
print(f"Sending moderation update to room group: {room_group_name}")
73+
async_to_sync(channel_layer.group_send)(
74+
room_group_name,
75+
{
76+
'type': 'moderation_update',
77+
'message_id': message_id,
78+
'status': message.moderation_status,
79+
'notes': moderation_notes,
80+
}
81+
)
82+
83+
return response
84+
6585
except Message.DoesNotExist:
6686
return f"Message with id {message_id} not found"
6787

app/chat/templates/chat/room.html

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,10 @@
2727
<h2 class="mb-4">Chat Room: {{ room.name }}</h2>
2828
<div class="chat-messages" id="chat-messages">
2929
{% for message in messages %}
30-
<div class="message" id="message-{{ message.id }}" {% if message.is_flagged %}style="display: none;"{% endif %}>
30+
<div class="message" id="message-{{ message.id }}">
3131
<span class="message-user">{{ message.user.username }}</span>
3232
<span class="message-time">{{ message.created_at|date:'H:i' }}</span>
3333
<div class="message-content">{{ message.content }}</div>
34-
{% if message.is_flagged %}
35-
<div class="alert alert-warning mt-1">
36-
<small>This message has been flagged for review.</small>
37-
{% if message.moderation_notes %}
38-
<button type="button" class="btn btn-sm btn-link" onclick="showModerationDetails('{{ message.id }}')">
39-
View Details
40-
</button>
41-
{% endif %}
42-
</div>
43-
{% endif %}
4434
</div>
4535
{% endfor %}
4636
</div>
@@ -98,6 +88,9 @@ <h2 class="mb-4">Chat Room: {{ room.name }}</h2>
9888
// Handle moderation update
9989
const messageDiv = document.querySelector(`#message-${data.message_id}`);
10090
if (messageDiv && data.status === 'flagged') {
91+
// remove message content
92+
messageDiv.querySelector('.message-content').remove();
93+
10194
// Add warning message
10295
const warningHtml = `
10396
<div class="alert alert-warning mt-1">

0 commit comments

Comments
 (0)