0005-cells-invalid-cell-report-38009.patch
combo/data/models.py | ||
---|---|---|
642 | 642 |
return cell_types |
643 | 643 | |
644 | 644 |
@classmethod |
645 |
def get_cells(cls, cell_filter=None, skip_cell_cache=False, prefetch_validity_info=False, **kwargs): |
|
645 |
def get_cells(cls, cell_filter=None, skip_cell_cache=False, prefetch_validity_info=False, select_related=None, **kwargs):
|
|
646 | 646 |
"""Returns the list of cells of various classes matching **kwargs""" |
647 | 647 |
cells = [] |
648 | 648 |
pages = [] |
649 |
select_related = select_related or {} |
|
649 | 650 |
if 'page' in kwargs: |
650 | 651 |
pages = [kwargs['page']] |
651 | 652 |
elif 'page__in' in kwargs: |
... | ... | |
670 | 671 |
continue |
671 | 672 |
if cell_filter and not cell_filter(klass): |
672 | 673 |
continue |
673 |
cells.extend(klass.objects.filter(**kwargs)) |
|
674 |
cells_queryset = klass.objects.filter(**kwargs) |
|
675 |
if select_related: |
|
676 |
cells_queryset = cells_queryset.select_related(*select_related) |
|
677 |
cells.extend(cells_queryset) |
|
674 | 678 |
if prefetch_validity_info: |
675 | 679 |
validity_info_list = list(ValidityInfo.objects.select_related('content_type')) |
676 | 680 |
for cell in cells: |
combo/manager/templates/combo/invalid_cell_report.html | ||
---|---|---|
1 |
{% extends "combo/manager_base.html" %} |
|
2 |
{% load i18n %} |
|
3 | ||
4 |
{% block appbar %} |
|
5 |
<h2>{% trans 'Invalid cells' %}</h2> |
|
6 |
{% endblock %} |
|
7 | ||
8 |
{% block breadcrumb %} |
|
9 |
{{ block.super }} |
|
10 |
<a href="{% url 'combo-manager-invalid-cell-report' %}">{% trans 'Anomaly report' %}</a> |
|
11 |
{% endblock %} |
|
12 | ||
13 |
{% block content %} |
|
14 |
{% if object_list %} |
|
15 |
<ul class="objects-list"> |
|
16 |
{% for cell in object_list %} |
|
17 |
<li> |
|
18 |
{% trans "Page:" %} <a href="{% url 'combo-manager-page-view' pk=cell.page_id %}">{{ cell.page.title }}</a> - |
|
19 |
{% trans "Cell:" %} <a href="{% url 'combo-manager-page-view' pk=cell.page_id %}#cell-{{ cell.get_reference }}">{{ cell.get_label }}</a> |
|
20 |
</li> |
|
21 |
{% endfor %} |
|
22 |
</ul> |
|
23 |
{% else %} |
|
24 |
<div class="big-msg-info"> |
|
25 |
{% trans "No invalid cell found." %} |
|
26 |
</div> |
|
27 |
{% endif %} |
|
28 |
{% endblock %} |
combo/manager/templates/combo/manager_home.html | ||
---|---|---|
9 | 9 |
<ul class="extra-actions-menu"> |
10 | 10 |
<li><a download href="{% url 'combo-manager-site-export' %}">{% trans 'Export Site' %}</a></li> |
11 | 11 |
<li><a href="{% url 'combo-manager-site-import' %}">{% trans 'Import Site' %}</a></li> |
12 |
<li><a href="{% url 'combo-manager-invalid-cell-report' %}">{% trans 'Anomaly report' %}</a></li> |
|
12 | 13 |
{% for extra_action in extra_actions %} |
13 | 14 |
<li><a href="{{ extra_action.href }}">{{ extra_action.text }}</a></li> |
14 | 15 |
{% endfor %} |
combo/manager/urls.py | ||
---|---|---|
28 | 28 |
url(r'^menu.json$', views.menu_json), |
29 | 29 |
url(r'^site-export$', views.site_export, name='combo-manager-site-export'), |
30 | 30 |
url(r'^site-import$', views.site_import, name='combo-manager-site-import'), |
31 |
url(r'^cells/invalid-report/$', views.invalid_cell_report, name='combo-manager-invalid-cell-report'), |
|
31 | 32 |
url(r'^pages/add/$', views.page_add, name='combo-manager-page-add'), |
32 | 33 |
url(r'^pages/(?P<pk>\d+)/$', views.page_view, |
33 | 34 |
name='combo-manager-page-view'), |
combo/manager/views.py | ||
---|---|---|
24 | 24 |
from django.core.urlresolvers import reverse, reverse_lazy |
25 | 25 |
from django.http import HttpResponse, HttpResponseRedirect, Http404 |
26 | 26 |
from django.shortcuts import redirect |
27 |
from django.shortcuts import render |
|
27 | 28 |
from django.shortcuts import get_object_or_404 |
28 | 29 |
from django.utils.translation import ugettext_lazy as _ |
29 | 30 |
from django.utils.encoding import force_text, force_bytes |
... | ... | |
91 | 92 |
site_import = SiteImportView.as_view() |
92 | 93 | |
93 | 94 | |
95 |
def invalid_cell_report(request): |
|
96 |
invalid_cells = CellBase.get_cells( |
|
97 |
select_related=['page'], |
|
98 |
page__snapshot__isnull=True, |
|
99 |
validity_info__invalid_since__isnull=False) |
|
100 |
context = { |
|
101 |
'object_list': invalid_cells, |
|
102 |
} |
|
103 |
return render(request, 'combo/invalid_cell_report.html', context) |
|
104 | ||
105 | ||
94 | 106 |
class PageAddView(CreateView): |
95 | 107 |
model = Page |
96 | 108 |
template_name = 'combo/page_add.html' |
tests/test_manager.py | ||
---|---|---|
586 | 586 |
assert 'Missing groups: foobar' in resp.text |
587 | 587 | |
588 | 588 | |
589 |
def test_invalid_cell_report(app, admin_user): |
|
590 |
app = login(app) |
|
591 |
resp = app.get('/manage/cells/invalid-report/') |
|
592 |
assert resp.context['object_list'] == [] |
|
593 | ||
594 |
page = Page.objects.create(title='One', slug='one', template_name='standard') |
|
595 |
cell = TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=0) |
|
596 |
resp = app.get('/manage/cells/invalid-report/') |
|
597 |
assert resp.context['object_list'] == [] |
|
598 | ||
599 |
cell.mark_as_invalid('foo_bar_reason') |
|
600 |
resp = app.get('/manage/cells/invalid-report/') |
|
601 |
assert resp.context['object_list'] == [cell] |
|
602 |
assert '<a href="/manage/pages/{}/">{}</a>'.format(page.pk, page.title) in resp.text |
|
603 |
assert '<a href="/manage/pages/{}/#cell-{}">{}</a>'.format(page.pk, cell.get_reference(), cell.get_label()) in resp.text |
|
604 | ||
605 |
snapshot = PageSnapshot.objects.create(page=page) |
|
606 |
page.snapshot = snapshot |
|
607 |
page.save() |
|
608 |
resp = app.get('/manage/cells/invalid-report/') |
|
609 |
assert resp.context['object_list'] == [] |
|
610 | ||
611 | ||
589 | 612 |
def test_duplicate_page(app, admin_user): |
590 | 613 |
page = Page.objects.create(title='One', slug='one', template_name='standard', exclude_from_navigation=False) |
591 | 614 |
TextCell.objects.create(page=page, placeholder='content', text='Foobar', order=0) |
592 |
- |