def fulfill_link(self, license_pool, active_loan, delivery_mechanism): """Create a new fulfillment link. This link may include tags from the OPDS Extensions for DRM. """ if isinstance(delivery_mechanism, LicensePoolDeliveryMechanism): logging.warn("LicensePoolDeliveryMechanism passed into fulfill_link instead of DeliveryMechanism!") delivery_mechanism = delivery_mechanism.delivery_mechanism format_types = AcquisitionFeed.format_types(delivery_mechanism) if not format_types: return None fulfill_url = self.url_for( "fulfill", license_pool_id=license_pool.id, mechanism_id=delivery_mechanism.id, library_short_name=self.library.short_name, _external=True ) rel=OPDSFeed.ACQUISITION_REL link_tag = AcquisitionFeed.acquisition_link( rel=rel, href=fulfill_url, types=format_types ) children = AcquisitionFeed.license_tags(license_pool, active_loan, None) link_tag.extend(children) children = self.drm_device_registration_tags( license_pool, active_loan, delivery_mechanism ) link_tag.extend(children) return link_tag
def fulfill_link(self, data_source_name, identifier_identifier, license_pool, active_loan, delivery_mechanism): """Create a new fulfillment link.""" if isinstance(delivery_mechanism, LicensePoolDeliveryMechanism): logging.warn("LicensePoolDeliveryMechanism passed into fulfill_link instead of DeliveryMechanism!") delivery_mechanism = delivery_mechanism.delivery_mechanism format_types = AcquisitionFeed.format_types(delivery_mechanism) if not format_types: return None fulfill_url = self.url_for( "fulfill", data_source=data_source_name, identifier=identifier_identifier, mechanism_id=delivery_mechanism.id, _external=True ) rel=OPDSFeed.ACQUISITION_REL link_tag = AcquisitionFeed.acquisition_link( rel=rel, href=fulfill_url, types=format_types ) children = AcquisitionFeed.license_tags(license_pool, active_loan, None) link_tag.extend(children) return link_tag
def acquisition_links(self, active_license_pool, active_loan, active_hold, active_fulfillment, feed, identifier): """Generate a number of <link> tags that enumerate all acquisition methods.""" can_borrow = False can_fulfill = False can_revoke = False can_hold = self.library.allow_holds if active_loan: can_fulfill = True can_revoke = True elif active_hold: # We display the borrow link even if the patron can't # borrow the book right this minute. can_borrow = True can_revoke = ( not self.circulation or self.circulation.can_revoke_hold( active_license_pool, active_hold) ) elif active_fulfillment: can_fulfill = True can_revoke = True else: # The patron has no existing relationship with this # work. Give them the opportunity to check out the work # or put it on hold. can_borrow = True # If there is something to be revoked for this book, # add a link to revoke it. revoke_links = [] if can_revoke: url = self.url_for( 'revoke_loan_or_hold', license_pool_id=active_license_pool.id, library_short_name=self.library.short_name, _external=True) kw = dict(href=url, rel=OPDSFeed.REVOKE_LOAN_REL) revoke_link_tag = OPDSFeed.makeelement("link", **kw) revoke_links.append(revoke_link_tag) # Add next-step information for every useful delivery # mechanism. borrow_links = [] api = None if self.circulation: api = self.circulation.api_for_license_pool(active_license_pool) if api: set_mechanism_at_borrow = ( api.SET_DELIVERY_MECHANISM_AT == BaseCirculationAPI.BORROW_STEP) else: # This is most likely an open-access book. Just put one # borrow link and figure out the rest later. set_mechanism_at_borrow = False if can_borrow: # Borrowing a book gives you an OPDS entry that gives you # fulfillment links. if set_mechanism_at_borrow: # The ebook distributor requires that the delivery # mechanism be set at the point of checkout. This means # a separate borrow link for each mechanism. for mechanism in active_license_pool.delivery_mechanisms: borrow_links.append( self.borrow_link( identifier, mechanism, [mechanism] ) ) else: # The ebook distributor does not require that the # delivery mechanism be set at the point of # checkout. This means a single borrow link with # indirectAcquisition tags for every delivery # mechanism. If a delivery mechanism must be set, it # will be set at the point of fulfillment. borrow_links.append( self.borrow_link( identifier, None, active_license_pool.delivery_mechanisms ) ) # Generate the licensing tags that tell you whether the book # is available. license_tags = feed.license_tags( active_license_pool, active_loan, active_hold ) for link in borrow_links: for t in license_tags: link.append(t) # Add links for fulfilling an active loan. fulfill_links = [] if can_fulfill: if active_fulfillment: # We're making an entry for a specific fulfill link. type = active_fulfillment.content_type url = active_fulfillment.content_link rel = OPDSFeed.ACQUISITION_REL link_tag = AcquisitionFeed.acquisition_link( rel=rel, href=url, types=[type]) fulfill_links.append(link_tag) elif active_loan.fulfillment: # The delivery mechanism for this loan has been # set. There is one link for the delivery mechanism # that was locked in, and links for any streaming # delivery mechanisms. for lpdm in active_license_pool.delivery_mechanisms: if lpdm is active_loan.fulfillment or lpdm.delivery_mechanism.is_streaming: fulfill_links.append( self.fulfill_link( active_license_pool, active_loan, lpdm.delivery_mechanism ) ) else: # The delivery mechanism for this loan has not been # set. There is one fulfill link for every delivery # mechanism. for lpdm in active_license_pool.delivery_mechanisms: fulfill_links.append( self.fulfill_link( active_license_pool, active_loan, lpdm.delivery_mechanism ) ) # If this is an open-access book, add an open-access link for # every delivery mechanism with an associated resource. open_access_links = [] if active_license_pool.open_access: for lpdm in active_license_pool.delivery_mechanisms: if lpdm.resource: open_access_links.append(self.open_access_link(lpdm)) return [x for x in borrow_links + fulfill_links + open_access_links + revoke_links if x is not None]