diff --git a/.gitignore b/.gitignore index 4a693c5d..2a1aff01 100644 --- a/.gitignore +++ b/.gitignore @@ -6,11 +6,14 @@ settings/keys/* *.dot reports ENV +venv .DS_Store build deploy/last-update logs/* +cache/* celerybeat.pid celerybeat-schedule .gitignore~ -static/scss/*.css.map +static/scss/**/*.css.map +*.retry \ No newline at end of file diff --git a/README.md b/README.md index 5eaf79d2..66fc4a29 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,32 @@ The partitioning between these modules is not as clean as would be ideal. `payme regluit was originally developed on Django 1.3 (python 2.7) and currently runs on Django 1.8. -Develop +Development (Vagrant + Virtualbox) +------- + +The recommended method for local development is to create a virtual machine with [Vagrant](https://www.vagrantup.com/) and [Virtualbox](https://www.virtualbox.org/wiki/Downloads). +With this method, the only requirements on the host machine are `virtualbox` and `vagrant`. +Vagrant will use the `ansible-local` provisioner, therefore installing python and ansible on the host machine is not necessary. + +__Instructions for Ubuntu 16:__ +1. Install virtualbox: `sudo apt-get install virtualbox` +2. Install vagrant: `sudo apt-get install vagrant` +3. Clone the `EbookFoundation/regluit` repository. +4. Navigate to the base directory of the cloned repo (where `Vagrantfile` is located). +5. Run `vagrant up` to create the VM, install dependencies, and start necessary services. + * Note: This step may take up to 15 minutes to complete. +6. Once the VM has been created, run `vagrant ssh` to log in to the virtual machine you just created. If provisioning was successful, you should see a success message upon login. + * If virtualenv doesn't activate upon login, you can do it manually by running `cd /opt/regluit && source venv/bin/activate` +7. Within the VM, run `./manage.py runserver 0.0.0.0:8000` to start the Django development server. +8. On your host machine, open your web browser of choice and navigate to `http://127.0.0.1:8000` + +__Instructions for other platforms (Windows/OSX):__ +* Steps are essentially the same, except for the installation of Vagrant and Virtualbox. Refer to each package's documentation for specific installation instructions. + +_NOTE:_ If running Windows on your host machine, ensure you are running `vagrant up` from an elevated command prompt, e.g. right click on Command Prompt -> Run As Administrator. + + +Development (Host Machine) ------- Here are some instructions for setting up regluit for development on diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 00000000..0ad9cdbc --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,56 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box = "ubuntu/xenial64" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + config.vm.box_check_update = false + + # Setup specific for local machine + config.vm.define "regluit-local", primary: true do |local| + # Create a private network + local.vm.network "private_network", type: "dhcp" + local.vm.hostname = "regluit-local" + + # VirtuaLBox provider settings for running locally with Oracle VirtualBox + # --uartmode1 disconnected is necessary to disable serial interface, which + # is known to cause issues with Ubuntu 16 VM's + local.vm.provider "virtualbox" do |vb| + vb.name = "regluit-local" + vb.memory = 1024 + vb.cpus = 2 + vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ] + end + + end + + config.vm.synced_folder ".", "/vagrant", disabled: true + config.vm.synced_folder ".", "/opt/regluit" + + config.vm.network "forwarded_port", guest: 8000, host: 8000 + + # Provision node with Ansible running on the Vagrant host + # This requires you have Ansible installed locally + # Vagrant autogenerates an ansible inventory file to use + config.vm.provision "ansible_local" do |ansible| + ansible.playbook = "/opt/regluit/provisioning/setup-regluit.yml" + ansible.provisioning_path = "/opt/regluit" + ansible.verbose = true + ansible.install = true + end + + config.vm.post_up_message = "Successfully created regluit-local VM. Run 'vagrant ssh' to log in and start the development server." + +end diff --git a/core/models/__init__.py b/core/models/__init__.py index 37917b8b..7f0ddf40 100755 --- a/core/models/__init__.py +++ b/core/models/__init__.py @@ -45,7 +45,7 @@ from regluit.payment.parameters import ( TRANSACTION_STATUS_FAILED, TRANSACTION_STATUS_INCOMPLETE ) -from regluit.utils import crypto +from regluit.utils import encryption as crypto from regluit.utils.localdatetime import now, date_today from regluit.core.parameters import ( diff --git a/core/models/bibmodels.py b/core/models/bibmodels.py index ee0991b5..24768e8d 100644 --- a/core/models/bibmodels.py +++ b/core/models/bibmodels.py @@ -106,10 +106,10 @@ class Identifier(models.Model): def __unicode__(self): return u'{0}:{1}'.format(self.type, self.value) - + def label(self): return ID_CHOICES_MAP.get(self.type, self.type) - + def url(self): return id_url(self.type, self.value) @@ -127,7 +127,7 @@ class Work(models.Model): is_free = models.BooleanField(default=False) landings = GenericRelation(Landing, related_query_name='works') related = models.ManyToManyField('self', symmetrical=False, blank=True, through='WorkRelation', related_name='reverse_related') - age_level = models.CharField(max_length=5, choices=AGE_LEVEL_CHOICES, default='', blank=True) + age_level = models.CharField(max_length=5, choices=AGE_LEVEL_CHOICES, default='', blank=True) class Meta: ordering = ['title'] @@ -137,7 +137,7 @@ class Work(models.Model): def __init__(self, *args, **kwargs): self._last_campaign = None super(Work, self).__init__(*args, **kwargs) - + def id_for(self, type): return id_for(self, type) @@ -205,7 +205,7 @@ class Work(models.Model): @property def openlibrary_url(self): return id_url('olwk', self.openlibrary_id) - + def cover_filetype(self): if self.uses_google_cover(): return 'jpeg' @@ -403,14 +403,14 @@ class Work(models.Model): def pdffiles(self): return EbookFile.objects.filter(edition__work=self, format='pdf').exclude(file='').order_by('-created') - + def versions(self): version_labels = [] for ebook in self.ebooks_all(): if ebook.version_label and not ebook.version_label in version_labels: version_labels.append(ebook.version_label) return version_labels - + def formats(self): fmts = [] for fmt in ['pdf', 'epub', 'mobi', 'html']: @@ -422,7 +422,7 @@ class Work(models.Model): def remove_old_ebooks(self): # this method is triggered after an file upload or new ebook saved old = Ebook.objects.filter(edition__work=self, active=True).order_by('-version_iter', '-created') - + # keep highest version ebook for each format and version label done_format_versions = [] for eb in old: @@ -431,7 +431,7 @@ class Work(models.Model): eb.deactivate() else: done_format_versions.append(format_version) - + # check for failed uploads. null_files = EbookFile.objects.filter(edition__work=self, file='') for ebf in null_files: @@ -768,12 +768,12 @@ class Subject(models.Model): class Meta: ordering = ['name'] - + @classmethod def set_by_name(cls, subject, work=None, authority=None): ''' use this method whenever you would be creating a new subject!''' subject = subject.strip() - + # make sure it's not a ; delineated list subjects = subject.split(';') for additional_subject in subjects[1:]: @@ -798,12 +798,12 @@ class Subject(models.Model): if not subject_obj.authority and authority: subject_obj.authority = authority subject_obj.save() - + subject_obj.works.add(work) - return subject_obj + return subject_obj else: return None - + def __unicode__(self): return self.name @@ -1082,7 +1082,7 @@ class EbookFile(models.Model): asking=self.asking, source=self.file.url ) - + new_mobi_ebf.file.save(path_for_file('ebf', None), mobi_cf) new_mobi_ebf.save() if self.ebook: @@ -1180,7 +1180,7 @@ class Ebook(models.Model): return '.{}'.format(self.version_iter) else: return '().{}'.format(self.version_label, self.version_iter) - + def set_version(self, version): #set both version_label and version_iter with one string with format "version.iter" version_pattern = r'(.*)\.(\d+)$' @@ -1190,11 +1190,11 @@ class Ebook(models.Model): else: self.version_label = version self.save() - + def set_next_iter(self): # set the version iter to the next unused iter for that version for ebook in Ebook.objects.filter( - edition=self.edition, + edition=self.edition, version_label=self.version_label, format=self.format, provider=self.provider @@ -1203,7 +1203,7 @@ class Ebook(models.Model): break self.version_iter = iter + 1 self.save() - + @property def rights_badge(self): if self.rights is None: diff --git a/frontend/forms/__init__.py b/frontend/forms/__init__.py index 64233dea..59b13279 100644 --- a/frontend/forms/__init__.py +++ b/frontend/forms/__init__.py @@ -292,7 +292,9 @@ class OfferForm(forms.ModelForm): class CampaignPurchaseForm(forms.Form): - anonymous = forms.BooleanField(required=False, label=_("Make this purchase anonymous, please")) + anonymous = forms.BooleanField(required=False, + label_suffix='', + label=_("Make this purchase anonymous")) offer_id = forms.IntegerField(required=False) offer = None library_id = forms.IntegerField(required=False) @@ -357,7 +359,8 @@ class CampaignPurchaseForm(forms.Form): class CampaignThanksForm(forms.Form): anonymous = forms.BooleanField( required=False, - label=_("Make this contribution anonymous, please") + label_suffix='', + label=_("Make this contribution anonymous") ) preapproval_amount = forms.DecimalField( required = True, @@ -391,7 +394,10 @@ class CampaignPledgeForm(forms.Form): def amount(self): return self.cleaned_data["preapproval_amount"] if self.cleaned_data else None - anonymous = forms.BooleanField(required=False, label=_("Make this support anonymous, please")) + anonymous = forms.BooleanField( + required=False, + label_suffix='', + label=_("Make this support anonymous")) ack_name = forms.CharField( required=False, max_length=64, diff --git a/frontend/templates/base.html b/frontend/templates/base.html index 932a9c74..44b63f0c 100644 --- a/frontend/templates/base.html +++ b/frontend/templates/base.html @@ -1,22 +1,28 @@ {% load truncatechars %}{% load sass_tags %} - +
+There are no freely available downloads of {{ work.title }} right now. {% if not work in request.user.wishlist.works.all %}Would you like there to be? Add this book to your wishlist.{% else %}Ask your friends to add it to their favorites!{% endif %}
+ +If you know of a Creative-Commons-licensed or US public domain edition of this book, you can add it through the More... tab of the book page.
+There are no freely available downloads of {{ work.title }} right now. {% if not work in request.user.wishlist.works.all %}Would you like there to be? Add this book to your wishlist.{% else %}Ask your friends to add it to their favorites!{% endif %}
- -If you know of a Creative-Commons-licensed or US public domain edition of this book, you can add it through the More... tab of the book page.
-- Looks like you're using an embedded browser inside an iOS app. (Maybe you followed a link in Twitter or Facebook?) -
-
- {% if formats.epub or formats.mobi %}
- To read this ebook you should open this page in safari, or use one of the "One-click" buttons, above.
- {% if iphone %}{% else %}{% endif %}
+ {% if xfer_url or can_kindle %}
+
- Not on iOS? Try the instructions for Android, desktop computers, or ereaders (Kindle, Nook, Kobo, etc.). -
-- You may already have an app which reads ebooks. Download the epub file and see if you're offered an option for opening the file. If so, you're done! If not... -
-iBooks
-Marvin is a great way to read ebooks.
-So is Aldiko.
- -- You may already have an app which reads ebooks. Download the pdf file and see if you're offered an option for opening the file. If so, you're done! If not... -
-iBooks
-- Download the HTML version. -
- {% elif formats.text %} -- Download the text version. -
- {% else %} -- This ebook is only available in .mobi. Your best bet is to install the free Amazon Kindle app from the Apple Store and then use the Send-to-Kindle option above. -
- {% endif %} -- Not on iOS? Try the instructions for Android, desktop computers, or ereaders (Kindle, Nook, Kobo, etc.). -
-- You may already have an app which reads ebooks. Download the epub file and see if you're offered an option for opening the file. If so, you're done! If not... -
-Aldiko
- -- You may already have an app which reads ebooks. Download the pdf file and see if you're offered an option for opening the file. If so, you're done! If not... -
-Aldiko
- -- Download the HTML version. -
- {% else %}{% if formats.text %} -- Download the text version. -
- {% else %} -- This ebook is only available in .mobi. Your best bet is to install the free Amazon Kindle app from Google Play and then use the Send-to-Kindle option above. -
- {% endif %}{% endif %}{% endif %}{% endif %} -- Not on Android? Try the instructions for iPhone/iPad, desktop computers, or ereaders (Kindle, Nook, Kobo, etc.). -
-- You probably already have an app which reads PDFs. Download the pdf file and open it. -
- {% elif formats.epub %} - {% if mac_ibooks %} -iBooks
-Calibre
-Calibre
-- You can read the HTML version right here in your browser. -
- {% else %} -- You can read the text version right here in your browser. -
- {% endif %} -- Not on a desktop computer, or want to "side-load" ebooks onto a device or app? Try the instructions for iPhone/iPad, Android, or ereaders (Kindle, Nook, Kobo, etc.). -
-+ Looks like you're using an embedded browser inside an iOS app. (Maybe you followed a link in Twitter or Facebook?) +
+
+ {% if formats.epub or formats.mobi %}
+ To read this ebook you should open this page in safari, or use one of the "One-click" buttons, above.
+ {% if iphone %}{% else %}{% endif %}
+ {% endif %}
+ {% if formats.pdf %}
+ You should also be able to use the pdf file.
+ {% elif formats.html %}
+ You can read the HTML version of this book right here in this browser.
+ {% elif formats.text %}
+ You can read the text version of this book right here in this browser.
+ {% endif %}
+
+ Not on iOS? Try the instructions for Android, desktop computers, or ereaders (Kindle, Nook, Kobo, etc.). +
++ You may already have an app which reads ebooks. Download the epub file and see if you're offered an option for opening the file. If so, you're done! If not... +
+iBooks
+Marvin is a great way to read ebooks.
+So is Aldiko.
+ ++ You may already have an app which reads ebooks. Download the pdf file and see if you're offered an option for opening the file. If so, you're done! If not... +
+iBooks
++ Download the HTML version. +
+ {% elif formats.text %} ++ Download the text version. +
{% else %} - All other ereaders: We're sorry; we don't have a version suitable for your device. ++ This ebook is only available in .mobi. Your best bet is to install the free Amazon Kindle app from the Apple Store and then use the Send-to-Kindle option above. +
{% endif %} - -- We're sorry; we don't have a file format suitable for ereaders. -
- {% endif %} - -- Not using an ereader? Try the instructions for iPhone/iPad, Android, or desktop computers. -
-Dropbox is a good way to share your ebooks between desktop, tablet and smartphone. If you see a dropbox button above, click it to load your books into your dropbox folder. Then load the file into your reader application on your device. -
++ Not on iOS? Try the instructions for Android, desktop computers, or ereaders (Kindle, Nook, Kobo, etc.). +
++ You may already have an app which reads ebooks. Download the epub file and see if you're offered an option for opening the file. If so, you're done! If not... +
+Aldiko
+ ++ You may already have an app which reads ebooks. Download the pdf file and see if you're offered an option for opening the file. If so, you're done! If not... +
+Aldiko
+ ++ Download the HTML version. +
+ {% else %}{% if formats.text %} ++ Download the text version. +
+ {% else %} ++ This ebook is only available in .mobi. Your best bet is to install the free Amazon Kindle app from Google Play and then use the Send-to-Kindle option above. +
+ {% endif %}{% endif %}{% endif %}{% endif %} ++ Not on Android? Try the instructions for iPhone/iPad, desktop computers, or ereaders (Kindle, Nook, Kobo, etc.). +
++ You probably already have an app which reads PDFs. Download the pdf file and open it. +
+ {% elif formats.epub %} + {% if mac_ibooks %} +iBooks
+Calibre
+Calibre
++ You can read the HTML version right here in your browser. +
+ {% else %} ++ You can read the text version right here in your browser. +
+ {% endif %} ++ Not on a desktop computer, or want to "side-load" ebooks onto a device or app? Try the instructions for iPhone/iPad, Android, or ereaders (Kindle, Nook, Kobo, etc.). +
++ We're sorry; we don't have a file format suitable for ereaders. +
+ {% endif %} + ++ Not using an ereader? Try the instructions for iPhone/iPad, Android, or desktop computers. +
+Dropbox is a good way to share your ebooks between desktop, tablet and smartphone. If you see a dropbox button above, click it to load your books into your dropbox folder. Then load the file into your reader application on your device. +
++ When an ebook license is purchased, the ungluing date is recalculated according to these formulae:(days per dollar) = [(initial ungluing date) - (launch date)] / (campaign goal) (current ungluing date) = (initial ungluing date) - (gross revenue)*(days per dollar) @@ -35,12 +35,12 @@ Here's a calculator you can use to see how this works: {{ form.cc_date_initial.errors }}{{ form.cc_date_initial }} {% else %} {% endif %} -and a revenue goal of +
and a revenue goal of {{ form.target.errors }}${{ form.target }},
{% if form.instance.dollar_per_day %} -If you launch today, when the Book has earned +
If you launch today, when the Book has earned ${{ form.revenue.errors }}{{ form.revenue }}, the new Ungluing Date will be {{ form.instance.cc_date }} and every additional ${{ form.instance.dollar_per_day|floatformat:2|intcomma }} received will advance the Ungluing Date by one day.
another Ungluing Date
diff --git a/frontend/templates/faqmenu.html b/frontend/templates/faqmenu.html index 2efad932..3b8537d4 100644 --- a/frontend/templates/faqmenu.html +++ b/frontend/templates/faqmenu.html @@ -1,62 +1,62 @@ --diff --git a/frontend/templates/home.html b/frontend/templates/home.html index d5b9b428..cf4aee22 100755 --- a/frontend/templates/home.html +++ b/frontend/templates/home.html @@ -13,8 +13,11 @@ {% block extra_css %} + + + {% endblock %} {% block extra_js %} @@ -22,20 +25,19 @@ + - @@ -44,10 +46,10 @@ function put_un_in_cookie2(){ {% block topsection %} {% include "learn_more.html" %} {% endblock %} - + {% block content %}FAQs
--+- -
+- - All -
+++FAQs
++--
-- - About the site - -
- -- - Unglued Ebooks - -
+- + All +
-- - Campaigns - -
- +- + About the site + +
-- - For Rights Holders - -
- -- - For Libraries -
-- - Start Exploring -
-- + Unglued Ebooks + +
+ +- + Campaigns + +
+ + +- + For Rights Holders + +
+ +- + For Libraries +
+- + Start Exploring +
+-+diff --git a/frontend/templates/libraryauth/library.html b/frontend/templates/libraryauth/library.html index a66826cc..135ddae1 100644 --- a/frontend/templates/libraryauth/library.html +++ b/frontend/templates/libraryauth/library.html @@ -14,7 +14,6 @@ {% block extra_js %} - @@ -233,4 +232,4 @@ function highlightTarget(targetdiv) {Today's Featured Free eBook
@@ -68,7 +70,7 @@ function put_un_in_cookie2(){-++@@ -95,76 +97,94 @@ function put_un_in_cookie2(){@@ -78,13 +80,13 @@ function put_un_in_cookie2(){ {% endif %}{% if work.relators.count > 2 %}{% for author in work.relators %}{% if not forloop.first %}, {{ author.name }}{% endif %}{% endfor %} {% endif %}-+{% if work.last_campaign.publisher %} {{ work.last_campaign.publisher }} {% endif %} {{ work.publication_date }}-{{ work.description|safe }}+{{ work.description|safe }}Your Recent Faves
- {% for work in faves %} - {% with work.googlebooks_id as googlebooks_id %} - {% include "book_panel.html" %} - {% endwith %} - {% endfor %} - +- + {% endif %} {% if top_pledge %}+ {% for work in faves %} + {% with work.googlebooks_id as googlebooks_id %} + {% include "book_panel.html" %} + {% endwith %} + {% endfor %} + ++ See MorePledge to Make These eBooks Free
-- {% for campaign in top_pledge %} - {% with campaign.work as work %} - {% with work.googlebooks_id as googlebooks_id %} - {% include "book_panel.html" %} - {% endwith %}{% endwith %} - {% endfor %} - +-++ See More {% endif %}Read These Free Licensed eBooks
-- {% for work in cc_books %} - {% with work.googlebooks_id as googlebooks_id %} - {% include "book_panel.html" %} - {% endwith %} - {% endfor %} - ++{% if top_b2u %}+ {% for work in cc_books %} + {% with work.googlebooks_id as googlebooks_id %} + {% include "book_panel.html" %} + {% endwith %} + {% endfor %} + ++ See MoreBuy and Read These eBooks to Make Them Free
-- {% for campaign in top_b2u %} - {% with campaign.work as work %} - {% with work.googlebooks_id as googlebooks_id %} - {% include "book_panel.html" %} - {% endwith %}{% endwith %} - {% endfor %} - +++ See More {% endif %} {% if top_t4u %}Read These Free eBooks and Thank the Creators
-- {% for campaign in top_t4u %} - {% with campaign.work as work %} - {% with work.googlebooks_id as googlebooks_id %} - {% include "book_panel.html" %} - {% endwith %}{% endwith %} - {% endfor %} - +-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/frontend/templates/learn_more.html b/frontend/templates/learn_more.html index 048abec0..41571729 100644 --- a/frontend/templates/learn_more.html +++ b/frontend/templates/learn_more.html @@ -16,131 +16,6 @@++ See More {% endif %}Read These Unglued eBooks - You've Made Them Free
-- {% for work in unglued_books %} - {% with work.googlebooks_id as googlebooks_id %} - {% include "book_panel.html" %} - {% endwith %} - {% endfor %} - +++ See More - +@@ -189,7 +209,7 @@ function put_un_in_cookie2(){-+{% endif %} -@@ -202,32 +222,25 @@ function put_un_in_cookie2(){-Donate!
--- -Please help support Unglue.it by making a tax-deductible donation to the Free Ebook Foundation.- ++-Donate!
++Please help support Unglue.it by making a tax-deductible donation to the Free Ebook Foundation.+--News
++-Latest Ungluing
--Latest Ungluing
--- {% for event in events %} +
+ {% for event in events %} {% comment %} events are tuples of date, object, and string representing object type {% endcomment %} @@ -236,22 +249,22 @@ function put_un_in_cookie2(){ {% if event.2 == "pledge" %} {% if object.user%} - + {{ object.user.username }}
{% if object.campaign.type == 1 %} - pledged to unglue + pledged to unglue {% elif object.campaign.type == 2 %} - bought a copy of + bought a copy of {% elif object.campaign.type == 3 %} - supported + supported {% endif %}
{{ object.campaign.work.title }} {% else %} - + Anonymous User
@@ -261,22 +274,22 @@ function put_un_in_cookie2(){ {% endif %} {% elif event.2 == "comment" %} - + {{ object.user.username }}
commented on
{{ object.content_object.title }} - + {% elif event.2 == "wish" %} - + {{ object.wishlist.user.username }}
faved
{{ object.work.title }} - + {% endif %} {% endwith %} @@ -285,26 +298,13 @@ function put_un_in_cookie2(){As seen on
- -For readers it’s a gold mine of great books they can have a say in bringing to market.---Find over 10,000 free ebooks here.
- -
Help us make more ebooks free!--- MAKE ---- Creators make ebooks in EPUB, MOBI, and PDF.-
- Ungluers love them for doing it.
----- GIVE --Read it Now-- Creators apply Creative Commons licenses to ebooks.-
- Ungluers read them at home, at a library, anywhere.
----- - ASK - --- Creators ask downloaders to contribute what they choose.-
- Ungluers say thank you with their support. -- -- ---- MAKE ---- Creators make ebooks in EPUB.-
- Ungluers love them for doing it.
----- - ASK - --- Creators set a funding goal and a per-copy price.-
- Ungluers purchase the ebook to advance the campaign. ----- GIVE --Read it Now-- When the funding goal is met, Creative Commons licenses are automatically applied.-
--- -- "Buy to Unglue" ----- - ASK - --- Creators set a funding goal and rewards for supporters.-
- Ungluers pledge to support the campaign. ----- MAKE ---- When the campaign succeeds, We collect Ungluer pledges.-
- The ebook is created and rewards are distributed. ----- GIVE -- -Read it Now-- --
+ Reflow text when sidebars are open. +
+We've sent your book to your Kindle. Happy reading!
-In the future you can send yourself unglued ebooks with one click. Log in, or sign up, and we'll add your Kindle email to your profile so you never have to enter it again.
@@ -31,14 +29,19 @@ Make sure the username box has your username, not your email -- some brow Forgot your password? Need an account? Other questions? -Welcome, {{user.username}}!
- - -- This work is a {{ work_rel.relation }} of {{ work_rel.from_work }}. -
- {% endif %} - {% endfor %} - {% for work_rel in work.works_related_from.all %} - {% if work.language != 'xx' and work_rel.to_work.language != 'xx' %} -- {{ work_rel.to_work }} is a {{ work_rel.relation }} of this work. -
- {% endif %} - {% endfor %} - {% if work.doab %} -- This book is included in DOAB. -
- {% endif %} - {% if work.gtbg %} -- This book is included in Project Gutenberg. -
- {% endif %} -You must be logged in to comment.
- {% endif %} -The rights holder, {% for claim in work.claim.all %} - {% if claim.status == 'active' %} - {{ claim.rights_holder.rights_holder_name }} - {% endif %} - {% endfor %} - , has agreed to release {{work.title}} to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) if ungluers can join together to raise ${{ work.last_campaign.target|floatformat:0|intcomma }} by {{ work.last_campaign.deadline }}. - You can help!
- {% endif %} - {% if work.last_campaign.type == 2 %} -The rights holder, {% for claim in work.claim.all %} - {% if claim.status == 'active' %} - {{ claim.rights_holder.rights_holder_name }} - {% endif %} - {% endfor %} - , has agreed to release {{work.title}} to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) on {{ work.last_campaign.cc_date }}. For every copy that ungluers purchase, that date gets sooner. ${{ work.last_campaign.left|floatformat:0|intcomma }} of sales will unglue the book TODAY. - You can help!
- {% endif %} - {% if work.last_campaign.type == 3 %} -The rights holder, {% for claim in work.claim.all %} - {% if claim.status == 'active' %} - {{ claim.rights_holder.rights_holder_name }} - {% endif %} - {% endfor %} - , has released {{work.title}} to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) . - You can help us say "Thank You!" so that other creators will do the same.
- {% endif %} -The rights holder, {% for claim in work.claim.all %} - {% if claim.status == 'active' %} - {{ claim.rights_holder.rights_holder_name }} - {% endif %} - {% endfor %} - , has agreed to release {{work.title}} to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) thanks to the efforts of ungluers like you.
-This work has been claimed by {{ rights_holder_name }}.
- {% else %} - {% if claimstatus == 'disputed' %} -Rights claims are pending.
- {% else %} - {% if claimstatus == 'one_pending' %} -A claim for this work by {{ rights_holder_name }} is pending.
- {% else %} - {% if request.user.rights_holder.all.count %} - Is this work yours? Claim it:The rights holder, {% for claim in work.claim.all %} + {% if claim.status == 'active' %} + {{ claim.rights_holder.rights_holder_name }} + {% endif %} + {% endfor %} + , has agreed to release {{work.title}} to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) if ungluers can join together to raise ${{ work.last_campaign.target|floatformat:0|intcomma }} by {{ work.last_campaign.deadline }}. + You can help!
+ {% endif %} + {% if work.last_campaign.type == 2 %} +The rights holder, {% for claim in work.claim.all %} + {% if claim.status == 'active' %} + {{ claim.rights_holder.rights_holder_name }} + {% endif %} + {% endfor %} + , has agreed to release {{work.title}} to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) on {{ work.last_campaign.cc_date }}. For every copy that ungluers purchase, that date gets sooner. ${{ work.last_campaign.left|floatformat:0|intcomma }} of sales will unglue the book TODAY. + You can help!
+ {% endif %} + {% if work.last_campaign.type == 3 %} +The rights holder, {% for claim in work.claim.all %} + {% if claim.status == 'active' %} + {{ claim.rights_holder.rights_holder_name }} + {% endif %} + {% endfor %} + , has released {{work.title}} to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) . + You can help us say "Thank You!" so that other creators will do the same.
+ {% endif %} +The rights holder, {% for claim in work.claim.all %} + {% if claim.status == 'active' %} + {{ claim.rights_holder.rights_holder_name }} + {% endif %} + {% endfor %} + , has agreed to release {{work.title}} to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) thanks to the efforts of ungluers like you.
+This work has been claimed by {{ rights_holder_name }}.
+ {% else %} + {% if claimstatus == 'disputed' %} +Rights claims are pending.
+ {% else %} + {% if claimstatus == 'one_pending' %} +A claim for this work by {{ rights_holder_name }} is pending.
+ {% else %} + {% if request.user.rights_holder.all.count %} + Is this work yours? Claim it:You must be logged in to comment.
+ {% endif %}