Skip to content

Commit

Permalink
Merge pull request #994 from internetarchive/844/hotfix/slow-work-pag…
Browse files Browse the repository at this point in the history
…es-availability

fixing works page to load availability of all editions in one go
  • Loading branch information
mekarpeles authored Jun 25, 2018
2 parents 82d0ac0 + 6c0ef96 commit 75452cf
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 97 deletions.
12 changes: 6 additions & 6 deletions openlibrary/macros/LoanStatus.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@
$ user_loan = None
$ waiting_loan = ctx.user and ctx.user.get_waiting_loan_for(page)
$ my_turn_to_borrow = waiting_loan and waiting_loan['status'] == 'available' and waiting_loan['position'] == 1
$ realtime_availability = page.get_realtime_availability()
$ availability = realtime_availability.get('status', 'error')
$ wlsize = realtime_availability.get('num_waitlist', 0)
$ availability = page.availability or page.get_realtime_availability()
$ availability_status = availability.get('status', 'error')
$ current_and_available_loans = []

$if page.get('ocaid'):
Expand Down Expand Up @@ -44,14 +43,15 @@
<input type="submit" value="Return eBook" class="submit unwait-btn" id="return_ebook"/>
</form>

$elif (availability == 'borrow_available') or my_turn_to_borrow:
$elif (availability_status == 'borrow_available') or my_turn_to_borrow:
<p>
<a href="$borrow_link" title="Borrow from $contributor" id="borrow_ebook" class="borrow-btn borrow-link">
Borrow eBook
</a>
</p>

$elif (availability == 'borrow_unavailable'):
$elif (availability_status == 'borrow_unavailable'):
$ wlsize = availability.get('num_waitlist', 0)
$if waiting_loan:
<p>
$ spot = ctx.user.get_waiting_loan_for(page)['position']
Expand Down Expand Up @@ -86,7 +86,7 @@
$:macros.daisy(page)

$# If waitlisted, show other possible editions after daisy download link
$if (availability == 'borrow_unavailble'):
$if (availability_status == 'borrow_unavailable'):
$ checkedout = current_and_available_loans[0] if current_and_available_loans else []
$if checkedout and not user_loan:
$if work and work.edition_count > 1:
Expand Down
130 changes: 66 additions & 64 deletions openlibrary/plugins/openlibrary/js/availability.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ $(function(){
var isAvailabilityFilteringDisabledForPage = function() {
return (window.location.pathname.match('\/people\/[^/]+') ||
window.location.pathname.match('\/account\/books\/[^/]+') ||
window.location.pathname.match('\/works\/[^/]+') ||
window.location.pathname.match('\/stats/[^/]+'));
}

Expand Down Expand Up @@ -166,74 +167,75 @@ $(function(){
}
});

getAvailabilityV2('openlibrary_edition', editions, function(editions_response) {
getAvailabilityV2('openlibrary_work', works, function(works_response) {
var response = {'books': editions_response, 'works': works_response};
$.each(results, function(index, e) {
var href = $(e).attr('href');
var _type_key_slug = href.split('/')
var _type = _type_key_slug[1];
var key = _type_key_slug[2];
if (response[_type]) {
var work = response[_type][key];
var li = $(e).closest("li");
var cta = li.find(".searchResultItemCTA-lending");
var msg = '';
var link = '';
var annotation = '';
var tag = 'a';

var mode = isAvailabilityFilteringDisabledForPage() ? 'everything' : localStorage.getItem('mode');

if (mode !== "printdisabled") {
if (work.status === 'error' || work.status === 'private') {
if (mode === "ebooks") {
li.remove();
}
} else {
var cls = 'borrow_available borrow-link';
link = ' href="/books/' + work.openlibrary_edition + '/x/borrow" ';

if (work.status === 'open') {
msg = 'Read';
} else if (work.status === 'borrow_available') {
msg = 'Borrow';
} else if (work.status === 'borrow_unavailable') {
tag = 'span';
link = '';
cls = work.status;
msg = '<form method="POST" action="/books/' + work.openlibrary_edition + '/x/borrow?action=join-waitinglist" class="join-waitlist waitinglist-form"><input type="hidden" name="action" value="join-waitinglist">';
if (work.num_waitlist !== '0') {
msg += 'Join Waitlist <span class="badge">' + work.num_waitlist + '</span></form>';

if (!isAvailabilityFilteringDisabledForPage()) {
getAvailabilityV2('openlibrary_edition', editions, function(editions_response) {
getAvailabilityV2('openlibrary_work', works, function(works_response) {
var response = {'books': editions_response, 'works': works_response};
$.each(results, function(index, e) {
var href = $(e).attr('href');
var _type_key_slug = href.split('/')
var _type = _type_key_slug[1];
var key = _type_key_slug[2];
if (response[_type]) {
var work = response[_type][key];
var li = $(e).closest("li");
var cta = li.find(".searchResultItemCTA-lending");
var msg = '';
var link = '';
var annotation = '';
var tag = 'a';

var mode = isAvailabilityFilteringDisabledForPage() ? 'everything' : localStorage.getItem('mode');

if (mode !== "printdisabled") {
if (work.status === 'error' || work.status === 'private') {
if (mode === "ebooks") {
li.remove();
}
} else {
msg += 'Join Waitlist</form>';
annotation = '<div class="waitlist-msg">You will be first in line!</div>';
var cls = 'borrow_available borrow-link';
link = ' href="/books/' + work.openlibrary_edition + '/x/borrow" ';

if (work.status === 'open') {
msg = 'Read';
} else if (work.status === 'borrow_available') {
msg = 'Borrow';
} else if (work.status === 'borrow_unavailable') {
tag = 'span';
link = '';
cls = work.status;
msg = '<form method="POST" action="/books/' + work.openlibrary_edition + '/x/borrow?action=join-waitinglist" class="join-waitlist waitinglist-form"><input type="hidden" name="action" value="join-waitinglist">';
if (work.num_waitlist !== '0') {
msg += 'Join Waitlist <span class="badge">' + work.num_waitlist + '</span></form>';

} else {
msg += 'Join Waitlist</form>';
annotation = '<div class="waitlist-msg">You will be first in line!</div>';
}
}
$(cta).append(
'<' + tag + ' ' + link + ' class="' + cls +
' cta-btn" data-ol-link-track="' +
work.status
+ '">' + msg + '</' + tag + '>'
);

if (annotation) {
$(cta).append(annotation);
}
}
}
$(cta).append(
'<' + tag + ' ' + link + ' class="' + cls +
' cta-btn" data-ol-link-track="' +
work.status
+ '">' + msg + '</' + tag + '>'
);

if (annotation) {
$(cta).append(annotation);
}
}
}
}
});
});
})
}

$('.searchResultItemCTA-lending form.join-waitlist').live('click', function(e) {
// consider submitting form async and refreshing search results page
$(this).submit()
})
});
});
})
}

updateBookAvailability();
$('.searchResultItemCTA-lending form.join-waitlist').live('click', function(e) {
// consider submitting form async and refreshing search results page
$(this).submit()
})

updateBookAvailability();
}
});
10 changes: 9 additions & 1 deletion openlibrary/plugins/upstream/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -622,7 +622,15 @@ def get_sorted_editions(self):
editions = [k[len("/books/"):] for k in web.ctx.site.things(q)]

