Merge remote-tracking branch 'Gluejar/master'

keepfolder
eric 2017-09-14 12:42:42 -04:00
commit 29df43156b
22 changed files with 483 additions and 332 deletions

View File

@ -33,7 +33,9 @@ def onix_feed_for_work(work):
feed = etree.fromstring(feed_xml) feed = etree.fromstring(feed_xml)
feed.append(header(work)) feed.append(header(work))
for edition in models.Edition.objects.filter(work=work,ebooks__isnull=False).distinct(): for edition in models.Edition.objects.filter(work=work,ebooks__isnull=False).distinct():
feed.append(product(edition)) edition_prod = product(edition)
if edition_prod:
feed.append(product(edition))
return etree.tostring(feed, pretty_print=True) return etree.tostring(feed, pretty_print=True)
def header(facet=None): def header(facet=None):

View File

@ -23123,5 +23123,11 @@ bisac= {
"pref_label": "Political Science / Terrorism", "pref_label": "Political Science / Terrorism",
"notation": "POL037000", "notation": "POL037000",
"alt_label": [] "alt_label": []
} },
"History / Europe / Greece": {
"related": [],
"pref_label": "History / Europe / Greece",
"notation": "HIS042000",
"alt_label": []
},
} }

View File

@ -38,7 +38,7 @@ from . import cc
from . import models from . import models
from .parameters import WORK_IDENTIFIERS from .parameters import WORK_IDENTIFIERS
from .validation import identifier_cleaner from .validation import identifier_cleaner
from .loaders.scrape import BaseScraper from .loaders.scrape import BaseScraper, scrape_sitemap
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
request_log = logging.getLogger("requests") request_log = logging.getLogger("requests")
@ -413,7 +413,6 @@ def relate_isbn(isbn, cluster_size=1):
elif related_edition.work.id != edition.work.id: elif related_edition.work.id != edition.work.id:
logger.debug("merge_works path 1 %s %s", edition.work.id, related_edition.work.id ) logger.debug("merge_works path 1 %s %s", edition.work.id, related_edition.work.id )
merge_works(related_edition.work, edition.work) merge_works(related_edition.work, edition.work)
if related_edition.work.editions.count()>cluster_size: if related_edition.work.editions.count()>cluster_size:
return related_edition.work return related_edition.work
return edition.work return edition.work
@ -452,7 +451,7 @@ def add_related(isbn):
related_edition.save() related_edition.save()
elif related_edition.work.id != work.id: elif related_edition.work.id != work.id:
logger.debug("merge_works path 1 %s %s", work.id, related_edition.work.id ) logger.debug("merge_works path 1 %s %s", work.id, related_edition.work.id )
merge_works(work, related_edition.work) work = merge_works(work, related_edition.work)
else: else:
if other_editions.has_key(related_language): if other_editions.has_key(related_language):
other_editions[related_language].append(related_edition) other_editions[related_language].append(related_edition)
@ -469,12 +468,15 @@ def add_related(isbn):
works_to_merge = set([ed.work for ed in lang_group[1:]]) - set([lang_edition.work]) works_to_merge = set([ed.work for ed in lang_group[1:]]) - set([lang_edition.work])
for w in works_to_merge: for w in works_to_merge:
logger.debug("merge_works path 2 %s %s", lang_edition.work.id, w.id ) logger.debug("merge_works path 2 %s %s", lang_edition.work.id, w.id )
merge_works(lang_edition.work, w) merged_work = merge_works(lang_edition.work, w)
models.WorkRelation.objects.get_or_create(to_work=lang_edition.work, from_work=work, relation='translation') models.WorkRelation.objects.get_or_create(
to_work=lang_group[0].work,
from_work=work,
relation='translation'
)
return new_editions return new_editions
def thingisbn(isbn): def thingisbn(isbn):
"""given an ISBN return a list of related edition ISBNs, according to """given an ISBN return a list of related edition ISBNs, according to
Library Thing. (takes isbn_10 or isbn_13, returns isbn_10, except for 979 isbns, which come back as isbn_13') Library Thing. (takes isbn_10 or isbn_13, returns isbn_10, except for 979 isbns, which come back as isbn_13')
@ -492,7 +494,7 @@ def merge_works(w1, w2, user=None):
logger.info("merging work %s into %s", w2.id, w1.id) logger.info("merging work %s into %s", w2.id, w1.id)
# don't merge if the works are the same or at least one of the works has no id (for example, when w2 has already been deleted) # don't merge if the works are the same or at least one of the works has no id (for example, when w2 has already been deleted)
if w1 is None or w2 is None or w1.id == w2.id or w1.id is None or w2.id is None: if w1 is None or w2 is None or w1.id == w2.id or w1.id is None or w2.id is None:
return return w1
if w2.selected_edition != None and w1.selected_edition == None: if w2.selected_edition != None and w1.selected_edition == None:
#the merge should be reversed #the merge should be reversed
temp = w1 temp = w1
@ -546,9 +548,14 @@ def merge_works(w1, w2, user=None):
for subject in w2.subjects.all(): for subject in w2.subjects.all():
if subject not in w1.subjects.all(): if subject not in w1.subjects.all():
w1.subjects.add(subject) w1.subjects.add(subject)
for work_relation in w2.works_related_to.all():
work_relation.to_work = w1
work_relation.save()
for work_relation in w2.works_related_from.all():
work_relation.from_work = w1
work_relation.save()
w2.delete() w2.delete()
return w1
def detach_edition(e): def detach_edition(e):
"""will detach edition from its work, creating a new stub work. if remerge=true, will see if there's another work to attach to """will detach edition from its work, creating a new stub work. if remerge=true, will see if there's another work to attach to
@ -776,7 +783,7 @@ def load_from_yaml(yaml_url, test_mode=False):
return edition.work.id if edition else None return edition.work.id if edition else None
def edition_for_ident(id_type, id_value): def edition_for_ident(id_type, id_value):
print 'returning edition for {}: {}'.format(id_type, id_value) #print 'returning edition for {}: {}'.format(id_type, id_value)
for ident in models.Identifier.objects.filter(type=id_type, value=id_value): for ident in models.Identifier.objects.filter(type=id_type, value=id_value):
return ident.edition if ident.edition else ident.work.editions[0] return ident.edition if ident.edition else ident.work.editions[0]
@ -844,7 +851,15 @@ class BasePandataLoader(object):
value = value[0] if isinstance(value, list) else value value = value[0] if isinstance(value, list) else value
try: try:
id = models.Identifier.objects.get(type=id_code, value=value) id = models.Identifier.objects.get(type=id_code, value=value)
work = id.work if work and id.work and id.work.id is not work.id:
# dangerous! merge newer into older
if work.id < id.work.id:
merge_works(work, id.work)
else:
merge_works(id.work, work)
work = id.work
else:
work = id.work
if id.edition and not edition: if id.edition and not edition:
edition = id.edition edition = id.edition
except models.Identifier.DoesNotExist: except models.Identifier.DoesNotExist:
@ -1045,5 +1060,21 @@ def add_by_webpage(url, work=None, user=None):
loader.load_ebooks(pandata, edition, user=user) loader.load_ebooks(pandata, edition, user=user)
return edition if edition else None return edition if edition else None
def add_by_sitemap(url, maxnum=None):
editions = []
scraper = BaseScraper(url)
for bookdata in scrape_sitemap(url, maxnum=maxnum):
edition = work = None
loader = BasePandataLoader(bookdata.base)
pandata = Pandata()
pandata.metadata = bookdata.metadata
for metadata in pandata.get_edition_list():
edition = loader.load_from_pandata(metadata, work)
work = edition.work
loader.load_ebooks(pandata, edition)
if edition:
editions.append(edition)
return editions

