Merge branch 'master' into prettier_acks
commit
e305a1ee74
|
@ -2,9 +2,25 @@ from selectable.base import ModelLookup
|
|||
from selectable.registry import registry
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from regluit.core.models import Work
|
||||
|
||||
class OwnerLookup(ModelLookup):
|
||||
model = User
|
||||
search_fields = ('username__icontains',)
|
||||
|
||||
registry.register(OwnerLookup)
|
||||
|
||||
class WorkLookup(ModelLookup):
|
||||
model = Work
|
||||
search_fields = ('title__istartswith',)
|
||||
filters = {'language': 'en', }
|
||||
def get_item_label(self,item):
|
||||
return "%s (%s)"%(item.title,item.id)
|
||||
|
||||
def get_query(self, request, term):
|
||||
results = super(WorkLookup, self).get_query(request, term)
|
||||
language = request.GET.get('language', 'en')
|
||||
results = results.filter(language=language)
|
||||
return results
|
||||
|
||||
|
||||
registry.register(OwnerLookup)
|
||||
registry.register(WorkLookup)
|
|
@ -249,15 +249,15 @@ class BookLoaderTests(TestCase):
|
|||
#ebook_epub = edition.ebooks.all()[0]
|
||||
ebook_epub = edition.ebooks.filter(format='epub')[0]
|
||||
self.assertEqual(ebook_epub.format, 'epub')
|
||||
#self.assertEqual(ebook_epub.url, 'http://books.google.com/books/download/The_Latin_language.epub?id=U3FXAAAAYAAJ&ie=ISO-8859-1&output=epub&source=gbs_api')
|
||||
self.assertEqual(parse_qs(urlparse(ebook_epub.url).query).get("id"), ['U3FXAAAAYAAJ'])
|
||||
#self.assertEqual(ebook_epub.url, 'http://books.google.com/books/download/The_Latin_language.epub?id=N1RfAAAAMAAJ&ie=ISO-8859-1&output=epub&source=gbs_api')
|
||||
self.assertEqual(parse_qs(urlparse(ebook_epub.url).query).get("id"), ['N1RfAAAAMAAJ'])
|
||||
self.assertEqual(parse_qs(urlparse(ebook_epub.url).query).get("output"), ['epub'])
|
||||
self.assertEqual(ebook_epub.provider, 'Google Books')
|
||||
self.assertEqual(ebook_epub.set_provider(), 'Google Books')
|
||||
ebook_pdf = edition.ebooks.filter(format='pdf')[0]
|
||||
self.assertEqual(ebook_pdf.format, 'pdf')
|
||||
#self.assertEqual(ebook_pdf.url, 'http://books.google.com/books/download/The_Latin_language.pdf?id=U3FXAAAAYAAJ&ie=ISO-8859-1&output=pdf&sig=ACfU3U2yLt3nmTncB8ozxOWUc4iHKUznCA&source=gbs_api')
|
||||
self.assertEqual(parse_qs(urlparse(ebook_pdf.url).query).get("id"), ['U3FXAAAAYAAJ'])
|
||||
#self.assertEqual(ebook_pdf.url, 'http://books.google.com/books/download/The_Latin_language.pdf?id=N1RfAAAAMAAJ&ie=ISO-8859-1&output=pdf&sig=ACfU3U2yLt3nmTncB8ozxOWUc4iHKUznCA&source=gbs_api')
|
||||
self.assertEqual(parse_qs(urlparse(ebook_pdf.url).query).get("id"), ['N1RfAAAAMAAJ'])
|
||||
self.assertEqual(parse_qs(urlparse(ebook_pdf.url).query).get("output"), ['pdf'])
|
||||
self.assertEqual(ebook_pdf.provider, 'Google Books')
|
||||
self.assertEqual(edition.public_domain, True)
|
||||
|
|
|
@ -13,8 +13,8 @@ from decimal import Decimal as D
|
|||
from selectable.forms import AutoCompleteSelectMultipleWidget,AutoCompleteSelectMultipleField
|
||||
from selectable.forms import AutoCompleteSelectWidget,AutoCompleteSelectField
|
||||
|
||||
from regluit.core.models import UserProfile, RightsHolder, Claim, Campaign, Premium, Ebook, Edition, PledgeExtra
|
||||
from regluit.core.lookups import OwnerLookup
|
||||
from regluit.core.models import UserProfile, RightsHolder, Claim, Campaign, Premium, Ebook, Edition, PledgeExtra, Work
|
||||
from regluit.core.lookups import OwnerLookup, WorkLookup
|
||||
|
||||
from regluit.utils.localdatetime import now
|
||||
|
||||
|
@ -208,6 +208,36 @@ def getTransferCreditForm(maximum, data=None, *args, **kwargs ):
|
|||
)
|
||||
return TransferCreditForm( data=data )
|
||||
|
||||
|
||||
class WorkForm(forms.Form):
|
||||
other_work = forms.ModelChoiceField(queryset=Work.objects.all(),
|
||||
widget=forms.HiddenInput(),
|
||||
required=True,
|
||||
error_messages={'required': 'Missing work to merge with.'},
|
||||
)
|
||||
work=None
|
||||
|
||||
def clean_other_work(self):
|
||||
if self.cleaned_data["other_work"].id== self.work.id:
|
||||
raise forms.ValidationError(_("You can't merge a work into itself"))
|
||||
return self.cleaned_data["other_work"]
|
||||
|
||||
def __init__(self, work=None, *args, **kwargs):
|
||||
super(WorkForm, self).__init__(*args, **kwargs)
|
||||
self.work=work
|
||||
|
||||
class OtherWorkForm(WorkForm):
|
||||
other_work = AutoCompleteSelectField(
|
||||
WorkLookup,
|
||||
label='Other Work',
|
||||
widget=AutoCompleteSelectWidget(WorkLookup),
|
||||
required=True,
|
||||
error_messages={'required': 'Missing work to merge with.'},
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(OtherWorkForm, self).__init__(*args, **kwargs)
|
||||
self.fields['other_work'].widget.update_query_parameters({'language':self.work.language})
|
||||
|
||||
class EditManagersForm(forms.ModelForm):
|
||||
managers = AutoCompleteSelectMultipleField(
|
||||
|
|
|
@ -139,7 +139,7 @@
|
|||
|
||||
{% block news %}
|
||||
<div class="launch_top">
|
||||
We unglued <a href="/work/81834/">one book</a>. Amazon <a href="http://blog.unglue.it/2012/08/09/open-thread-amazon-forces-unglue-it-to-suspend-crowdfunding-for-creative-commons-ebooks/">shut us down</a>. Now we're back. Help us unglue <a href="https://unglue.it/campaigns/ending">five more books</a>! <br />
|
||||
We've unglued our <a href="/work/113782/">second</a> and <a href="/work/76348/">third</a> books. Help us <a href="https://unglue.it/campaigns/ending">unglue even more</a>! <br />
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
{% extends "basedocumentation.html" %}
|
||||
|
||||
{% block extra_extra_head %}
|
||||
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/ui-lightness/jquery-ui.css" type="text/css" media="screen">
|
||||
{{ form.media.css }}
|
||||
<script type="text/javascript" src="{{ jquery_home }}"></script>
|
||||
<script type="text/javascript" src="{{ jquery_ui_home }}" ></script>
|
||||
{{ form.media.js }}
|
||||
{% endblock %}
|
||||
|
||||
{% block doccontent %}
|
||||
{% if merge_complete %}
|
||||
<h2>Merge {{ old_work_id }} into {{ work.id }} Complete</h2>
|
||||
{% include 'workbox.html' %}
|
||||
{% else %}
|
||||
<h2>Merge Works</h2>
|
||||
<form method="POST" action="#">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<h3>Merge this work...</h3>
|
||||
{% if other_work %}
|
||||
{% with other_work as work%}
|
||||
{% include 'workbox.html' %}
|
||||
{% endwith %}
|
||||
{% endif %}
|
||||
<h3>... into the current work</h3>
|
||||
{% include 'workbox.html' %}
|
||||
{% if other_work %}
|
||||
<input type="submit" name="confirm_merge_works" value="Confirm Merge" id="submit" />
|
||||
{% else %}
|
||||
<input type="submit" name="merge_works" value="Preview Merge Works" id="submit" />
|
||||
{% endif %}
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endblock %}
|
|
@ -9,4 +9,4 @@ If necessary to provide you with any premiums you requested, {{ campaign.rightsh
|
|||
|
||||
Thank you for your support.
|
||||
|
||||
{{ campaign.rightsholder }} (rights holder for {{ campaign.work.title }} and the Unglue.it team
|
||||
{{ campaign.rightsholder }} (rights holder for {{ campaign.work.title }}) and the Unglue.it team
|
|
@ -321,6 +321,9 @@ $j(document).ready(function(){
|
|||
{% endif %}
|
||||
|
||||
<p>If you'd like to contact us regarding rights for this work, please email <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>.</p>
|
||||
{% if user.is_staff %}<h4>Related Works</h4>
|
||||
<a href="{% url merge work_id %}">Merge other works into this one</a><br />
|
||||
{% endif %}
|
||||
|
||||
{% if work.subjects.all.count > 0 %}
|
||||
<h4>Subjects</h4>
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
<div class="workbox">
|
||||
<a href="{% url work work.id %}">{{ work.title }}</a> # {{work.id }}<br />
|
||||
Language: {{ work.language }}<br />
|
||||
Editions: <ol>
|
||||
{% for edition in work.editions.all %}
|
||||
<li>
|
||||
<div class="editionbox">{{ edition.title }}, published by {{edition.publisher}} in {{ edition.publication_date }} with authors
|
||||
{% for author in edition.authors.all %}
|
||||
{{author}},
|
||||
{% endfor %}
|
||||
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
</div>
|
|
@ -10,7 +10,7 @@ from regluit.core.feeds import SupporterWishlistFeed
|
|||
from regluit.core.models import Campaign
|
||||
from regluit.frontend.views import GoodreadsDisplayView, LibraryThingView, PledgeView, PledgeCompleteView, PledgeCancelView, PledgeRechargeView, FAQView
|
||||
from regluit.frontend.views import CampaignListView, WorkListView, UngluedListView, InfoPageView, InfoLangView, DonationView, FundPledgeView
|
||||
from regluit.frontend.views import NonprofitCampaign, DonationCredit, PledgeModifiedView, ManageAccount
|
||||
from regluit.frontend.views import NonprofitCampaign, DonationCredit, PledgeModifiedView, ManageAccount, MergeView
|
||||
|
||||
urlpatterns = patterns(
|
||||
"regluit.frontend.views",
|
||||
|
@ -49,6 +49,7 @@ urlpatterns = patterns(
|
|||
url(r"^work/(?P<work_id>\d+)/lockss/$", "lockss", name="lockss"),
|
||||
url(r"^lockss/(?P<year>\d+)/$", "lockss_manifest", name="lockss_manifest"),
|
||||
url(r"^work/(?P<work_id>\d+)/download/$", "download", name="download"),
|
||||
url(r"^work/(?P<work_id>\d+)/merge/$", login_required(MergeView.as_view()), name="merge"),
|
||||
url(r"^work/\d+/acks/images/(?P<file_name>[\w\.]*)$", "static_redirect_view",{'dir': 'images'}),
|
||||
url(r"^work/(?P<work_id>\d+)/librarything/$", "work_librarything", name="work_librarything"),
|
||||
url(r"^work/(?P<work_id>\d+)/goodreads/$", "work_goodreads", name="work_goodreads"),
|
||||
|
|
|
@ -44,11 +44,12 @@ from regluit.core import models, bookloader, librarything
|
|||
from regluit.core import userlists
|
||||
from regluit.core.search import gluejar_search
|
||||
from regluit.core.goodreads import GoodreadsClient
|
||||
from regluit.core.bookloader import merge_works
|
||||
from regluit.frontend.forms import UserData, UserEmail, ProfileForm, CampaignPledgeForm, GoodreadsShelfLoadingForm
|
||||
from regluit.frontend.forms import RightsHolderForm, UserClaimForm, LibraryThingForm, OpenCampaignForm
|
||||
from regluit.frontend.forms import getManageCampaignForm, DonateForm, CampaignAdminForm, EmailShareForm, FeedbackForm
|
||||
from regluit.frontend.forms import EbookForm, CustomPremiumForm, EditManagersForm, EditionForm, PledgeCancelForm
|
||||
from regluit.frontend.forms import getTransferCreditForm, CCForm, CloneCampaignForm, PlainCCForm
|
||||
from regluit.frontend.forms import getTransferCreditForm, CCForm, CloneCampaignForm, PlainCCForm, WorkForm, OtherWorkForm
|
||||
from regluit.payment.manager import PaymentManager
|
||||
from regluit.payment.models import Transaction, Account
|
||||
from regluit.payment import baseprocessor
|
||||
|
@ -568,6 +569,46 @@ class CampaignListView(FilterableListView):
|
|||
context['facet'] =self.kwargs['facet']
|
||||
return context
|
||||
|
||||
class MergeView(FormView):
|
||||
template_name="merge.html"
|
||||
work=None
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if not request.user.is_staff:
|
||||
return render(request, "admins_only.html")
|
||||
else:
|
||||
return super(MergeView, self).dispatch(request, *args, **kwargs)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(MergeView, self).get_context_data(**kwargs)
|
||||
context['work']=self.work
|
||||
return context
|
||||
|
||||
def get_form_class(self):
|
||||
if self.request.method == 'POST' and self.request.POST.has_key('confirm_merge_works'):
|
||||
return WorkForm
|
||||
else:
|
||||
return OtherWorkForm
|
||||
|
||||
def get_form_kwargs(self):
|
||||
self.work = get_object_or_404(models.Work, id=self.kwargs["work_id"])
|
||||
form_kwargs= {'work':self.work}
|
||||
if self.request.method == 'POST':
|
||||
form_kwargs.update({'data':self.request.POST})
|
||||
return form_kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
other_work=form.cleaned_data['other_work']
|
||||
context=self.get_context_data()
|
||||
if self.request.POST.has_key('confirm_merge_works'):
|
||||
context['old_work_id']=other_work.id
|
||||
merge_works(self.work,other_work,self.request.user)
|
||||
context['merge_complete']=True
|
||||
else:
|
||||
context['form']=WorkForm(initial={'other_work':other_work})
|
||||
context['other_work']=other_work
|
||||
return render(self.request, self.template_name, context)
|
||||
|
||||
class DonationView(TemplateView):
|
||||
template_name = "donation.html"
|
||||
|
||||
|
|
|
@ -12,6 +12,11 @@ $j(document).ready(function() {
|
|||
var windowWidth = $j(document).width();
|
||||
var marginWidth = (windowWidth - hijaxWidth)/2;
|
||||
$j('#about_expandable').css({'margin-left': marginWidth});
|
||||
|
||||
// position div vertically relative to top of viewport, to ensure visibility
|
||||
// regardless of where on the page the user clicked to activate it
|
||||
var marginTop = window.pageYOffset;
|
||||
$j('#about_expandable').css({'margin-top': marginTop});
|
||||
});
|
||||
|
||||
if ($j(this).attr("href").substr(-9,8) == "download") {
|
||||
|
@ -22,7 +27,7 @@ $j(document).ready(function() {
|
|||
$j('#feedback').css({"opacity": "0.07"});
|
||||
$j('#js-page-wrap').css({"opacity": "0.07"});
|
||||
$j('#footer').css({"opacity": "0.07"});
|
||||
$j('#about_expandable').css({'position': 'fixed'});
|
||||
$j('#about_expandable').css({'position': 'absolute'});
|
||||
$j('#about_expandable').fadeTo("slow", 1);
|
||||
|
||||
// if we're on a supporter page, personalize our about box
|
||||
|
|
Loading…
Reference in New Issue