cells: invalid cell report (#38009)
This commit is contained in:
parent
7046049aa0
commit
7299d1d835
|
@ -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:
|
||||
|
|
|
@ -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 %}
|
|
@ -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 %}
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue