Skip to content

Commit

Permalink
Merge 28c97e8 into 317ee96
Browse files Browse the repository at this point in the history
  • Loading branch information
jrief committed Oct 21, 2019
2 parents 317ee96 + 28c97e8 commit 9233439
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 22 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
* ...


=== 3.7.1 (unreleased) ===
* Fix problem with setting page permissions. If a page contains more than 1000 descendants, setting
page permissions caused a SQL error on SQLite.


=== 3.7.0 (2019-09-25) ===

* Introduced Django 2.2 support.
Expand Down
50 changes: 28 additions & 22 deletions cms/utils/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,32 +188,38 @@ def get_page_actions_for_user(user, site):
)
nodes = [page.node for page in pages]
pages_by_id = {}
page_permissions_chunks = []

for offset in range(0, pages.count(), 500):
pages_ids_chunk = []
for page in pages[offset:offset + 500]:
if page.node.is_root():
page.node._set_hierarchy(nodes)
page.node.__dict__['item'] = page
pages_by_id[page.pk] = page
pages_ids_chunk.append(page.pk)

page_permissions_chunks.append(
PagePermission
.objects
.with_user(user)
.filter(page_id__in=pages_ids_chunk)
)

for page in pages:
if page.node.is_root():
page.node._set_hierarchy(nodes)
page.node.__dict__['item'] = page
pages_by_id[page.pk] = page
for page_permissions in page_permissions_chunks:
for perm in page_permissions.iterator():
# set internal fk cache to our page with loaded ancestors and descendants
if DJANGO_1_11:
perm._page_cache = pages_by_id[perm.page_id]
else:
# for django >= 2.0
PagePermission.page.field.set_cached_value(perm, pages_by_id[perm.page_id])

page_permissions = (
PagePermission
.objects
.with_user(user)
.filter(page__in=pages_by_id)
)

for perm in page_permissions.iterator():
# set internal fk cache to our page with loaded ancestors and descendants
if DJANGO_1_11:
perm._page_cache = pages_by_id[perm.page_id]
else:
# for django >= 2.0
PagePermission.page.field.set_cached_value(perm, pages_by_id[perm.page_id])
page_ids = frozenset(perm.get_page_ids())

page_ids = frozenset(perm.get_page_ids())
for action in perm.get_configured_actions():
actions[action].update(page_ids)

for action in perm.get_configured_actions():
actions[action].update(page_ids)
return actions


Expand Down

0 comments on commit 9233439

Please sign in to comment.