utils.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from django.core.files.base import ContentFile
  2. import requests
  3. from typing import Optional
  4. from books.openlibrary import lookup_book_from_openlibrary
  5. from books.models import Author, Book
  6. def update_or_create_book(
  7. title: str, author: Optional[str] = None, force_update=False
  8. ) -> Book:
  9. book_dict = lookup_book_from_openlibrary(title, author)
  10. book, book_created = Book.objects.get_or_create(
  11. isbn=book_dict.get("isbn"),
  12. )
  13. if book_created or force_update:
  14. cover_url = book_dict.pop("cover_url")
  15. ol_author_id = book_dict.pop("ol_author_id")
  16. ol_author_name = book_dict.pop("ol_author_name")
  17. author_image_url = book_dict.pop("author_image_url")
  18. Book.objects.filter(pk=book.id).update(**book_dict)
  19. book.refresh_from_db()
  20. # Process authors
  21. if ol_author_name and ol_author_id:
  22. author, author_created = Author.objects.get_or_create(
  23. name=ol_author_name
  24. )
  25. if author_created or force_update:
  26. author.openlibrary_id = ol_author_id
  27. author.save()
  28. r = requests.get(author_image_url)
  29. if r.status_code == 200:
  30. fname = f"{author.name}_{author.uuid}.jpg"
  31. author.headshot.save(
  32. fname, ContentFile(r.content), save=True
  33. )
  34. # Process cover URL
  35. r = requests.get(cover_url)
  36. if r.status_code == 200:
  37. fname = f"{book.title}_{book.uuid}.jpg"
  38. book.cover.save(fname, ContentFile(r.content), save=True)
  39. book.fix_metadata()
  40. return book