Skip to content

Commit

Permalink
Merge pull request #456 from anshg1214/handle_deleted_and_redirected_…
Browse files Browse the repository at this point in the history
…entities

Handle Deleted and Redirected BB Entities
  • Loading branch information
alastair authored Aug 16, 2022
2 parents 2adb71e + 7a59166 commit 1944ad0
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ def fetch_multiple_edition_groups(bbids: List[uuid.UUID]) -> dict:
LEFT JOIN author_credit_name acn ON acn.author_credit_id = edition_group.author_credit_id
WHERE bbid in :bbids
AND master = 't'
AND data_id IS NOT NULL
GROUP BY bbid,
edition_group.name,
sort_name,
Expand Down
49 changes: 49 additions & 0 deletions critiquebrainz/frontend/external/bookbrainz_db/redirects.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import uuid
from brainzutils import cache
import sqlalchemy
import critiquebrainz.frontend.external.bookbrainz_db as db
from critiquebrainz.frontend.external.bookbrainz_db import DEFAULT_CACHE_EXPIRATION


def get_redirected_bbid(bbid: uuid.UUID) -> str:
"""
Get the redirected BBID for a given BBID.
Args:
bbid: The BBID to get the redirected BBID for.
Returns:
The redirected BBID.
Returns None if the BBID is not redirected.
"""
bb_redirect_key = cache.gen_key('bb_redirects', bbid)
results = cache.get(bb_redirect_key)

if not results:
with db.bb_engine.connect() as connection:
result = connection.execute(sqlalchemy.text("""
WITH RECURSIVE redirects AS (
SELECT source_bbid, target_bbid
FROM entity_redirect
WHERE source_bbid = :bbid
UNION
SELECT er.source_bbid, er.target_bbid
FROM entity_redirect er
INNER JOIN redirects rd
ON rd.target_bbid = er.source_bbid
)
SELECT target_bbid::text
FROM redirects
"""), {'bbid': bbid})

redirect_bbids = result.fetchall()

results = []
for redirect_bbid in redirect_bbids:
redirect_bbids = dict(redirect_bbid)
results.append(redirect_bbid['target_bbid'])

cache.set(bb_redirect_key, results, DEFAULT_CACHE_EXPIRATION)

if results:
return results[-1]
else:
return None
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from critiquebrainz.frontend.external.bookbrainz_db import redirects
from critiquebrainz.data.testing import DataTestCase


class BBRedirectsTestCase(DataTestCase):

def setUp(self):
super(BBRedirectsTestCase, self).setUp()
self.bbid1 = '63a40e3d-54ff-4549-9637-24959ad89241'
self.bbid2 = 'dd40b465-931f-46ee-b2ae-28685b19f8d8'
self.bbid3 = 'e5c4e68b-bfce-4c77-9ca2-0f0a2d4d09f0'

def test_single_bb_redirects(self):
# Test single redirect
redirected_bbid = redirects.get_redirected_bbid(self.bbid1)
self.assertEqual(redirected_bbid, 'ecdeb45d-c432-4347-94c3-f01acc799d4a')

def test_multiple_bb_redirects(self):
# Test multiple redirects
redirected_bbid = redirects.get_redirected_bbid(self.bbid2)
self.assertEqual(redirected_bbid, '7e691222-6f78-4ad6-ad5d-1a671a319fbd')

def test_no_bb_redirects(self):
# Test no redirects
redirected_bbid = redirects.get_redirected_bbid(self.bbid3)
self.assertEqual(redirected_bbid, None)
6 changes: 5 additions & 1 deletion critiquebrainz/frontend/views/bb_author.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from datetime import datetime
from flask import Blueprint, render_template, request
from flask import Blueprint, render_template, request, redirect, url_for
from flask_login import current_user
from werkzeug.exceptions import NotFound, BadRequest
from flask_babel import gettext
import critiquebrainz.db.review as db_review
import critiquebrainz.frontend.external.bookbrainz_db.author as bb_author
import critiquebrainz.frontend.external.bookbrainz_db.literary_work as bb_literary_work
import critiquebrainz.frontend.external.bookbrainz_db.redirects as bb_redirects
from critiquebrainz.frontend.forms.rate import RatingEditForm
from critiquebrainz.frontend.views import get_avg_rating, AUTHOR_REVIEWS_LIMIT

