Skip to content

Commit 5e8e83b

Browse files
authored
Merge pull request #9 from EbookFoundation/fix/view-performance
Deployed and verified in production. Homepage 12s→1.7s, /problems/429/ 502→3.2s.
2 parents 72ad79e + 42146f6 commit 5e8e83b

2 files changed

Lines changed: 15 additions & 13 deletions

File tree

doab_check/templates/problems.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ <h2>
1515
<ul>
1616
{% for provider in providers %}
1717
<li> <a href="#{{ provider.provider | urlencode }}">{{ provider.provider }}</a>:
18-
{{ provider.provider__count }} problem links </li>
18+
{{ provider.link_count }} problem links </li>
1919
{% endfor %}
2020
</ul>
2121

@@ -38,7 +38,7 @@ <h2>
3838
<td>{{ link.recent_check.content_type }}</td>
3939
</tr>
4040
</table>
41-
{% if forloop.counter == 1000 %} Can't display more than 1000 links {% endif %}
41+
{% if forloop.counter == 100 %} Showing first 100 links per provider {% endif %}
4242
{% endwith %}
4343
{% endfor %}
4444
</ul>

doab_check/views.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@ class HomepageView(generic.TemplateView):
1515
template_name = 'index.html'
1616

1717
def get_context_data(self, **kwargs):
18-
active_links = Link.objects.filter(recent_check__isnull=False, live=True
19-
).only('recent_check').order_by('-recent_check__return_code')
20-
codes = active_links.values(
21-
'recent_check__return_code').distinct()
18+
active_links = Link.objects.filter(recent_check__isnull=False, live=True)
2219
num_checked = active_links.count()
2320
items = Item.objects.filter(status=1)
2421
num_items = items.count()
2522
num_bad_items = active_links.exclude(recent_check__return_code=200).values('items'
2623
).distinct().count()
2724

25+
codes = active_links.values(
26+
'recent_check__return_code'
27+
).annotate(
28+
count=Count('id')
29+
).order_by('-recent_check__return_code')
30+
2831
for code in codes:
29-
code['count'] = active_links.filter(
30-
recent_check__return_code=code['recent_check__return_code'],
31-
).count()
3232
code['percent'] = '{:.2%}'.format(code['count'] / num_checked)
3333
return {'num_checked': num_checked, 'codes': codes,
3434
'num_items': num_items, 'num_bad_items': num_bad_items}
@@ -39,14 +39,16 @@ class ProblemsView(generic.TemplateView):
3939

4040
def get_context_data(self, **kwargs):
4141
code = kwargs['code']
42-
42+
4343
problems = Link.objects.exclude(recent_check__isnull=True
4444
).filter(recent_check__return_code__exact=code, live=True
45+
).select_related('recent_check'
4546
).order_by('provider').annotate(title=F('items__title'))
46-
providers = problems.values('provider').distinct().annotate(Count('provider'))
47+
providers = problems.values('provider').distinct().annotate(
48+
link_count=Count('provider'))
4749
for provider in providers:
48-
provider['links'] = problems.filter(provider=provider['provider'])
49-
#provider['count'] = provider['links'].count()
50+
provider['links'] = problems.filter(
51+
provider=provider['provider']).order_by('url')[:100]
5052
return {'code': code, 'providers': providers}
5153

5254

0 commit comments

Comments
 (0)