diff --git a/arkindex/project/tests/__init__.py b/arkindex/project/tests/__init__.py index bfb70ee524a4ebdc73c202c78f7119fd71250b3c..29b3ea9baefe02cb58d2be7d3b37a80ad895b46e 100644 --- a/arkindex/project/tests/__init__.py +++ b/arkindex/project/tests/__init__.py @@ -39,7 +39,7 @@ class _AssertExactQueriesContext(CaptureQueriesContext): reindent=True, use_space_around_operators=True, indent_width=4, - ) + ).strip() # When the file does not exist, try to create it with the current queries. # This avoids having to write all of the queries by hand when adding assertExactQueries for the first time. diff --git a/arkindex/project/tests/test_acl_mixin.py b/arkindex/project/tests/test_acl_mixin.py index e3f5d91c76893b5c4ee8e88e888c5907968e5f10..45af24dfcfa9b844983fa32aae2c65e269e1cccb 100644 --- a/arkindex/project/tests/test_acl_mixin.py +++ b/arkindex/project/tests/test_acl_mixin.py @@ -130,13 +130,13 @@ class TestACLMixin(FixtureTestCase): 'level': Role.Guest.value, } with self.assertExactQueries('corpus_rights_filter_public.sql', params=params): - corpora = list(corpus_acl_mixin.readable_corpora()) + corpora = list(corpus_acl_mixin.readable_corpora) self.assertCountEqual(corpora, [self.corpus, self.corpus1]) def test_corpus_acl_mixin_writable(self): corpus_acl_mixin = NewCorpusACLMixin(self.user1) with self.assertNumQueries(1): - corpora = list(corpus_acl_mixin.writable_corpora()) + corpora = list(corpus_acl_mixin.writable_corpora) self.assertCountEqual(corpora, [self.corpus1]) def test_repo_acl_mixin_has_read_access(self): @@ -169,11 +169,11 @@ class TestACLMixin(FixtureTestCase): def test_repo_acl_mixin_readable(self): repo_acl_mixin = RepositoryACLMixin(self.user2) with self.assertNumQueries(1): - repos = list(repo_acl_mixin.readable_repositories()) + repos = list(repo_acl_mixin.readable_repositories) self.assertCountEqual(repos, [self.repo1]) def test_repo_acl_mixin_executable(self): repo_acl_mixin = RepositoryACLMixin(self.user2) with self.assertNumQueries(1): - repos = list(repo_acl_mixin.executable_repositories()) + repos = list(repo_acl_mixin.executable_repositories) self.assertEqual(repos, []) diff --git a/arkindex/sql_validation/corpus_rights_filter.sql b/arkindex/sql_validation/corpus_rights_filter.sql index 1ae974fc3ad765be04492d7dcc6e70ba721c7111..b0b5f6ed6a6b143144388c027dce6ab7281d18ff 100644 --- a/arkindex/sql_validation/corpus_rights_filter.sql +++ b/arkindex/sql_validation/corpus_rights_filter.sql @@ -1,11 +1,11 @@ -SELECT DISTINCT "documents_corpus"."created", - "documents_corpus"."updated", - "documents_corpus"."id", - "documents_corpus"."name", - "documents_corpus"."description", - "documents_corpus"."repository_id", - "documents_corpus"."public", - LEAST("users_right"."level", T5."level") AS "max_level" +SELECT DISTINCT ON ("documents_corpus"."id") "documents_corpus"."created", + "documents_corpus"."updated", + "documents_corpus"."id", + "documents_corpus"."name", + "documents_corpus"."description", + "documents_corpus"."repository_id", + "documents_corpus"."public", + LEAST("users_right"."level", T5."level") AS "max_level" FROM "documents_corpus" INNER JOIN "users_right" ON ("documents_corpus"."id" = "users_right"."content_id" AND ("users_right"."content_type_id" = {corpus_type_id})) @@ -15,3 +15,5 @@ LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id" WHERE (("users_right"."user_id" = {user_id} OR T5."user_id" = {user_id}) AND LEAST("users_right"."level", T5."level") >= {level}) +ORDER BY "documents_corpus"."id" ASC, + "max_level" DESC diff --git a/arkindex/sql_validation/corpus_rights_filter_public.sql b/arkindex/sql_validation/corpus_rights_filter_public.sql index 549bde046d62949723f617f208c9e97d5ed86ff7..5d10d04b52fcb9741f12c926fd5305cf311e5481 100644 --- a/arkindex/sql_validation/corpus_rights_filter_public.sql +++ b/arkindex/sql_validation/corpus_rights_filter_public.sql @@ -1,18 +1,29 @@ -SELECT DISTINCT "documents_corpus"."created", - "documents_corpus"."updated", - "documents_corpus"."id", - "documents_corpus"."name", - "documents_corpus"."description", - "documents_corpus"."repository_id", - "documents_corpus"."public", - LEAST("users_right"."level", T5."level") AS "max_level" -FROM "documents_corpus" -LEFT OUTER JOIN "users_right" ON ("documents_corpus"."id" = "users_right"."content_id" + (SELECT "documents_corpus"."created", + "documents_corpus"."updated", + "documents_corpus"."id", + "documents_corpus"."name", + "documents_corpus"."description", + "documents_corpus"."repository_id", + "documents_corpus"."public", + LEAST("users_right"."level", T5."level") AS "max_level" + FROM "documents_corpus" + INNER JOIN "users_right" ON ("documents_corpus"."id" = "users_right"."content_id" AND ("users_right"."content_type_id" = {corpus_type_id})) -LEFT OUTER JOIN "users_group" ON ("users_right"."group_id" = "users_group"."id") -LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id" - AND (T5."content_type_id" = {group_type_id})) -WHERE ((("users_right"."user_id" = {user_id} - OR T5."user_id" = {user_id}) - AND LEAST("users_right"."level", T5."level") >= {level}) - OR "documents_corpus"."public") + LEFT OUTER JOIN "users_group" ON ("users_right"."group_id" = "users_group"."id") + LEFT OUTER JOIN "users_right" T5 ON ("users_group"."id" = T5."content_id" + AND (T5."content_type_id" = {group_type_id})) + WHERE (("users_right"."user_id" = {user_id} + OR T5."user_id" = {user_id}) + AND LEAST("users_right"."level", T5."level") >= {level})) +UNION + (SELECT "documents_corpus"."created", + "documents_corpus"."updated", + "documents_corpus"."id", + "documents_corpus"."name", + "documents_corpus"."description", + "documents_corpus"."repository_id", + "documents_corpus"."public", + 10 AS "max_level" + FROM "documents_corpus" + WHERE "documents_corpus"."public") +ORDER BY (3) ASC, (8) DESC