Merge pull request #4801 from FinnStutzenstein/numberingPrefetchingFix
Fixed prefetching and ordering of motions during numbering
This commit is contained in:
commit
7d03fddfcf
@ -3,7 +3,7 @@ from typing import Any, Dict, List, Tuple
|
|||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from django.db.models import Model, Prefetch
|
from django.db.models import Model
|
||||||
|
|
||||||
from ..core.config import config
|
from ..core.config import config
|
||||||
from ..utils.rest_api import ValidationError
|
from ..utils.rest_api import ValidationError
|
||||||
@ -91,16 +91,7 @@ def numbering(main_category: Category) -> List[Model]:
|
|||||||
def get_child_categories(main_category: Category) -> List[Category]:
|
def get_child_categories(main_category: Category) -> List[Category]:
|
||||||
# -> generate a mapping from a category id to all it's children with respect to `weight`:
|
# -> generate a mapping from a category id to all it's children with respect to `weight`:
|
||||||
category_children_mapping: Dict[int, List[Category]] = defaultdict(list)
|
category_children_mapping: Dict[int, List[Category]] = defaultdict(list)
|
||||||
# Optimize lookupqueries by prefetching all relations for motions
|
for category in Category.objects.exclude(parent=None).order_by("weight").all():
|
||||||
prefetched_queryset = Category.objects.prefetch_related(
|
|
||||||
Prefetch(
|
|
||||||
"motion_set",
|
|
||||||
queryset=Motion.objects.get_full_queryset()
|
|
||||||
.prefetch_related("parent")
|
|
||||||
.order_by("category_weight", "id"),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
for category in prefetched_queryset.exclude(parent=None).order_by("weight").all():
|
|
||||||
category_children_mapping[category.parent_id].append(category)
|
category_children_mapping[category.parent_id].append(category)
|
||||||
|
|
||||||
# - collect child categories
|
# - collect child categories
|
||||||
@ -156,9 +147,14 @@ def get_affected_motions(affected_categories) -> List[Motion]:
|
|||||||
# and sorted with `category_weight` per category.
|
# and sorted with `category_weight` per category.
|
||||||
affected_motions = []
|
affected_motions = []
|
||||||
for category in affected_categories:
|
for category in affected_categories:
|
||||||
affected_motions.extend(
|
motions = (
|
||||||
list(category.motion_set.all())
|
Motion.objects.prefetch_related(
|
||||||
) # The motions should be ordered correctly by the prefetch statement in `get_child_categories`
|
"agenda_items", "lists_of_speakers", "parent"
|
||||||
|
)
|
||||||
|
.filter(category=category)
|
||||||
|
.order_by("category_weight", "id")
|
||||||
|
)
|
||||||
|
affected_motions.extend(list(motions))
|
||||||
return affected_motions
|
return affected_motions
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user