--- /dev/null
+# -*- 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
--- /dev/null
+# -*- 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
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'
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(' ','_')
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
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):
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
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')
-
-
-
--- /dev/null
+#!/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()
+
+