View File

@ -130,9 +130,9 @@ def add_all_isbns(isbns, work, language=None, title=None):
first_edition = first_edition if first_edition else edition first_edition = first_edition if first_edition else edition
if work and (edition.work.id != work.id): if work and (edition.work.id != work.id):
if work.created < edition.work.created: if work.created < edition.work.created:
merge_works(work, edition.work) work = merge_works(work, edition.work)
else: else:
merge_works(edition.work, work) work = merge_works(edition.work, work)
else: else:
work = edition.work work = edition.work
return first_edition return first_edition

View File

@ -15,6 +15,9 @@ CONTAINS_COVER = re.compile('cover')
CONTAINS_CC = re.compile('creativecommons.org') CONTAINS_CC = re.compile('creativecommons.org')
class BaseScraper(object): class BaseScraper(object):
'''
designed to make at least a decent gues for webpages that embed metadata
'''
def __init__(self, url): def __init__(self, url):
self.metadata = {} self.metadata = {}
self.identifiers = {'http': url} self.identifiers = {'http': url}
@ -24,6 +27,7 @@ class BaseScraper(object):
response = requests.get(url, headers={"User-Agent": settings.USER_AGENT}) response = requests.get(url, headers={"User-Agent": settings.USER_AGENT})
if response.status_code == 200: if response.status_code == 200:
self.doc = BeautifulSoup(response.content, 'lxml') self.doc = BeautifulSoup(response.content, 'lxml')
self.get_genre()
self.get_title() self.get_title()
self.get_language() self.get_language()
self.get_description() self.get_description()
@ -41,7 +45,7 @@ class BaseScraper(object):
self.set('language', 'en') self.set('language', 'en')
except requests.exceptions.RequestException as e: except requests.exceptions.RequestException as e:
logger.error(e) logger.error(e)
self.metadata = None self.metadata = {}
self.metadata['identifiers'] = self.identifiers self.metadata['identifiers'] = self.identifiers
def set(self, name, value): def set(self, name, value):
@ -75,18 +79,28 @@ class BaseScraper(object):
return value return value
return value return value
def get_genre(self):
value = self.check_metas(['DC.Type', 'dc.type', 'og:type'])
if value and value in ('Text.Book', 'book'):
self.set('genre', 'book')
def get_title(self): def get_title(self):
value = self.check_metas(['DC.Title','dc.title', 'citation_title', 'title']) value = self.check_metas(['DC.Title', 'dc.title', 'citation_title', 'title'])
if not value: if not value:
value = self.fetch_one_el_content('title') value = self.fetch_one_el_content('title')
self.set('title', value) self.set('title', value)
def get_language(self): def get_language(self):
value = self.check_metas(['DC.Language','dc.language','language']) value = self.check_metas(['DC.Language', 'dc.language', 'language'])
self.set('language', value) self.set('language', value)
def get_description(self): def get_description(self):
value = self.check_metas(['DC.Description','dc.description','description']) value = self.check_metas([
'DC.Description',
'dc.description',
'og:description',
'description'
])
self.set('description', value) self.set('description', value)
def get_identifiers(self): def get_identifiers(self):
@ -100,7 +114,7 @@ class BaseScraper(object):
self.identifiers['doi'] = value self.identifiers['doi'] = value
isbns = {} isbns = {}
label_map = {'epub': 'EPUB', 'mobi': 'Mobi', label_map = {'epub': 'EPUB', 'mobi': 'Mobi',
'paper': 'Paperback', 'pdf': 'PDF', 'hard':'Hardback'} 'paper': 'Paperback', 'pdf':'PDF', 'hard':'Hardback'}
for key in label_map.keys(): for key in label_map.keys():
isbn_key = 'isbn_{}'.format(key) isbn_key = 'isbn_{}'.format(key)
value = self.check_metas(['citation_isbn'], type=label_map[key]) value = self.check_metas(['citation_isbn'], type=label_map[key])
@ -126,7 +140,7 @@ class BaseScraper(object):
if isbn: if isbn:
ed_list.append({ ed_list.append({
'_edition': isbn, '_edition': isbn,
'edition_identifiers': {'isbn': isbn} 'edition_identifiers': {'isbn':isbn}
}) })
if len(ed_list): if len(ed_list):
self.set('edition_list', ed_list) self.set('edition_list', ed_list)
@ -147,7 +161,10 @@ class BaseScraper(object):
self.set('publication_date', value) self.set('publication_date', value)
def get_authors(self): def get_authors(self):
value_list = self.check_metas(['DC.Creator.PersonalName', 'citation_author',], list_mode='list') value_list = self.check_metas([
'DC.Creator.PersonalName',
'citation_author',
], list_mode='list')
if not value_list: if not value_list:
return return
if len(value_list) == 1: if len(value_list) == 1:
@ -161,13 +178,17 @@ class BaseScraper(object):
self.set('creator', creator) self.set('creator', creator)
def get_cover(self): def get_cover(self):
block = self.doc.find(class_=CONTAINS_COVER) image_url = self.check_metas(['og.image'])
block = block if block else self.doc if not image_url:
img = block.find_all('img', src=CONTAINS_COVER) block = self.doc.find(class_=CONTAINS_COVER)
if img: block = block if block else self.doc
cover_uri = img[0].get('src', None) img = block.find_all('img', src=CONTAINS_COVER)
if cover_uri: if img:
self.set('covers', [{'image_url': urljoin(self.base, cover_uri)}]) cover_uri = img[0].get('src', None)
if cover_uri:
image_url = urljoin(self.base, cover_uri)
if image_url:
self.set('covers', [{'image_url': image_url}])
def get_downloads(self): def get_downloads(self):
for dl_type in ['epub', 'mobi', 'pdf']: for dl_type in ['epub', 'mobi', 'pdf']:
@ -181,3 +202,14 @@ class BaseScraper(object):
links = self.doc.find_all(href=CONTAINS_CC) links = self.doc.find_all(href=CONTAINS_CC)
for link in links: for link in links:
self.set('rights_url', link['href']) self.set('rights_url', link['href'])
def scrape_sitemap(url, maxnum=None):
try:
response = requests.get(url, headers={"User-Agent": settings.USER_AGENT})
doc = BeautifulSoup(response.content, 'lxml')
for page in doc.find_all('loc')[0:maxnum]:
scraper = BaseScraper(page.text)
if scraper.metadata.get('genre', None) == 'book':
yield scraper
except requests.exceptions.RequestException as e:
logger.error(e)

