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 return cell_types
@classmethod @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""" """Returns the list of cells of various classes matching **kwargs"""
cells = [] cells = []
pages = [] pages = []
select_related = select_related or {}
if 'page' in kwargs: if 'page' in kwargs:
pages = [kwargs['page']] pages = [kwargs['page']]
elif 'page__in' in kwargs: elif 'page__in' in kwargs:
@ -670,7 +671,10 @@ class CellBase(six.with_metaclass(CellMeta, models.Model)):
continue continue
if cell_filter and not cell_filter(klass): if cell_filter and not cell_filter(klass):
continue 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: if prefetch_validity_info:
validity_info_list = list(ValidityInfo.objects.select_related('content_type')) validity_info_list = list(ValidityInfo.objects.select_related('content_type'))
for cell in cells: 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"> <ul class="extra-actions-menu">
<li><a download href="{% url 'combo-manager-site-export' %}">{% trans 'Export Site' %}</a></li> <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-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 %} {% for extra_action in extra_actions %}
<li><a href="{{ extra_action.href }}">{{ extra_action.text }}</a></li> <li><a href="{{ extra_action.href }}">{{ extra_action.text }}</a></li>
{% endfor %} {% endfor %}

View File

@ -28,6 +28,7 @@ urlpatterns = [
url(r'^menu.json$', views.menu_json), url(r'^menu.json$', views.menu_json),
url(r'^site-export$', views.site_export, name='combo-manager-site-export'), 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'^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/add/$', views.page_add, name='combo-manager-page-add'),
url(r'^pages/(?P<pk>\d+)/$', views.page_view, url(r'^pages/(?P<pk>\d+)/$', views.page_view,
name='combo-manager-page-view'), name='combo-manager-page-view'),

View File

@ -17,6 +17,7 @@
import hashlib import hashlib
import json import json
import os import os
from operator import attrgetter
from django.conf import settings from django.conf import settings
from django.contrib import messages 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.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponse, HttpResponseRedirect, Http404 from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import redirect from django.shortcuts import redirect
from django.shortcuts import render
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import force_text, force_bytes from django.utils.encoding import force_text, force_bytes
@ -91,6 +93,18 @@ class SiteImportView(FormView):
site_import = SiteImportView.as_view() 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): class PageAddView(CreateView):
model = Page model = Page
template_name = 'combo/page_add.html' 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 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): def test_duplicate_page(app, admin_user):
page = Page.objects.create(title='One', slug='one', template_name='standard', exclude_from_navigation=False) 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) TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=0)