예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
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)
예제 #8
0
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)