]> git.parisson.com Git - teleforma.git/commitdiff
WIP
authorYoan Le Clanche <yoanl@pilotsystems.net>
Mon, 8 Jun 2020 07:48:37 +0000 (09:48 +0200)
committerYoan Le Clanche <yoanl@pilotsystems.net>
Mon, 8 Jun 2020 07:48:37 +0000 (09:48 +0200)
teleforma/templatetags/webclass.py [new file with mode: 0644]
teleforma/views/core.py
teleforma/webclass/admin.py
teleforma/webclass/forms.py [new file with mode: 0644]
teleforma/webclass/migrations/0002_auto__add_webclassrecord.py
teleforma/webclass/models.py
teleforma/webclass/templates/admin/webclass/webclassrecord/add_records_links.html [new file with mode: 0644]
teleforma/webclass/templates/admin/webclass/webclassrecord/change_list.html [new file with mode: 0644]
teleforma/webclass/templates/webclass/records_form.html [new file with mode: 0644]
teleforma/webclass/urls.py
teleforma/webclass/views.py

diff --git a/teleforma/templatetags/webclass.py b/teleforma/templatetags/webclass.py
new file mode 100644 (file)
index 0000000..c7698b0
--- /dev/null
@@ -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,
+    }
index f6be6f167b9454b6e32d61cb0d2e539561f5a53e..887683f7c1af7821fd0d8683b4e6e0f872b795e0 100644 (file)
@@ -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)
index adaa3393c183b8b59866aa66d35386f0ebb6e9e6..87e9ab5c7bb4e67c45387f4b2591b972e5a256d0 100644 (file)
@@ -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 (file)
index 0000000..2878a09
--- /dev/null
@@ -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()
index 45114df921604f9d43b6ad40cf3e6aa32dca9352..4d7712e13dc2edc9108ad8b68792704d0dc49c7b 100644 (file)
@@ -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'"},
index 62de7639b264f2634c9f21547648056c88c49cfe..8616b7c6815b2708c264c111540d9b64477a7d34 100644 (file)
@@ -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 (file)
index 0000000..d47c5ad
--- /dev/null
@@ -0,0 +1,5 @@
+<div class="object-tools">
+    {% for period in periods %}
+    <a class="btn btn-success" href="{% url teleforma-webclass-records-form period.id %}"><i class="icon-plus-sign icon-white"></i>{{ period.name}} </a>
+    {% endfor %}
+</div>
\ 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 (file)
index 0000000..3e56779
--- /dev/null
@@ -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 (file)
index 0000000..1d9db2d
--- /dev/null
@@ -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 %}
+<form method="post">{% csrf_token %}
+
+    <p>Vous pouvez choisir un/plusieurs enregistrements qui seront ajoutés à la page de cours.</p>
+    {{ form.as_p }}
+    <input type="submit" value="Ajouter">
+</form>
+{% endblock %}
\ No newline at end of file
index 29bb9b25739a4e513346e2cd2ca16abddfd46848..4a8a702f5e7b3b17f9356c839ef0d363b54d385f 100644 (file)
@@ -41,6 +41,7 @@ urlpatterns = patterns('',
     url(r'^desk/webclass_appointments/(?P<pk>.*)$', WebclassAppointment.as_view(),
        name="teleforma-webclass-appointments"),
     url(r'^desk/webclass_calendar/$', WebclassProfessorAppointments.as_view(), name="teleforma-webclass-professor"),
+    url(r'^admin/periods/(?P<period_id>.*)/webclass_records_form/$', WebclassRecordsFormView.as_view(), name="teleforma-webclass-records-form"),
     url(r'^desk/webclass/(?P<pk>.*)/join/$',
         join_webclass,
         name="teleforma-webclass-join"),
index 9b10005348da55b92b6b0ed7aed713d27b3fbf2f..2464243da19e97edb4df024bbd6dc5ed3b94f470 100644 (file)
@@ -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))