NYPL-Simplified/circulation

Making lists containing titles that have both audio and ebook fails

jonathangreen opened this issue · 1 comments

When creating a list containing a title that has both audio and ebook formats available from Overdrive list creation fails with:

{"host": "27fe6e13c2fb", "name": "root", "level": "ERROR", "timestamp": "2018-03-30T17:53:13.773444", "app": "simplified", "traceback": "Traceback (most recent call last):
  File \"/var/www/circulation/env/local/lib/python2.7/site-packages/flask/app.py\", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File \"/var/www/circulation/env/local/lib/python2.7/site-packages/flask/app.py\", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File \"/var/www/circulation/api/routes.py\", line 147, in decorated
    return f(*args, **kwargs)
  File \"/var/www/circulation/api/admin/routes.py\", line 100, in decorated
    v = f(*args, **kwargs)
  File \"/var/www/circulation/api/admin/routes.py\", line 79, in decorated
    return f(*args, **kwargs)
  File \"/var/www/circulation/api/admin/routes.py\", line 94, in decorated
    return f(*args, **kwargs)
  File \"/var/www/circulation/api/admin/routes.py\", line 468, in custom_lists
    return app.manager.admin_custom_lists_controller.custom_lists()
  File \"/var/www/circulation/api/admin/controller.py\", line 1078, in custom_lists
    return self._create_or_update_list(library, name, entries, collections, id)
  File \"/var/www/circulation/api/admin/controller.py\", line 1118, in _create_or_update_list
    Edition.permanent_work_id==pwid
  File \"/var/www/circulation/env/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py\", line 2840, in one
    \"Multiple rows were found for one()\")
MultipleResultsFound: Multiple rows were found for one()", "message": "Exception in web app: Multiple rows were found for one()", "filename": "app_server.py"}

Looks like the query that is failing is this one:

work = self._db.query(
    Work
).join(
    Edition, Edition.id==Work.presentation_edition_id
).filter(
    Edition.permanent_work_id==pwid
).one()

Testing in my database with this query:

select * from work w join editions e on e.id=w.presentation_edition_id where e.permanent_work_id = 'b8058b99-ad4a-7fd0-cf74-d557747811c1';

Give me:

 data_source_id | medium 
----------------+--------
             27 | Book
             27 | Audio
(2 rows)

The same thing happens when a book is available in two languages and has the same title and author for both.