def book_page(request, book_identifier): ''' info about a book ''' book = openlibrary.get_or_create_book(book_identifier) # TODO: again, post privacy? reviews = models.Review.objects.filter(book=book) rating = reviews.aggregate(Avg('rating')) tags = models.Tag.objects.filter( book=book ).values( 'book', 'name', 'identifier' ).distinct().all() user_tags = models.Tag.objects.filter( book=book, user=request.user ).values_list('name', flat=True) review_form = forms.ReviewForm() tag_form = forms.TagForm() data = { 'book': book, 'reviews': reviews, 'rating': rating['rating__avg'], 'tags': tags, 'user_tags': user_tags, 'review_form': review_form, 'tag_form': tag_form, } return TemplateResponse(request, 'book.html', data)
def book_page(request, book_identifier, tab='friends'): ''' info about a book ''' book = openlibrary.get_or_create_book(book_identifier) user_reviews = models.Review.objects.filter(user=request.user, book=book).all() if tab == 'friends': reviews = models.Review.objects.filter( Q(user__followers=request.user, privacy='public') | \ Q(mention_users=request.user), book=book, ) elif tab == 'local': reviews = models.Review.objects.filter( Q(privacy='public') | \ Q(mention_users=request.user), user__local=True, book=book, ) else: reviews = models.Review.objects.filter( Q(privacy='public') | \ Q(mention_users=request.user), book=book, ) try: shelf = models.Shelf.objects.get(user=request.user, book=book) except models.Shelf.DoesNotExist: shelf = None rating = reviews.aggregate(Avg('rating')) tags = models.Tag.objects.filter(book=book).values( 'book', 'name', 'identifier').distinct().all() user_tags = models.Tag.objects.filter(book=book, user=request.user).all() review_form = forms.ReviewForm() tag_form = forms.TagForm() data = { 'book': book, 'shelf': shelf, 'user_reviews': user_reviews, 'user_rating': user_reviews.aggregate(Avg('rating')), 'reviews': reviews, 'rating': rating['rating__avg'], 'tags': tags, 'user_tags': user_tags, 'user_tag_names': user_tags.values_list('identifier', flat=True), 'review_form': review_form, 'tag_form': tag_form, 'feed_tabs': ['friends', 'local', 'federated'], 'active_tab': tab, 'path': '/book/%s' % book_identifier, } return TemplateResponse(request, 'book.html', data)
def book_page(request, book_identifier): ''' info about a book ''' book = openlibrary.get_or_create_book(book_identifier) # TODO: again, post privacy? reviews = models.Review.objects.filter(book=book) rating = reviews.aggregate(Avg('rating')) review_form = forms.ReviewForm() data = { 'book': book, 'reviews': reviews, 'rating': rating['rating__avg'], 'review_form': review_form, } return TemplateResponse(request, 'book.html', data)
def review(request): ''' create a book review note ''' form = forms.ReviewForm(request.POST) book_identifier = request.POST.get('book') # TODO: better failure behavior if not form.is_valid(): return redirect('/book/%s' % book_identifier) # TODO: validation, htmlification name = form.data.get('name') content = form.data.get('content') rating = int(form.data.get('rating')) outgoing.handle_review(request.user, book_identifier, name, content, rating) return redirect('/book/%s' % book_identifier)
def review(request): ''' create a book review ''' form = forms.ReviewForm(request.POST) book_id = request.POST.get('book') if not form.is_valid(): return redirect('/book/%s' % book_id) # TODO: validation, htmlification name = form.cleaned_data.get('name') content = form.cleaned_data.get('content') rating = form.data.get('rating', None) try: rating = int(rating) except ValueError: rating = None outgoing.handle_review(request.user, book_id, name, content, rating) return redirect('/book/%s' % book_id)
def review(request): ''' create a book review ''' form = forms.ReviewForm(request.POST) book_identifier = request.POST.get('book') # TODO: better failure behavior if not form.is_valid(): return redirect('/book/%s' % book_identifier) # TODO: validation, htmlification name = form.cleaned_data.get('name') content = form.cleaned_data.get('content') rating = form.data.get('rating', None) try: rating = int(rating) except ValueError: rating = None # throws a value error if the book is not found book = get_or_create_book(book_identifier) outgoing.handle_review(request.user, book, name, content, rating) return redirect('/book/%s' % book_identifier)
def home_tab(request, tab): ''' user's homepage with activity feed ''' page_size = 15 try: page = int(request.GET.get('page', 1)) except ValueError: page = 1 shelves = [] shelves = get_user_shelf_preview(request.user, [('reading', 3), ('read', 1), ('to-read', 3)]) size = sum(len(s['books']) for s in shelves) # books new to the instance, for discovery if size < 6: recent_books = models.Work.objects.order_by('-created_date')[:6 - size] recent_books = [b.default_edition for b in recent_books] shelves.append({ 'name': 'Recently added', 'identifier': None, 'books': recent_books, 'count': 6 - size, }) # allows us to check if a user has shelved a book user_books = models.Edition.objects.filter( shelves__user=request.user).all() activities = get_activity_feed(request.user, tab) activity_count = activities.count() activities = activities[(page - 1) * page_size:page * page_size] next_page = '/?page=%d' % (page + 1) prev_page = '/?page=%d' % (page - 1) data = { 'user': request.user, 'shelves': shelves, 'user_books': user_books, 'activities': activities, 'feed_tabs': [{ 'id': 'home', 'display': 'Home' }, { 'id': 'local', 'display': 'Local' }, { 'id': 'federated', 'display': 'Federated' }], 'active_tab': tab, 'review_form': forms.ReviewForm(), 'quotation_form': forms.QuotationForm(), 'comment_form': forms.CommentForm(), 'next': next_page if activity_count > (page_size * page) else None, 'prev': prev_page if page > 1 else None, } return TemplateResponse(request, 'feed.html', data)
def book_page(request, book_id, tab='friends'): ''' info about a book ''' book = models.Book.objects.select_subclasses().get(id=book_id) if is_api_request(request): return JsonResponse(activitypub.get_book(book)) if isinstance(book, models.Work): book = book.default_edition if not book: return HttpResponseNotFound() work = book.parent_work if not work: return HttpResponseNotFound() book_reviews = models.Review.objects.filter( book__in=work.edition_set.all()) if request.user.is_authenticated: user_reviews = book_reviews.filter(user=request.user, ).all() reviews = get_activity_feed(request.user, tab, model=book_reviews) try: # TODO: books can be on multiple shelves shelf = models.Shelf.objects.filter(user=request.user, edition=book).first() except models.Shelf.DoesNotExist: shelf = None user_tags = models.Tag.objects.filter( book=book, user=request.user).values_list('identifier', flat=True) else: tab = 'public' reviews = book_reviews.filter(privacy='public') shelf = None user_reviews = [] user_tags = [] rating = reviews.aggregate(Avg('rating')) tags = models.Tag.objects.filter(book=book).values( 'book', 'name', 'identifier').distinct().all() data = { 'book': book, 'shelf': shelf, 'user_reviews': user_reviews, 'reviews': reviews.distinct(), 'rating': rating['rating__avg'], 'tags': tags, 'user_tags': user_tags, 'review_form': forms.ReviewForm(), 'tag_form': forms.TagForm(), 'feed_tabs': [{ 'id': 'friends', 'display': 'Friends' }, { 'id': 'local', 'display': 'Local' }, { 'id': 'federated', 'display': 'Federated' }], 'active_tab': tab, 'path': '/book/%s' % book_id, 'cover_form': forms.CoverForm(instance=book), 'info_fields': [ { 'name': 'ISBN', 'value': book.isbn_13 }, { 'name': 'OCLC number', 'value': book.oclc_number }, { 'name': 'OpenLibrary ID', 'value': book.openlibrary_key }, { 'name': 'Goodreads ID', 'value': book.goodreads_key }, { 'name': 'Format', 'value': book.physical_format }, { 'name': 'Pages', 'value': book.pages }, ], } return TemplateResponse(request, 'book.html', data)