113 lines
4.0 KiB
Python
113 lines
4.0 KiB
Python
from regluit.core import librarything, bookloader, models
|
|
import itertools
|
|
import django
|
|
|
|
from django.db.models import Q, F
|
|
from regluit.core import bookloader
|
|
import warnings
|
|
import datetime
|
|
|
|
def ry_lt_books():
|
|
"""return parsing of rdhyee's LibraryThing collection"""
|
|
lt = librarything.LibraryThing('rdhyee')
|
|
books = lt.parse_user_catalog(view_style=5)
|
|
return books
|
|
|
|
def editions_for_lt(books):
|
|
"""return the Editions that correspond to the list of LibraryThing books"""
|
|
editions = [bookloader.add_by_isbn(b["isbn"]) for b in books]
|
|
return editions
|
|
|
|
def ry_lt_not_loaded():
|
|
"""Calculate which of the books on rdhyee's librarything list don't yield Editions"""
|
|
books = list(ry_lt_books())
|
|
editions = editions_for_lt(books)
|
|
not_loaded_books = [b for (b, ed) in itertools.izip(books, editions) if ed is None]
|
|
return not_loaded_books
|
|
|
|
def ry_wish_list_equal_loadable_lt_books():
|
|
"""returnwhether the set of works in the user's wishlist is the same as the works in a user's loadable editions from LT"""
|
|
editions = editions_for_lt(ry_lt_books())
|
|
# assume only one user -- and that we have run a LT book loading process for that user
|
|
ry = django.contrib.auth.models.User.objects.all()[0]
|
|
return set([ed.work for ed in filter(None, editions)]) == set(ry.wishlist.works.all())
|
|
|
|
def clear_works_editions_ebooks():
|
|
models.Ebook.objects.all().delete()
|
|
models.Work.objects.all().delete()
|
|
models.Edition.objects.all().delete()
|
|
|
|
def load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, url, format, license, lang, publication_date):
|
|
|
|
# let's start with instantiating the relevant Work and Edition if they don't already exist
|
|
|
|
works = models.Work.objects.filter(Q(identifiers__type='olwk') & Q(identifiers__value=ol_work_id))
|
|
|
|
try:
|
|
work = models.Identifier.objects.get(type='olwk',value=ol_work_id).work
|
|
except models.Identifier.DoesNotExist: # create a new work
|
|
work = models.Work()
|
|
work.title = title
|
|
work.language = lang
|
|
work.openlibrary_lookup = None
|
|
work.save()
|
|
|
|
work_id = models.Identifier.get_or_add(type='olwk',value=ol_work_id, work=work)
|
|
|
|
# Now pull out any existing Gutenberg editions tied to the work with the proper Gutenberg ID
|
|
try:
|
|
edition = models.Identifier.objects.get( type='gtbg', value=gutenberg_etext_id ).edition
|
|
except models.Identifier.DoesNotExist:
|
|
edition = models.Edition()
|
|
edition.title = title
|
|
edition.work = work
|
|
|
|
edition.save()
|
|
edition_id = models.Identifier.get_or_add(type='gtbg',value=gutenberg_etext_id, edition=edition, work=work)
|
|
|
|
# check to see whether the Edition hasn't already been loaded first
|
|
# search by url
|
|
ebooks = models.Ebook.objects.filter(url=url)
|
|
|
|
# format: what's the controlled vocab? -- from Google -- alternative would be mimetype
|
|
|
|
if len(ebooks):
|
|
ebook = ebooks[0]
|
|
elif len(ebooks) == 0: # need to create new ebook
|
|
ebook = models.Ebook()
|
|
|
|
if len(ebooks) > 1:
|
|
warnings.warn("There is more than one Ebook matching url {0}".format(url))
|
|
|
|
|
|
ebook.format = format
|
|
ebook.provider = 'gutenberg'
|
|
ebook.url = url
|
|
ebook.rights = license
|
|
|
|
# is an Ebook instantiable without a corresponding Edition? (No, I think)
|
|
|
|
ebook.edition = edition
|
|
ebook.save()
|
|
|
|
return ebook
|
|
|
|
# get associated info from OL
|
|
# book_loader.add_openlibrary(work)
|
|
|
|
|
|
def load_moby_dick():
|
|
"""Let's try this out for Moby Dick"""
|
|
|
|
title = "Moby Dick"
|
|
ol_work_id = "/works/OL102749W"
|
|
gutenberg_etext_id = 2701
|
|
epub_url = "http://www.gutenberg.org/cache/epub/2701/pg2701.epub"
|
|
license = 'http://www.gutenberg.org/license'
|
|
lang = 'en'
|
|
format = 'epub'
|
|
publication_date = datetime.datetime(2001,7,1)
|
|
|
|
result = load_gutenberg_edition(title, gutenberg_etext_id, ol_work_id, epub_url, format, license, lang, publication_date)
|
|
return result
|
|
|