utils.py 1.6 KB

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