From: Guillaume Pellerin Date: Mon, 21 Apr 2014 09:34:02 +0000 (+0200) Subject: upgrade models, remove jsonfields, add REST serializers thanks to djangorestframework X-Git-Tag: 0.5.5~1^2~57 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=68cd7948582213cef29fdb591fa938d765b7126b;p=timeside.git upgrade models, remove jsonfields, add REST serializers thanks to djangorestframework --- diff --git a/setup.py b/setup.py index 29250d8..760a8ae 100755 --- a/setup.py +++ b/setup.py @@ -38,8 +38,8 @@ setup( 'simplejson', 'scipy', 'django', - 'jsonfield', 'django-extensions', + 'djangorestframework', ], platforms=['OS Independent'], license='Gnu Public License V2', diff --git a/tests/server/settings.py b/tests/server/settings.py index 0d353ca..4f1221d 100644 --- a/tests/server/settings.py +++ b/tests/server/settings.py @@ -52,7 +52,7 @@ USE_TZ = True # Absolute filesystem path to the directory that will hold user-uploaded files. # Example: "/home/media/media.lawrence.com/media/" -MEDIA_ROOT = '' +MEDIA_ROOT = 'media/' # URL that handles the media served from MEDIA_ROOT. Make sure to use a # trailing slash. @@ -129,6 +129,7 @@ INSTALLED_APPS = ( 'django_extensions', 'south', 'timeside', + 'rest_framework', ) # A sample logging configuration. The only tangible logging @@ -159,3 +160,6 @@ LOGGING = { }, } } + +REST_FRAMEWORK = { +} \ No newline at end of file diff --git a/timeside/__init__.py b/timeside/__init__.py index d527231..333a661 100644 --- a/timeside/__init__.py +++ b/timeside/__init__.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- -import api -import core -import decoder -import analyzer -import grapher -import encoder +from . import api +from . import core +from . import decoder +from . import analyzer +from . import grapher +from . import encoder __version__ = '0.5.5' diff --git a/timeside/admin.py b/timeside/admin.py index 53e030b..a6f882b 100644 --- a/timeside/admin.py +++ b/timeside/admin.py @@ -2,10 +2,11 @@ from django.contrib import admin from timeside.models import * -admin.site.register(Collection) +admin.site.register(Selection) admin.site.register(Item) admin.site.register(Experience) admin.site.register(Processor) +admin.site.register(Parameters) admin.site.register(Result) admin.site.register(Task) diff --git a/timeside/migrations/0001_initial.py b/timeside/migrations/0001_initial.py index 3233762..bba562c 100644 --- a/timeside/migrations/0001_initial.py +++ b/timeside/migrations/0001_initial.py @@ -8,40 +8,51 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - # Adding model 'Collection' - db.create_table('timeside_collections', ( + # Adding model 'Selection' + db.create_table('timeside_selections', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=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)), - ('uuid', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), + ('uuid', self.gf('django.db.models.fields.CharField')(unique=True, max_length=512, blank=True)), ('title', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='selections', null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), )) - db.send_create_signal('timeside', ['Collection']) + db.send_create_signal('timeside', ['Selection']) - # Adding M2M table for field items on 'Collection' - m2m_table_name = db.shorten_name('timeside_collections_items') + # Adding M2M table for field items on 'Selection' + m2m_table_name = db.shorten_name('timeside_selections_items') db.create_table(m2m_table_name, ( ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('collection', models.ForeignKey(orm['timeside.collection'], null=False)), + ('selection', models.ForeignKey(orm['timeside.selection'], null=False)), ('item', models.ForeignKey(orm['timeside.item'], null=False)) )) - db.create_unique(m2m_table_name, ['collection_id', 'item_id']) + db.create_unique(m2m_table_name, ['selection_id', 'item_id']) + + # Adding M2M table for field selections on 'Selection' + m2m_table_name = db.shorten_name('timeside_selections_selections') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('from_selection', models.ForeignKey(orm['timeside.selection'], null=False)), + ('to_selection', models.ForeignKey(orm['timeside.selection'], null=False)) + )) + db.create_unique(m2m_table_name, ['from_selection_id', 'to_selection_id']) # Adding model 'Item' db.create_table('timeside_items', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=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)), - ('uuid', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), + ('uuid', self.gf('django.db.models.fields.CharField')(unique=True, max_length=512, blank=True)), ('title', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), ('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)), + ('sha1', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), ('mime_type', self.gf('django.db.models.fields.CharField')(max_length=256, blank=True)), ('hdf5', self.gf('django.db.models.fields.files.FileField')(max_length=1024, blank=True)), ('lock', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='items', null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), )) db.send_create_signal('timeside', ['Item']) @@ -50,10 +61,11 @@ class Migration(SchemaMigration): ('id', self.gf('django.db.models.fields.AutoField')(primary_key=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)), - ('uuid', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), + ('uuid', self.gf('django.db.models.fields.CharField')(unique=True, max_length=512, blank=True)), ('title', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), ('description', self.gf('django.db.models.fields.TextField')(blank=True)), ('author', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='experiences', null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), + ('is_preset', self.gf('django.db.models.fields.BooleanField')(default=False)), )) db.send_create_signal('timeside', ['Experience']) @@ -66,15 +78,20 @@ class Migration(SchemaMigration): )) db.create_unique(m2m_table_name, ['experience_id', 'processor_id']) + # Adding M2M table for field experiences on 'Experience' + m2m_table_name = db.shorten_name('timeside_experiences_experiences') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('from_experience', models.ForeignKey(orm['timeside.experience'], null=False)), + ('to_experience', models.ForeignKey(orm['timeside.experience'], null=False)) + )) + db.create_unique(m2m_table_name, ['from_experience_id', 'to_experience_id']) + # Adding model 'Processor' db.create_table('timeside_processors', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=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)), - ('uuid', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), ('pid', self.gf('django.db.models.fields.CharField')(max_length=256)), ('type', self.gf('django.db.models.fields.CharField')(default='none', max_length=64)), - ('parameters', self.gf('jsonfield.fields.JSONField')(null=True, blank=True)), ('version', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)), )) db.send_create_signal('timeside', ['Processor']) @@ -84,40 +101,45 @@ class Migration(SchemaMigration): ('id', self.gf('django.db.models.fields.AutoField')(primary_key=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)), - ('uuid', self.gf('django.db.models.fields.CharField')(max_length=512, blank=True)), + ('uuid', self.gf('django.db.models.fields.CharField')(unique=True, max_length=512, blank=True)), ('item', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='results', null=True, on_delete=models.SET_NULL, to=orm['timeside.Item'])), ('processor', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='results', null=True, on_delete=models.SET_NULL, to=orm['timeside.Processor'])), - ('output', self.gf('django.db.models.fields.files.FileField')(max_length=1024)), - ('json', self.gf('jsonfield.fields.JSONField')(blank=True)), - ('hdf5', self.gf('django.db.models.fields.files.FileField')(max_length=1024)), - ('output_mime_type', self.gf('django.db.models.fields.CharField')(max_length=256, null=True)), + ('hdf5', self.gf('django.db.models.fields.files.FileField')(max_length=1024, blank=True)), + ('output', self.gf('django.db.models.fields.files.FileField')(max_length=1024, blank=True)), + ('output_mime_type', self.gf('django.db.models.fields.CharField')(max_length=256, blank=True)), + ('status', self.gf('django.db.models.fields.IntegerField')(default=1)), )) db.send_create_signal('timeside', ['Result']) + # Adding model 'Parameters' + db.create_table('timeside_parameters', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('processor', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='parameters', null=True, to=orm['timeside.Experience'])), + ('parameters', self.gf('django.db.models.fields.TextField')(blank=True)), + ('is_preset', self.gf('django.db.models.fields.BooleanField')(default=False)), + )) + db.send_create_signal('timeside', ['Parameters']) + # Adding model 'Task' db.create_table('timeside_tasks', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('experience', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='task', null=True, to=orm['timeside.Experience'])), + ('selection', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='task', null=True, to=orm['timeside.Selection'])), ('status', self.gf('django.db.models.fields.IntegerField')(default=1)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='tasks', null=True, on_delete=models.SET_NULL, to=orm['auth.User'])), )) db.send_create_signal('timeside', ['Task']) - # Adding M2M table for field items on 'Task' - m2m_table_name = db.shorten_name('timeside_tasks_items') - db.create_table(m2m_table_name, ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('task', models.ForeignKey(orm['timeside.task'], null=False)), - ('item', models.ForeignKey(orm['timeside.item'], null=False)) - )) - db.create_unique(m2m_table_name, ['task_id', 'item_id']) - def backwards(self, orm): - # Deleting model 'Collection' - db.delete_table('timeside_collections') + # Deleting model 'Selection' + db.delete_table('timeside_selections') + + # Removing M2M table for field items on 'Selection' + db.delete_table(db.shorten_name('timeside_selections_items')) - # Removing M2M table for field items on 'Collection' - db.delete_table(db.shorten_name('timeside_collections_items')) + # Removing M2M table for field selections on 'Selection' + db.delete_table(db.shorten_name('timeside_selections_selections')) # Deleting model 'Item' db.delete_table('timeside_items') @@ -128,18 +150,21 @@ class Migration(SchemaMigration): # Removing M2M table for field processors on 'Experience' db.delete_table(db.shorten_name('timeside_experiences_processors')) + # Removing M2M table for field experiences on 'Experience' + db.delete_table(db.shorten_name('timeside_experiences_experiences')) + # Deleting model 'Processor' db.delete_table('timeside_processors') # Deleting model 'Result' db.delete_table('timeside_results') + # Deleting model 'Parameters' + db.delete_table('timeside_parameters') + # Deleting model 'Task' db.delete_table('timeside_tasks') - # Removing M2M table for field items on 'Task' - db.delete_table(db.shorten_name('timeside_tasks_items')) - models = { 'auth.group': { @@ -178,29 +203,22 @@ class Migration(SchemaMigration): 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) }, - 'timeside.collection': { - 'Meta': {'ordering': "['title']", 'object_name': 'Collection', 'db_table': "'timeside_collections'"}, - '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'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'items': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'collections'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Item']"}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) - }, 'timeside.experience': { 'Meta': {'object_name': 'Experience', 'db_table': "'timeside_experiences'"}, 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'experiences'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), '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'}), + 'experiences': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'other_experiences'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Experience']"}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_preset': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'processors': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'experiences'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Processor']"}), 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) + 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512', 'blank': 'True'}) }, 'timeside.item': { 'Meta': {'ordering': "['title']", 'object_name': 'Item', 'db_table': "'timeside_items'"}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'items'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), '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'}), @@ -209,40 +227,56 @@ class Migration(SchemaMigration): 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'lock': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}), - 'sha1': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512', 'blank': 'True'}), + 'sha1': ('django.db.models.fields.CharField', [], {'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'}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) + 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512', 'blank': 'True'}) + }, + 'timeside.parameters': { + 'Meta': {'object_name': 'Parameters'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_preset': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'parameters': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'processor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parameters'", 'null': 'True', 'to': "orm['timeside.Experience']"}) }, 'timeside.processor': { 'Meta': {'object_name': 'Processor', 'db_table': "'timeside_processors'"}, - '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'}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'parameters': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), 'type': ('django.db.models.fields.CharField', [], {'default': "'none'", 'max_length': '64'}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}) }, 'timeside.result': { 'Meta': {'object_name': 'Result', 'db_table': "'timeside_results'"}, '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'}), - 'hdf5': ('django.db.models.fields.files.FileField', [], {'max_length': '1024'}), + 'hdf5': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'blank': 'True'}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'results'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['timeside.Item']"}), - 'json': ('jsonfield.fields.JSONField', [], {'blank': 'True'}), - 'output': ('django.db.models.fields.files.FileField', [], {'max_length': '1024'}), - 'output_mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}), + 'output': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'blank': 'True'}), + 'output_mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}), 'processor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'results'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['timeside.Processor']"}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) + 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512', 'blank': 'True'}) + }, + 'timeside.selection': { + 'Meta': {'object_name': 'Selection', 'db_table': "'timeside_selections'"}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'selections'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), + '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'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'items': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'selections'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Item']"}), + 'selections': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'other_selections'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Selection']"}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), + 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '512', 'blank': 'True'}) }, 'timeside.task': { 'Meta': {'object_name': 'Task', 'db_table': "'timeside_tasks'"}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tasks'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), 'experience': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'task'", 'null': 'True', 'to': "orm['timeside.Experience']"}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'items': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'task'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Item']"}), + 'selection': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'task'", 'null': 'True', 'to': "orm['timeside.Selection']"}), 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}) } } diff --git a/timeside/migrations/0002_auto__chg_field_result_output_mime_type.py b/timeside/migrations/0002_auto__chg_field_result_output_mime_type.py deleted file mode 100644 index 79c1d08..0000000 --- a/timeside/migrations/0002_auto__chg_field_result_output_mime_type.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- 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): - - # Changing field 'Result.output_mime_type' - db.alter_column('timeside_results', 'output_mime_type', self.gf('django.db.models.fields.CharField')(default='', max_length=256)) - - def backwards(self, orm): - - # Changing field 'Result.output_mime_type' - db.alter_column('timeside_results', 'output_mime_type', self.gf('django.db.models.fields.CharField')(max_length=256, null=True)) - - 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.collection': { - 'Meta': {'ordering': "['title']", 'object_name': 'Collection', 'db_table': "'timeside_collections'"}, - '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'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'items': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'collections'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Item']"}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) - }, - 'timeside.experience': { - 'Meta': {'object_name': 'Experience', 'db_table': "'timeside_experiences'"}, - 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'experiences'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), - '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'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'processors': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'experiences'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Processor']"}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) - }, - 'timeside.item': { - 'Meta': {'ordering': "['title']", 'object_name': 'Item', 'db_table': "'timeside_items'"}, - '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'}), - 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'blank': 'True'}), - 'hdf5': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'lock': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': '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'}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) - }, - 'timeside.processor': { - 'Meta': {'object_name': 'Processor', 'db_table': "'timeside_processors'"}, - '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'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'parameters': ('jsonfield.fields.JSONField', [], {'null': 'True', 'blank': 'True'}), - 'pid': ('django.db.models.fields.CharField', [], {'max_length': '256'}), - 'type': ('django.db.models.fields.CharField', [], {'default': "'none'", 'max_length': '64'}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}), - 'version': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}) - }, - 'timeside.result': { - 'Meta': {'object_name': 'Result', 'db_table': "'timeside_results'"}, - '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'}), - 'hdf5': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'results'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['timeside.Item']"}), - 'json': ('jsonfield.fields.JSONField', [], {'blank': 'True'}), - 'output': ('django.db.models.fields.files.FileField', [], {'max_length': '1024', 'blank': 'True'}), - 'output_mime_type': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}), - 'processor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'results'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['timeside.Processor']"}), - 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}) - }, - 'timeside.task': { - 'Meta': {'object_name': 'Task', 'db_table': "'timeside_tasks'"}, - 'experience': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'task'", 'null': 'True', 'to': "orm['timeside.Experience']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'items': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'task'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['timeside.Item']"}), - 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}) - } - } - - complete_apps = ['timeside'] \ No newline at end of file diff --git a/timeside/models.py b/timeside/models.py index df29646..a453500 100644 --- a/timeside/models.py +++ b/timeside/models.py @@ -9,9 +9,6 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User -from jsonfield import JSONField - - app = 'timeside' processors = timeside.core.processors(timeside.api.IProcessor) @@ -27,7 +24,6 @@ STATUS = ((0, _('failed')), (1, _('pending')), (2, _('running')), def get_mime_type(path): return mimetypes.guess_type(path)[0] - def get_processor(pid): for proc in processors: if proc.id == pid: @@ -44,7 +40,7 @@ class BaseResource(models.Model): date_added = models.DateTimeField(_('date added'), auto_now_add=True) date_modified = models.DateTimeField(_('date modified'), auto_now=True, null=True) - uuid = models.CharField(_('uuid'), blank=True, max_length=512, ) + uuid = models.CharField(_('uuid'), unique=True, blank=True, max_length=512, editable=False) class Meta(MetaCore): abstract = True @@ -67,24 +63,26 @@ class DocBaseResource(BaseResource): abstract = True -class Collection(DocBaseResource): +class Selection(DocBaseResource): - items = models.ManyToManyField('Item', related_name="collections", verbose_name=_('items'), blank=True, null=True) + items = models.ManyToManyField('Item', related_name="selections", verbose_name=_('items'), blank=True, null=True) + author = models.ForeignKey(User, related_name="selections", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL) + selections = models.ManyToManyField('Selection', related_name="other_selections", verbose_name=_('other selections'), blank=True, null=True) class Meta(MetaCore): - db_table = app + '_collections' - ordering = ['title'] - verbose_name = _('collection') + db_table = app + '_selections' + verbose_name = _('selection') class Item(DocBaseResource): file = models.FileField(_('file'), upload_to='items/%Y/%m/%d', blank=True, max_length=1024) url = models.URLField(_('URL'), blank=True, max_length=1024) - sha1 = models.CharField(_('sha1'), unique=True, blank=True, max_length=512) + sha1 = models.CharField(_('sha1'), blank=True, max_length=512) mime_type = models.CharField(_('mime type'), blank=True, max_length=256) hdf5 = models.FileField(_('HDF5 result file'), upload_to='items/%Y/%m/%d', blank=True, max_length=1024) lock = models.BooleanField(default=False) + author = models.ForeignKey(User, related_name="items", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL) class Meta(MetaCore): db_table = app + '_items' @@ -96,7 +94,7 @@ class Item(DocBaseResource): if not self.mime_type: self.mime_type = get_mime_type(self.file.path) if not self.sha1: - self.sha1 = sha1sum_file(self.file) + self.sha1 = sha1sum_file(self.file.path) super(Item, self).save(**kwargs) def results(self): @@ -107,17 +105,18 @@ class Experience(DocBaseResource): processors = models.ManyToManyField('Processor', related_name="experiences", verbose_name=_('processors'), blank=True, null=True) author = models.ForeignKey(User, related_name="experiences", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL) - + experiences = models.ManyToManyField('Experience', related_name="other_experiences", verbose_name=_('other experiences'), blank=True, null=True) + is_preset = models.BooleanField(default=False) + class Meta(MetaCore): db_table = app + '_experiences' verbose_name = _('Experience') -class Processor(BaseResource): +class Processor(models.Model): pid = models.CharField(_('pid'), choices=PROCESSOR_PIDS, max_length=256) type = models.CharField(_('type'), choices=PROCESSOR_TYPES, default='none', max_length=64) - parameters = JSONField(_('parameters'), blank=True, null=True) version = models.CharField(_('version'), max_length=64, blank=True) class Meta(MetaCore): @@ -137,16 +136,20 @@ class Result(BaseResource): item = models.ForeignKey('Item', related_name="results", verbose_name=_('item'), blank=True, null=True, on_delete=models.SET_NULL) processor = models.ForeignKey('Processor', related_name="results", verbose_name=_('processor'), blank=True, null=True, on_delete=models.SET_NULL) - json = JSONField(_('JSON result'), blank=True) hdf5 = models.FileField(_('HDF5 result file'), upload_to='results/%Y/%m/%d', blank=True, max_length=1024) output = models.FileField(_('Output file'), upload_to='results/%Y/%m/%d', blank=True, max_length=1024) output_mime_type = models.CharField(_('Output mime type'), blank=True, max_length=256) - + status = models.IntegerField(_('status'), choices=STATUS, default=1) + class Meta(MetaCore): db_table = app + '_results' verbose_name = _('Result') verbose_name_plural = _('Results') + def status_setter(self, status): + self.status = status + self.save() + def __unicode__(self): return '_'.join([self.item.title, unicode(self.processor)]) @@ -156,12 +159,28 @@ class Result(BaseResource): super(Result, self).save(**kwargs) +class Parameters(models.Model): + + processor = models.ForeignKey('Experience', related_name="parameters", verbose_name=_('processor'), blank=True, null=True) + parameters = models.TextField(_('Parameters'), blank=True) + is_preset = models.BooleanField(default=False) + + class Meta: + db_table = app + '_parameters' + verbose_name = _('Parameters') + verbose_name_plural = _('Parameters') + + def __unicode__(self): + pass + + class Task(models.Model): experience = models.ForeignKey('Experience', related_name="task", verbose_name=_('experience'), blank=True, null=True) - items = models.ManyToManyField('Item', related_name="task", verbose_name=_('items'), blank=True, null=True) + selection = models.ForeignKey('Selection', related_name="task", verbose_name=_('selection'), blank=True, null=True) status = models.IntegerField(_('status'), choices=STATUS, default=1) - + author = models.ForeignKey(User, related_name="tasks", verbose_name=_('author'), blank=True, null=True, on_delete=models.SET_NULL) + class Meta(MetaCore): db_table = app + '_tasks' verbose_name = _('Task') @@ -177,7 +196,7 @@ class Task(models.Model): def run(self): self.status_setter(2) - for item in self.items: + for item in self.selection.items: pipe = timeside.decoder.FileDecoder(item.file) proc_dict = {} for processor in self.experience.processors.all(): @@ -200,11 +219,7 @@ class Task(models.Model): for processor in proc_dict.keys(): proc = proc_dict[processor] - results = Result.objects.filter(processor=processor, uuid=proc.UUID) - if not results: - result = Result(processor=processor, uuid=proc.UUID, item=item) - else: - result = results[0] + result = Result.objects.get_or_create(processor=processor, uuid=proc.UUID, item=item) result.hdf5 = path + item.uuid + '_' + proc.UUID + '.hdf5' proc.results.to_hdf5(result.hdf5) result.save() diff --git a/timeside/serializers.py b/timeside/serializers.py new file mode 100644 index 0000000..a42fd29 --- /dev/null +++ b/timeside/serializers.py @@ -0,0 +1,19 @@ +from timeside.models import * +from rest_framework import serializers +import django.db.models + + +class SelectionSerializer(serializers.ModelSerializer): + + class Meta: + model = Selection + fields = ('id', 'author', 'items') + + +class ItemSerializer(serializers.ModelSerializer): + + class Meta: + model = Item + fields = ('id', 'title', 'mime_type') + + diff --git a/timeside/templates/timeside/index.html b/timeside/templates/timeside/index.html index 54bcdff..9e67fd7 100644 --- a/timeside/templates/timeside/index.html +++ b/timeside/templates/timeside/index.html @@ -5,7 +5,7 @@ diff --git a/timeside/urls.py b/timeside/urls.py index c1e401e..9a2a40f 100644 --- a/timeside/urls.py +++ b/timeside/urls.py @@ -1,9 +1,18 @@ # -*- coding: utf-8 -*- -from django.conf.urls.defaults import * -from timeside.views import * +from django.conf.urls import patterns, include, url +from django.contrib import admin +from rest_framework import routers +from timeside import views -urlpatterns = patterns('', - url(r'^$', IndexView.as_view(), name="timeside-index"), +admin.autodiscover() + +api_router = routers.DefaultRouter() +api_router.register(r'items', views.ItemViewSet) +api_router.register(r'selections', views.SelectionViewSet) +urlpatterns = patterns('', + url(r'^$', views.IndexView.as_view(), name="timeside-index"), + url(r'^admin/', include(admin.site.urls)), + url(r'^api/', include(api_router.urls)), ) diff --git a/timeside/views.py b/timeside/views.py index f7594b9..339f546 100644 --- a/timeside/views.py +++ b/timeside/views.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- import timeside - -from django.views.generic import * from timeside.models import * +from rest_framework import viewsets +from django.views.generic import * +from timeside.serializers import * def stream_from_file(__file): @@ -24,20 +25,12 @@ class IndexView(ListView): def get_context_data(self, **kwargs): context = super(IndexView, self).get_context_data(**kwargs) - item = self.get_object() - context['experiences'] = item.experiences.all().filter(author=self.request.user) return context def dispatch(self, *args, **kwargs): return super(IndexView, self).dispatch(*args, **kwargs) -class ItemGrapherView(DetailView): - - model = Item - mime_type = 'image/png' - - class ItemAnalyzerView(DetailView): model = Item @@ -51,4 +44,18 @@ class ItemAnalyzerView(DetailView): context = super(ItemJsonAnalyzerView, self).get_context_data(**kwargs) return context - \ No newline at end of file + + +class ItemViewSet(viewsets.ModelViewSet): + + model = Item + serializer_class = ItemSerializer + + +class SelectionViewSet(viewsets.ModelViewSet): + + model = Selection + serializer_class = SelectionSerializer + + +