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()
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) # 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)
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, )