Пример #1
0
def handle_incoming_create(activity):
    ''' someone did something, good on them '''
    user = get_or_create_remote_user(activity['actor'])
    uuid = activity['id']
    # if it's an article and in reply to a book, we have a review
    if activity['object']['type'] == 'Article' and \
            'inReplyTo' in activity['object']:
        possible_book = activity['object']['inReplyTo']
        try:
            # TODO idk about this error handling, should probs be more granular
            book = get_or_create_book(possible_book)
            models.Review(
                uuid=uuid,
                user=user,
                content=activity,
                activity_type='Article',
                book=book,
                name=activity['object']['name'],
                rating=activity['object']['rating'],
                review_content=activity['objet']['content'],
            ).save()
            return HttpResponse()
        except KeyError:
            pass

    models.Activity(
        uuid=uuid,
        user=user,
        content=activity,
        activity_type=activity['object']['type']
    )
    return HttpResponse()
Пример #2
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)
Пример #3
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)
Пример #4
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)
Пример #5
0
def review(request):
    ''' create a book review note '''
    form = forms.ReviewForm(request.POST)
    # TODO: better failure behavior
    if not form.is_valid():
        return redirect('/')
    book_identifier = request.POST.get('book')
    book = openlibrary.get_or_create_book(book_identifier)

    # TODO: validation, htmlification
    name = form.data.get('name')
    content = form.data.get('review_content')
    rating = form.data.get('rating')

    outgoing.handle_review(request.user, book, name, content, rating)
    return redirect('/book/%s' % book_identifier)
Пример #6
0
def create_review(user, possible_book, name, content, rating):
    ''' a book review has been added '''
    # throws a value error if the book is not found
    book = get_or_create_book(possible_book)

    content = sanitize(content)

    # no ratings outside of 0-5
    rating = rating if 0 <= rating <= 5 else 0

    return models.Review.objects.create(
        user=user,
        book=book,
        name=name,
        rating=rating,
        content=content,
    )