Browse Source

Search: exclude content under archived or deleted parents

Bastien Sevajol 9 years ago
parent
commit
98b87d6cac

+ 1 - 0
tracim/tracim/controllers/root.py View File

171
         result = api.search(keyword_list)
171
         result = api.search(keyword_list)
172
         if result:
172
         if result:
173
             items = result.limit(ContentApi.SEARCH_DEFAULT_RESULT_NB).all()
173
             items = result.limit(ContentApi.SEARCH_DEFAULT_RESULT_NB).all()
174
+        api.exclude_unavailable(items)
174
 
175
 
175
         current_user_content = Context(CTX.CURRENT_USER).toDict(user)
176
         current_user_content = Context(CTX.CURRENT_USER).toDict(user)
176
         fake_api = Context(CTX.CURRENT_USER).toDict({'current_user': current_user_content})
177
         fake_api = Context(CTX.CURRENT_USER).toDict({'current_user': current_user_content})

+ 25 - 0
tracim/tracim/lib/content.py View File

673
 
673
 
674
         return ContentType.sorted(content_types)
674
         return ContentType.sorted(content_types)
675
 
675
 
676
+    def exclude_unavailable(self, contents: [Content]) -> [Content]:
677
+        """
678
+        Update and return list with content under archived/deleted removed.
679
+        :param contents: List of contents to parse
680
+        """
681
+        for content in contents[:]:
682
+            if self.content_under_deleted(content) or self.content_under_archived(content):
683
+                contents.remove(content)
684
+        return contents
685
+
686
+    def content_under_deleted(self, content: Content) -> bool:
687
+        if content.parent:
688
+            if content.parent.is_deleted:
689
+                return True
690
+            if content.parent.parent:
691
+                return self.content_under_deleted(content.parent)
692
+        return False
693
+
694
+    def content_under_archived(self, content: Content) -> bool:
695
+        if content.parent:
696
+            if content.parent.is_archived:
697
+                return True
698
+            if content.parent.parent:
699
+                return self.content_under_archived(content.parent)
700
+        return False

+ 15 - 8
tracim/tracim/tests/__init__.py View File

30
 from tracim.fixtures.users_and_groups import Base as BaseFixture
30
 from tracim.fixtures.users_and_groups import Base as BaseFixture
31
 from tracim.lib.base import logger
31
 from tracim.lib.base import logger
32
 from tracim.lib.content import ContentApi
32
 from tracim.lib.content import ContentApi
33
+from tracim.lib.workspace import WorkspaceApi
33
 from tracim.model import DBSession, Content
34
 from tracim.model import DBSession, Content
34
 from tracim.model.data import Workspace, ContentType, ContentRevisionRO
35
 from tracim.model.data import Workspace, ContentType, ContentRevisionRO
35
 
36
 
300
 
301
 
301
 class BaseTest(object):
302
 class BaseTest(object):
302
 
303
 
303
-    def _create_workspace_and_test(self, name, *args, **kwargs) -> Workspace:
304
+    def _create_workspace_and_test(self, name, user) -> Workspace:
304
         """
305
         """
305
         All extra parameters (*args, **kwargs) are for Workspace init
306
         All extra parameters (*args, **kwargs) are for Workspace init
306
         :return: Created workspace instance
307
         :return: Created workspace instance
307
         """
308
         """
308
-        workspace = Workspace(label=name, *args, **kwargs)
309
-        DBSession.add(workspace)
310
-        DBSession.flush()
309
+        WorkspaceApi(user).create_workspace(name, save_now=True)
311
 
310
 
312
         eq_(1, DBSession.query(Workspace).filter(Workspace.label == name).count())
311
         eq_(1, DBSession.query(Workspace).filter(Workspace.label == name).count())
313
         return DBSession.query(Workspace).filter(Workspace.label == name).one()
312
         return DBSession.query(Workspace).filter(Workspace.label == name).one()
329
 
328
 
330
 class BaseTestThread(BaseTest):
329
 class BaseTestThread(BaseTest):
331
 
330
 
332
-    def _create_thread_and_test(self, workspace_name='workspace_1', folder_name='folder_1', thread_name='thread_1') -> Content:
331
+    def _create_thread_and_test(self,
332
+                                user,
333
+                                workspace_name='workspace_1',
334
+                                folder_name='folder_1',
335
+                                thread_name='thread_1') -> Content:
333
         """
336
         """
