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') }} + + {% endif %} + {%- 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') }} + + {% endif %} {% if release_group['external-urls'] %} {{ _('External links') }}