View File

@ -220,9 +220,7 @@ def load_from_books(books):
for isbn in isbns: for isbn in isbns:
edition = add_by_isbn_from_google(isbn, work=work) edition = add_by_isbn_from_google(isbn, work=work)
if edition and edition.work != work: if edition and edition.work != work:
merge_works(work, edition.work) work = merge_works(work, edition.work)
work = work if work.pk is not None else edition.work
edition.work=work # because integrity errors if not
if not edition: if not edition:
edition= Edition(title=title, work=work) edition= Edition(title=title, work=work)
edition.save() edition.save()

View File

@ -0,0 +1,24 @@
from django.core.management.base import BaseCommand
from regluit.core.bookloader import add_by_sitemap
class Command(BaseCommand):
help = "load books based on a website sitemap"
def add_arguments(self, parser):
# Positional arguments
parser.add_argument('url')
# Named (optional) arguments
parser.add_argument(
'--max',
dest='max',
type=int,
default=None,
nargs='?',
help='set a maximum number of books to load',
)
def handle(self, url, max=None, **options):
books = add_by_sitemap(url, maxnum=max)
print "loaded {} books".format(len(books))

View File

@ -1034,6 +1034,7 @@ class Campaign(models.Model):
url=ebf.file.url, url=ebf.file.url,
version_label=ebf.version['label'], version_label=ebf.version['label'],
version_iter=ebf.version['iter'], version_iter=ebf.version['iter'],
filesize=ebf.file.size,
) )
ebf.ebook = ebook ebf.ebook = ebook
ebf.save() ebf.save()
@ -1041,7 +1042,8 @@ class Campaign(models.Model):
for old_ebf in self.work.ebookfiles().filter(asking=True).exclude(pk__in=new_ebf_pks): for old_ebf in self.work.ebookfiles().filter(asking=True).exclude(pk__in=new_ebf_pks):
obsolete = Ebook.objects.filter(url=old_ebf.file.url) obsolete = Ebook.objects.filter(url=old_ebf.file.url)
old_ebf.ebook.deactivate() if old_ebf.ebook:
old_ebf.ebook.deactivate()
old_ebf.file.delete() old_ebf.file.delete()
old_ebf.delete() old_ebf.delete()

View File

@ -43,7 +43,7 @@ def isbn_cleaner(value):
if value == 'delete': if value == 'delete':
return value return value
if not value: if not value:
raise forms.ValidationError('no identifier value found') raise ValidationError('no identifier value found')
elif value == 'delete': elif value == 'delete':
return value return value
isbn=ISBN(value) isbn=ISBN(value)

View File

@ -1,3 +1,5 @@
PAGE TEMPLATES
base.html extra_css(empty) extra_js(empty) extra_head(empty) base.html extra_css(empty) extra_js(empty) extra_head(empty)
404.html 404.html
500.html 500.html
@ -9,10 +11,12 @@ base.html extra_css(empty) extra_js(empty) extra_head(empty)
about_unglued_empty.html about_unglued_empty.html
about_wishlist.html about_wishlist.html
about_wishlist_empty.html about_wishlist_empty.html
base-questionnaire.html
campaign_list.html extra_css extra_head campaign_list.html extra_css extra_head
cc_list.html extra_css extra_head cc_list.html extra_css extra_head
comments.html extra_css extra_head comments.html extra_css extra_head
download.html extra_js download.html extra_js
faceted_list.html extra_css extra_head
goodreads_display.html extra_head goodreads_display.html extra_head
home.html extra_css extra_js home.html extra_css extra_js
kindle_change_successful.html extra_js kindle_change_successful.html extra_js
@ -22,43 +26,52 @@ base.html extra_css(empty) extra_js(empty) extra_head(empty)
librarything.html librarything.html
lockss.html lockss.html
lockss_manifest.html lockss_manifest.html
map_subject.html
profiles/create_profile.html profiles/create_profile.html
profiles/edit_profile.html profiles/edit_profile.html
profiles/profile_detail.html profiles/profile_detail.html
profiles/profile_list.html profiles/profile_list.html
registration/registration_base.html extra_js extra_head extra_extra_head registration/registration_base.html extra_js extra_head extra_extra_head
basedocumentation.html extra_js extra_extra_head basedocumentation.html extra_js extra_extra_head
api_help.html
about.html about.html
about_smashwords.html about_smashwords.html
admins_only.html admins_only.html
api_help.html
ask_rh.html
campaign_admin.html extra_extra_head campaign_admin.html extra_extra_head
campaign_results.html campaign_results.html
claim.html claim.html
comments/base.html comments/base.html
comments/preview.html extra_css comments/preview.html extra_css
edit_edition.html extra_extra_head
edition_uploads.html edition_uploads.html
emailshare.html
gift.html extra_extra_head gift.html extra_extra_head
emailshare.html extra_css emailshare.html extra_css
faq.html faq.html
feedback.html feedback.html
front_matter.html extra_extra_head front_matter.html extra_extra_head
join_library.html
languages.html languages.html
libraries.html extra_css extra_js libraries.html extra_css extra_js
libraryauth/edit.html extra_extra_head libraryauth/edit.html extra_extra_head
manage_account.html extra_extra_head manage_account.html extra_extra_head
manage_campaign.html extra_extra_head manage_campaign.html extra_extra_head
manage_ebooks.html
manage_survey.html
marc.html
merge.html extra_extra_head merge.html extra_extra_head
metrics.html metrics.html
new_edition.html extra_extra_head new_edition.html extra_extra_head
notification/base.html notification/base.html
notification/notice_settings.html extra_css extra_js notification/notice_settings.html extra_css extra_js
notification/notices.html extra_css notification/notices.html extra_css
press.html
press_new.html press_new.html
press_submitterator.html
privacy.html privacy.html
rh_tools.html extra_extra_head rh_tools.html extra_extra_head
rights_holders.html extra_extra_head rights_holders.html extra_extra_head
surveys.html
terms.html extra_css terms.html extra_css
thanks.html thanks.html
basepledge.html extra_css extra_js extra_extra_head(empty) basepledge.html extra_css extra_js extra_extra_head(empty)
@ -75,8 +88,25 @@ base.html extra_css(empty) extra_js(empty) extra_head(empty)
pledge_user_error.html extra_extra_head pledge_user_error.html extra_extra_head
purchase.html extra_extra_head purchase.html extra_extra_head
stripe.html extra_extra_head stripe.html extra_extra_head
email_change/base.html
email_change_complete.html
email_change_form.html
email_verification_sent.html
email_verify.html
kindle_change_successful.html
kindle_config.html
marc_config.html
gift_duplicate.html
gift_error.html
gift_login.html
gift_welcome.html
kindle_response_graceful_degradation.html
registration/activation_complete.html registration/activation_complete.html
registration/activate.html registration/activate.html
registration/from_pledge.html
registration/from_add.html
registration/from_error.html
registration/from_purchase.html
registration/login.html registration/login.html
registration/logout.html registration/logout.html
registration/password_change_done.html registration/password_change_done.html
@ -98,18 +128,41 @@ base.html extra_css(empty) extra_js(empty) extra_head(empty)
work.html extra_css extra_js work.html extra_css extra_js
work_list.html extra_css extra_head work_list.html extra_css extra_head
bypub_list.html bypub_list.html
recommended.html
COMPONENT TEMPLATES
about_lightbox_footer.html
book_plain.html
book_panel_addbutton.html book_panel_addbutton.html
cardform.html cardform.html
cardscripts.html cardscripts.html
claim_terms.html
ebook_list.html
ebookfiles.html ebookfiles.html
edition_display.html edition_display.html
edition_upload.html edition_upload.html
explore.html explore.html
faqmenu.html faq_b2u.html
faq_pledge_cancel.html
faq_pledge.html
faq_purchase.html
faq_t4u.html faq_t4u.html
faqmenu.html
kindle_response_message.html
learn_more.html learn_more.html
marc_form.html
num_wishes.html num_wishes.html
press_item.html
refine.html
registration/login_form.html
registration/password_reset_email.html
registration/registration_closed.html
registration/test_template_name.html
sidebar_pledge_complete.html
slideshow.html
split.html split.html
stripe_stuff.html
subjectbox.html
trans_summary.html trans_summary.html
work_action.html
workbox.html

