Fixes editing links

This commit is contained in:
Mouse Reeve 2022-11-25 08:28:45 -08:00
parent 9dd0e22a47
commit 81ab08aaa3
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." "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 url=url, book=book, filetype=filetype
).exists(): ).exists()
# pylint: disable=line-too-long ):
self.add_error( # pylint: disable=line-too-long
"url", 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." _(
), "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> <button class="button is-primary" type="submit">{% trans "Save" %}</button>
</div> </div>
</div> </div>
{% include 'snippets/form_errors.html' with errors_list=link.form.availability.errors id="desc_availability" %}
</form> </form>
</td> </td>
<td> <td>

View file

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

View file

@ -21,11 +21,7 @@ class BookFileLinks(View):
def get(self, request, book_id): def get(self, request, book_id):
"""view links""" """view links"""
book = get_object_or_404(models.Edition, id=book_id) book = get_object_or_404(models.Edition, id=book_id)
links = book.file_links.order_by("domain__status", "created_date") annotated_links = get_annotated_links(book)
annotated_links = []
for link in links.all():
link.form = forms.FileLinkForm(instance=link)
annotated_links.append(link)
data = {"book": book, "links": annotated_links} data = {"book": book, "links": annotated_links}
return TemplateResponse(request, "book/file_links/edit_links.html", data) return TemplateResponse(request, "book/file_links/edit_links.html", data)
@ -34,8 +30,30 @@ class BookFileLinks(View):
"""Edit a link""" """Edit a link"""
link = get_object_or_404(models.FileLink, id=link_id, book=book_id) link = get_object_or_404(models.FileLink, id=link_id, book=book_id)
form = forms.FileLinkForm(request.POST, instance=link) form = forms.FileLinkForm(request.POST, instance=link)
form.save(request) if form.is_valid():
return self.get(request, book_id) 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 @require_POST