diff --git a/api/funkwhale_api/federation/migrations/0003_auto_20180403_1921.py b/api/funkwhale_api/federation/migrations/0003_auto_20180403_1921.py
deleted file mode 100644
index aadf3257ea4ff86dcfb2e8ed53a9d435c9f482fe..0000000000000000000000000000000000000000
--- a/api/funkwhale_api/federation/migrations/0003_auto_20180403_1921.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# Generated by Django 2.0.3 on 2018-04-03 19:21
-
-from django.db import migrations, models
-import django.db.models.deletion
-import django.utils.timezone
-import uuid
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('federation', '0002_auto_20180403_1620'),
- ]
-
- operations = [
- migrations.CreateModel(
- name='Follow',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('uuid', models.UUIDField(default=uuid.uuid4, unique=True)),
- ('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
- ('last_modification_date', models.DateTimeField(default=django.utils.timezone.now)),
- ('actor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='emitted_follows', to='federation.Actor')),
- ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_follows', to='federation.Actor')),
- ],
- ),
- migrations.AlterUniqueTogether(
- name='follow',
- unique_together={('actor', 'target')},
- ),
- ]
diff --git a/api/funkwhale_api/federation/migrations/0003_auto_20180406_1319.py b/api/funkwhale_api/federation/migrations/0003_auto_20180406_1319.py
new file mode 100644
index 0000000000000000000000000000000000000000..cc653b1aa49762d3d32c465e581f7789b8c10e8b
--- /dev/null
+++ b/api/funkwhale_api/federation/migrations/0003_auto_20180406_1319.py
@@ -0,0 +1,48 @@
+# Generated by Django 2.0.3 on 2018-04-06 13:19
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import uuid
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('federation', '0002_auto_20180403_1620'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Follow',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('uuid', models.UUIDField(default=uuid.uuid4, unique=True)),
+ ('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
+ ('modification_date', models.DateTimeField(auto_now=True)),
+ ('actor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='emitted_follows', to='federation.Actor')),
+ ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_follows', to='federation.Actor')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='FollowRequest',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('uuid', models.UUIDField(default=uuid.uuid4, unique=True)),
+ ('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
+ ('modification_date', models.DateTimeField(auto_now=True)),
+ ('approved', models.NullBooleanField(default=None)),
+ ('actor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='emmited_follow_requests', to='federation.Actor')),
+ ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_follow_requests', to='federation.Actor')),
+ ],
+ ),
+ migrations.AddField(
+ model_name='actor',
+ name='followers',
+ field=models.ManyToManyField(related_name='following', through='federation.Follow', to='federation.Actor'),
+ ),
+ migrations.AlterUniqueTogether(
+ name='follow',
+ unique_together={('actor', 'target')},
+ ),
+ ]
diff --git a/api/funkwhale_api/federation/migrations/0004_followrequest.py b/api/funkwhale_api/federation/migrations/0004_followrequest.py
deleted file mode 100644
index 6ede72747f0453b8d5e645641559429f32b88956..0000000000000000000000000000000000000000
--- a/api/funkwhale_api/federation/migrations/0004_followrequest.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# Generated by Django 2.0.3 on 2018-04-04 17:11
-
-from django.db import migrations, models
-import django.db.models.deletion
-import django.utils.timezone
-import uuid
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('federation', '0003_auto_20180403_1921'),
- ]
-
- operations = [
- migrations.CreateModel(
- name='FollowRequest',
- fields=[
- ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('uuid', models.UUIDField(default=uuid.uuid4, unique=True)),
- ('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
- ('last_modification_date', models.DateTimeField(default=django.utils.timezone.now)),
- ('approved', models.NullBooleanField(default=None)),
- ('actor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='emmited_follow_requests', to='federation.Actor')),
- ('target', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='received_follow_requests', to='federation.Actor')),
- ],
- ),
- ]
diff --git a/api/funkwhale_api/federation/migrations/0005_actor_followers.py b/api/funkwhale_api/federation/migrations/0005_actor_followers.py
deleted file mode 100644
index 94a1c75acea175634e985eabea1504808d3b97ba..0000000000000000000000000000000000000000
--- a/api/funkwhale_api/federation/migrations/0005_actor_followers.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Generated by Django 2.0.3 on 2018-04-05 16:35
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('federation', '0004_followrequest'),
- ]
-
- operations = [
- migrations.AddField(
- model_name='actor',
- name='followers',
- field=models.ManyToManyField(related_name='following', through='federation.Follow', to='federation.Actor'),
- ),
- ]
diff --git a/api/funkwhale_api/federation/models.py b/api/funkwhale_api/federation/models.py
index 833b5d8f38ae19c397ef7aeb10123ad031261d78..4bf597001f9fe53640ca7dde3d6a3e0b168fce65 100644
--- a/api/funkwhale_api/federation/models.py
+++ b/api/funkwhale_api/federation/models.py
@@ -106,8 +106,8 @@ class Follow(models.Model):
on_delete=models.CASCADE,
)
creation_date = models.DateTimeField(default=timezone.now)
- last_modification_date = models.DateTimeField(
- default=timezone.now)
+ modification_date = models.DateTimeField(
+ auto_now=True)
class Meta:
unique_together = ['actor', 'target']
@@ -129,8 +129,8 @@ class FollowRequest(models.Model):
on_delete=models.CASCADE,
)
creation_date = models.DateTimeField(default=timezone.now)
- last_modification_date = models.DateTimeField(
- default=timezone.now)
+ modification_date = models.DateTimeField(
+ auto_now=True)
approved = models.NullBooleanField(default=None)
def approve(self):
diff --git a/api/funkwhale_api/music/migrations/0023_auto_20180405_1830.py b/api/funkwhale_api/music/migrations/0023_auto_20180405_1830.py
deleted file mode 100644
index 3cef1f42e6a1e2e3ea5edfdcba619331336c99fc..0000000000000000000000000000000000000000
--- a/api/funkwhale_api/music/migrations/0023_auto_20180405_1830.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# Generated by Django 2.0.3 on 2018-04-05 18:30
-
-from django.conf import settings
-import django.contrib.postgres.fields.jsonb
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('federation', '0005_actor_followers'),
- ('music', '0022_importbatch_import_request'),
- ]
-
- operations = [
- migrations.AddField(
- model_name='importbatch',
- name='federation_actor',
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='import_batches', to='federation.Actor'),
- ),
- migrations.AddField(
- model_name='importbatch',
- name='federation_source',
- field=models.URLField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='importjob',
- name='federation_source',
- field=models.URLField(blank=True, null=True),
- ),
- migrations.AddField(
- model_name='importjob',
- name='metadata',
- field=django.contrib.postgres.fields.jsonb.JSONField(default={}),
- ),
- migrations.AlterField(
- model_name='importbatch',
- name='source',
- field=models.CharField(choices=[('api', 'api'), ('shell', 'shell'), ('federation', 'federation')], default='api', max_length=30),
- ),
- migrations.AlterField(
- model_name='importbatch',
- name='submitted_by',
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='imports', to=settings.AUTH_USER_MODEL),
- ),
- ]
diff --git a/api/funkwhale_api/music/migrations/0023_auto_20180406_1319.py b/api/funkwhale_api/music/migrations/0023_auto_20180406_1319.py
new file mode 100644
index 0000000000000000000000000000000000000000..c51a7b9fab79e44fbf1b0db52ee119dfd375cd54
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0023_auto_20180406_1319.py
@@ -0,0 +1,104 @@
+# Generated by Django 2.0.3 on 2018-04-06 13:19
+
+from django.conf import settings
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import uuid
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('federation', '0003_auto_20180406_1319'),
+ ('music', '0022_importbatch_import_request'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='album',
+ name='uuid',
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
+ ),
+ migrations.AddField(
+ model_name='artist',
+ name='uuid',
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
+ ),
+ migrations.AddField(
+ model_name='importbatch',
+ name='federation_actor',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='import_batches', to='federation.Actor'),
+ ),
+ migrations.AddField(
+ model_name='importbatch',
+ name='federation_source',
+ field=models.URLField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name='importbatch',
+ name='uuid',
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
+ ),
+ migrations.AddField(
+ model_name='importjob',
+ name='federation_source',
+ field=models.URLField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name='importjob',
+ name='metadata',
+ field=django.contrib.postgres.fields.jsonb.JSONField(default={}),
+ ),
+ migrations.AddField(
+ model_name='importjob',
+ name='uuid',
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
+ ),
+ migrations.AddField(
+ model_name='lyrics',
+ name='uuid',
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
+ ),
+ migrations.AddField(
+ model_name='track',
+ name='uuid',
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
+ ),
+ migrations.AddField(
+ model_name='trackfile',
+ name='creation_date',
+ field=models.DateTimeField(default=django.utils.timezone.now),
+ ),
+ migrations.AddField(
+ model_name='trackfile',
+ name='federation_source',
+ field=models.URLField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name='trackfile',
+ name='modification_date',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AddField(
+ model_name='trackfile',
+ name='uuid',
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
+ ),
+ migrations.AddField(
+ model_name='work',
+ name='uuid',
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
+ ),
+ migrations.AlterField(
+ model_name='importbatch',
+ name='source',
+ field=models.CharField(choices=[('api', 'api'), ('shell', 'shell'), ('federation', 'federation')], default='api', max_length=30),
+ ),
+ migrations.AlterField(
+ model_name='importbatch',
+ name='submitted_by',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='imports', to=settings.AUTH_USER_MODEL),
+ ),
+ ]
diff --git a/api/funkwhale_api/music/migrations/0024_auto_20180406_1115.py b/api/funkwhale_api/music/migrations/0024_auto_20180406_1115.py
deleted file mode 100644
index 8b655a64246d477275ade43b2ae808727c2934a8..0000000000000000000000000000000000000000
--- a/api/funkwhale_api/music/migrations/0024_auto_20180406_1115.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# Generated by Django 2.0.3 on 2018-04-06 11:15
-
-from django.db import migrations, models
-import uuid
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('music', '0023_auto_20180405_1830'),
- ]
-
- operations = [
- migrations.AddField(
- model_name='album',
- name='uuid',
- field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
- ),
- migrations.AddField(
- model_name='artist',
- name='uuid',
- field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
- ),
- migrations.AddField(
- model_name='importbatch',
- name='uuid',
- field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
- ),
- migrations.AddField(
- model_name='importjob',
- name='uuid',
- field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
- ),
- migrations.AddField(
- model_name='lyrics',
- name='uuid',
- field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
- ),
- migrations.AddField(
- model_name='track',
- name='uuid',
- field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
- ),
- migrations.AddField(
- model_name='trackfile',
- name='uuid',
- field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
- ),
- migrations.AddField(
- model_name='work',
- name='uuid',
- field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True),
- ),
- ]
diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index 5d8035f358f4dd9cdc3fbaebf6e7402f614f976e..efffb12d9f9cf239a7e14ed80f7b495cfe004708 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -414,6 +414,12 @@ class TrackFile(models.Model):
Track, related_name='files', on_delete=models.CASCADE)
audio_file = models.FileField(upload_to='tracks/%Y/%m/%d', max_length=255)
source = models.URLField(null=True, blank=True)
+ creation_date = models.DateTimeField(default=timezone.now)
+ modification_date = models.DateTimeField(auto_now=True)
+
+ # points to the URL of the original trackfile ActivityPub Object
+ federation_source = models.URLField(null=True, blank=True)
+
duration = models.IntegerField(null=True, blank=True)
acoustid_track_id = models.UUIDField(null=True, blank=True)
mimetype = models.CharField(null=True, blank=True, max_length=200)
diff --git a/api/funkwhale_api/music/tasks.py b/api/funkwhale_api/music/tasks.py
index e4214d9904597fde9504afb837071cbe35802b1c..4f85613eba0a9b19fe3a8788bc6725eaed73ad97 100644
--- a/api/funkwhale_api/music/tasks.py
+++ b/api/funkwhale_api/music/tasks.py
@@ -102,6 +102,7 @@ def _do_import(import_job, replace, use_acoustid=True):
track_file = track_file or models.TrackFile(
track=track, source=import_job.source)
track_file.acoustid_track_id = acoustid_track_id
+ track_file.federation_source = import_job.federation_source
if from_file:
track_file.audio_file = ContentFile(import_job.audio_file.read())
track_file.audio_file.name = import_job.audio_file.name
diff --git a/api/tests/music/test_import.py b/api/tests/music/test_import.py
index 87e1899d635f21c4cbdb1d0b7a09f8e04dd86552..98174891fbf123f5c4aa0c6d3c03031df3132485 100644
--- a/api/tests/music/test_import.py
+++ b/api/tests/music/test_import.py
@@ -62,6 +62,7 @@ def test_import_job_from_federation_no_musicbrainz(factories):
tf = job.track_file
assert tf.source == job.source
+ assert tf.federation_source == job.federation_source
assert tf.track.title == 'Ping'
assert tf.track.artist.name == 'Hello'
assert tf.track.album.title == 'World'
@@ -84,6 +85,7 @@ def test_import_job_from_federation_musicbrainz_recording(factories, mocker):
tf = job.track_file
assert tf.source == job.source
+ assert tf.federation_source == job.federation_source
assert tf.track == t
track_from_api.assert_called_once_with(
mbid=tasks.get_mbid(job.metadata['recording'], 'recording'))
@@ -105,6 +107,7 @@ def test_import_job_from_federation_musicbrainz_release(factories, mocker):
job.refresh_from_db()
tf = job.track_file
+ assert tf.federation_source == job.federation_source
assert tf.source == job.source
assert tf.track.title == 'Ping'
assert tf.track.artist == a.artist
@@ -131,6 +134,7 @@ def test_import_job_from_federation_musicbrainz_artist(factories, mocker):
tf = job.track_file
assert tf.source == job.source
+ assert tf.federation_source == job.federation_source
assert tf.track.title == 'Ping'
assert tf.track.artist == a
assert tf.track.album.artist == a