]> git.parisson.com Git - teleforma.git/commitdiff
add media read flag (todo: add read duration) feature/video-stats
authorGuillaume Pellerin <guillaume.pellerin@parisson.com>
Thu, 19 Jun 2025 16:01:51 +0000 (18:01 +0200)
committerGuillaume Pellerin <guillaume.pellerin@parisson.com>
Thu, 19 Jun 2025 16:01:51 +0000 (18:01 +0200)
teleforma/migrations/0031_mediaread.py [new file with mode: 0644]
teleforma/migrations/0032_alter_mediaread_duration.py [new file with mode: 0644]
teleforma/models/core.py
teleforma/views/core.py

diff --git a/teleforma/migrations/0031_mediaread.py b/teleforma/migrations/0031_mediaread.py
new file mode 100644 (file)
index 0000000..126b2f4
--- /dev/null
@@ -0,0 +1,25 @@
+# Generated by Django 3.2.25 on 2025-06-19 17:12
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('teleforma', '0030_auto_20250428_1124'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='MediaRead',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('duration', models.DurationField(verbose_name='duration')),
+                ('media', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='read', to='teleforma.media', verbose_name='media')),
+                ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='read', to=settings.AUTH_USER_MODEL, verbose_name='user')),
+            ],
+        ),
+    ]
diff --git a/teleforma/migrations/0032_alter_mediaread_duration.py b/teleforma/migrations/0032_alter_mediaread_duration.py
new file mode 100644 (file)
index 0000000..d003a71
--- /dev/null
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.25 on 2025-06-19 17:37
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('teleforma', '0031_mediaread'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='mediaread',
+            name='duration',
+            field=models.DurationField(blank=True, null=True, verbose_name='duration'),
+        ),
+    ]
index 778af7d88bd1f0f3a9bc93152f5526d06087a9e7..185f6c1d0f35e9cd128ac5206bab65a75ac77ad0 100644 (file)
@@ -1155,3 +1155,13 @@ class WebClassGroup(models.Model):
                 'iejs': [iej.name for iej in self.iejs.all()],
                 }
         return data
+
+
+class MediaRead(models.Model):
+    "Store media read and time by user"
+
+    media = models.ForeignKey('Media', related_name='read', verbose_name=_('media'),
+                                   blank=True, null=True, on_delete=models.SET_NULL)
+    user = models.ForeignKey(User, related_name='read', verbose_name=_('user'),
+                               blank=True, null=True, on_delete=models.SET_NULL)
+    duration = models.DurationField(_("duration"), blank=True, null=True)
index 8283aa91d2a7024d3f452201404bd2b251d33c31..68dea393aeaa754ec79a7d71285c37a25aa24623 100644 (file)
@@ -73,7 +73,7 @@ from ..decorators import access_required
 from ..models.appointment import Appointment, AppointmentPeriod
 from ..models.chat import ChatMessage
 from ..models.core import (Conference, ConferencePublication, Course, CourseType, Department,
-                           Document, DocumentType, Media, MediaTranscoded,
+                           Document, DocumentType, Media, MediaRead, MediaTranscoded,
                            Organization, Period, Professor, WebClassGroup,
                            StreamingServer, LiveStream,
                            get_user_role)
@@ -714,6 +714,7 @@ class MediaView(CourseAccessMixin, DetailView):
             reverse("teleforma-media-detail",
                 kwargs={"period_id": period_id, "pk": media.id}))
         if get_access(media, courses) and referer == media_detail_url:
+            media_read, c = MediaRead.objects.get_or_create(media=media, user=request.user)
             return serve_media(media.file,
                 content_type=media.mime_type,
                 streaming=streaming,