From 21944971cc22498fa51ee22109b33a91a3ca40ab Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Mon, 24 Mar 2014 17:50:07 +0100 Subject: [PATCH] update the django models to simulate an experience --- {timeside/server => tests/django}/__init__.py | 0 {timeside => tests/django}/manage.py | 2 +- {timeside/server => tests/django}/settings.py | 4 +- tests/django/timeside.sql | Bin 0 -> 69632 bytes tests/django/update_schema.sh | 5 + {timeside/server => tests/django}/urls.py | 0 {timeside/server => tests/django}/wsgi.py | 0 timeside/api.py | 1 + timeside/migrations/0001_initial.py | 222 ++++++++++++++++-- ...perience_decoder__add_field_experience_.py | 153 ++++++++++++ timeside/models.py | 112 +++++++-- timeside/views.py | 44 ++++ 12 files changed, 504 insertions(+), 39 deletions(-) rename {timeside/server => tests/django}/__init__.py (100%) rename {timeside => tests/django}/manage.py (71%) rename {timeside/server => tests/django}/settings.py (98%) create mode 100644 tests/django/timeside.sql create mode 100755 tests/django/update_schema.sh rename {timeside/server => tests/django}/urls.py (100%) rename {timeside/server => tests/django}/wsgi.py (100%) create mode 100644 timeside/migrations/0002_auto__add_decoder__add_field_experience_decoder__add_field_experience_.py diff --git a/timeside/server/__init__.py b/tests/django/__init__.py similarity index 100% rename from timeside/server/__init__.py rename to tests/django/__init__.py diff --git a/timeside/manage.py b/tests/django/manage.py similarity index 71% rename from timeside/manage.py rename to tests/django/manage.py index 663ca0c..f9726f9 100755 --- a/timeside/manage.py +++ b/tests/django/manage.py @@ -3,7 +3,7 @@ import os import sys if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings") + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") from django.core.management import execute_from_command_line diff --git a/timeside/server/settings.py b/tests/django/settings.py similarity index 98% rename from timeside/server/settings.py rename to tests/django/settings.py index fcc8ded..eba1bd0 100644 --- a/timeside/server/settings.py +++ b/tests/django/settings.py @@ -104,10 +104,10 @@ MIDDLEWARE_CLASSES = ( # 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) -ROOT_URLCONF = 'server.urls' +ROOT_URLCONF = 'urls' # Python dotted path to the WSGI application used by Django's runserver. -WSGI_APPLICATION = 'server.wsgi.application' +WSGI_APPLICATION = 'wsgi.application' TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". diff --git a/tests/django/timeside.sql b/tests/django/timeside.sql new file mode 100644 index 0000000000000000000000000000000000000000..0d14bf5ebec8ace1998b3f28d27f9ac8df3579c8 GIT binary patch literal 69632 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 J+h>Ks{|}7RAB+G1 literal 0 HcmV?d00001 diff --git a/tests/django/update_schema.sh b/tests/django/update_schema.sh new file mode 100755 index 0000000..82d28e9 --- /dev/null +++ b/tests/django/update_schema.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +./manage.py schemamigration timeside --auto +./manage.py migrate timeside + diff --git a/timeside/server/urls.py b/tests/django/urls.py similarity index 100% rename from timeside/server/urls.py rename to tests/django/urls.py diff --git a/timeside/server/wsgi.py b/tests/django/wsgi.py similarity index 100% rename from timeside/server/wsgi.py rename to tests/django/wsgi.py diff --git a/timeside/api.py b/timeside/api.py index b214023..1cf1c99 100644 --- a/timeside/api.py +++ b/timeside/api.py @@ -173,6 +173,7 @@ class IDecoder(IProcessor): def mime_type(): """Return the mime type corresponding to this decoded format""" + class IGrapher(IProcessor): """Media item visualizer driver interface""" diff --git a/timeside/migrations/0001_initial.py b/timeside/migrations/0001_initial.py index 4a7e796..f951451 100644 --- a/timeside/migrations/0001_initial.py +++ b/timeside/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import datetime +from south.utils import datetime_utils as datetime from south.db import db from south.v2 import SchemaMigration from django.db import models @@ -9,46 +9,224 @@ class Migration(SchemaMigration): def forwards(self, orm): # Adding model 'Item' - db.create_table('timeside_item', ( + db.create_table('timeside_items', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('code', self.gf('django.db.models.fields.CharField')(unique=True, max_length=512)), ('title', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), - ('description', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)), - ('code', self.gf('django.db.models.fields.CharField')(unique=True, max_length=256)), - ('media_file', self.gf('django.db.models.fields.files.FileField')(max_length=1024, db_column='file')), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('file', self.gf('django.db.models.fields.files.FileField')(max_length=1024, blank=True)), + ('url', self.gf('django.db.models.fields.URLField')(max_length=1024, blank=True)), + ('sha1', self.gf('django.db.models.fields.CharField')(unique=True, max_length=512, blank=True)), + ('mime_type', self.gf('django.db.models.fields.CharField')(max_length=256, null=True)), )) db.send_create_signal('timeside', ['Item']) - # Adding model 'Analysis' - db.create_table('timeside_analysis', ( + # Adding model 'Analyzer' + db.create_table('timeside_analyzers', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('item', self.gf('django.db.models.fields.related.ForeignKey')(related_name='analysis', null=True, on_delete=models.SET_NULL, to=orm['timeside.Item'])), - ('hdf5_file', self.gf('django.db.models.fields.files.FileField')(max_length=1024, db_column='hdf5')), + ('pid', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('parameters', self.gf('django.db.models.fields.TextField')(blank=True)), + ('version', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)), + ('status', self.gf('django.db.models.fields.IntegerField')(default=1)), )) - db.send_create_signal('timeside', ['Analysis']) + db.send_create_signal('timeside', ['Analyzer']) + + # Adding model 'Grapher' + db.create_table('timeside_graphers', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('pid', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('parameters', self.gf('django.db.models.fields.TextField')(blank=True)), + ('version', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)), + ('status', self.gf('django.db.models.fields.IntegerField')(default=1)), + ('file', self.gf('django.db.models.fields.files.FileField')(max_length=1024, db_column='file')), + ('mime_type', self.gf('django.db.models.fields.CharField')(max_length=256, null=True)), + ('height', self.gf('django.db.models.fields.IntegerField')(default=180)), + ('width', self.gf('django.db.models.fields.IntegerField')(default=320)), + )) + db.send_create_signal('timeside', ['Grapher']) + + # Adding model 'Encoder' + db.create_table('timeside_encoders', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('pid', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('parameters', self.gf('django.db.models.fields.TextField')(blank=True)), + ('version', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)), + ('status', self.gf('django.db.models.fields.IntegerField')(default=1)), + ('file', self.gf('django.db.models.fields.files.FileField')(max_length=1024, db_column='file')), + ('mime_type', self.gf('django.db.models.fields.CharField')(max_length=256, null=True)), + )) + db.send_create_signal('timeside', ['Encoder']) + + # Adding model 'Experience' + db.create_table('timeside_experiences', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('item', self.gf('django.db.models.fields.related.ForeignKey')(related_name='experience', null=True, on_delete=models.SET_NULL, to=orm['timeside.Item'])), + ('title', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('date_added', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('date_modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, null=True, blank=True)), + ('status', self.gf('django.db.models.fields.IntegerField')(default=1)), + ('uuid', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='experience', null=True, to=orm['auth.User'])), + ('begin_time', self.gf('django.db.models.fields.FloatField')(default=0, blank=True)), + ('end_time', self.gf('django.db.models.fields.FloatField')(blank=True)), + ('low_frequency', self.gf('django.db.models.fields.FloatField')(blank=True)), + ('high_frequency', self.gf('django.db.models.fields.FloatField')(blank=True)), + ('hdf5', self.gf('django.db.models.fields.files.FileField')(max_length=1024, db_column='hdf5')), + )) + db.send_create_signal('timeside', ['Experience']) + + # Adding M2M table for field analyzers on 'Experience' + m2m_table_name = db.shorten_name('timeside_experiences_analyzers') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('experience', models.ForeignKey(orm['timeside.experience'], null=False)), + ('analyzer', models.ForeignKey(orm['timeside.analyzer'], null=False)) + )) + db.create_unique(m2m_table_name, ['experience_id', 'analyzer_id']) + + # Adding M2M table for field graphers on 'Experience' + m2m_table_name = db.shorten_name('timeside_experiences_graphers') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('experience', models.ForeignKey(orm['timeside.experience'], null=False)), + ('grapher', models.ForeignKey(orm['timeside.grapher'], null=False)) + )) + db.create_unique(m2m_table_name, ['experience_id', 'grapher_id']) + + # Adding M2M table for field encoders on 'Experience' + m2m_table_name = db.shorten_name('timeside_experiences_encoders') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('experience', models.ForeignKey(orm['timeside.experience'], null=False)), + ('encoder', models.ForeignKey(orm['timeside.encoder'], null=False)) + )) + db.create_unique(m2m_table_name, ['experience_id', 'encoder_id']) def backwards(self, orm): # Deleting model 'Item' - db.delete_table('timeside_item') + db.delete_table('timeside_items') + + # Deleting model 'Analyzer' + db.delete_table('timeside_analyzers') + + # Deleting model 'Grapher' + db.delete_table('timeside_graphers') - # Deleting model 'Analysis' - db.delete_table('timeside_analysis') + # Deleting model 'Encoder' + db.delete_table('timeside_encoders') + + # Deleting model 'Experience' + db.delete_table('timeside_experiences') + + # Removing M2M table for field analyzers on 'Experience' + db.delete_table(db.shorten_name('timeside_experiences_analyzers')) + + # Removing M2M table for field graphers on 'Experience' + db.delete_table(db.shorten_name('timeside_experiences_graphers')) + + # Removing M2M table for field encoders on 'Experience' + db.delete_table(db.shorten_name('timeside_experiences_encoders')) models = { - 'timeside.analysis': { - 'Meta': {'object_name': 'Analysis'}, - 'hdf5_file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'hdf5'"}), + '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'}) + }, + 'timeside.analyzer': { + 'Meta': {'object_name': 'Analyzer', 'db_table': "'timeside_analyzers'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}) + }, + 'timeside.encoder': { + 'Meta': {'object_name': 'Encoder', 'db_table': "'timeside_encoders'"}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'file'"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}), + 'parameters': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}) + }, + 'timeside.experience': { + 'Meta': {'object_name': 'Experience', 'db_table': "'timeside_experiences'"}, + 'analyzers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'experience'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Analyzer']"}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'experience'", 'null': 'True', 'to': "orm['auth.User']"}), + 'begin_time': ('django.db.models.fields.FloatField', [], {'default': '0', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'encoders': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'experience'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Encoder']"}), + 'end_time': ('django.db.models.fields.FloatField', [], {'blank': 'True'}), + 'graphers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'experience'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Grapher']"}), + 'hdf5': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'hdf5'"}), + 'high_frequency': ('django.db.models.fields.FloatField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experience'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['timeside.Item']"}), + 'low_frequency': ('django.db.models.fields.FloatField', [], {'blank': 'True'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), + 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '256'}) + }, + 'timeside.grapher': { + 'Meta': {'object_name': 'Grapher', 'db_table': "'timeside_graphers'"}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'file'"}), + 'height': ('django.db.models.fields.IntegerField', [], {'default': '180'}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'item': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'analysis'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['timeside.Item']"}) + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}), + 'parameters': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'default': '320'}) }, 'timeside.item': { - 'Meta': {'ordering': "['code']", 'object_name': 'Item'}, - 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}), - 'description': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}), + 'Meta': {'ordering': "['code']", 'object_name': 'Item', 'db_table': "'timeside_items'"}, + 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'blank': 'True'}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'media_file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'file'"}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}), + 'sha1': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '1024', 'blank': 'True'}) } } diff --git a/timeside/migrations/0002_auto__add_decoder__add_field_experience_decoder__add_field_experience_.py b/timeside/migrations/0002_auto__add_decoder__add_field_experience_decoder__add_field_experience_.py new file mode 100644 index 0000000..64f5e52 --- /dev/null +++ b/timeside/migrations/0002_auto__add_decoder__add_field_experience_decoder__add_field_experience_.py @@ -0,0 +1,153 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as 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 'Decoder' + db.create_table('timeside_decoders', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('pid', self.gf('django.db.models.fields.CharField')(max_length=256)), + ('parameters', self.gf('django.db.models.fields.TextField')(blank=True)), + ('version', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)), + ('status', self.gf('django.db.models.fields.IntegerField')(default=1)), + )) + db.send_create_signal('timeside', ['Decoder']) + + # Adding field 'Experience.decoder' + db.add_column('timeside_experiences', 'decoder', + self.gf('django.db.models.fields.related.ForeignKey')(related_name='experience', null=True, to=orm['timeside.Decoder']), + keep_default=False) + + # Adding field 'Experience.json' + db.add_column('timeside_experiences', 'json', + self.gf('django.db.models.fields.files.FileField')(default=1, max_length=1024, db_column='json'), + keep_default=False) + + + def backwards(self, orm): + # Deleting model 'Decoder' + db.delete_table('timeside_decoders') + + # Deleting field 'Experience.decoder' + db.delete_column('timeside_experiences', 'decoder_id') + + # Deleting field 'Experience.json' + db.delete_column('timeside_experiences', 'json') + + + 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'}) + }, + 'timeside.analyzer': { + 'Meta': {'object_name': 'Analyzer', 'db_table': "'timeside_analyzers'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}) + }, + 'timeside.decoder': { + 'Meta': {'object_name': 'Decoder', 'db_table': "'timeside_decoders'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}) + }, + 'timeside.encoder': { + 'Meta': {'object_name': 'Encoder', 'db_table': "'timeside_encoders'"}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'file'"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}), + 'parameters': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}) + }, + 'timeside.experience': { + 'Meta': {'object_name': 'Experience', 'db_table': "'timeside_experiences'"}, + 'analyzers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'experience'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Analyzer']"}), + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'experience'", 'null': 'True', 'to': "orm['auth.User']"}), + 'begin_time': ('django.db.models.fields.FloatField', [], {'default': '0', 'blank': 'True'}), + 'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), + 'decoder': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experience'", 'null': 'True', 'to': "orm['timeside.Decoder']"}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'encoders': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'experience'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Encoder']"}), + 'end_time': ('django.db.models.fields.FloatField', [], {'blank': 'True'}), + 'graphers': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'experience'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Grapher']"}), + 'hdf5': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'hdf5'"}), + 'high_frequency': ('django.db.models.fields.FloatField', [], {'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'experience'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['timeside.Item']"}), + 'json': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'json'"}), + 'low_frequency': ('django.db.models.fields.FloatField', [], {'blank': 'True'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), + 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '256'}) + }, + 'timeside.grapher': { + 'Meta': {'object_name': 'Grapher', 'db_table': "'timeside_graphers'"}, + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'db_column': "'file'"}), + 'height': ('django.db.models.fields.IntegerField', [], {'default': '180'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}), + 'parameters': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'default': '320'}) + }, + 'timeside.item': { + 'Meta': {'ordering': "['code']", 'object_name': 'Item', 'db_table': "'timeside_items'"}, + 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}), + 'sha1': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '1024', 'blank': 'True'}) + } + } + + complete_apps = ['timeside'] \ No newline at end of file diff --git a/timeside/models.py b/timeside/models.py index 416f52a..8a334e9 100644 --- a/timeside/models.py +++ b/timeside/models.py @@ -2,22 +2,35 @@ from django.db.models import * from django.utils.translation import ugettext_lazy as _ +from django.contrib.auth.models import User +import timeside + +app = 'timeside' + +STATUS = ((0, _('broken')), (1, _('pending')), (2, _('processing')), + (3, _('done')), (4, _('ready'))) class MetaCore: - app_label = 'timeside' + app_label = app class Item(Model): + code = CharField(_('code'), unique=True, max_length=512) title = CharField(_('title'), blank=True, max_length=512) - description = CharField(_('description'), blank=True, max_length=1024) - code = CharField(_('code'), unique=True, max_length=256) - media_file = FileField(_('file'), upload_to='items/%Y/%m/%d', - db_column="file", max_length=1024) + description = TextField(_('description'), blank=True) + file = FileField(_('file'), upload_to='items/%Y/%m/%d', blank=True, max_length=1024) + url = URLField(_('URL'), blank=True, max_length=1024) + sha1 = CharField(_('sha1'), unique=True, blank=True, max_length=512) + mime_type = CharField(_('mime_type'), null=True, max_length=256) + + def set_mime_type(self): + if self.file: + self.mime_type = mimetypes.guess_type(self.file.path)[0] class Meta(MetaCore): - db_table = 'timeside_item' + db_table = app + '_items' ordering = ['code'] verbose_name = _('item') @@ -25,16 +38,87 @@ class Item(Model): return self.code -class Analysis(Model): +class Processor(Model): + + pid = CharField(_('pid'), max_length=256) + parameters = TextField(_('parameters'), blank=True) + version = CharField(_('version'), max_length=64, blank=True) + status = IntegerField(_('status'), choices=STATUS, default=1) + + def save(self): + super(Processor, self).save() + if not self.version: + self.version = timeside.__version__ + + class Meta(MetaCore): + abstract=True + + +class Decoder(Processor): + + class Meta(MetaCore): + db_table = app + '_decoders' + verbose_name = _('decoder') + + +class Analyzer(Processor): + + class Meta(MetaCore): + db_table = app + '_analyzers' + verbose_name = _('analyzer') + + +class Grapher(Processor): - item = ForeignKey(Item, related_name='analysis', - verbose_name=_('item'), null=True, on_delete=SET_NULL) - hdf5_file = FileField(_('file'), upload_to='cache/%Y/%m/%d', - db_column="hdf5", max_length=1024) + file = FileField(_('file'), upload_to='cache/grapher/%Y/%m/%d', db_column="file", max_length=1024) + mime_type = CharField(_('mime_type'), null=True, max_length=256) + height = IntegerField(_('height'), default=180) + width = IntegerField(_('width'), default=320) class Meta(MetaCore): - db_table = 'timeside_analysis' - verbose_name = _('analysis') + db_table = app + '_graphers' + verbose_name = _('grapher') + + +class Encoder(Processor): + + file = FileField(_('file'), upload_to='cache/encoder/%Y/%m/%d', db_column="file", max_length=1024) + mime_type = CharField(_('mime_type'), null=True, max_length=256) + + class Meta(MetaCore): + db_table = app + '_encoders' + verbose_name = _('encoder') + + +class Experience(Model): + + item = ForeignKey(Item, related_name='experience', verbose_name=_('item'), null=True, on_delete=SET_NULL) + title = CharField(_('title'), blank=True, max_length=512) + description = TextField(_('description'), blank=True) + date_added = DateTimeField(_('date added'), auto_now_add=True) + date_modified = DateTimeField(_('date modified'), auto_now=True, null=True) + status = IntegerField(_('status'), choices=STATUS, default=1) + uuid = CharField(_('uuid'), max_length=256) + author = ForeignKey(User, related_name="experience", verbose_name=_('author'), blank=True, null=True) + + decoder = ForeignKey(Decoder, related_name="experience", verbose_name=_('decoder'), null=True) + analyzers = ManyToManyField(Analyzer, related_name="experience", verbose_name=_('analyzers'), blank=True, null=True) + graphers = ManyToManyField(Grapher, related_name="experience", verbose_name=_('graphers'), blank=True, null=True) + encoders = ManyToManyField(Encoder, related_name="experience", verbose_name=_('encoders'), blank=True, null=True) + + begin_time = FloatField(_('begin time'), default=0, blank=True) + end_time = FloatField(_('end time'), blank=True) + low_frequency = FloatField(_('low frequency'), blank=True) + high_frequency = FloatField(_('highh frequency'), blank=True) + + hdf5 = FileField(_('hdf5_file'), upload_to='cache/hdf5/%Y/%m/%d', db_column="hdf5", max_length=1024) + json = FileField(_('json_file'), upload_to='cache/json/%Y/%m/%d', db_column="json", max_length=1024) + + class Meta(MetaCore): + db_table = app + '_experiences' + verbose_name = _('experience') def results(self): - pass \ No newline at end of file + pass + + diff --git a/timeside/views.py b/timeside/views.py index 74b8215..4ff8ba5 100644 --- a/timeside/views.py +++ b/timeside/views.py @@ -1,10 +1,18 @@ # -*- coding: utf-8 -*- +import timeside from django.views.generic import * from timeside.models import * +decoders = timeside.core.processors(timeside.api.IDecoder) +analyzers = timeside.core.processors(timeside.api.IAnalyzer) +graphers = timeside.core.processors(timeside.api.IGrapher) +encoders = timeside.core.processors(timeside.api.IEncoder) +value_analyzers = timeside.core.processors(timeside.api.IValueAnalyzer) + + class IndexView(ListView): model = Item @@ -18,3 +26,39 @@ class IndexView(ListView): #@method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(IndexView, self).dispatch(*args, **kwargs) + + +class ItemGraphView(DetailView): + + + + def item_visualize(self, request, public_id, grapher_id, width, height): + item = MediaItem.objects.get(public_id=public_id) + mime_type = 'image/png' + grapher = self.get_grapher(grapher_id) + + if grapher.id() != grapher_id: + raise Http404 + + size = width + '_' + height + image_file = '.'.join([public_id, grapher_id, size, 'png']) + + # FIX waveform grapher name change + old_image_file = '.'.join([public_id, 'waveform', size, 'png']) + if 'waveform_centroid' in grapher_id and self.cache_data.exists(old_image_file): + image_file = old_image_file + + if not self.cache_data.exists(image_file): + source = item.get_source() + if source: + path = self.cache_data.dir + os.sep + image_file + decoder = timeside.decoder.FileDecoder(source) + graph = grapher(width = int(width), height = int(height)) + (decoder | graph).run() + graph.watermark('timeside', opacity=.6, margin=(5,5)) + f = open(path, 'w') + graph.render(output=path) + f.close() + + response = HttpResponse(self.cache_data.read_stream_bin(image_file), mimetype=mime_type) + return response \ No newline at end of file -- 2.39.5