cells: invalid cell report (#38009)

This commit is contained in:
Lauréline Guérin 2020-02-18 13:55:18 +01:00
parent 7046049aa0
commit 7299d1d835
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
6 changed files with 73 additions and 2 deletions

View File

@ -642,10 +642,11 @@ class CellBase(six.with_metaclass(CellMeta, models.Model)):
return cell_types
@classmethod
def get_cells(cls, cell_filter=None, skip_cell_cache=False, prefetch_validity_info=False, **kwargs):
def get_cells(cls, cell_filter=None, skip_cell_cache=False, prefetch_validity_info=False, select_related=None, **kwargs):
"""Returns the list of cells of various classes matching **kwargs"""
cells = []
pages = []
select_related = select_related or {}
if 'page' in kwargs:
pages = [kwargs['page']]
elif 'page__in' in kwargs:
@ -670,7 +671,10 @@ class CellBase(six.with_metaclass(CellMeta, models.Model)):
continue
if cell_filter and not cell_filter(klass):
continue
cells.extend(klass.objects.filter(**kwargs))
cells_queryset = klass.objects.filter(**kwargs)
if select_related:
cells_queryset = cells_queryset.select_related(*select_related)
cells.extend(cells_queryset)
if prefetch_validity_info:
validity_info_list = list(ValidityInfo.objects.select_related('content_type'))
for cell in cells:

View File

@ -0,0 +1,28 @@
{% extends "combo/manager_base.html" %}
{% load i18n %}
{% block appbar %}
<h2>{% trans 'Invalid cells' %}</h2>
{% endblock %}
{% block breadcrumb %}
{{ block.super }}
<a href="{% url 'combo-manager-invalid-cell-report' %}">{% trans 'Anomaly report' %}</a>
{% endblock %}
{% block content %}
{% if object_list %}
<ul class="objects-list">
{% for cell in object_list %}
<li>
{% trans "Page:" %} <a href="{% url 'combo-manager-page-view' pk=cell.page_id %}">{{ cell.page.title }}</a> -
{% trans "Cell:" %} <a href="{% url 'combo-manager-page-view' pk=cell.page_id %}#cell-{{ cell.get_reference }}">{{ cell.get_label }}</a>
</li>
{% endfor %}
</ul>
{% else %}
<div class="big-msg-info">
{% trans "No invalid cell found." %}
</div>
{% endif %}
{% endblock %}

View File

@ -9,6 +9,7 @@
<ul class="extra-actions-menu">
<li><a download href="{% url 'combo-manager-site-export' %}">{% trans 'Export Site' %}</a></li>
<li><a href="{% url 'combo-manager-site-import' %}">{% trans 'Import Site' %}</a></li>
<li><a href="{% url 'combo-manager-invalid-cell-report' %}">{% trans 'Anomaly report' %}</a></li>
{% for extra_action in extra_actions %}
<li><a href="{{ extra_action.href }}">{{ extra_action.text }}</a></li>
{% endfor %}

View File

@ -28,6 +28,7 @@ urlpatterns = [
url(r'^menu.json$', views.menu_json),
url(r'^site-export$', views.site_export, name='combo-manager-site-export'),
url(r'^site-import$', views.site_import, name='combo-manager-site-import'),
url(r'^cells/invalid-report/$', views.invalid_cell_report, name='combo-manager-invalid-cell-report'),
url(r'^pages/add/$', views.page_add, name='combo-manager-page-add'),
url(r'^pages/(?P<pk>\d+)/$', views.page_view,
name='combo-manager-page-view'),

View File

@ -17,6 +17,7 @@
import hashlib
import json
import os
from operator import attrgetter
from django.conf import settings
from django.contrib import messages
@ -24,6 +25,7 @@ from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import redirect
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import force_text, force_bytes
@ -91,6 +93,18 @@ class SiteImportView(FormView):
site_import = SiteImportView.as_view()
def invalid_cell_report(request):
invalid_cells = CellBase.get_cells(
select_related=['page'],
page__snapshot__isnull=True,
validity_info__invalid_since__isnull=False)
invalid_cells.sort(key=attrgetter('page.order', 'page.pk', 'order'))
context = {
'object_list': invalid_cells,
}
return render(request, 'combo/invalid_cell_report.html', context)
class PageAddView(CreateView):
model = Page
template_name = 'combo/page_add.html'

View File

@ -586,6 +586,29 @@ def test_site_export_import_missing_group(app, admin_user):
assert 'Missing groups: foobar' in resp.text
def test_invalid_cell_report(app, admin_user):
app = login(app)
resp = app.get('/manage/cells/invalid-report/')
assert resp.context['object_list'] == []
page = Page.objects.create(title='One', slug='one', template_name='standard')
cell = TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=0)
resp = app.get('/manage/cells/invalid-report/')
assert resp.context['object_list'] == []
cell.mark_as_invalid('foo_bar_reason')
resp = app.get('/manage/cells/invalid-report/')
assert resp.context['object_list'] == [cell]
assert '<a href="/manage/pages/{}/">{}</a>'.format(page.pk, page.title) in resp.text
assert '<a href="/manage/pages/{}/#cell-{}">{}</a>'.format(page.pk, cell.get_reference(), cell.get_label()) in resp.text
snapshot = PageSnapshot.objects.create(page=page)
page.snapshot = snapshot
page.save()
resp = app.get('/manage/cells/invalid-report/')
assert resp.context['object_list'] == []
def test_duplicate_page(app, admin_user):
page = Page.objects.create(title='One', slug='one', template_name='standard', exclude_from_navigation=False)
TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=0)