334
         :return: Thread
337
         :return: Thread
335
         """
338
         """
336
-        workspace = self._create_workspace_and_test(workspace_name)
337
-        folder = self._create_content_and_test(folder_name, workspace, type=ContentType.Folder)
338
-        thread = self._create_content_and_test(thread_name, workspace, type=ContentType.Thread, parent=folder)
339
+        workspace = self._create_workspace_and_test(workspace_name, user)
340
+        folder = self._create_content_and_test(folder_name, workspace, type=ContentType.Folder, owner=user)
341
+        thread = self._create_content_and_test(thread_name,
342
+                                               workspace,
343
+                                               type=ContentType.Thread,
344
+                                               parent=folder,
345
+                                               owner=user)
339
         return thread
346
         return thread

+ 45 - 4
tracim/tracim/tests/library/test_content_api.py View File

1
 # -*- coding: utf-8 -*-
1
 # -*- coding: utf-8 -*-
2
 
2
 
3
-from nose.tools import eq_
3
+from nose.tools import eq_, ok_
4
 from nose.tools import raises
4
 from nose.tools import raises
5
 from tracim.lib.group import GroupApi
5
 from tracim.lib.group import GroupApi
6
 
6
 
12
 from tracim.lib.user import UserApi
12
 from tracim.lib.user import UserApi
13
 from tracim.lib.workspace import RoleApi
13
 from tracim.lib.workspace import RoleApi
14
 from tracim.lib.workspace import WorkspaceApi
14
 from tracim.lib.workspace import WorkspaceApi
15
-from tracim.model import DBSession, new_revision
15
+from tracim.model import DBSession, new_revision, User
16
 
16
 
17
 from tracim.model.auth import Group
17
 from tracim.model.auth import Group
18
 
18
 
21
 from tracim.model.data import ContentType
21
 from tracim.model.data import ContentType
22
 from tracim.model.data import UserRoleInWorkspace
22
 from tracim.model.data import UserRoleInWorkspace
23
 
23
 
24
-from tracim.tests import TestStandard
24
+from tracim.tests import TestStandard, BaseTest
25
 
25
 
26
 
26
 
27
-class TestContentApi(TestStandard):
27
+class TestContentApi(BaseTest, TestStandard):
28
 
28
 
29
     def test_compare_content_for_sorting_by_type(self):
29
     def test_compare_content_for_sorting_by_type(self):
30
         c1 = Content()
30
         c1 = Content()
729
 
729
 
730
         eq_(True, id1 in [o.content_id for o in res.all()])
730
         eq_(True, id1 in [o.content_id for o in res.all()])
731
         eq_(True, id2 in [o.content_id for o in res.all()])
731
         eq_(True, id2 in [o.content_id for o in res.all()])
732
+
733
+    def test_unit__search_exclude_content_under_deleted_or_archived_parents__ok(self):
734
+        admin = DBSession.query(User).filter(User.email == 'admin@admin.admin').one()
735
+        workspace = self._create_workspace_and_test('workspace_1', admin)
736
+        folder_1 = self._create_content_and_test('folder_1', workspace=workspace, type=ContentType.Folder)
737
+        folder_2 = self._create_content_and_test('folder_2', workspace=workspace, type=ContentType.Folder)
738
+        page_1 = self._create_content_and_test('foo', workspace=workspace, type=ContentType.Page, parent=folder_1)
739
+        page_2 = self._create_content_and_test('bar', workspace=workspace, type=ContentType.Page, parent=folder_2)
740
+
741
+        api = ContentApi(admin)
742
+
743
+        foo_result = api.search(['foo']).all()
744
+        eq_(1, len(foo_result))
745
+        ok_(page_1 in foo_result)
746
+
747
+        bar_result = api.search(['bar']).all()
748
+        eq_(1, len(bar_result))
749
+        ok_(page_2 in bar_result)
750
+
751
+        with new_revision(folder_1):
752
+            api.delete(folder_1)
753
+        with new_revision(folder_2):
754
+            api.archive(folder_2)
755
+
756
+        # Actually ContentApi.search don't filter it
757
+        foo_result = api.search(['foo']).all()
758
+        eq_(1, len(foo_result))
759
+        ok_(page_1 in foo_result)
760
+
761
+        bar_result = api.search(['bar']).all()
762
+        eq_(1, len(bar_result))
763
+        ok_(page_2 in bar_result)
764
+
765
+        # ContentApi offer exclude_unavailable method to do it
766
+        foo_result = api.search(['foo']).all()
767
+        api.exclude_unavailable(foo_result)
768
+        eq_(0, len(foo_result))
769
+
770
+        bar_result = api.search(['bar']).all()
771
+        api.exclude_unavailable(bar_result)
772
+        eq_(0, len(bar_result))

