mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2024-12-17 05:36:34 +00:00
UI for adding and removing authors
This commit is contained in:
parent
327f14a150
commit
b2d1384bc5
3 changed files with 81 additions and 11 deletions
|
@ -26,7 +26,8 @@
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form class="block" name="edit-book" action="{{ book.local_path }}/edit" method="post" enctype="multipart/form-data">
|
<form class="block" name="edit-book" action="{{ book.local_path }}/edit#deduplication" method="post" enctype="multipart/form-data">
|
||||||
|
<fieldset {% if confirm_mode %}disabled{% endif %}>
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="hidden" name="last_edited_by" value="{{ request.user.id }}">
|
<input type="hidden" name="last_edited_by" value="{{ request.user.id }}">
|
||||||
<div class="columns">
|
<div class="columns">
|
||||||
|
@ -68,11 +69,11 @@
|
||||||
{% for author in book.authors.all %}
|
{% for author in book.authors.all %}
|
||||||
<p><a href="{{ author.local_path }}">{{ author.name }}</a>
|
<p><a href="{{ author.local_path }}">{{ author.name }}</a>
|
||||||
<label class="label">
|
<label class="label">
|
||||||
<input type="checkbox" name="remove-author" value="{{ author.id }}"> {% trans "Remove this author" %}
|
<input type="checkbox" name="remove_author" value="{{ author.id }}"> {% trans "Remove this author" %}
|
||||||
</label>
|
</label>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<label class="label" for="id_add_author">{% trans "Add Author:" %}</label>
|
<label class="label" for="id_add_author">{% trans "Add Author:" %}</label>
|
||||||
<input class="input" type="text" name="author" id="id_add_author" placeholder="John Doe">
|
<input class="input" type="text" name="add_author" id="id_add_author" placeholder="John Doe" value="{{ add_author }}">
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -138,6 +139,42 @@
|
||||||
<button class="button is-primary" type="submit">{% trans "Save" %}</button>
|
<button class="button is-primary" type="submit">{% trans "Save" %}</button>
|
||||||
<a class="button" href="/book/{{ book.id }}">{% trans "Cancel" %}</a>
|
<a class="button" href="/book/{{ book.id }}">{% trans "Cancel" %}</a>
|
||||||
</div>
|
</div>
|
||||||
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
{% if author_matches or book_matches %}
|
||||||
|
<hr class="block">
|
||||||
|
<form class="box content" id="deduplication">
|
||||||
|
<h2 class="title is-4">{% trans "Confirm Book Info" %}</h2>
|
||||||
|
<div class="columns">
|
||||||
|
{% if author_matches.exists %}
|
||||||
|
<fieldset class="column is-half">
|
||||||
|
<legend class="label">{% blocktrans %}Is "{{ add_author }}" an existing author?{% endblocktrans %}</legend>
|
||||||
|
{% for match in author_matches %}
|
||||||
|
<label class="label"><input type="radio" name="author_match" value="{{ match.id }}"> {{ match.name }}</label>
|
||||||
|
<p class="help">
|
||||||
|
<a href="{{ author.local_path }}" target="_blank">{% blocktrans with book_title=match.book_set.first.title %}Author of <em>{{ book_title }}</em>{% endblocktrans %}</a>
|
||||||
|
</p>
|
||||||
|
{% endfor %}
|
||||||
|
<label class="label"><input type="radio" name="author_match"> this is a new author</label>
|
||||||
|
</fieldset>
|
||||||
|
{% else %}
|
||||||
|
<p class="column is-half">{% blocktrans %}Creating a new author: {{ add_author }}{% endblocktrans %}</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if not book %}
|
||||||
|
<fieldset class="column is-half">
|
||||||
|
<legend class="title is-5">{% trans "Is this an editions of an existing work?" %}</legend>
|
||||||
|
{% for match in book_matches %}
|
||||||
|
<label class="label"><input type="radio" name="book_match" value="{{ match.id }}"> {{ match.title }}</label>
|
||||||
|
{% endfor %}
|
||||||
|
<label class="label"><input type="radio" name="book_match"> this is a new work</label>
|
||||||
|
</fieldset>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="button is-primary" type="submit">{% trans "save" %}</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -83,6 +83,22 @@ class BookViews(TestCase):
|
||||||
self.assertEqual(self.book.title, 'New Title')
|
self.assertEqual(self.book.title, 'New Title')
|
||||||
|
|
||||||
|
|
||||||
|
def test_edit_book_add_author(self):
|
||||||
|
''' lets a user edit a book '''
|
||||||
|
view = views.EditBook.as_view()
|
||||||
|
self.local_user.groups.add(self.group)
|
||||||
|
form = forms.EditionForm(instance=self.book)
|
||||||
|
form.data['title'] = 'New Title'
|
||||||
|
form.data['last_edited_by'] = self.local_user.id
|
||||||
|
form.data['add_author'] = "John Doe"
|
||||||
|
request = self.factory.post('', form.data)
|
||||||
|
request.user = self.local_user
|
||||||
|
with patch('bookwyrm.models.activitypub_mixin.broadcast_task.delay'):
|
||||||
|
view(request, self.book.id)
|
||||||
|
self.book.refresh_from_db()
|
||||||
|
self.assertEqual(self.book.title, 'New Title')
|
||||||
|
|
||||||
|
|
||||||
def test_switch_edition(self):
|
def test_switch_edition(self):
|
||||||
''' updates user's relationships to a book '''
|
''' updates user's relationships to a book '''
|
||||||
work = models.Work.objects.create(title='test work')
|
work = models.Work.objects.create(title='test work')
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
''' the good stuff! the books! '''
|
''' the good stuff! the books! '''
|
||||||
from django.core.paginator import Paginator
|
|
||||||
from django.contrib.auth.decorators import login_required, permission_required
|
from django.contrib.auth.decorators import login_required, permission_required
|
||||||
|
from django.contrib.postgres.search import SearchRank, SearchVector
|
||||||
|
from django.core.paginator import Paginator
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.db.models import Avg, Q
|
from django.db.models import Avg, Q
|
||||||
from django.http import HttpResponseNotFound
|
from django.http import HttpResponseNotFound
|
||||||
|
@ -132,16 +133,32 @@ class EditBook(View):
|
||||||
if not form.is_valid():
|
if not form.is_valid():
|
||||||
return TemplateResponse(request, 'edit_book.html', data)
|
return TemplateResponse(request, 'edit_book.html', data)
|
||||||
|
|
||||||
if not book or form.author:
|
add_author = request.POST.get('add_author')
|
||||||
|
if not book or add_author:
|
||||||
# creting a book or adding an author to a book needs another step
|
# creting a book or adding an author to a book needs another step
|
||||||
return TemplateResponse(request, 'confirm_book.html', data)
|
data['confirm_mode'] = True
|
||||||
|
data['add_author'] = add_author
|
||||||
|
# check for existing authors
|
||||||
|
vector = SearchVector('name', weight='A') +\
|
||||||
|
SearchVector('aliases', weight='B')
|
||||||
|
|
||||||
|
data['author_matches'] = models.Author.objects.annotate(
|
||||||
|
search=vector
|
||||||
|
).annotate(
|
||||||
|
rank=SearchRank(vector, add_author)
|
||||||
|
).filter(rank__gt=0.8).order_by('-rank')[:5]
|
||||||
|
|
||||||
|
# check if this is an edition of an existing work
|
||||||
|
author_text = book.author_text if book else add_author
|
||||||
|
data['book_matches'] = connector_manager.local_search(
|
||||||
|
'%s %s' % (form.cleaned_data.get('title'), author_text),
|
||||||
|
min_confidence=0.5,
|
||||||
|
raw=True
|
||||||
|
)[:5]
|
||||||
|
|
||||||
|
return TemplateResponse(request, 'edit_book.html', data)
|
||||||
|
|
||||||
# remove authors
|
|
||||||
if request.POST.get('remove-author'):
|
|
||||||
import pdb;pdb.set_trace()
|
|
||||||
author = get_object_or_404(id=author_id)
|
|
||||||
book = form.save()
|
book = form.save()
|
||||||
|
|
||||||
return redirect('/book/%s' % book.id)
|
return redirect('/book/%s' % book.id)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue