From 138b47352a3b03222aea0a098c93db5df1399530 Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Thu, 30 Jan 2014 14:45:22 +0100 Subject: [PATCH] add video source (telecaster) selection page by rooms --- example/settings.py | 11 +-- example/urls.py | 2 +- teleforma/sources/__init__.py | 0 teleforma/sources/admin.py | 15 ++++ teleforma/sources/migrations/0001_initial.py | 80 +++++++++++++++++++ ...002_auto__add_field_monitor_record_path.py | 54 +++++++++++++ teleforma/sources/migrations/__init__.py | 0 .../{models/sources.py => sources/models.py} | 15 +++- teleforma/sources/tests.py | 16 ++++ teleforma/sources/urls.py | 44 ++++++++++ teleforma/sources/views.py | 22 +++++ .../templates/teleforma/source_detail.html | 49 ++++++++++++ teleforma/templates/telemeta/base.html | 46 ++--------- teleforma/views/core.py | 2 +- 14 files changed, 307 insertions(+), 49 deletions(-) create mode 100644 teleforma/sources/__init__.py create mode 100644 teleforma/sources/admin.py create mode 100644 teleforma/sources/migrations/0001_initial.py create mode 100644 teleforma/sources/migrations/0002_auto__add_field_monitor_record_path.py create mode 100644 teleforma/sources/migrations/__init__.py rename teleforma/{models/sources.py => sources/models.py} (67%) create mode 100644 teleforma/sources/tests.py create mode 100644 teleforma/sources/urls.py create mode 100644 teleforma/sources/views.py create mode 100644 teleforma/templates/teleforma/source_detail.html diff --git a/example/settings.py b/example/settings.py index 80fdda5d..d8fa64c5 100644 --- a/example/settings.py +++ b/example/settings.py @@ -19,10 +19,10 @@ MANAGERS = ADMINS DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. - 'NAME': 'teleforma', # Or path to database file if using sqlite3. - 'USER': 'teleforma', # Not used with sqlite3. - 'PASSWORD': 'HMYsrZLEtYeBrvER', # Not used with sqlite3. + 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': 'teleforma.sql', # Or path to database file if using sqlite3. + 'USER': '', # Not used with sqlite3. + 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } @@ -146,7 +146,8 @@ INSTALLED_APPS = ( 'jqchat', # 'follow', 'googletools', - 'telecaster', +# 'telecaster', + 'teleforma.sources', ) TEMPLATE_CONTEXT_PROCESSORS = ( diff --git a/example/urls.py b/example/urls.py index 8bacff02..7173c4e1 100644 --- a/example/urls.py +++ b/example/urls.py @@ -20,7 +20,7 @@ urlpatterns = patterns('', # TeleForma (r'^', include('teleforma.urls')), - (r'^telecaster/', include('telecaster.urls')), + (r'^', include('teleforma.sources.urls')), # Languages (r'^i18n/', include('django.conf.urls.i18n')), diff --git a/teleforma/sources/__init__.py b/teleforma/sources/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/teleforma/sources/admin.py b/teleforma/sources/admin.py new file mode 100644 index 00000000..7c88691f --- /dev/null +++ b/teleforma/sources/admin.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from teleforma.sources.models import * +from django.contrib import admin + + +class SourceAdmin(admin.ModelAdmin): + model = Source + +class MonitorAdmin(admin.ModelAdmin): + model = Monitor + + +admin.site.register(Source) +admin.site.register(Monitor) diff --git a/teleforma/sources/migrations/0001_initial.py b/teleforma/sources/migrations/0001_initial.py new file mode 100644 index 00000000..cac9e932 --- /dev/null +++ b/teleforma/sources/migrations/0001_initial.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'Monitor' + db.create_table('teleforma_monitor', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('port', self.gf('telemeta.models.core.IntegerField')(default=0, blank=True)), + ('mount_point', self.gf('telemeta.models.core.CharField')(default='', max_length=255, blank=True)), + ('mime_type', self.gf('telemeta.models.core.CharField')(default='', max_length=255, blank=True)), + )) + db.send_create_signal('sources', ['Monitor']) + + # Adding model 'Source' + db.create_table('teleforma_source', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('public_id', self.gf('telemeta.models.core.CharField')(default='', max_length=255, blank=True)), + ('ip', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39)), + ('room', self.gf('telemeta.models.core.ForeignKey')(related_name='source', on_delete=models.SET_NULL, default=None, to=orm['teleforma.Room'], blank=True, null=True)), + )) + db.send_create_signal('sources', ['Source']) + + # Adding M2M table for field monitors on 'Source' + db.create_table('teleforma_source_monitors', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('source', models.ForeignKey(orm['sources.source'], null=False)), + ('monitor', models.ForeignKey(orm['sources.monitor'], null=False)) + )) + db.create_unique('teleforma_source_monitors', ['source_id', 'monitor_id']) + + + def backwards(self, orm): + # Deleting model 'Monitor' + db.delete_table('teleforma_monitor') + + # Deleting model 'Source' + db.delete_table('teleforma_source') + + # Removing M2M table for field monitors on 'Source' + db.delete_table('teleforma_source_monitors') + + + models = { + 'sources.monitor': { + 'Meta': {'object_name': 'Monitor', 'db_table': "'teleforma_monitor'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'mount_point': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'port': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}) + }, + 'sources.source': { + 'Meta': {'ordering': "['public_id']", 'object_name': 'Source', 'db_table': "'teleforma_source'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}), + 'monitors': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'source'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['sources.Monitor']"}), + 'public_id': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'room': ('telemeta.models.core.ForeignKey', [], {'related_name': "'source'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['teleforma.Room']", 'blank': 'True', 'null': 'True'}) + }, + 'teleforma.organization': { + 'Meta': {'object_name': 'Organization'}, + 'description': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}) + }, + 'teleforma.room': { + 'Meta': {'object_name': 'Room'}, + 'description': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'organization': ('telemeta.models.core.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"}) + } + } + + complete_apps = ['sources'] \ No newline at end of file diff --git a/teleforma/sources/migrations/0002_auto__add_field_monitor_record_path.py b/teleforma/sources/migrations/0002_auto__add_field_monitor_record_path.py new file mode 100644 index 00000000..5a02b4f2 --- /dev/null +++ b/teleforma/sources/migrations/0002_auto__add_field_monitor_record_path.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Monitor.record_path' + db.add_column('teleforma_monitor', 'record_path', + self.gf('telemeta.models.core.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Monitor.record_path' + db.delete_column('teleforma_monitor', 'record_path') + + + models = { + 'sources.monitor': { + 'Meta': {'object_name': 'Monitor', 'db_table': "'teleforma_monitor'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'mount_point': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'port': ('telemeta.models.core.IntegerField', [], {'default': '0', 'blank': 'True'}), + 'record_path': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}) + }, + 'sources.source': { + 'Meta': {'ordering': "['public_id']", 'object_name': 'Source', 'db_table': "'teleforma_source'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}), + 'monitors': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'source'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['sources.Monitor']"}), + 'public_id': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'room': ('telemeta.models.core.ForeignKey', [], {'related_name': "'source'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['teleforma.Room']", 'blank': 'True', 'null': 'True'}) + }, + 'teleforma.organization': { + 'Meta': {'object_name': 'Organization'}, + 'description': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}) + }, + 'teleforma.room': { + 'Meta': {'object_name': 'Room'}, + 'description': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'organization': ('telemeta.models.core.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"}) + } + } + + complete_apps = ['sources'] \ No newline at end of file diff --git a/teleforma/sources/migrations/__init__.py b/teleforma/sources/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/teleforma/models/sources.py b/teleforma/sources/models.py similarity index 67% rename from teleforma/models/sources.py rename to teleforma/sources/models.py index 409b6af2..ea89c97c 100644 --- a/teleforma/models/sources.py +++ b/teleforma/sources/models.py @@ -1,5 +1,6 @@ from teleforma.models.core import * +from django.utils.translation import ugettext_lazy as _ class Monitor(Model): @@ -9,8 +10,9 @@ class Monitor(Model): ('video/webm', 'video/webm'), ('video/mp4', 'video/mp4')] port = IntegerField(_('port')) - mount_point = CharField(_('public_id'), max_length=255) + mount_point = CharField(_('mount point'), max_length=255) mime_type = CharField(_('type'), choices=mime_types, max_length=255) + record_path = CharField(_('record path'), max_length=255) @property def slug(self): @@ -20,7 +22,7 @@ class Monitor(Model): db_table = app_label + '_' + 'monitor' def __unicode__(self): - return self.slug + '(' + self.type + ')' + return self.slug + '(' + self.mime_type + ')' class Source(Model): @@ -37,5 +39,12 @@ class Source(Model): ordering = ['public_id'] def __unicode__(self): - return '-'.join([self.public_id, self.room, self.ip]) + return '-'.join([self.public_id, self.room.name, self.ip]) + @property + def default_monitor_url(self): + return 'http://' + str(self.ip) + self.monitors.all()[0].slug + + @property + def default_record_url(self): + return 'http://' + self.public_id + '/' + self.monitors.all()[0].record_path diff --git a/teleforma/sources/tests.py b/teleforma/sources/tests.py new file mode 100644 index 00000000..501deb77 --- /dev/null +++ b/teleforma/sources/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/teleforma/sources/urls.py b/teleforma/sources/urls.py new file mode 100644 index 00000000..d65dd635 --- /dev/null +++ b/teleforma/sources/urls.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2007-2012 Parisson SARL + +# This software is a computer program whose purpose is to backup, analyse, +# transcode and stream any audio content with its metadata over a web frontend. + +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". + +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. + +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. + +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. +# +# Authors: Guillaume Pellerin + +import os.path +from django.conf.urls.defaults import * +from teleforma.sources.views import * + +urlpatterns = patterns('', + + url(r'^desk/sources/$', SourcesView.as_view(), name="teleforma-sources"), + url(r'^desk/sources/(?P.*)/$', SourceView.as_view(), name="teleforma-source-detail"), + +) diff --git a/teleforma/sources/views.py b/teleforma/sources/views.py new file mode 100644 index 00000000..ed59fcb0 --- /dev/null +++ b/teleforma/sources/views.py @@ -0,0 +1,22 @@ + +from teleforma.views.core import * +from teleforma.sources.models import * + + +class SourcesView(RedirectView): + + def get_redirect_url(self): + sources = Source.objects.all() + print sources[0].pk + return reverse('teleforma-source-detail', args=(sources[0].pk,)) + + +class SourceView(DetailView): + + model = Source + template_name='teleforma/source_detail.html' + + def get_context_data(self, **kwargs): + context = super(SourceView, self).get_context_data(**kwargs) + context['sources'] = Source.objects.all() + return context diff --git a/teleforma/templates/teleforma/source_detail.html b/teleforma/templates/teleforma/source_detail.html new file mode 100644 index 00000000..c47fe495 --- /dev/null +++ b/teleforma/templates/teleforma/source_detail.html @@ -0,0 +1,49 @@ +{% extends "teleforma/course_media.html" %} +{% load telemeta_utils %} +{% load teleforma_tags %} +{% load i18n %} + +{% block extra_javascript %} +{% endblock extra_javascript %} + +{% block modules %} +
+ +

playlistsSalles

+
+
    +{% block courses %} +{% for source in sources %} +
  • {{ source.room.name }}
  • +{% endfor %} +{% endblock courses %} +
+ +
+ +
+ +{% block module-action %} + +{% endblock module-action %} + + +{% endblock modules %} + + +{% block course %} +
+ +
{{ object.room.name }}
+ +
+ +
+ +
+{% endblock course %} + diff --git a/teleforma/templates/telemeta/base.html b/teleforma/templates/telemeta/base.html index eef9708c..e9f900ce 100644 --- a/teleforma/templates/telemeta/base.html +++ b/teleforma/templates/telemeta/base.html @@ -82,54 +82,23 @@ alt="logo" /> diff --git a/teleforma/views/core.py b/teleforma/views/core.py index 8d7e06cb..49874726 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -177,7 +177,7 @@ class HomeRedirectView(View): def get(self, request): if request.user.is_authenticated(): periods = get_periods(request.user) - return HttpResponseRedirect(reverse('teleforma-desk-period-list', kwargs={'period_id': periods[0].id})) + return HttpResponseRedirect(reverse('teleforma-sources')) else: return HttpResponseRedirect(reverse('teleforma-login')) -- 2.39.5