def add_user_book(): """Adds a new book to a user's books""" if session.get("user"): user_id = session["user"] label = request.json.get("label") book_dict = request.json.get("book") isbn = book_dict["id"] book = crud.get_book_by_isbn(isbn) category = crud.get_category_by_label(user_id, label) if not book: book = crud.create_book(isbn, book_dict["volumeInfo"]["title"], book_dict["volumeInfo"]["authors"], book_dict["volumeInfo"]["description"], book_dict["volumeInfo"]["pageCount"], book_dict["volumeInfo"]["imageLinks"]["thumbnail"]) if not category: category = crud.create_category(user_id, label) added_books = crud.create_book_category(book, category) return jsonify ({"success": f"""A new category, {category.label}, has been added to your bookshelf and {book.title} has been added to it"""}) if book in crud.get_all_books_in_category(user_id, label): return jsonify ({"error": f"{book.title} is already in your {category.label} books"}) added_books = crud.create_book_category(book, category) # Right now, added_books is a list of all of the book objects in category return jsonify ({"success": f"{book.title} has been added to {category.label} books"})
def update_event_books(): """Updates the status of can_suggest_books and can_vote on an event""" if request.method == "POST": if session.get("user_id"): event_id = request.json.get("event_id") update_type = request.json.get("update_type") if update_type == "suggest": crud.update_event_suggesting(event_id) return jsonify({"success": "Event books has been updated"}) if update_type == "vote": crud.update_voting(event_id) event = crud.get_event_by_id(event_id) if not event.can_vote: events_books = crud.get_all_events_books(event_id) vote_totals_dict = {} for event_book in events_books: vote_totals_dict[ event_book.vote_count] = vote_totals_dict.get( event_book.vote_count, []) vote_totals_dict[event_book.vote_count].append( event_book.isbn) max_votes = set(vote_totals_dict[max(vote_totals_dict)]) for event_book in events_books: if event_book.isbn not in max_votes: crud.remove_book_from_event(event_book.isbn, event_id) else: crud.reset_vote_count(event_book) attendees = crud.get_all_events_attendees(event_id) for attendee in attendees: crud.reset_voted_for(attendee) return jsonify({"success": "Voting has been updated"}) if request.method == "PUT": event_id = request.json.get("event_id") isbn = request.json.get("isbn") event = crud.get_event_by_id(event_id) book = crud.get_book_by_isbn(isbn) if book not in crud.get_all_books_for_event(event_id): crud.create_event_book(event, book) return jsonify({"success": f"You have suggested {book.title}"}) else: return jsonify({ "error": f"That book has already been suggested for the event." })
def update_event_book_votes(): """Increases the number of votes on a given event book""" user_id = session.get("user") if request.method == "GET": # get all of the user's event_books events_attendee_dict = crud.get_all_users_voted_for_books(user_id) # dictionary with event_id as key and list of book isbn's that the given # user has voted for (if any) for each event print("THESE ARE EVENTS_ATTENDEE.voted_for", events_attendee_dict) return jsonify(events_attendee_dict) else: event_id = request.json.get("eventId") isbn = request.json.get("bookIsbn") event_attendee = crud.get_event_attendee_by_id(user_id, event_id) update = event_attendee.update_voted_for(isbn) # returns, "removed", "added", or None events_attendee_dict = crud.get_all_users_voted_for_books(user_id) events_books = crud.get_all_events_books(event_id) events_books = [event_book.to_dict() for event_book in events_books] if not update: # But buttons to vote should already be gone return jsonify({"error": "You have already voted twice.", "booksVotedFor": events_attendee_dict, "allEventsBooks": events_books}) event_book = crud.get_event_book_by_isbn(event_id, isbn) book = crud.get_book_by_isbn(isbn) if update == "removed": crud.update_event_book_vote_count(event_book, "remove") return jsonify({"success": f"You have successfully 'unvoted' for {book.title}.", "booksVotedFor": events_attendee_dict, "allEventsBooks": events_books}) crud.update_event_book_vote_count(event_book, "add") if len(events_attendee_dict[event_id]) >= 2: # Vote buttons on the front end should disappear (but unvote buttons should remain) return jsonify({"success": f"You voted for {book.title}", "booksVotedFor": events_attendee_dict, "buttons": "hidden", "allEventsBooks": events_books}) return jsonify({"success": f"You voted for {book.title}", "booksVotedFor": events_attendee_dict, "buttons": "visible", "allEventsBooks": events_books})
def add_book_to_event(): event_id = request.json.get("event_id") isbn = request.json.get("isbn") event = crud.get_event_by_id(event_id) book = crud.get_book_by_isbn(isbn) if book not in crud.get_all_books_for_event(event_id): # CHANGED crud.create_event_book(event, book) # CHANGED return jsonify({"success": f"You have suggested {book.title}"}) else: return jsonify({"error": f"That book has already been suggested for the event."})
def test_get_book_by_isbn(self): neverwhere = crud.get_book_by_isbn("yuCUZ3km3qIC") self.assertEqual(neverwhere.title, "Neverwhere")
def get_and_update_categories(): """Gets or updates a user's categories""" if session.get("user_id"): user_id = session["user_id"] if request.method == "GET": categories = [] category_objects = crud.get_all_user_categories(user_id) for category_object in category_objects: dict_category = category_object.to_dict() categories.append(dict_category) return jsonify({"categories": categories}) elif request.method == "POST": if request.json.get("label"): label = request.json.get("label") user = crud.get_user_by_id(user_id) if crud.get_category_by_label(user_id, label): return ({ "error": f"{label} is already in {user.first_name}'s bookshelf!" }) new_category = crud.create_category(user_id, label) return jsonify({ "success": f"{new_category.label} has been added to {user.first_name}'s bookshelf!" }) else: old_label = request.json.get("old_label") new_label = request.json.get("new_label") crud.update_category_label(user_id, old_label, new_label) return jsonify({ "success": f"{old_label} has been changed to {new_label}!", "label": new_label }) elif request.method == "PUT": label = request.json.get("label") book_dict = request.json.get("book") isbn = book_dict["id"] book = crud.get_book_by_isbn(isbn) category = crud.get_category_by_label(user_id, label) if not book: authors = "" for author in book_dict["volumeInfo"]["authors"]: authors += f"{author} " page_count = book_dict["volumeInfo"].get("pageCount") if not page_count: page_count = 000 book = crud.create_book( isbn, book_dict["volumeInfo"]["title"], authors, book_dict["volumeInfo"]["description"], page_count, book_dict["volumeInfo"]["imageLinks"]["thumbnail"]) if not category: category = crud.create_category(user_id, label) added_books = crud.create_book_category(book, category) return jsonify({ "success": f"""A new category, {category.label}, has been added to your bookshelf and {book.title} has been added to it""" }) if book in crud.get_all_books_in_category(user_id, label): return jsonify({ "error": f"{book.title} is already in your {category.label} books" }) added_books = crud.create_book_category(book, category) return jsonify({ "success": f"{book.title} has been added to {category.label} books" }) elif request.method == "DELETE": if request.json.get("label"): label = request.json.get("label") crud.delete_category(label, user_id) return jsonify({ "success": f"{label} has successfully been removed from your bookshelf.", "label": "" }) else: label = request.json.get("category") isbn = request.json.get("isbn") title = request.json.get("title") this_category = crud.get_category_by_label(user_id, label) crud.remove_book_from_category(isbn, this_category.id) return jsonify({ "success": f"{title} has successfully been removed from {label}.", }) else: return jsonify({"error": "User must be logged in to view this page."})
def update_event_book_votes(): """Increases the number of votes on a given event book""" user_id = session.get("user_id") events = crud.get_all_events_for_user(user_id) all_events = {} for event in events: events_books = crud.get_all_events_books(event.id) event_dict = event.to_dict() events_books = [event_book.to_dict() for event_book in events_books] event_dict["events_books"] = events_books all_events[event.id] = event_dict if request.method == "GET": # get all of the user's event_books events_attendee_dict = crud.get_all_users_voted_for_books(user_id) # dictionary with event_id as key and list of book isbn's that the given # user has voted for (if any) for each event return jsonify({ "booksVotedFor": events_attendee_dict, "allEventsBooks": all_events }) else: event_id = request.json.get("eventId") isbn = request.json.get("bookIsbn") event_attendee = crud.get_event_attendee_by_id(user_id, event_id) update = event_attendee.update_voted_for( isbn) # returns, "removed", "added", or None events_attendee_dict = crud.get_all_users_voted_for_books(user_id) if not update: return jsonify({ "error": "You have already voted twice.", "booksVotedFor": events_attendee_dict, "allEventsBooks": all_events }) event_book = crud.get_event_book_by_isbn(event_id, isbn) book = crud.get_book_by_isbn(isbn) if update == "removed": crud.update_event_book_vote_count(event_book, "remove") return jsonify({ "success": f"You have successfully 'unvoted' for {book.title}.", "booksVotedFor": events_attendee_dict, "allEventsBooks": all_events }) crud.update_event_book_vote_count(event_book, "add") if len(events_attendee_dict[event_id]) >= 2: return jsonify({ "success": f"You voted for {book.title}", "booksVotedFor": events_attendee_dict, "buttons": "hidden", "allEventsBooks": all_events }) return jsonify({ "success": f"You voted for {book.title}", "booksVotedFor": events_attendee_dict, "buttons": "visible", "allEventsBooks": all_events })