]> git.parisson.com Git - teleforma.git/commitdiff
Notify conference creation : https://trackers.pilotsystems.net/prebarreau/0863
authorYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 12 Nov 2024 16:33:23 +0000 (17:33 +0100)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Tue, 12 Nov 2024 16:33:23 +0000 (17:33 +0100)
teleforma/models/core.py
teleforma/views/core.py

index f7c4ab25288d0e548311ec4a94d43c2122cc9005..29831f48b7b105f90c431bf6aded5198e5b6876a 100755 (executable)
@@ -41,6 +41,8 @@ import string
 import random
 import requests
 import asyncio
+import httpx
+
 from teleforma.utils import guess_mimetypes
 
 import django.db.models as models
@@ -450,19 +452,37 @@ class Conference(models.Model):
                     self.course_type.name, self.session,
                     str(self.date_begin)]
         return ' - '.join(list)
+    
+    async def notify_async(self):
+        if self.streaming and not self.notified_live:
+            # Notify live conferences by sending a signal to websocket.
+            # This signal will be catched by the channel instance to notify students
+            if settings.DEBUG:
+                requests.post(f"{settings.CHANNEL_URL}{reverse('teleforma-live-conference-notify')}", {'id': self.id})
+            else:
+                transport = httpx.HTTPTransport(uds=settings.CHANNEL_URL)
+                async with httpx.AsyncClient(transport=transport) as client:
+                    response = await client.post("http://localhost" + reverse('teleforma-live-conference-notify'),
+                                            data={'id': self.id}, timeout=20.0)
+                    assert response.status_code == 200
 
-    def save(self, *args, **kwargs):
-        if not self.public_id:
-            self.public_id = get_random_hash()
-        self.course.save()
-        
+    def notify_sync(self):
         if self.streaming and not self.notified_live:
             # Notify live conferences by sending a signal to websocket.
             # This signal will be catched by the channel instance to notify students
-            from teleforma.models.notification import notify
-            #requests.post(f"{settings.CHANNEL_URL}{reverse('teleforma-live-conference-notify')}", {'id': self.id})
-            #self.notified_live = True
-        
+            if settings.DEBUG:
+                requests.post(f"{settings.CHANNEL_URL}{reverse('teleforma-live-conference-notify')}", {'id': self.id})
+            else:
+                transport = httpx.HTTPTransport(uds=settings.CHANNEL_URL)
+                with httpx.Client(transport=transport) as client:
+                    response = client.post("http://localhost" + reverse('teleforma-live-conference-notify'),
+                                            data={'id': self.id}, timeout=120.0)
+                    assert response.status_code == 200
+
+    def save(self, *args, **kwargs):
+        if not self.public_id:
+            self.public_id = get_random_hash()
+        self.course.save()        
         super(Conference, self).save(*args, **kwargs)
 
     def to_dict(self):
@@ -611,6 +631,13 @@ class Conference(models.Model):
         verbose_name = _('conference')
         ordering = ['-date_begin']
 
+def notif_conference(sender, instance, *args, **kwargs):
+    if not instance.notified_live:
+        instance.notify_sync()
+        instance.notified_live = True
+        instance.save()
+
+post_save.connect(notif_conference, sender=Conference)
 
 class StreamingServer(models.Model):
 
@@ -634,7 +661,6 @@ class StreamingServer(models.Model):
         db_table = app_label + '_' + 'streaming_server'
         verbose_name = _('streaming server')
 
-
 class LiveStream(models.Model):
 
     element_type = 'livestream'
index d189e02172620203a05d94fddddccb8e1b92a908..aab019044db5c6545d4cb72cdd8812b0e389485b 100644 (file)
@@ -39,6 +39,7 @@ import os
 from html import escape
 from io import BytesIO
 from teleforma.utils import guess_mimetypes
+import logging
 
 from jsonrpc import jsonrpc_method
 
@@ -78,6 +79,7 @@ from teleforma.models import *
 from teleforma.forms import *
 from teleforma.models.appointment import AppointmentPeriod
 from teleforma.webclass.models import Webclass, WebclassSlot, WebclassRecord
+from teleforma.models.notification import Notification, notify
 from teleforma.decorators import access_required
 from teleforma.models.crfpa import Home
 import pages
@@ -94,6 +96,8 @@ from ..models.core import (Conference, Course, CourseType, Department,
 from ..webclass.models import Webclass, WebclassRecord, get_records_from_bbb
 from .pages import get_page_content
 
+
+logger = logging.getLogger('teleforma')
 # def render(request, template, data=None, mimetype=None):
 #     return django_render(template, data, context_instance=RequestContext(request),
 #                          mimetype=mimetype)
@@ -963,6 +967,7 @@ class LiveConferenceNotify(APIView):
         conference = Conference.objects.get(pk=int(conference_id))
         students = Student.objects.filter(period=conference.period, platform_only=True)
         text = f"""Une confĂ©rence live "{conference.course.title}" commence"""
+
         url = reverse('teleforma-conference-detail', kwargs={'period_id': conference.period.id, 'pk': conference.id})
 
         # notify students
@@ -973,6 +978,8 @@ class LiveConferenceNotify(APIView):
                     for course in courses:
                         if conference.course == course['course'] and \
                                 conference.course_type in course['types']:
+                            if conference.bbb_room_id:
+                                url = conference.get_join_conference_url(student.user)
                             notify(student.user, text, url)
                             logger.info("Student notified: " + student.user.username)
             except Exception as e: