From: Yoan Le Clanche Date: Mon, 8 Jun 2020 07:48:37 +0000 (+0200) Subject: WIP X-Git-Tag: 1.4.3~75^2~3 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=d50eeb50249d7c3b96f4c06a05e4882b8c2ad4e1;p=teleforma.git WIP --- diff --git a/teleforma/templatetags/webclass.py b/teleforma/templatetags/webclass.py new file mode 100644 index 00000000..c7698b0a --- /dev/null +++ b/teleforma/templatetags/webclass.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from django import template +from teleforma.models.crfpa import Period + +register = template.Library() + +@register.inclusion_tag('admin/webclass/webclassrecord/add_records_links.html', takes_context=True) +def add_records_links(context): + + periods = Period.objects.filter(is_open=True) + return { + 'periods':periods, + } diff --git a/teleforma/views/core.py b/teleforma/views/core.py index f6be6f16..887683f7 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -73,7 +73,7 @@ from jsonrpc.proxy import ServiceProxy from teleforma.models import * from teleforma.forms import * from teleforma.models.appointment import AppointmentPeriod -from teleforma.webclass.models import Webclass, WebclassSlot +from teleforma.webclass.models import Webclass, WebclassSlot, WebclassRecord from telemeta.views import * import jqchat.models from xlwt import Workbook @@ -429,6 +429,8 @@ class CourseView(CourseAccessMixin, DetailView): webclass_slot = webclass.get_slot(self.request.user) context['webclass'] = webclass context['webclass_slot'] = webclass_slot + + print(WebclassRecord.get_records(context['period'], course)) return context @method_decorator(login_required) diff --git a/teleforma/webclass/admin.py b/teleforma/webclass/admin.py index adaa3393..87e9ab5c 100644 --- a/teleforma/webclass/admin.py +++ b/teleforma/webclass/admin.py @@ -22,7 +22,7 @@ class WebclassAdmin(admin.ModelAdmin): class WebclassRecordAdmin(admin.ModelAdmin): list_filter = ('course', 'period') - list_display = ('course', 'period') + list_display = ('course', 'period', 'created') search_fields = ['id', 'course__code', 'course__title'] # def get_form(self, request, obj=None, **kwargs): diff --git a/teleforma/webclass/forms.py b/teleforma/webclass/forms.py new file mode 100644 index 00000000..2878a090 --- /dev/null +++ b/teleforma/webclass/forms.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +from datetime import datetime +from django.forms import Form, ModelChoiceField, ChoiceField +from teleforma.models.core import Course, Period +from teleforma.webclass.models import get_records, WebclassSlot, WebclassRecord +from django.core.exceptions import ValidationError + +class WebclassRecordsForm(Form): + # period = ModelChoiceField(label='Période', + # queryset=Period.objects.filter(is_open=True)) + + class Meta: + pass + + + def __init__(self, *args, **kwargs): + self.period_id = kwargs.pop('period_id') + self.period = Period.objects.get(pk=self.period_id) + super(WebclassRecordsForm, self).__init__(*args, **kwargs) + + courses = Course.objects.all() + all_records = self.get_records_by_course() + for course in courses: + webclass = course.webclass.count() + if course.webclass.count(): + rooms = [] + for webclass in course.webclass.all(): + for slot in webclass.slots.all(): + rooms.append(slot.room_id) + + field_name = 'course_%d' % course.id + records = all_records.get(course.id, []) + + vocabulary = [('none', 'Aucun')] + for record in records: + print(record) + webclass_slot = WebclassSlot.objects.get(pk=record['slot_id']) + label = u"%s à %s - %s" % (record['start_date'].strftime('%d/%m/%Y %H:%M'), record['end_date'].strftime('%H:%M'), webclass_slot.professor.user.last_name) + vocabulary.append((record['id'], label)) + self.fields[field_name] = ChoiceField(label=course.title, choices=vocabulary, required=False) + + def get_records_by_course(self): + records = get_records(period_id=self.period_id) + by_course = {} + for record in records: + by_course.setdefault(record['course_id'], []).append(record) + return by_course + + def save_records(self): + for key, value in self.data.items(): + if key.startswith('course') and value != 'none': + course_id = key.replace('course_', '') + course = Course.objects.get(pk=course_id) + record = WebclassRecord(course=course, period=self.period, record_id=value) + record.save() diff --git a/teleforma/webclass/migrations/0002_auto__add_webclassrecord.py b/teleforma/webclass/migrations/0002_auto__add_webclassrecord.py index 45114df9..4d7712e1 100644 --- a/teleforma/webclass/migrations/0002_auto__add_webclassrecord.py +++ b/teleforma/webclass/migrations/0002_auto__add_webclassrecord.py @@ -13,8 +13,8 @@ class Migration(SchemaMigration): ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('period', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['teleforma.Period'])), ('course', self.gf('django.db.models.fields.related.ForeignKey')(related_name='webclass_records', to=orm['teleforma.Course'])), - ('url', self.gf('django.db.models.fields.CharField')(max_length=255)), - ('created', self.gf('django.db.models.fields.DateTimeField')()), + ('record_id', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), )) db.send_create_signal('webclass', ['WebclassRecord']) @@ -174,10 +174,10 @@ class Migration(SchemaMigration): 'webclass.webclassrecord': { 'Meta': {'object_name': 'WebclassRecord', 'db_table': "'teleforma_webclass_record'"}, 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'webclass_records'", 'to': "orm['teleforma.Course']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {}), + 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'period': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['teleforma.Period']"}), - 'url': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + 'record_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}) }, 'webclass.webclassslot': { 'Meta': {'object_name': 'WebclassSlot', 'db_table': "'teleforma_webclass_slot'"}, diff --git a/teleforma/webclass/models.py b/teleforma/webclass/models.py index 62de7639..8616b7c6 100644 --- a/teleforma/webclass/models.py +++ b/teleforma/webclass/models.py @@ -30,36 +30,62 @@ DAYS_CHOICES = [(i, _(calendar.day_name[i])) for i in range(7)] class MetaCore: app_label = 'webclass' -def get_all_records(): - all_records = [] - recordings = [] - recordings_xml = self.bbb.get_recordings(self.room_id).get_field('recordings') - if hasattr(recordings_xml, 'get'): - recordings = recordings_xml['recording'] - if type(recordings) is XMLDictNode: - recordings = [recordings] - for recording in recordings: - recording.prettyprint() - url = recording.get('playback', {}).get('format', {}).get('url') - if url: - url = url.decode() - data = { - 'start': int(recording['startTime'].decode()), - 'end': int(recording['endTime'].decode()), - 'url': url, - 'state': recording['state'].decode(), - } - data['duration'] = data['end'] - data['start'] - all_records.append(data) +def get_records_from_bbb(**kwargs): + """get records info from bbb xml""" + records = [] + for server in BBBServer.objects.all(): + recordings_xml = server.get_instance().get_recordings(**kwargs).get_field('recordings') + if hasattr(recordings_xml, 'get'): + recordings = recordings_xml['recording'] + if type(recordings) is XMLDictNode: + recordings = [recordings] + for recording in recordings: + recording.prettyprint() + url = recording.get('playback', {}).get('format', {}).get('url') + if url: + url = url.decode() + if not recording['metadata'].get('periodid'): + continue + start = int(recording['startTime'].decode()[:-3]) + end = int(recording['endTime'].decode()[:-3]) + data = { + 'id': recording['recordID'].decode(), + 'start': start, + 'start_date': datetime.datetime.fromtimestamp(start), + 'end': end, + 'end_date': datetime.datetime.fromtimestamp(end), + 'url': url, + 'state': recording['state'].decode(), + 'period_id': int(recording['metadata'].get('periodid').decode()), + 'course_id': int(recording['metadata'].get('courseid').decode()), + 'slot_id': int(recording['metadata'].get('slotid').decode()), + } + data['duration'] = data['end'] - data['start'] + records.append(data) + return records + +def get_records(period_id=None, course_id=None, rooms=None, recording_id=None): + """ get all records, filtered """ + # if not rooms: + # rooms = ';'.join([slot.room_id for slot in self.slots.all()]) + # print(rooms) + meta = {} + if period_id: + meta['periodid'] = period_id + if course_id: + meta['courseid'] = period_id + meta['origin'] = 'crfpa' + + all_records = get_records_from_bbb(meta=meta) + # vocabulary = [('Aucun', 'none')] if not all_records: return [] - all_records = sorted(all_records, key=lambda record:-record['duration']) - vocabulary = [] - for record in all_records: - vocabulary.append((record['url'], record['duration'])) - return longest_record + all_records = sorted(all_records, key=lambda record:-record['start']) + # for record in all_records: + # vocabulary.append((record['url'], record['start'])) + return all_records @@ -78,6 +104,7 @@ class BBBServer(models.Model): def __unicode__(self): return "Serveur %d" % self.id + class Webclass(models.Model): department = models.ForeignKey('teleforma.Department', related_name='webclass', verbose_name=_('department'), on_delete=models.SET_NULL, blank=True, null=True) @@ -106,6 +133,7 @@ class Webclass(models.Model): return None + class WebclassSlot(models.Model): """ Webclass slot """ webclass = models.ForeignKey('Webclass', related_name='slots') @@ -183,9 +211,17 @@ class WebclassSlot(models.Model): 'bannerColor': "#003768", # 'customStyleUrl': site_url+"/static/teleforma/css/bbb.css" } + meta = { + 'origin':'crfpa', + 'periodid': webclass.period.id, + 'courseid': webclass.course.id, + 'webclassid': webclass.id, + 'slotid': self.id, + 'professor': self.professor.last_name, + } print params try: - result = self.bbb.create_meeting(self.room_id, params=params) + result = self.bbb.create_meeting(self.room_id, params=params, meta=meta) except BBBException as e: print(e) raise @@ -308,8 +344,8 @@ class WebclassRecord(models.Model): period = models.ForeignKey('teleforma.Period', verbose_name=_('period')) course = models.ForeignKey('teleforma.Course', related_name='webclass_records', verbose_name=_('course')) - url = models.CharField("Enregistrement BBB", max_length=255) - created = models.DateTimeField("Date de la conférence") + record_id = models.CharField("Enregistrement BBB", max_length=255) + created = models.DateTimeField("Date de la conférence", auto_now_add=True) class Meta(MetaCore): db_table = app_label + '_' + 'webclass_record' @@ -318,3 +354,16 @@ class WebclassRecord(models.Model): def __unicode__(self): return "Enregistrement webclass %d" % self.id + + + @staticmethod + def get_records(period, course): + records = [] + for record in WebclassRecord.objects.filter(period=period, course=course): + records.append(record.record_id) + + records = get_records_from_bbb(recording_id=','.join(records)) + print(records) + return records + + diff --git a/teleforma/webclass/templates/admin/webclass/webclassrecord/add_records_links.html b/teleforma/webclass/templates/admin/webclass/webclassrecord/add_records_links.html new file mode 100644 index 00000000..d47c5ad8 --- /dev/null +++ b/teleforma/webclass/templates/admin/webclass/webclassrecord/add_records_links.html @@ -0,0 +1,5 @@ +
+ {% for period in periods %} + {{ period.name}} + {% endfor %} +
\ No newline at end of file diff --git a/teleforma/webclass/templates/admin/webclass/webclassrecord/change_list.html b/teleforma/webclass/templates/admin/webclass/webclassrecord/change_list.html new file mode 100644 index 00000000..3e567797 --- /dev/null +++ b/teleforma/webclass/templates/admin/webclass/webclassrecord/change_list.html @@ -0,0 +1,7 @@ +{% extends "admin/change_list.html" %} +{% load webclass %} + +{% block object-tools %} +{% add_records_links %} +{{ block.super }} +{% endblock %} \ No newline at end of file diff --git a/teleforma/webclass/templates/webclass/records_form.html b/teleforma/webclass/templates/webclass/records_form.html new file mode 100644 index 00000000..1d9db2dd --- /dev/null +++ b/teleforma/webclass/templates/webclass/records_form.html @@ -0,0 +1,16 @@ +{% extends "admin/base.html" %} +{% load teleforma_tags %} +{% load i18n %} + +{% block head_title %}Gestion des enregistrements{% endblock %} + +{% block title %}Gestion des enregistrements{% endblock %} + +{% block content %} +
{% csrf_token %} + +

