def POST(self, work_id): """ Add a work (or a work and an edition) to a bookshelf. GET params: - edition_id str (optional) - action str: e.g. "add", "remove" - redir bool: if patron not logged in, redirect back to page after login - bookshelf_id int: which bookshelf? e.g. the ID for "want to read"? - dont_remove bool: if book exists & action== "add", don't try removal :param str work_id: e.g. OL123W :rtype: json :return: a list of bookshelves_affected """ from openlibrary.core.models import Bookshelves user = accounts.get_current_user() i = web.input(edition_id=None, action="add", redir=False, bookshelf_id=None, dont_remove=False) key = i.edition_id if i.edition_id else ('/works/OL%sW' % work_id) if not user: raise web.seeother('/account/login?redirect=%s' % key) username = user.key.split('/')[2] current_status = Bookshelves.get_users_read_status_of_work( username, work_id) try: bookshelf_id = int(i.bookshelf_id) shelf_ids = Bookshelves.PRESET_BOOKSHELVES.values() if bookshelf_id != -1 and bookshelf_id not in shelf_ids: raise ValueError except (TypeError, ValueError): return delegate.RawText(json.dumps({'error': 'Invalid bookshelf'}), content_type="application/json") if (not i.dont_remove ) and bookshelf_id == current_status or bookshelf_id == -1: work_bookshelf = Bookshelves.remove(username=username, work_id=work_id, bookshelf_id=current_status) else: edition_id = int( i.edition_id.split('/')[2][2:-1]) if i.edition_id else None work_bookshelf = Bookshelves.add(username=username, bookshelf_id=bookshelf_id, work_id=work_id, edition_id=edition_id) if i.redir: raise web.seeother(key) return delegate.RawText(json.dumps( {'bookshelves_affected': work_bookshelf}), content_type="application/json")
def POST(self, work_id): from openlibrary.core.models import Bookshelves user = accounts.get_current_user() i = web.input(edition_id=None, action="add", redir=False, bookshelf_id=None) key = i.edition_id if i.edition_id else ('/works/OL%sW' % work_id) if not user: raise web.seeother('/account/login?redirect=%s' % key) username = user.key.split('/')[2] current_status = Bookshelves.get_users_read_status_of_work( username, work_id) try: bookshelf_id = int(i.bookshelf_id) shelf_ids = Bookshelves.PRESET_BOOKSHELVES.values() if bookshelf_id != -1 and bookshelf_id not in shelf_ids: raise ValueError except ValueError: return delegate.RawText(simplejson.dumps( {'error': 'Invalid bookshelf'}), content_type="application/json") if bookshelf_id == current_status or bookshelf_id == -1: work_bookshelf = Bookshelves.remove(username=username, work_id=work_id, bookshelf_id=current_status) else: edition_id = int( i.edition_id.split('/')[2][2:-1]) if i.edition_id else None work_bookshelf = Bookshelves.add(username=username, bookshelf_id=bookshelf_id, work_id=work_id, edition_id=edition_id) if i.redir: raise web.seeother(key) return delegate.RawText(simplejson.dumps( {'bookshelves_affected': work_bookshelf}), content_type="application/json")