if editions:
return web.ctx.site.get_many(["/books/" + olid for olid in editions])
books = web.ctx.site.get_many(["/books/" + olid for olid in editions])

availability = lending.get_availability_of_ocaids([
book.ocaid for book in books if book.ocaid
])

for book in books:
book.availability = availability.get(book.ocaid) or {"status": "error"}
return books
else:
return []

Expand Down
31 changes: 5 additions & 26 deletions openlibrary/templates/books/edition-sort.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

$ worldcat = "https://worldcat.org/isbn/XXX"
$ worldcatoclc = "https://worldcat.org/oclc/XXX"
$ bookmooch = "http://www.bookmooch.com/m/mooch_choice?asin=XXX"
$ titletrader = "http://www.titletrader.com/invinfo/XXX.html"

$ viewbook = "//%s/stream/XXX?ref=ol" % bookreader_host()
$ detailbook = "//archive.org/details/XXX"
Expand All @@ -16,7 +14,6 @@

$ djvutxt = "//archive.org/download/XXX/XXX_djvu.txt"
$ seeall = "//archive.org/download/XXX"
$ google = ""

$ isbn = (book.isbn_10 and book.isbn_10[0]) or (book.isbn_13 and book.isbn_13[0]) or ""
$ isbn = isbn.replace("-", "")
Expand All @@ -28,17 +25,6 @@
$elif isbn_13:
$ isbn_10 = isbn_13_to_isbn_10(isbn_13)

$ asin = None
$ scribd = None
$if book.get('identifiers'):
$if book.identifiers.get('scribd'):
$ scribd = book.identifiers.scribd[0]
$if book.identifiers.get('amazon'):
$ asin = book.identifiers.amazon[0]

$if isbn_10 and not asin:
$ asin = isbn_10

$ library = None
$ collection = set()
$ meta_fields = book.get_ia_meta_fields()
Expand Down Expand Up @@ -129,15 +115,8 @@
</div>
</td>

$if isbn or asin or scribd:
<td class="icon buy">
<div class="aaaa"></div>
<div class="links">
$:macros.AffiliateLinks({'isbn': isbn, 'asin': asin, 'scribd': scribd})
</div>
</td>
$else:
<td class="icon buy inact">
<div class="zzzz"></div>
<div class="links"></div>
</td>

<td class="icon buy inact">
<div class="zzzz"></div>
<div class="links"></div>
</td>

0 comments on commit 75452cf

Please sign in to comment.