perf: optimize badge checking

This commit is contained in:
Frédéric Péters 2018-01-08 21:53:57 +01:00
parent d736942516
commit 615c215870
2 changed files with 21 additions and 8 deletions

View File

@ -381,23 +381,30 @@ class CellBase(models.Model):
return self.__class__.__name__.lower() + ' ' + self.extra_css_class
@classmethod
def get_all_cell_types(cls):
cell_types = []
def get_cell_classes(cls, class_filter=lambda x: True):
for klass in get_cell_classes():
if not class_filter(klass):
continue
if not klass.is_enabled():
continue
if klass.visible is False:
continue
yield klass
@classmethod
def get_all_cell_types(cls):
cell_types = []
for klass in cls.get_cell_classes():
cell_types.extend(klass.get_cell_types())
return cell_types
@classmethod
def get_cells(cls, concrete=True, **kwargs):
def get_cells(cls, concrete=True, subclasses=(), **kwargs):
"""Returns a queryset of cells of various classes matching **kwargs"""
queryset = cls.objects.filter(**kwargs).order_by('order')
if not concrete:
return queryset
return queryset.select_subclasses()
return queryset.select_subclasses(*subclasses)
def get_reference(self):
"Returns a string that can serve as a unique reference to a cell"""

View File

@ -218,14 +218,13 @@ def skeleton(request):
cells = list(cells)
extend_with_parent_cells(cells)
cell_with_badges = [x for x in CellBase.get_cells() if bool(x.get_badge)]
ctx = {
'page': selected_page,
'page_cells': cells,
'pages': pages,
'request': request,
'render_skeleton': True,
'check_badges': bool(cell_with_badges),
'check_badges': should_check_badges(),
'site_base': request.build_absolute_uri('/')[:-1],
}
@ -337,6 +336,14 @@ def page(request):
return publish_page(request, page)
def should_check_badges():
check_badges = False
for klass in CellBase.get_cell_classes(lambda x: bool(x.get_badge)):
check_badges = klass.objects.all().exists()
if check_badges:
break
return check_badges
def publish_page(request, page, status=200, template_name=None):
pages = page.get_parents_and_self()
@ -352,10 +359,9 @@ def publish_page(request, page, status=200, template_name=None):
cells = list(CellBase.get_cells(page_id=page.id))
extend_with_parent_cells(cells)
cells = [x for x in cells if x.is_visible(user=request.user)]
cell_with_badges = [x for x in CellBase.get_cells() if bool(x.get_badge)]
ctx = {
'check_badges': bool(cell_with_badges),
'check_badges': should_check_badges(),
'page': page,
'page_cells': cells,
'pages': pages,