Browse Source

Merge pull request #39 from buxx/fix/search

Tracim 9 years ago
parent
commit
ca813c31c0

+ 0 - 8
README.md View File

@@ -140,18 +140,10 @@ _Reminder : Tracim is developped and tested using python3.4._
140 140
 Tracim uses virtualenv as deployment environment. This ensure that there will be no 
141 141
 conflict between system-wide python installation and Tracim required ones.
142 142
 
143
-    SITE_PACKAGES_PATH=`python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"`
144 143
     virtualenv -p /usr/bin/python3 tg2env
145 144
     source tg2env/bin/activate
146 145
     cd tracim && python setup.py develop && cd -
147 146
     pip install -r install/requirements.txt
148
-    ./bin/tg2env-patch 1 $SITE_PACKAGES_PATH
149
-    pip install -r install/requirements.txt
150
-    ./bin/tg2env-patch 2 $SITE_PACKAGES_PATH
151
-    
152
-Notes:
153
-
154
-* Ubuntu (at least 14.04): please update the site-package path with your version of python
155 147
 
156 148
 ## Database Setup ##
157 149
 

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

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

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

@@ -673,3 +673,28 @@ class ContentApi(object):
673 673
 
674 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,6 +30,7 @@ from tracim.fixtures import FixturesLoader
30 30
 from tracim.fixtures.users_and_groups import Base as BaseFixture
31 31
 from tracim.lib.base import logger
32 32
 from tracim.lib.content import ContentApi
33
+from tracim.lib.workspace import WorkspaceApi
33 34
 from tracim.model import DBSession, Content
34 35
 from tracim.model.data import Workspace, ContentType, ContentRevisionRO
35 36
 
@@ -300,14 +301,12 @@ class ArgumentParser(argparse.ArgumentParser):
300 301
 
301 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 306
         All extra parameters (*args, **kwargs) are for Workspace init
306 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 311
         eq_(1, DBSession.query(Workspace).filter(Workspace.label == name).count())
313 312
         return DBSession.query(Workspace).filter(Workspace.label == name).one()
@@ -329,11 +328,19 @@ class BaseTest(object):
329 328
 
330 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 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 346
         return thread

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

@@ -1,6 +1,6 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
-from nose.tools import eq_
3
+from nose.tools import eq_, ok_
4 4
 from nose.tools import raises
5 5
 from tracim.lib.group import GroupApi
6 6
 
@@ -12,7 +12,7 @@ from tracim.lib.group import GroupApi
12 12
 from tracim.lib.user import UserApi
13 13
 from tracim.lib.workspace import RoleApi
14 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 17
 from tracim.model.auth import Group
18 18
 
@@ -21,10 +21,10 @@ from tracim.model.data import Content
21 21
 from tracim.model.data import ContentType
22 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 29
     def test_compare_content_for_sorting_by_type(self):
30 30
         c1 = Content()
@@ -729,3 +729,44 @@ class TestContentApi(TestStandard):
729 729
 
730 730
         eq_(True, id1 in [o.content_id for o in res.all()])
731 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,14 +2,17 @@
2 2
 import transaction
3 3
 from nose.tools import eq_
4 4
 
5
+from tracim.model import DBSession, User
5 6
 from tracim.tests import BaseTestThread, TestStandard
6 7
 
7 8
 
8 9
 class TestThread(BaseTestThread, TestStandard):
9 10
 
10 11
     def test_create_thread(self, key='1'):
12
+        admin = DBSession.query(User).filter(User.email == 'admin@admin.admin').one()
11 13
         return self._create_thread_and_test(
12 14
             workspace_name='workspace_%s' % key,
13 15
             folder_name='folder_%s' % key,
14 16
             thread_name='thread_%s' % key,
17
+            user=admin
15 18
         )

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

@@ -3,7 +3,7 @@ import transaction
3 3
 from nose.tools import eq_
4 4
 
5 5
 from tracim.lib.content import ContentApi
6
-from tracim.model import DBSession, Content
6
+from tracim.model import DBSession, Content, User
7 7
 from tracim.model.data import Workspace
8 8
 from tracim.tests import BaseTestThread, TestStandard
9 9
 
@@ -11,10 +11,12 @@ from tracim.tests import BaseTestThread, TestStandard
11 11
 class TestThread(BaseTestThread, TestStandard):
12 12
 
13 13
     def test_children(self):
14
+        admin = DBSession.query(User).filter(User.email == 'admin@admin.admin').one()
14 15
         self._create_thread_and_test(
15 16
             workspace_name='workspace_1',
16 17
             folder_name='folder_1',
17 18
             thread_name='thread_1',
19
+            user=admin
18 20
         )
19 21
         workspace = DBSession.query(Workspace).filter(Workspace.label == 'workspace_1').one()
20 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,7 +32,7 @@ class TestContentRevision(BaseTest, TestStandard):
32 32
 
33 33
     def test_new_revision(self):
34 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 36
         folder = self._create_content_and_test(name='folder_1', workspace=workspace, type=ContentType.Folder)
37 37
         page = self._create_content_and_test(
38 38
             workspace=workspace,