Merge pull request #4801 from FinnStutzenstein/numberingPrefetchingFix

Fixed prefetching and ordering of motions during numbering
This commit is contained in:
Sean 2019-06-24 13:08:53 +02:00 committed by GitHub
commit 7d03fddfcf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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