View File

@ -204,11 +204,9 @@ ul.fancytree-container {
</p> </p>
<p><b>Cover Image</b>: <br /> <p><b>Cover Image</b>: <br />
{% if edition.cover_image %} <div class="cover-image">
<img src="{{edition.cover_image}}" /><br /> <img src="{{edition.cover_image_thumbnail}}" />
{% else %} </div>
[ no cover specified for this edition ]<br />
{% endif %}
{{ form.cover_image.errors }}{{ form.cover_image }}{{ form.cover_image.help_text }} {{ form.cover_image.errors }}{{ form.cover_image }}{{ form.cover_image.help_text }}
(<i>Enter a URL for an image, at least 300 px wide. The image will be scaled to the proportions of a 6x9 cover. </i>)<br /> (<i>Enter a URL for an image, at least 300 px wide. The image will be scaled to the proportions of a 6x9 cover. </i>)<br />
OR...<br /> OR...<br />

View File

@ -1,10 +1,8 @@
<div class="clearfix"> <div class="clearfix">
<div class="editions"> <div class="editions">
{% if edition.googlebooks_id %} <div class="book-cover">
<div class="image"> <img src="{{ edition.cover_image_thumbnail }}" title="edition cover" alt="edition cover" />
<img src="{{ edition.cover_image_small }}" title="edition cover" alt="edition cover" /> </div>
</div>
{% endif %}
<div class="metadata" id="edition_{{edition.id}}"> <div class="metadata" id="edition_{{edition.id}}">
{% if edition.title != work.title %} {% if edition.title != work.title %}
Title: {{edition.title}}<br /> Title: {{edition.title}}<br />

View File

@ -44,7 +44,7 @@ function put_un_in_cookie2(){
<h3 class="featured_books">Today's Featured Free eBook</h3> <h3 class="featured_books">Today's Featured Free eBook</h3>
{% with featured as work %} {% with featured as work %}
<div class="book-detail"> <div class="book-detail">
<div id="book-detail-img" style="float:left;padding-right:10px"> <div id="book-detail-img" class="book-cover" style="float:left;padding-right:10px">
<a href="{% url 'work' featured.id %}"> <a href="{% url 'work' featured.id %}">
{% if work.googlebooks_id %} {% if work.googlebooks_id %}
<img src="{{ work.cover_image_thumbnail }}" alt="Find {{ work.title }} at Google Books" title="Find {{ work.title }} at Google Books" width="131" height="192" /> <img src="{{ work.cover_image_thumbnail }}" alt="Find {{ work.title }} at Google Books" title="Find {{ work.title }} at Google Books" width="131" height="192" />

View File

@ -66,7 +66,7 @@ Please fix the following before launching your campaign:
(Or, <a href="{% url 'rightsholders' %}">go back</a> to rights holder tools page.)<br /> (Or, <a href="{% url 'rightsholders' %}">go back</a> to rights holder tools page.)<br />
<div style="height:15px;"></div> <div style="height:15px;"></div>
<div class="book-detail"> <div class="book-detail">
<div id="book-detail-img"> <div id="book-detail-img" class="book-cover" >
<a href="#"><img src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" /></a> <a href="#"><img src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" /></a>
</div> </div>

View File

@ -15,7 +15,7 @@
{% block doccontent %} {% block doccontent %}
<div style="height:15px"></div> <div style="height:15px"></div>
<div class="book-detail"> <div class="book-detail">
<div id="book-detail-img"> <div id="book-detail-img" class="book-cover" >
<a href="{% url 'work' work.id %}"><img src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" /></a> <a href="{% url 'work' work.id %}"><img src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" /></a>
</div> </div>

View File

@ -17,7 +17,7 @@
{% block doccontent %} {% block doccontent %}
<div style="height:15px"></div> <div style="height:15px"></div>
<div class="book-detail"> <div class="book-detail">
<div id="book-detail-img"> <div id="book-detail-img" class="book-cover" >
<a href="{% url 'work' work.id %}"><img src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" /></a> <a href="{% url 'work' work.id %}"><img src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" /></a>
</div> </div>

View File

@ -77,12 +77,12 @@
<div id="content-block"> <div id="content-block">
<div class="book-detail"> <div class="book-detail">
{% if work.uses_google_cover %} {% if work.uses_google_cover %}
<div id="book-detail-img"> <div class="book-cover" id="book-detail-img">
<a href="{{ work.googlebooks_url }}"> <a href="{{ work.googlebooks_url }}">
<img src="{{ work.cover_image_thumbnail }}" alt="Find {{ work.title }} at Google Books" title="Find {{ work.title }} at Google Books" width="131" height="192" /></a> <img src="{{ work.cover_image_thumbnail }}" alt="Find {{ work.title }} at Google Books" title="Find {{ work.title }} at Google Books" width="131" height="192" /></a>
</div> </div>
{% else %} {% else %}
<div id="book-detail-img"> <div id="book-detail-img" class="book-cover" >
<img itemprop="image" src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" /> <img itemprop="image" src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" />
</div> </div>
{% endif %} {% endif %}
@ -280,14 +280,18 @@
</div> </div>
<div> <div>
{% for work_rel in work.works_related_to.all %} {% for work_rel in work.works_related_to.all %}
<p> {% if work_rel.from_work.language != 'xx' and work.language != 'xx' %}
This work is a {{ work_rel.relation }} of <a href="{% url 'work' work_rel.from_work.id %}">{{ work_rel.from_work }}</a>. <p>
</p> This work is a {{ work_rel.relation }} of <a href="{% url 'work' work_rel.from_work.id %}">{{ work_rel.from_work }}</a>.
</p>
{% endif %}
{% endfor %} {% endfor %}
{% for work_rel in work.works_related_from.all %} {% for work_rel in work.works_related_from.all %}
<p> {% if work.language != 'xx' and work_rel.to_work.language != 'xx' %}
<a href="{% url 'work' work_rel.to_work.id %}">{{ work_rel.to_work }}</a> is a {{ work_rel.relation }} of this work. <p>
</p> <a href="{% url 'work' work_rel.to_work.id %}">{{ work_rel.to_work }}</a> is a {{ work_rel.relation }} of this work.
</p>
{% endif %}
{% endfor %} {% endfor %}
{% if work.doab %} {% if work.doab %}
<p> <p>
@ -509,273 +513,7 @@
</div> </div>
</div> </div>
<div id="js-rightcol"> <div id="js-rightcol">
<div class="clearfix"> {% include 'work_action.html' %}
{% if status == 'ACTIVE' %}
{% if work.last_campaign.type == 1 %}
{% if pledged %}
<div class="btn_support modify"><form action="{% url 'pledge_modify' work_id %}" method="get"><input type="submit" value="Modify Pledge" /></form></div>
{% else %}
<div class="btn_support"><form action="{% url 'pledge' work_id %}" method="get"><input type="submit" value="Pledge" /></form></div>
{% endif %}
{% elif work.last_campaign.type == 3 %}
<div class="btn_support">
<a href="{% url 'download' work_id %}{% if action == 'preview' %}?testmode=1{% endif %}" class="hijax"><span>Download</span></a>
</div>
<div style="text-align: center;">... and thank the creators!</div>
{% elif license_is_active %}
<div class="btn_support">
<a href="{% url 'download_purchased' work_id %}" class="hijax"><span>Download</span></a>
</div>
{% elif borrowable %}
<div class="btn_support"><form action="{% url 'borrow' work_id %}" method="get"><input type="submit" value="Borrow" /></form></div>
{% else %}
<div class="btn_support"><form action="{% url 'purchase' work_id %}" method="get"><input type="submit" value="{% if next_acq %}{% if on_hold %}On Hold{% else %}Reserve{% endif %}{% else %}Purchase{% endif %}" /></form></div>
{% endif %}
{% elif work.is_free %}
<div class="btn_support">
<a href="{% url 'download' work_id %}" class="hijax"><span>Download</span></a>
</div>
{% endif %}
</div>
<br />
<div class="js-rightcol-pad rounded">
{% if status == 'ACTIVE' and work.last_campaign.email %}
<div class="jsmodule">
<h3 class="jsmod-title"><span>Ask Questions</span></h3>
<div class="jsmod-content">
<ul class="social menu">
<a href="{% url 'ask_rh' work.last_campaign.id %}"><li class="email"><span>Email the Rights Holder</span></li></a>
</ul>
</div>
</div>
{% endif %}
<div class="jsmodule">
<h3 class="jsmod-title"><span>Share</span></h3>
<div class="jsmod-content">
<ul class="social menu">
<a href="https://www.facebook.com/sharer.php?u={{request.build_absolute_uri|urlencode:"" }}"><li class="facebook first"><span>Facebook</span></li></a>
{% if work.is_free %}
<a href="https://twitter.com/intent/tweet?url={{request.build_absolute_uri|urlencode:"" }}&amp;text=I%27m%20enjoying%20{{ work.title|urlencode }}%2C%20a%20free%2C%20DRM%2Dfree%20ebook%2E%20You%20can%20too%21"><li class="twitter"><span>Twitter</span></li></a>
{% else %}
{% if status == 'SUCCESSFUL' %}
<a href="https://twitter.com/intent/tweet?url={{request.build_absolute_uri|urlencode:"" }}&amp;text=I%27m%20looking%20forward%20to the%20free%2C%20non%2DDRM%20ebook%20of%20{{ work.title|urlencode }}%2E%20You%20can%20too%21 "><li class="twitter"><span>Twitter</span></li></a>
{% else %}
<a href="https://twitter.com/intent/tweet?url={{request.build_absolute_uri|urlencode:"" }}&amp;text=I%27m%20ungluing%20{{ work.title|urlencode }}%20at%20%40unglueit.%20Join%20me%21"><li class="twitter"><span>Twitter</span></li></a>
{% endif %}
{% endif %}
{% if request.user.is_authenticated %}<a href="{% url 'emailshare' '' %}?next={{request.build_absolute_uri|urlencode:""}}"><li class="email"><span>Email</span></li></a>{% endif %}
<a href="#" id="embed"><li class="embed"><span>Embed</span></li></a>
</ul>
<div id="widgetcode">
Copy/paste this into your site:<br /><textarea rows="7" cols="22">&lt;iframe src="https://{{request.META.HTTP_HOST}}/api/widget/{{work.id}}/" width="152" height="325" frameborder="0"&gt;&lt;/iframe&gt;</textarea></div>
</div>
</div>
{% if status == 'ACTIVE' %}
<div class="jsmodule">
{% if premiums %}
<a href="{% url 'pledge' work_id %}"><h3 class="jsmod-title"><span>Premiums</span></h3></a>
<div class="jsmod-content">
<ul class="support menu">
{% if pledged %}
{% for premium in premiums %}
{% if premium.limit == 0 or premium.limit > premium.premium_count %}
<li class="{% if forloop.first %}first{% elif forloop.last %}last{% endif %}">
<a href="{% url 'pledge_modify' work_id %}?premium_id={{premium.id}}">
<span class="menu-item-price">{% if premium.amount %}${{ premium.amount|floatformat:0|intcomma }}{% else %}Any amount{% endif %}</span>{% if pledged.0.premium == premium %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">{{ premium.description }}</span>
{% if premium.limit != 0 %}<br /> Only {{ premium.premium_remaining }} remaining! {% endif %}
</a></li>
{% endif %}
{% endfor %}
{% else %}
{% for premium in premiums %}
{% if premium.limit == 0 or premium.limit > premium.premium_count %}
<li class="{% if forloop.first %}first{% elif forloop.last %}last{% endif %}">
<a href="{% url 'pledge' work_id %}?premium_id={{premium.id}}">
<span class="menu-item-price">${{ premium.amount|floatformat:0|intcomma }}</span>
<span class="menu-item-desc">{{ premium.description }}</span>
{% if premium.limit != 0 %}<br /> Only {{ premium.premium_remaining }} remaining! {% endif %}
</a></li>
{% endif %}
{% endfor %}
{% endif %}
</ul>
</div>
{% endif %}
{% if work.last_campaign.type == 1 %}
<a href="{% url 'pledge' work_id %}"><h3 class="jsmod-title"><span>Acknowledgements</span></h3></a>
<div class="jsmod-content">
In addition to any premiums you're eligible for, you'll automatically be acknowledged in the unglued ebook as follows:
<ul class="support menu">
{% if pledged %}
{% with pledged.0.amount as amount %}
<li class="first">
<a href="{% url 'pledge_modify' work_id %}?preapproval_amount=1">
<span class="menu-item-price">Any amount</span>{% if amount < 25 %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">The unglued ebook, free for you to read and share.</span>
</a>
</li>
<li>
<a href="{% url 'pledge_modify' work_id %}?preapproval_amount=25">
<span class="menu-item-price">$25 and up</span>{% if amount >= 25 and amount < 50 %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">Your name in the acknowledgements section of the unglued ebook under "Supporters".</span>
</a>
</li>
<li>
<a href="{% url 'pledge_modify' work_id %}?preapproval_amount=50">
<span class="menu-item-price">$50 and up</span>{% if amount >= 50 and amount < 100 %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">Your name &amp; profile link in the acknowledgements section of the unglued ebook under "Benefactors".</span>
</a>
</li>
<li class="last">
<a href="{% url 'pledge_modify' work_id %}?preapproval_amount=100">
<span class="menu-item-price">$100 and up</span>{% if amount >= 100 %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">Your name, profile link, &amp; a dedication of your choice in the acknowledgements section of the unglued ebook under "Bibliophiles".</span>
</a>
</li>
{% endwith %}
{% else %}
<li class="first">
<a href="{% url 'pledge' work_id %}?preapproval_amount=1">
<span class="menu-item-price">Any amount</span>
<span class="menu-item-desc">The unglued ebook, free for you to read and share.</span>
</a>
</li>
<li>
<a href="{% url 'pledge' work_id %}?preapproval_amount=25">
<span class="menu-item-price">$25 and up</span>
<span class="menu-item-desc">Your name in the acknowledgements section of the unglued ebook under "Supporters".</span>
</a>
</li>
<li>
<a href="{% url 'pledge' work_id %}?preapproval_amount=50">
<span class="menu-item-price">$50 and up</span>
<span class="menu-item-desc">Your name &amp; profile link in the acknowledgements section of the unglued ebook under "Benefactors".</span>
</a>
</li>
<li class="last">
<a href="{% url 'pledge' work_id %}?preapproval_amount=100">
<span class="menu-item-price">$100 and up</span>
<span class="menu-item-desc">Your name, profile link, &amp; a dedication of your choice in the acknowledgements section of the unglued ebook under "Bibliophiles".</span>
</a>
</li>
{% endif %}
</ul>
</div>
{% endif %}
{% if work.last_campaign.type == 2 %}
{% if lib_licenses.available %}
<h3 class="jsmod-title"><span>Borrow</span></h3>
<div class="jsmod-content">
<ul class="support menu">
{% for lib_license in lib_licenses.all %}
<li class="{% if forloop.first %}first{% elif forloop.last %}last{% endif %}">
<a href="???">Borrow!</a>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
<h3 class="jsmod-title"><span>Buy for Yourself</span></h3>
<div class="jsmod-content">
<ul class="support menu">
{% if purchased %}
<li class="first no_link">
<span class="menu-item-desc">{% if purchased.gifts.all.count %}A gift to you!{% else %}Purchased!{% endif %}</span>
</li>
{% else %}
<li class="first" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<a href="{% url 'purchase' work_id %}?offer_id={{work.last_campaign.individual_offer.id}}">
<span class="menu-item-price" itemprop="price">${{ work.last_campaign.individual_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.individual_offer.get_license_display }}</span>
</a>
</li>
{% endif %}
</ul>
</div>
<h3 class="jsmod-title"><span>Buy as a Gift</span></h3>
<div class="jsmod-content">
<ul class="support menu">
<li class="first" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<a href="{% url 'purchase' work_id %}?offer_id=give{{work.last_campaign.individual_offer.id}}">
<span class="menu-item-price" itemprop="price">${{ work.last_campaign.individual_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.individual_offer.get_license_display }}</span>
</a>
</li>
</ul>
</div>
{% if borrowed %}
<h3 class="jsmod-title">
<span class="on-wishlist">Borrowed!</span>
</h3>
{% else %}
<h3 class="jsmod-title"><span>Buy for a Library</span></h3>
<div class="jsmod-content">
<ul class="support menu">
<li class="first last">
{% if request.user.profile.libraries %}
<a href="{% url 'purchase' work_id %}?offer_id={{work.last_campaign.library_offer.id}}">
<span class="menu-item-price">${{ work.last_campaign.library_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.library_offer.get_license_display }}</span>
</a>
{% else %}
<a href="{% url 'library_list' %}"><span class="menu-item-desc">
Join a Library to share and borrow unglue.it ebooks
</span></a>
{% endif %}
</li>
</ul>
</div>
{% endif %}
{% endif %}
{% if work.last_campaign.type == 3 %}
<h3 class="jsmod-title"><span>Thank the Creators</span></h3>
<div class="jsmod-content">
<ul class="support menu">
{% if purchased %}
<li class="first no_link">
<span class="menu-item-desc">You're welcome!</span>
</li>
{% else %}
{% if work.last_campaign.ask_money %}
<li class="first last" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
{% if request.user.library %}
<a href="{% url 'thank' work_id %}?offer_id={{work.last_campaign.library_offer.id}}">
<span class="menu-item-price" itemprop="price">${{ work.last_campaign.library_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.library_offer.get_thanks_display }}</span>
</a>
{% else %}
<a href="{% url 'thank' work_id %}?offer_id={{work.last_campaign.individual_offer.id}}">
<span class="menu-item-price" itemprop="price">${{ work.last_campaign.individual_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.individual_offer.get_thanks_display }}</span>
</a>
{% endif %}
</li>
{% else %}
<li class="first last" >
<a href="{% url 'download' work_id %}">
<span class="menu-item-desc">Just read the book!</span>
</a>
{% endif %}
{% endif %}
</ul>
</div>
{% endif %}
</div>
{% endif %}
</div>
{% if request.user.libpref %}
{% if work.is_free or work.ebookfiles %}
<div id="libtools">
<p>for libraries...</p>
<form method="POST" id="record_form" action="{% url 'work_marc' work.id %}">
{% include 'marc_form.html' %}
<input type="submit" name="submit" value="Download {% if not work.has_marc %}stub {% endif %}MARC" id="submit">
</form>
</div>
{% endif %}
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,268 @@
{% load humanize %}
<div class="clearfix">
{% if status == 'ACTIVE' %}
{% if work.last_campaign.type == 1 %}
{% if pledged %}
<div class="btn_support modify"><form action="{% url 'pledge_modify' work_id %}" method="get"><input type="submit" value="Modify Pledge" /></form></div>
{% else %}
<div class="btn_support"><form action="{% url 'pledge' work_id %}" method="get"><input type="submit" value="Pledge" /></form></div>
{% endif %}
{% elif work.last_campaign.type == 3 %}
<div class="btn_support">
<a href="{% url 'download' work_id %}{% if action == 'preview' %}?testmode=1{% endif %}" class="hijax"><span>Download</span></a>
</div>
<div style="text-align: center;">... and thank the creators!</div>
{% elif license_is_active %}
<div class="btn_support">
<a href="{% url 'download_purchased' work_id %}" class="hijax"><span>Download</span></a>
</div>
{% elif borrowable %}
<div class="btn_support"><form action="{% url 'borrow' work_id %}" method="get"><input type="submit" value="Borrow" /></form></div>
{% else %}
<div class="btn_support"><form action="{% url 'purchase' work_id %}" method="get"><input type="submit" value="{% if next_acq %}{% if on_hold %}On Hold{% else %}Reserve{% endif %}{% else %}Purchase{% endif %}" /></form></div>
{% endif %}
{% elif work.is_free %}
<div class="btn_support">
<a href="{% url 'download' work_id %}" class="hijax"><span>Download</span></a>
</div>
{% endif %}
</div>
<br />
<div class="js-rightcol-pad rounded">
{% if status == 'ACTIVE' and work.last_campaign.email %}
<div class="jsmodule">
<h3 class="jsmod-title"><span>Ask Questions</span></h3>
<div class="jsmod-content">
<ul class="social menu">
<a href="{% url 'ask_rh' work.last_campaign.id %}"><li class="email"><span>Email the Rights Holder</span></li></a>
</ul>
</div>
</div>
{% endif %}
<div class="jsmodule">
<h3 class="jsmod-title"><span>Share</span></h3>
<div class="jsmod-content">
<ul class="social menu">
<a href="https://www.facebook.com/sharer.php?u={{request.build_absolute_uri|urlencode:"" }}"><li class="facebook first"><span>Facebook</span></li></a>
{% if work.is_free %}
<a href="https://twitter.com/intent/tweet?url={{request.build_absolute_uri|urlencode:"" }}&amp;text=I%27m%20enjoying%20{{ work.title|urlencode }}%2C%20a%20free%2C%20DRM%2Dfree%20ebook%2E%20You%20can%20too%21"><li class="twitter"><span>Twitter</span></li></a>
{% else %}
{% if status == 'SUCCESSFUL' %}
<a href="https://twitter.com/intent/tweet?url={{request.build_absolute_uri|urlencode:"" }}&amp;text=I%27m%20looking%20forward%20to the%20free%2C%20non%2DDRM%20ebook%20of%20{{ work.title|urlencode }}%2E%20You%20can%20too%21 "><li class="twitter"><span>Twitter</span></li></a>
{% else %}
<a href="https://twitter.com/intent/tweet?url={{request.build_absolute_uri|urlencode:"" }}&amp;text=I%27m%20ungluing%20{{ work.title|urlencode }}%20at%20%40unglueit.%20Join%20me%21"><li class="twitter"><span>Twitter</span></li></a>
{% endif %}
{% endif %}
{% if request.user.is_authenticated %}<a href="{% url 'emailshare' '' %}?next={{request.build_absolute_uri|urlencode:""}}"><li class="email"><span>Email</span></li></a>{% endif %}
<a href="#" id="embed"><li class="embed"><span>Embed</span></li></a>
</ul>
<div id="widgetcode">
Copy/paste this into your site:<br /><textarea rows="7" cols="22">&lt;iframe src="https://{{request.META.HTTP_HOST}}/api/widget/{{work.id}}/" width="152" height="325" frameborder="0"&gt;&lt;/iframe&gt;</textarea></div>
</div>
</div>
{% if status == 'ACTIVE' %}
<div class="jsmodule">
{% if premiums %}
<a href="{% url 'pledge' work_id %}"><h3 class="jsmod-title"><span>Premiums</span></h3></a>
<div class="jsmod-content">
<ul class="support menu">
{% if pledged %}
{% for premium in premiums %}
{% if premium.limit == 0 or premium.limit > premium.premium_count %}
<li class="{% if forloop.first %}first{% elif forloop.last %}last{% endif %}">
<a href="{% url 'pledge_modify' work_id %}?premium_id={{premium.id}}">
<span class="menu-item-price">{% if premium.amount %}${{ premium.amount|floatformat:0|intcomma }}{% else %}Any amount{% endif %}</span>{% if pledged.0.premium == premium %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">{{ premium.description }}</span>
{% if premium.limit != 0 %}<br /> Only {{ premium.premium_remaining }} remaining! {% endif %}
</a></li>
{% endif %}
{% endfor %}
{% else %}
{% for premium in premiums %}
{% if premium.limit == 0 or premium.limit > premium.premium_count %}
<li class="{% if forloop.first %}first{% elif forloop.last %}last{% endif %}">
<a href="{% url 'pledge' work_id %}?premium_id={{premium.id}}">
<span class="menu-item-price">${{ premium.amount|floatformat:0|intcomma }}</span>
<span class="menu-item-desc">{{ premium.description }}</span>
{% if premium.limit != 0 %}<br /> Only {{ premium.premium_remaining }} remaining! {% endif %}
</a></li>
{% endif %}
{% endfor %}
{% endif %}
</ul>
</div>
{% endif %}
{% if work.last_campaign.type == 1 %}
<a href="{% url 'pledge' work_id %}"><h3 class="jsmod-title"><span>Acknowledgements</span></h3></a>
<div class="jsmod-content">
In addition to any premiums you're eligible for, you'll automatically be acknowledged in the unglued ebook as follows:
<ul class="support menu">
{% if pledged %}
{% with pledged.0.amount as amount %}
<li class="first">
<a href="{% url 'pledge_modify' work_id %}?preapproval_amount=1">
<span class="menu-item-price">Any amount</span>{% if amount < 25 %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">The unglued ebook, free for you to read and share.</span>
</a>
</li>
<li>
<a href="{% url 'pledge_modify' work_id %}?preapproval_amount=25">
<span class="menu-item-price">$25 and up</span>{% if amount >= 25 and amount < 50 %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">Your name in the acknowledgements section of the unglued ebook under "Supporters".</span>
</a>
</li>
<li>
<a href="{% url 'pledge_modify' work_id %}?preapproval_amount=50">
<span class="menu-item-price">$50 and up</span>{% if amount >= 50 and amount < 100 %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">Your name &amp; profile link in the acknowledgements section of the unglued ebook under "Benefactors".</span>
</a>
</li>
<li class="last">
<a href="{% url 'pledge_modify' work_id %}?preapproval_amount=100">
<span class="menu-item-price">$100 and up</span>{% if amount >= 100 %}<div class="you_pledged">Yours!</div>{% endif %}
<span class="menu-item-desc">Your name, profile link, &amp; a dedication of your choice in the acknowledgements section of the unglued ebook under "Bibliophiles".</span>
</a>
</li>
{% endwith %}
{% else %}
<li class="first">
<a href="{% url 'pledge' work_id %}?preapproval_amount=1">
<span class="menu-item-price">Any amount</span>
<span class="menu-item-desc">The unglued ebook, free for you to read and share.</span>
</a>
</li>
<li>
<a href="{% url 'pledge' work_id %}?preapproval_amount=25">
<span class="menu-item-price">$25 and up</span>
<span class="menu-item-desc">Your name in the acknowledgements section of the unglued ebook under "Supporters".</span>
</a>
</li>
<li>
<a href="{% url 'pledge' work_id %}?preapproval_amount=50">
<span class="menu-item-price">$50 and up</span>
<span class="menu-item-desc">Your name &amp; profile link in the acknowledgements section of the unglued ebook under "Benefactors".</span>
</a>
</li>
<li class="last">
<a href="{% url 'pledge' work_id %}?preapproval_amount=100">
<span class="menu-item-price">$100 and up</span>
<span class="menu-item-desc">Your name, profile link, &amp; a dedication of your choice in the acknowledgements section of the unglued ebook under "Bibliophiles".</span>
</a>
</li>
{% endif %}
</ul>
</div>
{% endif %}
{% if work.last_campaign.type == 2 %}
{% if lib_licenses.available %}
<h3 class="jsmod-title"><span>Borrow</span></h3>
<div class="jsmod-content">
<ul class="support menu">
{% for lib_license in lib_licenses.all %}
<li class="{% if forloop.first %}first{% elif forloop.last %}last{% endif %}">
<a href="???">Borrow!</a>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
<h3 class="jsmod-title"><span>Buy for Yourself</span></h3>
<div class="jsmod-content">
<ul class="support menu">
{% if purchased %}
<li class="first no_link">
<span class="menu-item-desc">{% if purchased.gifts.all.count %}A gift to you!{% else %}Purchased!{% endif %}</span>
</li>
{% else %}
<li class="first" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<a href="{% url 'purchase' work_id %}?offer_id={{work.last_campaign.individual_offer.id}}">
<span class="menu-item-price" itemprop="price">${{ work.last_campaign.individual_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.individual_offer.get_license_display }}</span>
</a>
</li>
{% endif %}
</ul>
</div>
<h3 class="jsmod-title"><span>Buy as a Gift</span></h3>
<div class="jsmod-content">
<ul class="support menu">
<li class="first" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<a href="{% url 'purchase' work_id %}?offer_id=give{{work.last_campaign.individual_offer.id}}">
<span class="menu-item-price" itemprop="price">${{ work.last_campaign.individual_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.individual_offer.get_license_display }}</span>
</a>
</li>
</ul>
</div>
{% if borrowed %}
<h3 class="jsmod-title">
<span class="on-wishlist">Borrowed!</span>
</h3>
{% else %}
<h3 class="jsmod-title"><span>Buy for a Library</span></h3>
<div class="jsmod-content">
<ul class="support menu">
<li class="first last">
{% if request.user.profile.libraries %}
<a href="{% url 'purchase' work_id %}?offer_id={{work.last_campaign.library_offer.id}}">
<span class="menu-item-price">${{ work.last_campaign.library_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.library_offer.get_license_display }}</span>
</a>
{% else %}
<a href="{% url 'library_list' %}"><span class="menu-item-desc">
Join a Library to share and borrow unglue.it ebooks
</span></a>
{% endif %}
</li>
</ul>
</div>
{% endif %}
{% endif %}
{% if work.last_campaign.type == 3 %}
<h3 class="jsmod-title"><span>Thank the Creators</span></h3>
<div class="jsmod-content">
<ul class="support menu">
{% if purchased %}
<li class="first no_link">
<span class="menu-item-desc">You're welcome!</span>
</li>
{% else %}
{% if work.last_campaign.ask_money %}
<li class="first last" itemprop="offers" itemscope itemtype="http://schema.org/Offer">
{% if request.user.library %}
<a href="{% url 'thank' work_id %}?offer_id={{work.last_campaign.library_offer.id}}">
<span class="menu-item-price" itemprop="price">${{ work.last_campaign.library_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.library_offer.get_thanks_display }}</span>
</a>
{% else %}
<a href="{% url 'thank' work_id %}?offer_id={{work.last_campaign.individual_offer.id}}">
<span class="menu-item-price" itemprop="price">${{ work.last_campaign.individual_offer.price|floatformat:2|intcomma }}</span>
<span class="menu-item-desc">{{ work.last_campaign.individual_offer.get_thanks_display }}</span>
</a>
{% endif %}
</li>
{% else %}
<li class="first last" >
<a href="{% url 'download' work_id %}">
<span class="menu-item-desc">Just read the book!</span>
</a>
{% endif %}
{% endif %}
</ul>
</div>
{% endif %}
</div>
{% endif %}
</div>
{% if request.user.libpref %}
{% if work.is_free or work.ebookfiles %}
<div id="libtools">
<p>for libraries...</p>
<form method="POST" id="record_form" action="{% url 'work_marc' work.id %}">
{% include 'marc_form.html' %}
<input type="submit" name="submit" value="Download {% if not work.has_marc %}stub {% endif %}MARC" id="submit">
</form>
</div>
{% endif %}
{% endif %}

View File

@ -464,6 +464,7 @@ def edition_uploads(request, edition_id):
) )
form.instance.ebook = new_ebook form.instance.ebook = new_ebook
form.instance.ebook.set_next_iter() form.instance.ebook.set_next_iter()
form.instance.save()
else: else:
context['upload_error'] = form.errors context['upload_error'] = form.errors
@ -967,7 +968,7 @@ class MergeView(FormView):
context = self.get_context_data() context = self.get_context_data()
if self.request.POST.has_key('confirm_merge_works'): if self.request.POST.has_key('confirm_merge_works'):
context['old_work_id'] = other_work.id context['old_work_id'] = other_work.id
merge_works(self.work, other_work, self.request.user) self.work = merge_works(self.work, other_work, self.request.user)
context['merge_complete'] = True context['merge_complete'] = True
else: else:
context['form'] = WorkForm(initial={'other_work':other_work}) context['form'] = WorkForm(initial={'other_work':other_work})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
display:block; display:block;
} }
#book-detail-img { .book-cover {
float: left; float: left;
margin-right:10px; margin-right:10px;
width:151px; width:151px;