]> git.parisson.com Git - telecaster-client.git/commitdiff
first working django telecaster :), fix various conf, start & stop seq
authoryomguy <yomguy@parisson.com>
Thu, 12 Jul 2012 00:33:46 +0000 (02:33 +0200)
committeryomguy <yomguy@parisson.com>
Thu, 12 Jul 2012 00:33:46 +0000 (02:33 +0200)
TODO: full utf8

telecaster/migrations/0005_auto__del_record__add_osc__add_field_station_pid.py [new file with mode: 0644]
telecaster/migrations/0006_auto__chg_field_station_pid.py [new file with mode: 0644]
telecaster/models.py
telecaster/old/telecaster.py [new file with mode: 0755]

diff --git a/telecaster/migrations/0005_auto__del_record__add_osc__add_field_station_pid.py b/telecaster/migrations/0005_auto__del_record__add_osc__add_field_station_pid.py
new file mode 100644 (file)
index 0000000..9f141ab
--- /dev/null
@@ -0,0 +1,191 @@
+# -*- 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):
+        # Deleting model 'Record'
+        db.delete_table('telecaster_record')
+
+        # Adding model 'OSC'
+        db.create_table('telecaster_osc', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('host', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('port', self.gf('django.db.models.fields.IntegerField')()),
+        ))
+        db.send_create_signal('telecaster', ['OSC'])
+
+        # Adding field 'Station.pid'
+        db.add_column('telecaster_station', 'pid',
+                      self.gf('django.db.models.fields.IntegerField')(default=1),
+                      keep_default=False)
+
+        # Adding M2M table for field osc on 'Station'
+        db.create_table('telecaster_station_osc', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('station', models.ForeignKey(orm['telecaster.station'], null=False)),
+            ('osc', models.ForeignKey(orm['telecaster.osc'], null=False))
+        ))
+        db.create_unique('telecaster_station_osc', ['station_id', 'osc_id'])
+
+    def backwards(self, orm):
+        # Adding model 'Record'
+        db.create_table('telecaster_record', (
+            ('station', self.gf('django.db.models.fields.related.ForeignKey')(related_name='records', null=True, to=orm['telecaster.Station'], on_delete=models.SET_NULL, blank=True)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
+            ('datetime', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
+        ))
+        db.send_create_signal('telecaster', ['Record'])
+
+        # Deleting model 'OSC'
+        db.delete_table('telecaster_osc')
+
+        # Deleting field 'Station.pid'
+        db.delete_column('telecaster_station', 'pid')
+
+        # Removing M2M table for field osc on 'Station'
+        db.delete_table('telecaster_station_osc')
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'notes.note': {
+            'Meta': {'object_name': 'Note'},
+            'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2012, 7, 12, 0, 0)'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'markup': ('django.db.models.fields.CharField', [], {'default': "'m'", 'max_length': '1'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'rendered_content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['notes.Topic']"})
+        },
+        'notes.topic': {
+            'Meta': {'object_name': 'Topic'},
+            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'slug': ('django_extensions.db.fields.AutoSlugField', [], {'allow_duplicates': 'False', 'max_length': '50', 'separator': "u'-'", 'blank': 'True', 'populate_from': "'title'", 'overwrite': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'telecaster.osc': {
+            'Meta': {'object_name': 'OSC'},
+            'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'port': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'telecaster.station': {
+            'Meta': {'object_name': 'Station'},
+            'conference': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'station'", 'to': "orm['teleforma.Conference']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'osc': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'station'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['telecaster.OSC']"}),
+            'pid': ('django.db.models.fields.IntegerField', [], {}),
+            'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'started': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'teleforma.conference': {
+            'Meta': {'ordering': "['-date_begin']", 'object_name': 'Conference'},
+            'comment': ('teleforma.models.ShortTextField', [], {'max_length': '255', 'blank': 'True'}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Course']"}),
+            'course_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.CourseType']"}),
+            'date_begin': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'date_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'professor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Professor']"}),
+            'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'to': "orm['teleforma.Room']"}),
+            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'})
+        },
+        'teleforma.course': {
+            'Meta': {'ordering': "['number']", 'object_name': 'Course'},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Department']"}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'magistral': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'obligation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'synthesis_note': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.coursetype': {
+            'Meta': {'object_name': 'CourseType', 'db_table': "'teleforma_course_type'"},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.department': {
+            'Meta': {'object_name': 'Department'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'department'", 'to': "orm['teleforma.Organization']"})
+        },
+        'teleforma.organization': {
+            'Meta': {'object_name': 'Organization'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.professor': {
+            'Meta': {'object_name': 'Professor'},
+            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'professor'", 'unique': 'True', 'to': "orm['auth.User']"})
+        },
+        'teleforma.room': {
+            'Meta': {'object_name': 'Room'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"})
+        }
+    }
+
+    complete_apps = ['telecaster']
\ No newline at end of file
diff --git a/telecaster/migrations/0006_auto__chg_field_station_pid.py b/telecaster/migrations/0006_auto__chg_field_station_pid.py
new file mode 100644 (file)
index 0000000..894980c
--- /dev/null
@@ -0,0 +1,155 @@
+# -*- 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):
+
+        # Changing field 'Station.pid'
+        db.alter_column('telecaster_station', 'pid', self.gf('django.db.models.fields.IntegerField')(null=True))
+    def backwards(self, orm):
+
+        # Changing field 'Station.pid'
+        db.alter_column('telecaster_station', 'pid', self.gf('django.db.models.fields.IntegerField')(default=1))
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'notes.note': {
+            'Meta': {'object_name': 'Note'},
+            'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2012, 7, 12, 0, 0)'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'markup': ('django.db.models.fields.CharField', [], {'default': "'m'", 'max_length': '1'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'rendered_content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['notes.Topic']"})
+        },
+        'notes.topic': {
+            'Meta': {'object_name': 'Topic'},
+            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'slug': ('django_extensions.db.fields.AutoSlugField', [], {'allow_duplicates': 'False', 'max_length': '50', 'separator': "u'-'", 'blank': 'True', 'populate_from': "'title'", 'overwrite': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'telecaster.osc': {
+            'Meta': {'object_name': 'OSC'},
+            'host': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'port': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'telecaster.station': {
+            'Meta': {'object_name': 'Station'},
+            'conference': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'station'", 'to': "orm['teleforma.Conference']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'osc': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'station'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['telecaster.OSC']"}),
+            'pid': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'started': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'teleforma.conference': {
+            'Meta': {'ordering': "['-date_begin']", 'object_name': 'Conference'},
+            'comment': ('teleforma.models.ShortTextField', [], {'max_length': '255', 'blank': 'True'}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.Course']"}),
+            'course_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'conference'", 'to': "orm['teleforma.CourseType']"}),
+            'date_begin': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'date_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'professor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Professor']"}),
+            'public_id': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'readers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['auth.User']"}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'conference'", 'null': 'True', 'to': "orm['teleforma.Room']"}),
+            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'})
+        },
+        'teleforma.course': {
+            'Meta': {'ordering': "['number']", 'object_name': 'Course'},
+            'code': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+            'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Department']"}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'magistral': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'obligation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'synthesis_note': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.coursetype': {
+            'Meta': {'object_name': 'CourseType', 'db_table': "'teleforma_course_type'"},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.department': {
+            'Meta': {'object_name': 'Department'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'department'", 'to': "orm['teleforma.Organization']"})
+        },
+        'teleforma.organization': {
+            'Meta': {'object_name': 'Organization'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.professor': {
+            'Meta': {'object_name': 'Professor'},
+            'courses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'professor'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['teleforma.Course']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'professor'", 'unique': 'True', 'to': "orm['auth.User']"})
+        },
+        'teleforma.room': {
+            'Meta': {'object_name': 'Room'},
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'organization': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'room'", 'to': "orm['teleforma.Organization']"})
+        }
+    }
+
+    complete_apps = ['telecaster']
\ No newline at end of file
index 08a1f940660ce71d6a630d4e519b8cf215224fda..2a43ab5a7fca7f86f0407430e991c64e1e6ef308 100644 (file)
@@ -70,11 +70,26 @@ class ShortTextField(models.TextField):
 add_introspection_rules([], ["^telecaster\.models\.ShortTextField"])
 
 
+class OSC(Model):
+    "OSC server"
+
+    host               = CharField(_('host'), max_length=255)
+    port               = IntegerField(_('port'))
+
+    class Meta:
+        db_table = app_label + '_' + 'osc'
+
+
 class Station(Model):
+    "Media streaming station"
 
     public_id         = CharField(_('public_id'), max_length=255)
     started           = BooleanField(_('started'))
-    conference        = ForeignKey(Conference, related_name='station', verbose_name=_('conference'))
+    conference        = ForeignKey(Conference, related_name='station',
+                                    verbose_name=_('conference'))
+    pid               = IntegerField(_('pid'), blank=True, null=True)
+    osc               = ManyToManyField(OSC, related_name="station",
+                                    verbose_name=_('OSC'), blank=True, null=True)
 
     class Meta:
         db_table = app_label + '_' + 'station'
@@ -89,10 +104,11 @@ class Station(Model):
     def description(self):
         return self.conference.description
 
-    def set_conf(self, conf):
-        self.conf = conf
-
-    def setup(self):
+    def setup(self, conf_file):
+        self.department = self.conference.course.department.name
+        self.organization = self.conference.course.department.organization.name
+        conf_dict = xml2dict(conf_file)
+        self.conf = conf_dict['telecaster']
         self.date = datetime.datetime.now().strftime("%Y")
         self.time = datetime.datetime.now().strftime("%x-%X")
         self.time_txt = self.time.replace('/','_').replace(':','_').replace(' ','_')
@@ -108,44 +124,39 @@ class Station(Model):
         self.ogg_quality = self.conf['media']['ogg_quality']
         self.format = self.conf['media']['format']
         self.channels = int(self.conf['media']['channels'])
-        self.server_name = [self.organization, self.department, self.conference]
-        self.ServerDescription = clean_string('-'.join(self.description))
+        self.server_name = [self.organization, self.department, self.conference.slug]
+        self.ServerDescription = clean_string(self.description)
         self.ServerName = clean_string('_-_'.join(self.server_name))
-        self.mount_point = self.ServerName + '.' + self.format
-        self.filename = clean_string('_-_'.join(self.description[1:])) + '-' + self.time_txt + '.' + self.format
+        self.mount_point = self.conference.slug
+        self.filename = clean_string('_-_'.join(self.description[1:])) + \
+                                    '-' + self.time_txt + '.' + self.format
         self.output_dir = self.rec_dir + os.sep + self.date + os.sep + self.department
         self.file_dir = self.output_dir + os.sep + self.ServerName
         self.uid = os.getuid()
-        self.deefuzzer_pid = get_pid('/usr/bin/deefuzzer '+self.deefuzzer_user_file, self.uid)
         self.new_title = clean_string('-'.join(self.description))
         self.short_title = self.new_title
         self.genre = self.conf['infos']['genre']
         self.encoder = 'TeleCaster by Parisson'
+        self.save()
 
         if not os.path.exists(self.file_dir):
             os.makedirs(self.file_dir)
 
-        self.jack_inputs = []
-        if 'jack' in self.conf:
-            jack_inputs = self.conf['jack']['input']
-            if len(jack_inputs) > 1:
-                for jack_input in jack_inputs:
-                    self.jack_inputs.append(jack_input['name'])
-            else:
-                self.jack_inputs.append(jack_inputs['name'])
-
         self.deefuzzer_dict = xml2dict(self.deefuzzer_default_conf_file)
-        self.deefuzzer_osc_ports =  []
-        self.server_ports = []
 
         for station in self.deefuzzer_dict['deefuzzer']['station']:
             if station['control']['mode'] == '1':
-                self.deefuzzer_osc_ports.append(station['control']['port'])
-                self.server_ports.append(station['server']['port'])
-            if station['server']['host'] == 'localhost' or  station['server']['host'] == '127.0.0.1':
-                self.conf['play_port'] = station['server']['port']
-            else:
-                self.conf['play_port'] = '8000'
+                port = int(station['control']['port'])
+                osc = OSC.objects.filter(port=port)
+                if osc:
+                    self.osc.add(osc[0])
+                else:
+                    self.osc.create(host='127.0.0.1', port=port)
+
+#            if station['server']['host'] == 'localhost' or  station['server']['host'] == '127.0.0.1':
+#                self.conf['play_port'] = station['server']['port']
+#            else:
+#                self.conf['play_port'] = '8000'
 
     def deefuzzer_setup(self):
         i = 0
@@ -156,12 +167,12 @@ class Station(Model):
             station['infos']['genre'] = self.genre
             station['media']['bitrate'] = self.bitrate
             station['media']['dir'] = self.play_dir
-            station['media']['voices'] = str(len(self.jack_inputs))
             station['record']['dir'] = self.file_dir
             station['relay']['mode'] = '1'
-            station['relay']['author'] = self.professor
+            station['relay']['author'] = unicode(self.conference.professor)
             self.deefuzzer_dict['deefuzzer']['station'][i] = station
             i += 1
+        print self.deefuzzer_dict
         self.deefuzzer_xml = dicttoxml(self.deefuzzer_dict)
 
     def deefuzzer_write_conf(self):
@@ -172,22 +183,17 @@ class Station(Model):
     def deefuzzer_start(self):
         command = 'deefuzzer ' + self.deefuzzer_user_file + ' > /dev/null &'
         os.system(command)
-        self.set_lock()
+        time.sleep(2)
+        self.pid = get_pid('deefuzzer', args=self.deefuzzer_user_file)
+        self.save()
 
     def deefuzzer_stop(self):
-        if len(self.deefuzzer_pid) != 0:
-            os.system('kill -9 '+self.deefuzzer_pid[0])
+        os.system('kill -9 '+str(self.pid))
 
     def rec_stop(self):
-        if len(self.deefuzzer_pid) != 0:
-            for port in self.deefuzzer_osc_ports:
-                target = liblo.Address(int(port))
-                liblo.send(target, '/record', 0)
-
-    def mp3_convert(self):
-        os.system('oggdec -o - '+ self.file_dir+os.sep+self.filename+' | lame -S -m m -h -b '+ self.bitrate + \
-            ' --add-id3v2 --tt "'+ self.new_title + '" --ta "'+self.professor+'" --tl "'+self.organization+'" --ty "'+self.date+ \
-            '" --tg "'+self.genre+'" - ' + self.file_dir+os.sep+self.ServerDescription + '.mp3 &')
+        for osc in self.osc.all():
+            target = liblo.Address(int(osc.port))
+            liblo.send(target, '/record', 0)
 
     def write_tags_ogg(self):
        file = self.file_dir + os.sep + self.filename
@@ -224,35 +230,16 @@ class Station(Model):
 
     def start(self):
         self.started = True
-        self.datetime_start = datetime.datetime.now()
-#        self.deefuzzer_setup()
-#        self.deefuzzer_write_conf()
-#        self.deefuzzer_start()
+        self.deefuzzer_setup()
+        self.deefuzzer_write_conf()
+        self.deefuzzer_start()
         self.save()
 
     def stop(self):
         self.started = False
         self.datetime_stop = datetime.datetime.now()
-#        self.rec_stop()
-#        time.sleep(2)
-#        self.deefuzzer_stop()
-        self.save()
-
-    def configure(self, dict):
-        self.organization = dict['organization']
-        self.department = dict['department']
-        self.session = dict['session']
-        self.professor = dict['professor']
-        self.comment = dict['comment']
+        self.rec_stop()
+        time.sleep(2)
+        self.deefuzzer_stop()
         self.save()
 
-
-class Record(Model):
-
-    station = ForeignKey(Station, related_name='records', verbose_name='station',
-                         blank=True, null=True, on_delete=models.SET_NULL)
-    datetime = DateTimeField(_('record_date'), auto_now=True)
-    file = FileField(_('file'), upload_to='items/%Y/%m/%d')
-
-
-
diff --git a/telecaster/old/telecaster.py b/telecaster/old/telecaster.py
new file mode 100755 (executable)
index 0000000..392a8e3
--- /dev/null
@@ -0,0 +1,150 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# *-* coding: utf-8 *-*
+"""
+   telecaster
+
+   Copyright (c) 2006-2010 Guillaume Pellerin <yomguy@parisson.org>
+
+# 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.
+
+# Author: Guillaume Pellerin <yomguy@parisson.com>
+"""
+
+version = '0.5.2'
+
+
+import os
+import sys
+import pwd
+import cgi
+import cgitb
+import time
+from tools import *
+from webview import *
+from station import *
+cgitb.enable()
+
+
+class TeleCaster:
+    """Manage the calls of Station and Webview to get the network and
+    disk streams"""
+
+    def __init__(self, conf_file):
+        """Main function"""
+        self.conf_file = conf_file
+        conf_dict = xml2dict(self.conf_file)
+        self.conf = conf_dict['telecaster']
+        self.title = self.conf['infos']['name']
+        self.log_file = self.conf['log']
+        self.logger = Logger(self.log_file)
+        self.uid = os.getuid()
+        self.url = self.conf['infos']['url']
+        self.user = pwd.getpwuid(os.getuid())[0]
+        self.user_dir = '/home' + os.sep + self.user + os.sep + '.telecaster'
+        if not os.path.exists(self.user_dir):
+            os.makedirs(self.user_dir)
+        self.lock_file = self.user_dir + os.sep + 'telecaster.lock'
+
+    def transition_head(self):
+        html_file = open('telecaster_starting_head.html', 'r')
+        html = html_file.read()
+        html_file.close()
+        return html
+
+    def transition_foot(self):
+        html_file = open('telecaster_starting_foot.html', 'r')
+        html = html_file.read()
+        html_file.close()
+        return html
+
+    def main(self):
+        edcast_pid = get_pid('edcast_jack', self.uid)
+        deefuzzer_pid = get_pid('/usr/bin/deefuzzer '+self.user_dir+os.sep+'deefuzzer.xml', self.uid)
+        writing = edcast_pid != []
+        casting = deefuzzer_pid != []
+        form = WebView(self.conf, version)
+
+        if deefuzzer_pid == [] and form.has_key("action") and \
+            form.has_key("department") and form.has_key("conference") and \
+            form.has_key("session") and form["action"].value == "start":
+        
+            self.conference_dict = {'title': '',
+                        'department': '',
+                        'conference': '',
+                        'session': '',
+                        'professor': '',
+                        'comment': ''}
+                        
+        for data in self.conference_dict:
+            if not form.has_key(data):
+                self.conference_dict[data] = 'Inconnu'
+            else:
+                value = form.getfirst(data)
+                if '....' in value:
+                    self.conference_dict[data] = 'Inconnu'
+                else:
+                    self.conference_dict[data] = value
+        
+        self.conference_dict['title'] = self.title
+            s = Station(self.conf_file, self.conference_dict, self.lock_file)
+            s.start()
+            time.sleep(2)
+            self.logger.write_info('starting')
+            self.main()
+
+        elif deefuzzer_pid != [] and os.path.exists(self.lock_file) and not form.has_key("action"):
+            self.conference_dict = get_conference_from_lock(self.lock_file)
+            form.stop_form(self.conference_dict, writing, casting)
+            self.logger.write_info('started')
+
+        elif deefuzzer_pid and form.has_key("action") and form["action"].value == "stop":
+        self.logger.write_info('stopping')
+            if os.path.exists(self.lock_file):
+                self.conference_dict = get_conference_from_lock(self.lock_file)
+        s = Station(self.conf_file, self.conference_dict, self.lock_file)
+                s.stop()
+        time.sleep(2)
+        self.main()
+
+        elif deefuzzer_pid == []:
+            form.start_form(writing, casting)
+            self.logger.write_info('stopped')
+
+    elif deefuzzer_pid != []:
+        os.system('kill -9 '+deefuzzer_pid[0])
+        self.main()
+      
+
+conf_file = '/etc/telecaster/telecaster.xml'
+
+if __name__ == '__main__':
+    sys.stderr = sys.stdout
+    t = TeleCaster(conf_file)
+    t.main()
+
+