Expand All @@ -24,6 +25,9 @@ def entity(id):
author = bb_author.get_author_by_bbid(id)

if author is None:
redirected_bbid = bb_redirects.get_redirected_bbid(id)
if redirected_bbid:
return redirect(url_for('bb_author.entity', id=redirected_bbid))
raise NotFound(gettext("Sorry, we couldn't find an author with that BookBrainz ID."))

literary_work_type = request.args.get('literary_work_type')
Expand Down
8 changes: 7 additions & 1 deletion critiquebrainz/frontend/views/bb_edition_group.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from flask import Blueprint, render_template, request
from flask import Blueprint, render_template, request, redirect, url_for
from flask_login import current_user
from werkzeug.exceptions import NotFound, BadRequest
from flask_babel import gettext
import critiquebrainz.db.review as db_review
import critiquebrainz.frontend.external.bookbrainz_db.edition_group as bb_edition_group
import critiquebrainz.frontend.external.bookbrainz_db.redirects as bb_redirects
from critiquebrainz.frontend.forms.rate import RatingEditForm
from critiquebrainz.frontend.views import get_avg_rating, EDITION_GROUP_REVIEWS_LIMIT

Expand All @@ -14,9 +15,14 @@
@bb_edition_group_bp.route('/<uuid:id>')
def entity(id):
id = str(id)

edition_group = bb_edition_group.get_edition_group_by_bbid(id)

if edition_group is None:
redirected_bbid = bb_redirects.get_redirected_bbid(id)
if redirected_bbid:
return redirect(url_for('bb_edition_group.entity', id=redirected_bbid))

raise NotFound(gettext("Sorry, we couldn't find an edition group with that BookBrainz ID."))

try:
Expand Down
7 changes: 6 additions & 1 deletion critiquebrainz/frontend/views/bb_literary_work.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from flask import Blueprint, render_template, request
from flask import Blueprint, render_template, request, redirect, url_for
from flask_login import current_user
from werkzeug.exceptions import NotFound, BadRequest
from flask_babel import gettext
import critiquebrainz.db.review as db_review
import critiquebrainz.frontend.external.bookbrainz_db.literary_work as bb_literary_work
import critiquebrainz.frontend.external.bookbrainz_db.redirects as bb_redirects
from critiquebrainz.frontend.forms.rate import RatingEditForm
from critiquebrainz.frontend.views import get_avg_rating, LITERARY_WORK_REVIEWS_LIMIT

Expand All @@ -16,6 +17,10 @@ def entity(id):
literary_work = bb_literary_work.get_literary_work_by_bbid(id)

if literary_work is None:
redirected_bbid = bb_redirects.get_redirected_bbid(id)
if redirected_bbid:
return redirect(url_for('bb_literary_work.entity', id=redirected_bbid))

raise NotFound(gettext("Sorry, we couldn't find a work with that BookBrainz ID."))

try:
Expand Down
7 changes: 6 additions & 1 deletion critiquebrainz/frontend/views/bb_series.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from flask import Blueprint, render_template, request
from flask import Blueprint, render_template, request, redirect, url_for
from flask_login import current_user
from werkzeug.exceptions import NotFound, BadRequest
from flask_babel import gettext
import critiquebrainz.db.review as db_review
import critiquebrainz.frontend.external.bookbrainz_db.series as bb_series
import critiquebrainz.frontend.external.bookbrainz_db.redirects as bb_redirects
from critiquebrainz.frontend.forms.rate import RatingEditForm
from critiquebrainz.frontend.views import get_avg_rating, SERIES_REVIEWS_LIMIT

Expand All @@ -16,6 +17,10 @@ def entity(id):
series = bb_series.get_series_by_bbid(id)

if series is None:
redirected_bbid = bb_redirects.get_redirected_bbid(id)
if redirected_bbid:
return redirect(url_for('bb_series.entity', id=redirected_bbid))

raise NotFound(gettext("Sorry, we couldn't find a series with that BookBrainz ID."))

try:
Expand Down

0 comments on commit 1944ad0

Please sign in to comment.