def edition_license_filter(query_set): return query_set.filter(ebooks__rights=cc.ccinfo(facet_name))
def set_name(self): self.facet_name = facet_name self.license = cc.ccinfo(facet_name)
def license_filter(query_set): return query_set.filter(rights=cc.ccinfo(facet_name))
def product(edition, facet=None): ebooks = facet.filter_model("Ebook", edition.ebooks.filter( active=True)) if facet else edition.ebooks.filter(active=True) ebooks = ebooks.order_by('-created') # Just because an edition satisfies 2 facets with multiple ebooks doesn't mean that there is a single ebook satisfies both facets if not ebooks.exists(): return None work = edition.work product_node = etree.Element("Product") product_node.append( text_node("RecordReference", "it.unglue.work.%s.%s" % (work.id, edition.id))) product_node.append(text_node("NotificationType", "03")) # final ident_node = etree.SubElement(product_node, "ProductIdentifier") ident_node.append(text_node("ProductIDType", "01")) #proprietary ident_node.append(text_node("IDTypeName", "unglue.it edition id")) #proprietary ident_node.append(text_node("IDValue", unicode(edition.id))) # wrong isbn better than no isbn isbn = edition.isbn_13 if edition.isbn_13 else edition.work.first_isbn_13() if isbn: ident_node = etree.SubElement(product_node, "ProductIdentifier") ident_node.append(text_node("ProductIDType", "03")) #proprietary ident_node.append(text_node("IDValue", isbn)) # Descriptive Detail Block descriptive_node = etree.SubElement(product_node, "DescriptiveDetail") descriptive_node.append(text_node("ProductComposition", "00")) # single item descriptive_node.append(text_node("ProductForm", "ED")) # download ebook = None latest_ebooks = [] ebook_formats = [] for ebook in ebooks: if ebook.format not in ebook_formats: ebook_formats.append(ebook.format) latest_ebooks.append(ebook) if ebook.format == 'epub': descriptive_node.append(text_node("ProductFormDetail", "E101")) elif ebook.format == 'pdf': descriptive_node.append(text_node("ProductFormDetail", "E107")) elif ebook.format == 'mobi': descriptive_node.append(text_node("ProductFormDetail", "E116")) if ebook.rights: license_node = etree.SubElement(descriptive_node, "EpubLicense") license_node.append(text_node("EpubLicenseName", ebook.rights)) lic_expr_node = etree.SubElement(license_node, "EpubLicenseExpression") lic_expr_node.append(text_node("EpubLicenseExpressionType", '01')) #human readable lic_expr_node.append( text_node("EpubLicenseExpressionLink", ccinfo(ebook.rights).url)) title_node = etree.SubElement(descriptive_node, "TitleDetail") title_node.append(text_node("TitleType", '01')) #distinctive title title_el = etree.SubElement(title_node, "TitleElement") title_el.append(text_node("TitleElementLevel", '01')) title_el.append(text_node("TitleText", edition.title)) contrib_i = 0 for contrib in edition.relators.all(): contrib_i += 1 contrib_node = etree.SubElement(descriptive_node, "Contributor") contrib_node.append(text_node("SequenceNumber", unicode(contrib_i))) contrib_node.append( text_node("ContributorRole", relator_contrib.get(contrib.relation.code, ""))) contrib_node.append(text_node("PersonName", contrib.author.name)) contrib_node.append( text_node("PersonNameInverted", contrib.author.last_name_first)) (lang, locale) = (edition.work.language, None) if '_' in lang: (lang, locale) = lang.split('_') if len(lang) == 2: lang = iso639.get(lang, None) if lang: lang_node = etree.SubElement(descriptive_node, "Language") lang_node.append(text_node("LanguageRole", "01")) lang_node.append(text_node("LanguageCode", lang)) if locale: lang_node.append(text_node("CountryCode", locale)) for subject in work.subjects.all(): subj_node = etree.SubElement(descriptive_node, "Subject") if subject.authority == 'lcsh': subj_node.append(text_node("SubjectSchemeIdentifier", "04")) subj_node.append(text_node("SubjectHeadingText", subject.name)) elif subject.authority == 'lcc': subj_node.append(text_node("SubjectSchemeIdentifier", "03")) subj_node.append(text_node("SubjectCode", subject.name)) elif subject.authority == 'bisacsh': subj_node.append(text_node("SubjectSchemeIdentifier", "10")) subj_node.append(text_node("SubjectCode", bisac.code(subject.name))) subj_node.append(text_node("SubjectHeadingText", subject.name)) else: subj_node.append(text_node("SubjectSchemeIdentifier", "20")) subj_node.append(text_node("SubjectHeadingText", subject.name)) # audience range composite if work.age_level: range_match = re.search(r'(\d?\d?)-(\d?\d?)', work.age_level) if range_match: audience_range_node = etree.SubElement(descriptive_node, "AudienceRange") audience_range_node.append( text_node("AudienceRangeQualifier", "17")) #Interest age, years if range_match.group(1): audience_range_node.append( text_node("AudienceRangePrecision", "03")) #from audience_range_node.append( text_node("AudienceRangeValue", range_match.group(1))) if range_match.group(2): audience_range_node.append( text_node("AudienceRangePrecision", "04")) #from audience_range_node.append( text_node("AudienceRangeValue", range_match.group(2))) # Collateral Detail Block coll_node = etree.SubElement(product_node, "CollateralDetail") desc_node = etree.SubElement(coll_node, "TextContent") desc_node.append(text_node("TextType", '03')) # description desc_node.append(text_node("ContentAudience", '00')) #unrestricted desc = ( work.description if work.description else '' ) + '<br /><br />Listed by <a href="https://unglue.it/work/%s/">Unglue.it</a>.' % work.id try: content = etree.XML("<div>" + desc + "</div>") content_node = etree.SubElement(desc_node, "Text", attrib={"textformat": "05"}) #xhtml content_node.append(content) except etree.XMLSyntaxError: content_node = etree.SubElement(desc_node, "Text", attrib={"textformat": "02"}) #html content_node.text = etree.CDATA(desc) supp_node = etree.SubElement(coll_node, "SupportingResource") supp_node.append(text_node("ResourceContentType", '01')) #front cover supp_node.append(text_node("ContentAudience", '00')) #unrestricted supp_node.append(text_node("ResourceMode", '03')) #image cover_node = etree.SubElement(supp_node, "ResourceVersion") cover_node.append(text_node("ResourceForm", '01')) #linkable coverfeat_node = etree.SubElement(cover_node, "ResourceVersionFeature") coverfeat_node.append(text_node("ResourceVersionFeatureType", '01')) #image format coverfeat_node.append(text_node("FeatureValue", 'D502')) #jpeg cover_node.append( text_node("ResourceLink", edition.cover_image_thumbnail())) #link # Publishing Detail Block pubdetail_node = etree.SubElement(product_node, "PublishingDetail") if edition.publisher_name: pub_node = etree.SubElement(pubdetail_node, "Publisher") pub_node.append(text_node("PublishingRole", '01')) #publisher pub_node.append(text_node("PublisherName", edition.publisher_name.name)) pubdetail_node.append(text_node("PublishingStatus", '00')) #unspecified #consumers really want a pub date publication_date = edition.publication_date if edition.publication_date else edition.work.earliest_publication_date if publication_date: pubdate_node = etree.SubElement(pubdetail_node, "PublishingDate") pubdate_node.append(text_node("PublishingDateRole", '01')) #nominal pub date pubdate_node.append( text_node("Date", publication_date.replace('-', ''))) # Product Supply Block supply_node = etree.SubElement(product_node, "ProductSupply") market_node = etree.SubElement(supply_node, "Market") terr_node = etree.SubElement(market_node, "Territory") terr_node.append(text_node("RegionsIncluded", 'WORLD')) supply_detail_node = etree.SubElement(supply_node, "SupplyDetail") supplier_node = etree.SubElement(supply_detail_node, "Supplier") supplier_node.append(text_node("SupplierRole", '11')) #non-exclusive distributer supplier_node.append(text_node("SupplierName", 'Unglue.it')) #non-exclusive distributer for ebook in latest_ebooks: website_node = etree.SubElement(supplier_node, "Website") website_node.append(text_node("WebsiteRole", '29')) #full content website_node.append( text_node("WebsiteDescription", '%s file download' % ebook.format, attrib={'textformat': '06'})) #full content website_node.append(text_node("WebsiteLink", ebook.download_url)) #full content supply_detail_node.append(text_node("ProductAvailability", '20')) #Available price_node = etree.SubElement(supply_detail_node, "Price") price_node.append(text_node("PriceType", '01')) #retail excluding tax price_node.append(text_node("PriceAmount", '0.00')) #retail excluding tax price_node.append(text_node("CurrencyCode", 'USD')) #retail excluding tax return product_node