def review_count_preprocessor(request): """ preprocessor which returns user's review information like the following: 1) Current review count. 2) If no reviews, when is next review. 3) How many reviews coming up in next hour. 4) How many reviews coming up in next day. """ context_dict = {} if hasattr(request, 'user'): if hasattr(request.user, 'profile'): review_count = get_users_current_reviews(request.user).count() context_dict['review_count'] = review_count if review_count == 0: reviews = get_users_future_reviews(request.user) if reviews: next_review_date = reviews[0].next_review_date context_dict['next_review_date'] = next_review_date context_dict[ 'next_review_timestamp_local'] = next_review_date.timestamp( ) * 1000 context_dict['next_review_timestamp_utc'] = int( time.mktime(next_review_date.timetuple()) ) * 1000 #TODO potentially remove? one_hour = datetime.timedelta(hours=1) today = datetime.timedelta(hours=24) context_dict[ 'reviews_within_hour_count'] = get_users_future_reviews( request.user, time_limit=one_hour).count() context_dict[ 'reviews_within_day_count'] = get_users_future_reviews( request.user, time_limit=today).count() return context_dict return context_dict
def get_next_review_date(self, obj): user = obj.user if self.get_reviews_count(obj) == 0: reviews = get_users_future_reviews(user) if reviews: next_review_date = reviews[0].next_review_date return next_review_date
def test_returning_future_review_count_with_incorrect_argument_type_falls_back_to_default(self): self.review.next_review_date = timezone.now() self.review.needs_review = False self.review.save() future_reviews = get_users_future_reviews(self.user, time_limit="this is not a timedelta") self.assertGreater(future_reviews.count(), 0)
def test_returning_future_review_count_with_invalid_time_limit_returns_empty_queryset(self): self.review.next_review_date = timezone.now() self.review.needs_review = False self.review.save() future_reviews = get_users_future_reviews(self.user, time_limit=timezone.timedelta(hours=-1)) self.assertEqual(future_reviews.count(), 0)
def test_returning_future_review_count_with_incorrect_argument_type_falls_back_to_default( self ): self.review.next_review_date = timezone.now() self.review.needs_review = False self.review.save() future_reviews = get_users_future_reviews( self.user, time_limit="this is not a timedelta" ) self.assertGreater(future_reviews.count(), 0)
def test_returning_future_review_count_with_invalid_time_limit_returns_empty_queryset( self ): self.review.next_review_date = timezone.now() self.review.needs_review = False self.review.save() future_reviews = get_users_future_reviews( self.user, time_limit=timezone.timedelta(hours=-1) ) self.assertEqual(future_reviews.count(), 0)
def test_returning_review_count_that_is_time_delimited_functions_correctly(self): new_review = create_review(create_vocab("arbitrary word"), self.user) new_review.needs_review = False more_than_24_hours_from_now = timezone.now() + timezone.timedelta(hours=25) new_review.next_review_date = more_than_24_hours_from_now new_review.save() self.review.next_review_date = timezone.now() self.review.needs_review = False self.review.save() future_reviews = get_users_future_reviews(self.user, time_limit=timezone.timedelta(hours=24)) self.assertEqual(future_reviews.count(), 1)
def test_returning_review_count_that_is_time_delimited_functions_correctly(self): new_review = create_review(create_vocab("arbitrary word"), self.user) new_review.needs_review = False more_than_24_hours_from_now = timezone.now() + timezone.timedelta(hours=25) new_review.next_review_date = more_than_24_hours_from_now new_review.save() self.review.next_review_date = timezone.now() self.review.needs_review = False self.review.save() future_reviews = get_users_future_reviews( self.user, time_limit=timezone.timedelta(hours=24) ) self.assertEqual(future_reviews.count(), 1)
def get_reviews_within_day_count(self, obj): return get_users_future_reviews( obj.user, time_limit=datetime.timedelta(hours=24) ).count()