def test_query_docs(monkeypatch): monkeypatch_ol(monkeypatch) assert dynlinks.query_docs(["isbn:1234567890"]) == { "isbn:1234567890": { "key": "/books/OL1M", "title": "foo" } } assert dynlinks.query_docs(["isbn:9876543210"]) == {} assert dynlinks.query_docs(["isbn:1234567890", "isbn:9876543210"]) == { "isbn:1234567890": { "key": "/books/OL1M", "title": "foo" } }
def process(self, req): requests = req.split('|') bib_keys = sum([r.split(';') for r in requests], []) # filter out 'id:foo' before passing to dynlinks bib_keys = [k for k in bib_keys if k[:3].lower() != 'id:'] self.docs = dynlinks.query_docs(bib_keys) if not self.options.get('no_details'): self.detailss = dynlinks.process_result_for_details(self.docs) else: self.detailss = {} dp = dynlinks.DataProcessor() self.datas = dp.process(self.docs) self.works = dp.works # XXX control costs below with [:iaid_limit] - note that this may result # in no 'exact' item match, even if one exists # Note that it's available thru above works/docs iaid_limit = 500 self.wkey_to_iaids = dict( (wkey, get_work_iaids(wkey)[:iaid_limit]) for wkey in self.works) iaids = sum(self.wkey_to_iaids.values(), []) self.iaid_to_meta = dict( (iaid, ia.get_metadata(iaid)) for iaid in iaids) def lookup_iaids(iaids): step = 10 if len(iaids) > step and not self.options.get('debug_things'): result = [] while iaids: result += lookup_iaids(iaids[:step]) iaids = iaids[step:] return result query = { 'type': '/type/edition', 'ocaid': iaids, } result = web.ctx.site.things(query) return result ekeys = lookup_iaids(iaids) # If returned order were reliable, I could skip the below. eds = dynlinks.ol_get_many_as_dict(ekeys) self.iaid_to_ed = dict((ed['ocaid'], ed) for ed in eds.values()) # self.iaid_to_ekey = dict((iaid, ed['key']) # for iaid, ed in self.iaid_to_ed.items()) # Work towards building a dict of iaid loanability, # def has_lending_collection(meta): # collections = meta.get("collection", []) # return 'lendinglibrary' in collections or 'inlibrary' in collections # in case site.store supports get_many (unclear) # maybe_loanable_iaids = [iaid for iaid in iaids # if has_lending_collection(self.iaid_to_meta.get(iaid, {}))] # loanable_ekeys = [self.iaid_to_ekey.get(iaid) for iaid in maybe_loanable_iaids] # loanstatus = web.ctx.site.store.get('ebooks' + ekey, {'borrowed': 'false'}) result = {} for r in requests: bib_keys = r.split(';') if r.lower().startswith('id:'): result_key = bib_keys.pop(0)[3:] else: result_key = r sub_result = self.make_record(bib_keys) if sub_result: result[result_key] = sub_result if self.options.get('debug_items'): result['ekeys'] = ekeys result['eds'] = eds result['iaids'] = iaids return result