Merge pull request #2443 from bookwyrm-social/edit-links

Fixes editing links
This commit is contained in:
Mouse Reeve 2022-11-25 08:56:19 -08:00 committed by GitHub
commit d8860f2a4d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 16 deletions

View file

@ -36,13 +36,16 @@ class FileLinkForm(CustomForm):
"This domain is blocked. Please contact your administrator if you think this is an error."
),
)
elif models.FileLink.objects.filter(
if (
not self.instance
and models.FileLink.objects.filter(
url=url, book=book, filetype=filetype
).exists():
# pylint: disable=line-too-long
self.add_error(
"url",
_(
"This link with file type has already been added for this book. If it is not visible, the domain is still pending."
),
)
).exists()
):
# pylint: disable=line-too-long
self.add_error(
"url",
_(
"This link with file type has already been added for this book. If it is not visible, the domain is still pending."
),
)

View file

@ -86,6 +86,7 @@
<button class="button is-primary" type="submit">{% trans "Save" %}</button>
</div>
</div>
{% include 'snippets/form_errors.html' with errors_list=link.form.availability.errors id="desc_availability" %}
</form>
</td>
<td>

View file

@ -15,6 +15,7 @@ from bookwyrm.tests.validate_html import validate_html
class LinkViews(TestCase):
"""books books books"""
# pylint: disable=invalid-name
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()

View file

@ -21,11 +21,7 @@ class BookFileLinks(View):
def get(self, request, book_id):
"""view links"""
book = get_object_or_404(models.Edition, id=book_id)
links = book.file_links.order_by("domain__status", "created_date")
annotated_links = []
for link in links.all():
link.form = forms.FileLinkForm(instance=link)
annotated_links.append(link)
annotated_links = get_annotated_links(book)
data = {"book": book, "links": annotated_links}
return TemplateResponse(request, "book/file_links/edit_links.html", data)
@ -34,8 +30,30 @@ class BookFileLinks(View):
"""Edit a link"""
link = get_object_or_404(models.FileLink, id=link_id, book=book_id)
form = forms.FileLinkForm(request.POST, instance=link)
form.save(request)
return self.get(request, book_id)
if form.is_valid():
form.save(request)
return redirect("file-link", book_id)
# this form shouldn't ever really get here, since it's just a dropdown
# get the data again rather than redirecting
book = get_object_or_404(models.Edition, id=book_id)
annotated_links = get_annotated_links(book, form=form)
data = {"book": book, "links": annotated_links}
return TemplateResponse(request, "book/file_links/edit_links.html", data)
def get_annotated_links(book, form=None):
"""The links for this book, plus the forms to edit those links"""
links = book.file_links.order_by("domain__status", "created_date")
annotated_links = []
for link in links.all():
if form and link.id == form.instance.id:
link.form = form
else:
link.form = forms.FileLinkForm(instance=link)
annotated_links.append(link)
return annotated_links
@require_POST