def get_subcategory(self, page=1): threads_query = Thread.objects.filter(subcategory=self.subcategory._model) url_builder = UrlBuilder(reverse('forum:subcategories:show', args=[self.subcategory.id]), arguments={'page': page}) page -= 1 paginator = Paginator(page, threads_query.count(), forum_settings.THREADS_ON_PAGE, url_builder) if paginator.wrong_page_number: return self.redirect(paginator.last_page_url, permanent=False) thread_from, thread_to = paginator.page_borders(page) threads = ThreadPrototype.from_query(threads_query.select_related().order_by('-important', '-updated_at')[thread_from:thread_to]) important_threads = sorted([t for t in threads if t.important], key=lambda t: t.caption) threads = [t for t in threads if not t.important] read_state = ReadState(account=self.account) if self.account.is_authenticated: SubCategoryReadInfoPrototype.read_subcategory(subcategory=self.subcategory, account=self.account) return self.template('forum/subcategory.html', {'category': self.category, 'subcategory': self.subcategory, 'can_create_thread': can_create_thread(self.account, self.subcategory), 'paginator': paginator, 'can_subscribe': self.account.is_authenticated and not self.account.is_fast, 'has_subscription': SubscriptionPrototype.has_subscription(self.account, subcategory=self.subcategory), 'threads': threads, 'important_threads': important_threads, 'read_state': read_state } )
def test_create_when_created(self): read_info_1 = SubCategoryReadInfoPrototype.read_subcategory( self.subcategory, self.account) read_info_2 = SubCategoryReadInfoPrototype.read_subcategory( self.subcategory, self.account) self.assertEqual(read_info_1.id, read_info_2.id)
def test_subcategory_has_new_messages__unread_state_expired(self): SubCategoryReadInfoPrototype.read_subcategory( subcategory=self.subcategory, account=self.account) self.subcategory._model.updated_at = datetime.datetime.now() self.subcategory.save() self.assertFalse(self.get_read_state().subcategory_has_new_messages( self.subcategory))
def test_subcategory_has_new_messages__unread_but_thread_read(self): SubCategoryReadInfoPrototype.read_subcategory(subcategory=self.subcategory, account=self.account) self.subcategory._model.updated_at = datetime.datetime.now() self.subcategory.save() self.assertTrue(self.get_read_state().subcategory_has_new_messages(self.subcategory)) ThreadReadInfoPrototype.read_thread(self.thread, self.account) ThreadReadInfoPrototype.read_thread(self.thread_2, self.account) ThreadReadInfoPrototype.read_thread(self.thread_3, self.account) self.assertFalse(self.get_read_state().subcategory_has_new_messages(self.subcategory))
def test_read_subcategory__existed_info(self): self.assertEqual(SubCategoryReadInfoPrototype._db_count(), 0) read_info = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) read_info_2 = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) self.assertEqual(read_info.id, read_info_2.id) self.assertEqual(SubCategoryReadInfoPrototype._db_count(), 1) self.assertEqual(read_info.subcategory_id, self.subcategory.id) self.assertEqual(read_info.account_id, self.account.id) self.assertTrue(read_info_2.read_at > datetime.datetime.now() - datetime.timedelta(seconds=1)) self.assertTrue(read_info_2.all_read_at < datetime.datetime.now() - datetime.timedelta(seconds=1))
def test_read_subcategory__existed_info(self): self.assertEqual(SubCategoryReadInfoPrototype._db_count(), 0) read_info = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) read_info_2 = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) self.assertEqual(read_info.id, read_info_2.id) self.assertEqual(SubCategoryReadInfoPrototype._db_count(), 1) self.assertEqual(read_info.subcategory_id, self.subcategory.id) self.assertEqual(read_info.account_id, self.account.id) self.assertTrue(read_info_2.read_at > datetime.datetime.now() - datetime.timedelta(seconds=1)) self.assertTrue(read_info_2.all_read_at < datetime.datetime.now() - datetime.timedelta(seconds=1))
def get_subcategory(self, page=1): threads_query = Thread.objects.filter( subcategory=self.subcategory._model) url_builder = UrlBuilder(reverse('forum:subcategories:show', args=[self.subcategory.id]), arguments={'page': page}) page -= 1 paginator = Paginator(page, threads_query.count(), forum_settings.THREADS_ON_PAGE, url_builder) if paginator.wrong_page_number: return self.redirect(paginator.last_page_url, permanent=False) thread_from, thread_to = paginator.page_borders(page) threads = ThreadPrototype.from_query( threads_query.select_related().order_by( '-important', '-updated_at')[thread_from:thread_to]) important_threads = sorted(filter(lambda t: t.important, threads), key=lambda t: t.caption) threads = filter(lambda t: not t.important, threads) read_state = ReadState(account=self.account) if self.account.is_authenticated(): SubCategoryReadInfoPrototype.read_subcategory( subcategory=self.subcategory, account=self.account) return self.template( 'forum/subcategory.html', { 'category': self.category, 'subcategory': self.subcategory, 'can_create_thread': can_create_thread(self.account, self.subcategory), 'paginator': paginator, 'can_subscribe': self.account.is_authenticated() and not self.account.is_fast, 'has_subscription': SubscriptionPrototype.has_subscription( self.account, subcategory=self.subcategory), 'threads': threads, 'important_threads': important_threads, 'read_state': read_state })
def test_remove_old_infos(self): read_info_1 = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) read_info_2 = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account_2) removed_time = datetime.datetime.now() - datetime.timedelta(seconds=forum_settings.UNREAD_STATE_EXPIRE_TIME) SubCategoryReadInfoPrototype._model_class.objects.filter(id=read_info_2.id).update(read_at=removed_time) self.assertEqual(SubCategoryReadInfoPrototype._db_count(), 2) SubCategoryReadInfoPrototype.remove_old_infos() self.assertEqual(SubCategoryReadInfoPrototype._db_count(), 1) self.assertEqual(SubCategoryReadInfoPrototype._db_get_object(0).id, read_info_1.id)
def test_remove_old_infos(self): read_info_1 = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) read_info_2 = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account_2) removed_time = datetime.datetime.now() - datetime.timedelta(seconds=forum_settings.UNREAD_STATE_EXPIRE_TIME) SubCategoryReadInfoPrototype._model_class.objects.filter(id=read_info_2.id).update(read_at=removed_time) self.assertEqual(SubCategoryReadInfoPrototype._db_count(), 2) SubCategoryReadInfoPrototype.remove_old_infos() self.assertEqual(SubCategoryReadInfoPrototype._db_count(), 1) self.assertEqual(SubCategoryReadInfoPrototype._db_get_object(0).id, read_info_1.id)
def test_thread_is_new__read(self): SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) read_state = self.get_read_state() self.assertFalse(read_state.thread_is_new(self.thread)) self.thread._model.created_at = datetime.datetime.now() self.thread.save() self.assertTrue(read_state.thread_is_new(self.thread))
def test_thread_is_new__read(self): SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) read_state = self.get_read_state() self.assertFalse(read_state.thread_is_new(self.thread)) self.thread._model.created_at = datetime.datetime.now() self.thread.save() self.assertTrue(read_state.thread_is_new(self.thread))
def test_subcategory_has_new_messages__unread_but_thread_read(self): SubCategoryReadInfoPrototype.read_subcategory( subcategory=self.subcategory, account=self.account) self.subcategory._model.updated_at = datetime.datetime.now() self.subcategory.save() self.assertTrue(self.get_read_state().subcategory_has_new_messages( self.subcategory)) ThreadReadInfoPrototype.read_thread(self.thread, self.account) ThreadReadInfoPrototype.read_thread(self.thread_2, self.account) ThreadReadInfoPrototype.read_thread(self.thread_3, self.account) self.assertFalse(self.get_read_state().subcategory_has_new_messages( self.subcategory))
def test_create_when_created(self): read_info_1 = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) read_info_2 = SubCategoryReadInfoPrototype.read_subcategory(self.subcategory, self.account) self.assertEqual(read_info_1.id, read_info_2.id)
def test_subcategory_has_new_messages__read(self): SubCategoryReadInfoPrototype.read_subcategory( subcategory=self.subcategory, account=self.account) self.assertTrue(self.get_read_state().subcategory_has_new_messages( self.subcategory))
def test_subcategory_has_new_messages__unread_state_expired(self): SubCategoryReadInfoPrototype.read_subcategory(subcategory=self.subcategory, account=self.account) self.subcategory._model.updated_at = datetime.datetime.now() self.subcategory.save() self.assertFalse(self.get_read_state().subcategory_has_new_messages(self.subcategory))
def test_subcategory_has_new_messages__read(self): SubCategoryReadInfoPrototype.read_subcategory(subcategory=self.subcategory, account=self.account) self.assertTrue(self.get_read_state().subcategory_has_new_messages(self.subcategory))