From c1b07ea72c4f398c172f86eb34bbfa156ec9f3f8 Mon Sep 17 00:00:00 2001 From: Gael Le Mignot Date: Mon, 1 Jun 2020 09:39:39 +0200 Subject: [PATCH] WIP for Webclass by Yoan --- teleforma/context_processors.py | 7 +++- teleforma/models/core.py | 37 ++++++++++++++++--- teleforma/static/teleforma/css/bbb.css | 3 ++ .../templates/teleforma/course_webclass.html | 20 ++++++---- .../templates/teleforma/inc/webclass.html | 20 ++++++++++ .../templates/teleforma/seminar_detail.html | 27 ++++++++++---- teleforma/views/core.py | 20 +++++++--- 7 files changed, 107 insertions(+), 27 deletions(-) create mode 100644 teleforma/static/teleforma/css/bbb.css create mode 100644 teleforma/templates/teleforma/inc/webclass.html diff --git a/teleforma/context_processors.py b/teleforma/context_processors.py index 32383816..2b210929 100644 --- a/teleforma/context_processors.py +++ b/teleforma/context_processors.py @@ -62,10 +62,15 @@ def seminar_progress(user, seminar, more=False): 'obj': seminar.docs_correct, 'step': '5' }] + if seminar.conference and seminar.conference.webclass: + objects[2]['obj'] = seminar.conference for item in objects: obj = item['obj'] step = item['step'] - for item in obj.all(): + items = [obj] + if hasattr(obj, 'all'): + items = obj.all() + for item in items: if item.weight: total += item.weight if user in item.readers.all(): diff --git a/teleforma/models/core.py b/teleforma/models/core.py index cd0d0b85..5b8a1a9f 100755 --- a/teleforma/models/core.py +++ b/teleforma/models/core.py @@ -54,6 +54,7 @@ from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User from django.core.exceptions import ValidationError from django.contrib.contenttypes import generic +from django.contrib.sites.models import Site from notes.models import Note import jqchat.models from django.core.paginator import InvalidPage, EmptyPage @@ -539,6 +540,10 @@ class WebclassMixin(Model): class Meta(MetaCore): abstract = True + @property + def weight(self): + return 50 + def prepare_webclass(self): """ generate room id and moderator password @@ -551,25 +556,32 @@ class WebclassMixin(Model): self.webclass_password = password - def create_webclass_room(self): + def create_webclass_room(self, request): """ create a BBB room and generate meeting id and moderator password """ if self.webclass_id and self.webclass: try: # check if meeting already exists self.get_webclass_info() except BBBException: + year = datetime.datetime.now().year + # site_url = 'https://' + request.get_host() params = { 'moderatorPW':self.webclass_password, 'attendeePW':'pwattendee', # 'maxParticipants':self.webclass_max_participants + 1, - 'welcome':"Bienvenue sur la conférence \"%s\"." % (self.title.encode('utf-8'),), + 'welcome':"Pro-Barreau : Bienvenue sur la conférence \"%s\"." % (self.title.encode('utf-8'),), 'record':True, # 'autoStartRecording':True, 'muteOnStart':True, 'allowModsToUnmuteUsers':True, + 'logo':'https://www.pro-barreau.com/static/img/logo_probarreau.png', + 'copyright': "© %d Pro-Barreau" % year, # 'guestPolicy':'ALWAYS_ACCEPT' + 'bannerText': "Pro-Barreau", + 'bannerColor': "#003768", + # 'customStyleUrl': site_url+"/static/teleforma/css/bbb.css" } - + print params try: result = bbb.create_meeting(self.webclass_id, params=params) register_web_hook() @@ -578,12 +590,12 @@ class WebclassMixin(Model): raise - def get_join_webclass_url(self, user, username=None): + def get_join_webclass_url(self, request, user, username=None): """ Get url to BBB meeting. If user are professor or staff, provide the url with the moderator password """ - self.create_webclass_room() + self.create_webclass_room(request) username = user.get_full_name() is_professor = len(user.professor.all()) >= 1 is_staff = user.is_staff or user.is_superuser @@ -591,7 +603,6 @@ class WebclassMixin(Model): if is_professor or is_staff: password = self.webclass_password params = {'userID': user.username} - print(bbb.get_join_meeting_url(username, self.webclass_id, password, params)) return bbb.get_join_meeting_url(username, self.webclass_id, password, params) def get_fake_join_webclass_url(self, username): @@ -658,6 +669,14 @@ class WebclassMixin(Model): return auditors < self.webclass_max_participants return True + @property + def webclass_duration(self): + if self.webclass_hours_complementary: + seconds = self.duration.as_seconds() - self.webclass_hours_complementary.as_seconds() + else: + seconds = self.duration.as_seconds() + return datetime.timedelta(seconds=seconds) + # def clean(self): # if self.start_date > self.end_date:: # raise ValidationError("Dates are incorrect") @@ -799,6 +818,12 @@ class Conference(Displayable, WebclassMixin): def suggestions(self): return (list(self.suggested_seminars.all()) + list(self.suggested_conferences.all()))[:3] + def set_as_read(self, user): + """ set as read for user """ + if user not in self.readers.all(): + self.readers.add(user) + self.save() + class Meta(MetaCore): db_table = app_label + '_' + 'conference' verbose_name = _('conference') diff --git a/teleforma/static/teleforma/css/bbb.css b/teleforma/static/teleforma/css/bbb.css new file mode 100644 index 00000000..a92fb6ba --- /dev/null +++ b/teleforma/static/teleforma/css/bbb.css @@ -0,0 +1,3 @@ +body { + background-color:red; +} \ No newline at end of file diff --git a/teleforma/templates/teleforma/course_webclass.html b/teleforma/templates/teleforma/course_webclass.html index 74268c72..3d446961 100644 --- a/teleforma/templates/teleforma/course_webclass.html +++ b/teleforma/templates/teleforma/course_webclass.html @@ -25,31 +25,34 @@ {% if webclass_status == 'past' %} {% if record %} -

La conférence est terminée, vous pouvez la revoir ci-dessous. +

La conférence est terminée, vous pouvez la revoir ci-dessous.

Voir l'enregistrement {% else %} -

La conférence est terminée. L'enregistrement n'est pas encore ligne. +

La conférence est terminée. L'enregistrement n'est pas encore ligne.

{% endif %} {% elif webclass_status == 'ingoing' %}

La conférence est en cours.

Cliquez ici pour rejoindre la conférence {% elif webclass_status == 'almost' %} -

La conférence va bientôt démarrer.

- Cliquez ici pour rejoindre la conférence +

Le salon « Pro-Barreau Live » est accessible.

+ Cliquez ici pour rejoindre la conférence {% elif webclass_status == 'future' %} -

La conférence est prévue pour le {{ conference.date_begin }}. Revenez ici à ce moment là pour pouvoir la rejoindre.

+

+ Votre Webconférence débutera le {{ conference.date_begin|date:"d/m/Y" }} à {{ conference.date_begin|time:"H\hi" }}. + Vous pourrez accéder au salon « Pro-Barreau Live » dès {{ begin_minus_1_hour|time:"H\hi" }} en cliquant sur le lien qui apparaitra ci-dessous. +

{% endif %} {% if user.is_superuser %}
-

Liens de test

+

Liens d'invitation

-Utilisateur courant : Cliquez ici pour rejoindre la conférence en tant que {{ request.user.username }} +Se connecter en tant qu'admin : Cliquez ici pour rejoindre la conférence en tant que {{ request.user.username }}

@@ -70,6 +73,7 @@ Utilisateur courant :
{{ conference.date_begin }}
{% if conference.date_end %}
{% trans "End date" %}
{{ conference.date_end }}
{% endif %} {% comment %}
{% trans "Live" %}
{% if is_webclass_running %}{% trans "Yes" %}{% else %}{% trans "No" %}{% endif %}
{% endcomment %} +
{% trans "Duration" %}
{{ conference.webclass_duration|hours }} {% trans "hours" %}
{% trans "Live" %}
{% trans "Yes" %}
{% comment %} {% if conference.room %}
{% trans "Room" %}
{{ conference.room }}
{% endif %} {% endcomment %} {% if user.is_staff or user.is_superuser %} diff --git a/teleforma/templates/teleforma/inc/webclass.html b/teleforma/templates/teleforma/inc/webclass.html new file mode 100644 index 00000000..01e6ff03 --- /dev/null +++ b/teleforma/templates/teleforma/inc/webclass.html @@ -0,0 +1,20 @@ +{% load teleforma_tags %} +{% load thumbnail %} +{% load i18n %} + + + + + + + + +
+ Voir la conférence + + {% if user in webclass.readers.all %} + + {% else %} + + {% endif %} +
diff --git a/teleforma/templates/teleforma/seminar_detail.html b/teleforma/templates/teleforma/seminar_detail.html index 003eafb0..b30114d1 100644 --- a/teleforma/templates/teleforma/seminar_detail.html +++ b/teleforma/templates/teleforma/seminar_detail.html @@ -138,14 +138,27 @@ $(window).ready(function( ){ {% endwith %} - {% with seminar.medias as medias %} -
-
-

{% trans "Step" %} 2 : {% if medias.all.count > 1 %}{% trans "view these conferences" %}{% else %}{% trans "view this conference" %}{% endif %}

+ {% if seminar.conference.webclass %} + {% with seminar.conference as webclass %} +
+
+

{% trans "Step" %} 2 : {% trans "view this conference" %}

+
+ {% include "teleforma/inc/webclass.html" %}
- {% include "teleforma/inc/media_package_list.html" %} -
- {% endwith %} + {% endwith %} + {% else %} + {% with seminar.medias as medias %} +
+
+

{% trans "Step" %} 2 : {% if medias.all.count > 1 %}{% trans "view these conferences" %}{% else %}{% trans "view this conference" %}{% endif %}

+
+ {% include "teleforma/inc/media_package_list.html" %} +
+ {% endwith %} + {% endif %} + + {% if seminar.quiz %}
diff --git a/teleforma/views/core.py b/teleforma/views/core.py index 787f560e..e5d3561c 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -67,6 +67,7 @@ from django.contrib.auth.forms import UserChangeForm from django.core.exceptions import ObjectDoesNotExist from django.contrib.syndication.views import Feed from django.core.paginator import Paginator +from django.core.urlresolvers import resolve from django.contrib.auth.decorators import login_required from django.contrib.contenttypes.models import ContentType from django.views.generic.edit import FormView @@ -462,20 +463,28 @@ class ConferenceView(DetailView): webclass_status = "" now = datetime.datetime.now() - if conference.date_begin - timedelta(hours=1) > now: + + begin_minus_1_hour = conference.date_begin - timedelta(hours=1) + if now < begin_minus_1_hour: # conference not yet started webclass_status = "future" - elif conference.date_end < now: + elif conference.date_end + timedelta(hours=1) < now: # conference expired webclass_status = "past" context['record'] = conference.get_record() - elif conference.date_begin - timedelta(hours=1) < now < conference.date_begin: + elif begin_minus_1_hour < now < conference.date_begin: # conference can be joined webclass_status = "almost" else: webclass_status = "ingoing" + context['begin_minus_1_hour'] = begin_minus_1_hour context['record'] = conference.get_record() context['webclass_status'] = webclass_status + + # set conf as read when user navigate to the record page + if resolve(self.request.path).url_name == "teleforma-conference-webclass-record": + conference.set_as_read(self.request.user) + else: content_type = ContentType.objects.get(app_label="teleforma", model="conference") context['livestreams'] = conference.livestream.all() @@ -529,7 +538,7 @@ def join_webclass(request, pk): # fake debug links username = request.GET.get('username') if username: - return redirect(conference.get_fake_join_webclass_url(username)) + return redirect(conference.get_fake_join_webclass_url(request, username)) user = request.user authorized = False @@ -546,7 +555,8 @@ def join_webclass(request, pk): authorized = True if authorized: - return redirect(conference.get_join_webclass_url(user)) + conference.set_as_read(user) + return redirect(conference.get_join_webclass_url(request, user)) else: return HttpResponse('Unauthorized', status=401) -- 2.39.5