staff only UI for merging works [finish #39297681]

staff-only link in rights tab of every work!
pull/1/head
eric 2012-12-12 22:35:35 -05:00
parent 139124c5dd
commit fec7f33d9e
7 changed files with 148 additions and 6 deletions

View File

@ -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)

View File

@ -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(

View File

@ -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 %}

View File

@ -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>

View File

@ -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>

View File

@ -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"),

View File

@ -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"