diff --git a/critiquebrainz/frontend/external/musicbrainz_db/helpers.py b/critiquebrainz/frontend/external/musicbrainz_db/helpers.py
index 4ab57230e..2ddd90ab1 100644
--- a/critiquebrainz/frontend/external/musicbrainz_db/helpers.py
+++ b/critiquebrainz/frontend/external/musicbrainz_db/helpers.py
@@ -59,20 +59,21 @@ def _relationship_link_helper(relation, query, source_attr, target_attr, target_
setdefault(relation_type, []).append(link)
-def get_tags(*, db, entity_model, tag_model, entity_ids):
+def get_tags(*, db, entity_model, tag_model, foreign_tag_id, entity_ids):
"""Get tags associated with entities.
Args:
db (Session object): Session object.
entity_model (mbdata.models): Model of the entity.
tag_model (mbdata.models): Tag of the model.
+ foreign_tag_id (tag_model.foreign_key): Foreign ID that joins the tag model and entity model
entity_ids (list): IDs of the entity whose tags are to be fetched
Returns:
List of tuples containing the entity_ids and the list of associated tags.
"""
tags = db.query(entity_model.id, func.array_agg(Tag.name)).\
- join(tag_model).\
+ join(tag_model, entity_model.id == foreign_tag_id).\
join(Tag).\
filter(entity_model.id.in_(entity_ids)).\
group_by(entity_model.id).\
diff --git a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py
index c92c89372..bc2aac3d1 100644
--- a/critiquebrainz/frontend/external/musicbrainz_db/release_group.py
+++ b/critiquebrainz/frontend/external/musicbrainz_db/release_group.py
@@ -93,6 +93,7 @@ def fetch_multiple_release_groups(mbids, *, includes=None):
db=db,
entity_model=models.ReleaseGroup,
tag_model=models.ReleaseGroupTag,
+ foreign_tag_id=models.ReleaseGroupTag.release_group_id,
entity_ids=release_group_ids,
)
for release_group_id, tags in release_group_tags:
diff --git a/critiquebrainz/frontend/external/musicbrainz_db/tests/helpers_test.py b/critiquebrainz/frontend/external/musicbrainz_db/tests/helpers_test.py
index e0cee6df4..192ea51ca 100644
--- a/critiquebrainz/frontend/external/musicbrainz_db/tests/helpers_test.py
+++ b/critiquebrainz/frontend/external/musicbrainz_db/tests/helpers_test.py
@@ -1,10 +1,12 @@
from collections import defaultdict
from unittest import TestCase
from unittest.mock import MagicMock
+from mbdata import models
from critiquebrainz.frontend.external.musicbrainz_db.serialize import to_dict_relationships
from critiquebrainz.frontend.external.musicbrainz_db.helpers import get_relationship_info
import critiquebrainz.frontend.external.musicbrainz_db as mb
from critiquebrainz.frontend.external.musicbrainz_db.test_data import linkplaceurl_1, linkplaceurl_2, place_suisto
+from critiquebrainz.frontend.external.musicbrainz_db.helpers import get_tags
class HelpersTestCase(TestCase):
@@ -12,9 +14,31 @@ class HelpersTestCase(TestCase):
def setUp(self):
mb.mb_session = MagicMock()
self.mock_db = mb.mb_session.return_value.__enter__.return_value
+ self.tags_query = self.mock_db.query.return_value.join.return_value.\
+ join.return_value.filter.return_value.group_by.return_value.all
self.relationships_query = self.mock_db.query.return_value.options.return_value.\
options.return_value.filter.return_value.options
+ def test_get_tags(self):
+ data = defaultdict(dict)
+ self.tags_query.return_value = [(1820974, ['hip hop', 'hip-hop/rap'])]
+ release_group_tags = get_tags(
+ db=self.mock_db,
+ entity_model=models.ReleaseGroup,
+ tag_model=models.ReleaseGroupTag,
+ foreign_tag_id=models.ReleaseGroupTag.release_group_id,
+ entity_ids=['1820974'],
+ )
+ for release_group_id, tags in release_group_tags:
+ data[release_group_id]['tags'] = tags
+ expected_data = {
+ 1820974: {
+ 'tags': ['hip hop', 'hip-hop/rap']
+ }
+ }
+ data = dict(data)
+ self.assertDictEqual(data, expected_data)
+
def test_get_relationship_info(self):
data = {}
self.relationships_query.return_value = [linkplaceurl_1, linkplaceurl_2]
diff --git a/critiquebrainz/frontend/templates/event/entity.html b/critiquebrainz/frontend/templates/event/entity.html
index 641960585..34e5a43c5 100644
--- a/critiquebrainz/frontend/templates/event/entity.html
+++ b/critiquebrainz/frontend/templates/event/entity.html
@@ -1,5 +1,5 @@
{% extends 'base.html' %}
-{% from 'macros.html' import show_avg_rating, entity_rate_form with context %}
+{% from 'macros.html' import show_avg_rating, entity_rate_form, show_external_reviews with context %}
{% block title %}{{ event.name }} - CritiqueBrainz{% endblock %}
@@ -128,6 +128,13 @@
{{ _('Event information') }}
{% endfor %}
{% endif %}
+ {% if external_reviews %}
+ {{ _('External reviews') }}
+
+ {{ show_external_reviews(external_reviews) }}
+
+ {% endif %}
+
diff --git a/critiquebrainz/frontend/templates/macros.html b/critiquebrainz/frontend/templates/macros.html
index 3c5476663..f64b2a3ae 100644
--- a/critiquebrainz/frontend/templates/macros.html
+++ b/critiquebrainz/frontend/templates/macros.html
@@ -107,6 +107,16 @@
{%- endmacro %}
+{% macro show_external_reviews(reviews) %}
+ {% if reviews %}
+ {% for review in reviews %}
+
+ {{ review.url.url }}
+
+ {% endfor %}
+ {% endif %}
+{% endmacro %}
+
{% macro show_tags(tags) %}
{% if tags %}
{% for tag in tags %}
diff --git a/critiquebrainz/frontend/templates/release_group/entity.html b/critiquebrainz/frontend/templates/release_group/entity.html
index 84ad79a2d..001cb3d27 100644
--- a/critiquebrainz/frontend/templates/release_group/entity.html
+++ b/critiquebrainz/frontend/templates/release_group/entity.html
@@ -1,5 +1,5 @@
{% extends 'base.html' %}
-{% from 'macros.html' import cover_art, show_embedded_player, show_tags, show_avg_rating, entity_rate_form with context %}
+{% from 'macros.html' import cover_art, show_embedded_player, show_tags, show_avg_rating, entity_rate_form, show_external_reviews with context %}
{% block title %}
{{ _('Release group "%(title)s" by %(artist)s', title=release_group.title, artist=release_group['artist-credit-phrase']) }}
@@ -148,6 +148,12 @@ {{ _('Release group information') }}
{% if release_group['first-release-date'] %}{{ _('First release in %(year)s', year=release_group['first-release-date'][:4]) }}{% endif %}
+ {% if external_reviews %}
+ {{ _('External reviews') }}
+
+ {{ show_external_reviews(external_reviews) }}
+
+ {% endif %}
{% if release_group['external-urls'] %}
{{ _('External links') }}
diff --git a/critiquebrainz/frontend/views/event.py b/critiquebrainz/frontend/views/event.py
index 79634b66a..500df0517 100644
--- a/critiquebrainz/frontend/views/event.py
+++ b/critiquebrainz/frontend/views/event.py
@@ -40,6 +40,11 @@ def entity(id):
except mb_exceptions.NoDataFoundException:
raise NotFound(gettext("Sorry, we couldn't find an event with that MusicBrainz ID."))
+ if 'url-rels' in event:
+ external_reviews = list(filter(lambda rel: rel['type'] == 'review', event['url-rels']))
+ else:
+ external_reviews = []
+
if 'artist-rels' in event and event['artist-rels']:
artists_sorted = sorted(event['artist-rels'], key=itemgetter('type'))
event['artists_grouped'] = groupby(artists_sorted, itemgetter('type'))
@@ -69,5 +74,5 @@ def entity(id):
avg_rating = get_avg_rating(event['id'], "event")
return render_template('event/entity.html', id=event['id'], event=event, reviews=reviews,
- rating_form=rating_form, my_review=my_review, limit=limit, offset=offset,
- count=count, avg_rating=avg_rating, current_user=current_user)
+ rating_form=rating_form, my_review=my_review, external_reviews=external_reviews,
+ limit=limit, offset=offset, count=count, avg_rating=avg_rating, current_user=current_user)
diff --git a/critiquebrainz/frontend/views/release_group.py b/critiquebrainz/frontend/views/release_group.py
index f7e14a14d..c36171e80 100644
--- a/critiquebrainz/frontend/views/release_group.py
+++ b/critiquebrainz/frontend/views/release_group.py
@@ -40,6 +40,10 @@ def entity(id):
except mb_exceptions.NoDataFoundException:
raise NotFound(gettext("Sorry, we couldn't find a release group with that MusicBrainz ID."))
+ if 'url-rels' in release_group:
+ external_reviews = list(filter(lambda rel: rel['type'] == 'review', release_group['url-rels']))
+ else:
+ external_reviews = []
if 'tag-list' in release_group:
tags = release_group['tag-list']
else:
@@ -79,5 +83,5 @@ def entity(id):
return render_template('release_group/entity.html', id=release_group['id'], release_group=release_group, reviews=reviews,
release=release, my_review=my_review, spotify_mappings=spotify_mappings, tags=tags,
- soundcloud_url=soundcloud_url, limit=limit, offset=offset, count=count, avg_rating=avg_rating,
- rating_form=rating_form, current_user=current_user)
+ soundcloud_url=soundcloud_url, external_reviews=external_reviews, limit=limit, offset=offset,
+ count=count, avg_rating=avg_rating, rating_form=rating_form, current_user=current_user)
diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml
index 73a589d3e..bed25d55f 100644
--- a/docker/docker-compose.dev.yml
+++ b/docker/docker-compose.dev.yml
@@ -42,7 +42,7 @@ services:
image: redis:4.0-alpine
musicbrainz_db:
- image: metabrainz/musicbrainz-test-database:schema-change-2017-q2
+ image: metabrainz/musicbrainz-test-database:beta
volumes:
- ../data/mbdata:/var/lib/postgresql/data/pgdata:z
environment:
diff --git a/requirements.txt b/requirements.txt
index 8e7e42c2f..2ec849937 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,4 @@
-git+https://github.com/metabrainz/brainzutils-python.git@v1.9.0
+git+https://github.com/metabrainz/brainzutils-python.git@v1.10.1
beautifulsoup4==4.6.0
coverage==4.4.1
click==6.7
@@ -8,7 +8,6 @@ Flask-SQLAlchemy==2.2
Flask-Testing==0.6.2
Flask-WTF==0.14.2
Markdown==2.6.8
-mbdata==2017.6.2
musicbrainzngs==0.6
pytest==3.2.0
pytest-cov==2.5.1