Skip to content

Commit f1747e7

Browse files
jaap3berkerpeksag
authored andcommitted
Cleanup blogs app (#1336)
* Add initial_data() factory * Fix DoesNotExist when there is no Feed in update_blog_supernav() * Remove unused Contributor and Translation models * Do not trust the HTML in the entry.summary field * Use update_or_create() when updating Blog entries
1 parent cdb0b8b commit f1747e7

File tree

11 files changed

+90
-121
lines changed

11 files changed

+90
-121
lines changed

blogs/admin.py

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,7 @@
11
from django.contrib import admin
22
from django.core.management import call_command
3-
from django.utils.html import format_html
43

5-
from cms.admin import ContentManageableModelAdmin
6-
7-
from .models import BlogEntry, Contributor, Translation, Feed, FeedAggregate
8-
9-
10-
@admin.register(Translation)
11-
class TranslationAdmin(ContentManageableModelAdmin):
12-
list_display = ['name', '_display_url']
13-
14-
def _display_url(self, obj):
15-
return format_html('<a href="{0}">{0}</a>'.format(obj.url))
16-
17-
18-
@admin.register(Contributor)
19-
class ContributorAdmin(ContentManageableModelAdmin):
20-
list_display = ['_display_name']
21-
22-
def _display_name(self, obj):
23-
if obj.user.first_name or obj.user.last_name:
24-
return "{} {}".format(obj.user.first_name, obj.user.last_name)
25-
else:
26-
return "{} (PK#{})".format(obj.user.username, obj.user.pk)
4+
from .models import BlogEntry, Feed, FeedAggregate
275

286

297
@admin.register(BlogEntry)

blogs/factories.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from django.conf import settings
2+
3+
from .models import Feed
4+
5+
6+
def initial_data():
7+
feed, _ = Feed.objects.get_or_create(
8+
id=1,
9+
defaults={
10+
'name': 'Python Insider',
11+
'website_url': settings.PYTHON_BLOG_URL,
12+
'feed_url': settings.PYTHON_BLOG_FEED_URL,
13+
}
14+
)
15+
return {
16+
'feeds': [feed],
17+
}

blogs/management/commands/update_blogs.py

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,10 @@ def handle(self, **options):
1313
entries = get_all_entries(feed.feed_url)
1414

1515
for entry in entries:
16-
try:
17-
e = BlogEntry.objects.get(url=entry['url'])
18-
19-
# Update our info if it's changed
20-
if e.pub_date < entry['pub_date']:
21-
e.title = entry['title']
22-
e.summary = entry['summary']
23-
e.pub_date = entry['pub_date']
24-
e.save()
25-
26-
except BlogEntry.DoesNotExist:
27-
BlogEntry.objects.create(
28-
title=entry['title'],
29-
summary=entry['summary'],
30-
pub_date=entry['pub_date'],
31-
url=entry['url'],
32-
feed=feed,
33-
)
16+
url = entry.pop('url')
17+
BlogEntry.objects.update_or_create(
18+
feed=feed, url=url, defaults=entry,
19+
)
3420

3521
feed.last_import = now()
3622
feed.save()
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Generated by Django 2.0.6 on 2018-09-25 09:07
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('blogs', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name='contributor',
15+
name='creator',
16+
),
17+
migrations.RemoveField(
18+
model_name='contributor',
19+
name='last_modified_by',
20+
),
21+
migrations.RemoveField(
22+
model_name='contributor',
23+
name='user',
24+
),
25+
migrations.RemoveField(
26+
model_name='translation',
27+
name='creator',
28+
),
29+
migrations.RemoveField(
30+
model_name='translation',
31+
name='last_modified_by',
32+
),
33+
migrations.DeleteModel(
34+
name='Contributor',
35+
),
36+
migrations.DeleteModel(
37+
name='Translation',
38+
),
39+
]

blogs/models.py

Lines changed: 1 addition & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import feedparser
22

33
from django.db import models
4-
from django.conf import settings
54

65
from cms.models import ContentManageable
76

@@ -42,6 +41,7 @@ class Feed(models.Model):
4241
def __str__(self):
4342
return self.name
4443