Vous pouvez choisir un/plusieurs enregistrements qui seront ajoutés à la page de cours.

+ {{ form.as_p }} + +
+{% endblock %} \ No newline at end of file diff --git a/teleforma/webclass/urls.py b/teleforma/webclass/urls.py index 29bb9b25..4a8a702f 100644 --- a/teleforma/webclass/urls.py +++ b/teleforma/webclass/urls.py @@ -41,6 +41,7 @@ urlpatterns = patterns('', url(r'^desk/webclass_appointments/(?P.*)$', WebclassAppointment.as_view(), name="teleforma-webclass-appointments"), url(r'^desk/webclass_calendar/$', WebclassProfessorAppointments.as_view(), name="teleforma-webclass-professor"), + url(r'^admin/periods/(?P.*)/webclass_records_form/$', WebclassRecordsFormView.as_view(), name="teleforma-webclass-records-form"), url(r'^desk/webclass/(?P.*)/join/$', join_webclass, name="teleforma-webclass-join"), diff --git a/teleforma/webclass/views.py b/teleforma/webclass/views.py index 9b100053..2464243d 100644 --- a/teleforma/webclass/views.py +++ b/teleforma/webclass/views.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from django.views.generic import View, TemplateView +from django.views.generic import View, TemplateView, FormView from django.contrib import messages from django.http import HttpResponse from django.shortcuts import redirect, get_object_or_404, render @@ -13,6 +13,7 @@ from django.conf import settings from django.core.cache import cache from teleforma.webclass.models import Webclass, WebclassSlot +from teleforma.webclass.forms import WebclassRecordsForm from teleforma.views.core import get_periods, get_courses @@ -141,6 +142,20 @@ class WebclassAppointment(View): # return data +class WebclassRecordsFormView(FormView): + template_name = 'webclass/records_form.html' + form_class = WebclassRecordsForm + success_url = '/admin/django/webclass/webclassrecord' + + def get_form_kwargs(self): + kwargs = super(WebclassRecordsFormView, self).get_form_kwargs() + kwargs['period_id'] = int(self.kwargs['period_id']) + return kwargs + + def form_valid(self, form): + form.save_records() + return super(WebclassRecordsFormView, self).form_valid(form) + def join_webclass(request, pk): webclass_slot = WebclassSlot.objects.get(pk=int(pk))