From dcb66690bb5baedc1e21c0418c09590b8a58af81 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Wed, 13 Dec 2017 23:36:10 +0100
Subject: [PATCH] Fixed #7: store release-group id on Album

---
 CHANGELOG                                     |  8 ++++
 .../migrations/0013_auto_20171213_2211.py     | 28 +++++++++++++
 api/funkwhale_api/music/models.py             |  7 +++-
 api/funkwhale_api/music/tests/factories.py    |  1 +
 api/funkwhale_api/music/tests/test_models.py  | 41 +++++++++++++++++++
 dev.yml                                       | 12 ++++--
 6 files changed, 93 insertions(+), 4 deletions(-)
 create mode 100644 CHANGELOG
 create mode 100644 api/funkwhale_api/music/migrations/0013_auto_20171213_2211.py
 create mode 100644 api/funkwhale_api/music/tests/test_models.py

diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 00000000..48346b64
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,8 @@
+Changelog
+=========
+
+
+0.2.4 (unreleased)
+------------------
+
+Models: now store relese group mbid on Album model (#7)
diff --git a/api/funkwhale_api/music/migrations/0013_auto_20171213_2211.py b/api/funkwhale_api/music/migrations/0013_auto_20171213_2211.py
new file mode 100644
index 00000000..00ccbb62
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0013_auto_20171213_2211.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-12-13 22:11
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0012_auto_20161122_1905'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='importjob',
+            options={'ordering': ('id',)},
+        ),
+        migrations.AlterModelOptions(
+            name='track',
+            options={'ordering': ['album', 'position']},
+        ),
+        migrations.AddField(
+            model_name='album',
+            name='release_group_id',
+            field=models.UUIDField(blank=True, null=True),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index 596f890b..d87da1eb 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -110,13 +110,14 @@ class Album(APIModelMixin):
     title = models.CharField(max_length=255)
     artist = models.ForeignKey(Artist, related_name='albums')
     release_date = models.DateField(null=True)
+    release_group_id = models.UUIDField(null=True, blank=True)
     cover = VersatileImageField(upload_to='albums/covers/%Y/%m/%d', null=True, blank=True)
     TYPE_CHOICES = (
         ('album', 'Album'),
     )
     type = models.CharField(choices=TYPE_CHOICES, max_length=30, default='album')
 
-    api_includes = ['artist-credits', 'recordings', 'media']
+    api_includes = ['artist-credits', 'recordings', 'media', 'release-groups']
     api = musicbrainz.api.releases
     musicbrainz_model = 'release'
     musicbrainz_mapping = {
@@ -127,6 +128,10 @@ class Album(APIModelMixin):
             'musicbrainz_field_name': 'release-list',
             'converter': lambda v: int(v[0]['medium-list'][0]['position']),
         },
+        'release_group_id': {
+            'musicbrainz_field_name': 'release-group',
+            'converter': lambda v: v['id'],
+        },
         'title': {
             'musicbrainz_field_name': 'title',
         },
diff --git a/api/funkwhale_api/music/tests/factories.py b/api/funkwhale_api/music/tests/factories.py
index ea680b3b..d3cd625b 100644
--- a/api/funkwhale_api/music/tests/factories.py
+++ b/api/funkwhale_api/music/tests/factories.py
@@ -18,6 +18,7 @@ class AlbumFactory(factory.django.DjangoModelFactory):
     release_date = factory.Faker('date')
     cover = factory.django.ImageField()
     artist = factory.SubFactory(ArtistFactory)
+    release_group_id = factory.Faker('uuid4')
 
     class Meta:
         model = 'music.Album'
diff --git a/api/funkwhale_api/music/tests/test_models.py b/api/funkwhale_api/music/tests/test_models.py
new file mode 100644
index 00000000..a652676d
--- /dev/null
+++ b/api/funkwhale_api/music/tests/test_models.py
@@ -0,0 +1,41 @@
+import pytest
+
+from funkwhale_api.music import models
+from funkwhale_api.music import importers
+from . import factories
+
+
+def test_can_store_release_group_id_on_album(db):
+    album = factories.AlbumFactory()
+    assert album.release_group_id is not None
+
+
+def test_import_album_stores_release_group(db):
+
+    album_data = {
+        "artist-credit": [
+            {
+                "artist": {
+                    "disambiguation": "George Shaw",
+                    "id": "62c3befb-6366-4585-b256-809472333801",
+                    "name": "Adhesive Wombat",
+                    "sort-name": "Wombat, Adhesive"
+                }
+            }
+        ],
+        "artist-credit-phrase": "Adhesive Wombat",
+        "country": "XW",
+        "date": "2013-06-05",
+        "id": "a50d2a81-2a50-484d-9cb4-b9f6833f583e",
+        "status": "Official",
+        "title": "Marsupial Madness",
+        'release-group': {'id': '447b4979-2178-405c-bfe6-46bf0b09e6c7'}
+    }
+    artist = factories.ArtistFactory(
+        mbid=album_data['artist-credit'][0]['artist']['id']
+    )
+    cleaned_data = models.Album.clean_musicbrainz_data(album_data)
+    album = importers.load(models.Album, cleaned_data, album_data, import_hooks=[])
+
+    assert album.release_group_id == album_data['release-group']['id']
+    assert album.artist == artist
diff --git a/dev.yml b/dev.yml
index 54bc62d8..c71298cf 100644
--- a/dev.yml
+++ b/dev.yml
@@ -33,9 +33,12 @@ services:
      - redis
     command: python manage.py celery worker
     environment:
-        - C_FORCE_ROOT=true
-        - "DATABASE_URL=postgresql://postgres@postgres/postgres"
-        - "CACHE_URL=redis://redis:6379/0"
+      - "DJANGO_ALLOWED_HOSTS=localhost"
+      - "DJANGO_SETTINGS_MODULE=config.settings.local"
+      - "DJANGO_SECRET_KEY=dev"
+      - C_FORCE_ROOT=true
+      - "DATABASE_URL=postgresql://postgres@postgres/postgres"
+      - "CACHE_URL=redis://redis:6379/0"
     volumes:
       - ./api:/app
       - ./data/music:/music
@@ -49,6 +52,9 @@ services:
       - ./api:/app
       - ./data/music:/music
     environment:
+      - "DJANGO_ALLOWED_HOSTS=localhost"
+      - "DJANGO_SETTINGS_MODULE=config.settings.local"
+      - "DJANGO_SECRET_KEY=dev"
       - "DATABASE_URL=postgresql://postgres@postgres/postgres"
       - "CACHE_URL=redis://redis:6379/0"
     ports:
-- 
GitLab