From 7ce14e24c17d320d4bb38c7ecc27f60654a33585 Mon Sep 17 00:00:00 2001 From: Yoan Le Clanche Date: Tue, 12 Nov 2024 17:33:23 +0100 Subject: [PATCH] Notify conference creation : https://trackers.pilotsystems.net/prebarreau/0863 --- teleforma/models/core.py | 46 +++++++++++++++++++++++++++++++--------- teleforma/views/core.py | 7 ++++++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/teleforma/models/core.py b/teleforma/models/core.py index f7c4ab25..29831f48 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -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' diff --git a/teleforma/views/core.py b/teleforma/views/core.py index d189e021..aab01904 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -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: -- 2.39.5