+ 3 - 0
tracim/tracim/tests/library/test_thread.py View File

2
 import transaction
2
 import transaction
3
 from nose.tools import eq_
3
 from nose.tools import eq_
4
 
4
 
5
+from tracim.model import DBSession, User
5
 from tracim.tests import BaseTestThread, TestStandard
6
 from tracim.tests import BaseTestThread, TestStandard
6
 
7
 
7
 
8
 
8
 class TestThread(BaseTestThread, TestStandard):
9
 class TestThread(BaseTestThread, TestStandard):
9
 
10
 
10
     def test_create_thread(self, key='1'):
11
     def test_create_thread(self, key='1'):
12
+        admin = DBSession.query(User).filter(User.email == 'admin@admin.admin').one()
11
         return self._create_thread_and_test(
13
         return self._create_thread_and_test(
12
             workspace_name='workspace_%s' % key,
14
             workspace_name='workspace_%s' % key,
13
             folder_name='folder_%s' % key,
15
             folder_name='folder_%s' % key,
14
             thread_name='thread_%s' % key,
16
             thread_name='thread_%s' % key,
17
+            user=admin
15
         )
18
         )

+ 3 - 1
tracim/tracim/tests/library/test_workspace.py View File

3
 from nose.tools import eq_
3
 from nose.tools import eq_
4
 
4
 
5
 from tracim.lib.content import ContentApi
5
 from tracim.lib.content import ContentApi
6
-from tracim.model import DBSession, Content
6
+from tracim.model import DBSession, Content, User
7
 from tracim.model.data import Workspace
7
 from tracim.model.data import Workspace
8
 from tracim.tests import BaseTestThread, TestStandard
8
 from tracim.tests import BaseTestThread, TestStandard
9
 
9
 
11
 class TestThread(BaseTestThread, TestStandard):
11
 class TestThread(BaseTestThread, TestStandard):
12
 
12
 
13
     def test_children(self):
13
     def test_children(self):
14
+        admin = DBSession.query(User).filter(User.email == 'admin@admin.admin').one()
14
         self._create_thread_and_test(
15
         self._create_thread_and_test(
15
             workspace_name='workspace_1',
16
             workspace_name='workspace_1',
16
             folder_name='folder_1',
17
             folder_name='folder_1',
17
             thread_name='thread_1',
18
             thread_name='thread_1',
19
+            user=admin
18
         )
20
         )
19
         workspace = DBSession.query(Workspace).filter(Workspace.label == 'workspace_1').one()
21
         workspace = DBSession.query(Workspace).filter(Workspace.label == 'workspace_1').one()
20
         folder = ContentApi.get_canonical_query().filter(Content.label == 'folder_1').one()
22
         folder = ContentApi.get_canonical_query().filter(Content.label == 'folder_1').one()

+ 1 - 1
tracim/tracim/tests/models/test_content_revision.py View File

32
 
32
 
33
     def test_new_revision(self):
33
     def test_new_revision(self):
34
         admin = DBSession.query(User).filter(User.email == 'admin@admin.admin').one()
34
         admin = DBSession.query(User).filter(User.email == 'admin@admin.admin').one()
35
-        workspace = self._create_workspace_and_test(name='workspace_1')
35
+        workspace = self._create_workspace_and_test(name='workspace_1', user=admin)
36
         folder = self._create_content_and_test(name='folder_1', workspace=workspace, type=ContentType.Folder)
36
         folder = self._create_content_and_test(name='folder_1', workspace=workspace, type=ContentType.Folder)
37
         page = self._create_content_and_test(
37
         page = self._create_content_and_test(
38
             workspace=workspace,
38
             workspace=workspace,