44+
4545
class FeedAggregate(models.Model):
4646
"""
4747
An aggregate of RSS feeds.
@@ -57,48 +57,6 @@ class FeedAggregate(models.Model):
5757
def __str__(self):
5858
return self.name
5959

60-
class Translation(ContentManageable):
61-
""" Model to store blog translation links """
62-
name = models.CharField(max_length=100)
63-
url = models.URLField('URL')
64-
65-
class Meta:
66-
verbose_name = 'Translation'
67-
verbose_name_plural = 'Translations'
68-
ordering = ('name', )
69-
70-
def __str__(self):
71-
return self.name
72-
73-
def get_absolute_url(self):
74-
return self.url
75-
76-
77-
class Contributor(ContentManageable):
78-
""" Blog Contributors """
79-
user = models.ForeignKey(
80-
settings.AUTH_USER_MODEL,
81-
related_name='blog_contributor',
82-
on_delete=models.CASCADE,
83-
)
84-
85-
class Meta:
86-
verbose_name = 'Contributor'
87-
verbose_name_plural = 'Contributors'
88-
ordering = ('user__last_name', 'user__first_name')
89-
90-
def __str__(self):
91-
return self.user.get_full_name()
92-
93-
def get_absolute_url(self):
94-
return self.user.get_absolute_url()
95-
96-
def get_display_name(self):
97-
if self.user.first_name or self.user.last_name:
98-
return """{} {}""".format(self.user.first_name, self.user.last_name)
99-
else:
100-
return self.user.username
101-
10260

10361
class RelatedBlog(ContentManageable):
10462
name = models.CharField(max_length=100, help_text="Internal Name")

blogs/parser.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import datetime
22
import feedparser
33

4+
from django.conf import settings
45
from django.template.loader import render_to_string
56
from django.utils.timezone import make_aware, utc
67

78
from boxes.models import Box
8-
from .models import BlogEntry
9+
from .models import BlogEntry, Feed
910

1011

1112
def get_all_entries(feed_url):
@@ -37,13 +38,20 @@ def _render_blog_supernav(entry):
3738

3839
def update_blog_supernav():
3940
"""Retrieve latest entry and update blog supernav item """
40-
latest_entry = BlogEntry.objects.filter(feed_id=1).latest()
41-
rendered_box = _render_blog_supernav(latest_entry)
42-
43-
box, _ = Box.objects.update_or_create(
44-
label='supernav-python-blog',
45-
defaults={
46-
'content': rendered_box,
47-
'content_markup_type': 'html',
48-
}
49-
)
41+
try:
42+
latest_entry = BlogEntry.objects.filter(
43+
feed=Feed.objects.get(
44+
feed_url=settings.PYTHON_BLOG_FEED_URL,
45+
)
46+
).latest()
47+
except (BlogEntry.DoesNotExist, Feed.DoesNotExist):
48+
pass
49+
else:
50+
rendered_box = _render_blog_supernav(latest_entry)
51+
box, _ = Box.objects.update_or_create(
52+
label='supernav-python-blog',
53+
defaults={
54+
'content': rendered_box,
55+
'content_markup_type': 'html',
56+
}
57+
)

blogs/tests/test_models.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,11 @@
11
from django.test import TestCase
22
from django.utils import timezone
33

4-
from ..models import Translation, BlogEntry, Feed
4+
from ..models import BlogEntry, Feed
55

66

77
class BlogModelTest(TestCase):
88

9-
def test_translation(self):
10-
t = Translation.objects.create(
11-
name='Swiss',
12-
url='http://python.ch',
13-
)
14-
self.assertEqual(str(t), 'Swiss')
15-
self.assertEqual(t.get_absolute_url(), t.url)
16-
179
def test_blog_entry(self):
1810
now = timezone.now()
1911

blogs/tests/test_templatetags.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
from django.template import Template, Context
44
from django.utils.timezone import now
55

6-
from boxes.models import Box
7-
86
from ..templatetags.blogs import get_latest_blog_entries
9-
from ..parser import _render_blog_supernav
107
from ..models import BlogEntry, Feed, FeedAggregate
118
from .utils import get_test_rss_path
129

@@ -22,9 +19,8 @@ def test_get_latest_entries(self):
2219
management command
2320
"""
2421
Feed.objects.create(
25-
id=1, name='psf default', website_url='example.org',
22+
name='psf default', website_url='https://example.org',
2623
feed_url=self.test_file_path)
27-
entries = None
2824
call_command('update_blogs')
2925
entries = get_latest_blog_entries()
3026

@@ -33,9 +29,6 @@ def test_get_latest_entries(self):
3329
entries[0].pub_date.isoformat(),
3430
'2013-03-04T15:00:00+00:00'
3531
)
36-
b = Box.objects.get(label='supernav-python-blog')
37-
rendered_box = _render_blog_supernav(BlogEntry.objects.latest())
38-
self.assertEqual(b.content.raw, rendered_box)
3932

4033
def test_feed_list(self):
4134
f1 = Feed.objects.create(
@@ -61,14 +54,14 @@ def test_feed_list(self):
6154
summary='',
6255
pub_date=now(),
6356
url='path/to/foo',
64-
feed=f1
57+
feed=f2
6558
)
6659
fa = FeedAggregate.objects.create(
6760
name='test',
6861
slug='test',
6962
description='testing',
7063
)
71-
fa.feeds.add(f1,f2)
64+
fa.feeds.add(f1, f2)
7265

7366

7467
t = Template("""

blogs/views.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.views.generic import TemplateView
22

3-
from .models import BlogEntry, Translation, Contributor
3+
from .models import BlogEntry
44

55

66
class BlogHome(TemplateView):
@@ -21,8 +21,6 @@ def get_context_data(self, **kwargs):
2121
context.update({
2222
'latest_entry': latest_entry,
2323
'entries': other_entries,
24-
'translations': Translation.objects.all(),
25-
'contributors': Contributor.objects.all(),
2624
})
2725

2826
return context

pydotorg/settings/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,8 @@
222222
HONEYPOT_VALUE = 'write your message'
223223

224224
### Blog Feed URL
225-
PYTHON_BLOG_FEED_URL = "http://feeds.feedburner.com/PythonInsider"
226-
PYTHON_BLOG_URL = "http://blog.python.org"
225+
PYTHON_BLOG_FEED_URL = "https://feeds.feedburner.com/PythonInsider"
226+
PYTHON_BLOG_URL = "https://blog.python.org"
227227

228228
### Registration mailing lists
229229
MAILING_LIST_PSF_MEMBERS = "[email protected]"

0 commit comments

Comments
 (0)