Skip to content

Commit 01f79ed

Browse files
committed
Update the example project to the updated tutorial
1 parent 9f7e6b2 commit 01f79ed

21 files changed

+3297
-2349
lines changed

myblog/.coveragerc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
[run]
22
include = ./*
3-
branch = 1
3+
branch = True
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
from django.conf import settings
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='Entry',
17+
fields=[
18+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
('title', models.CharField(max_length=500)),
20+
('body', models.TextField()),
21+
('created_at', models.DateTimeField(auto_now_add=True)),
22+
('modified_at', models.DateTimeField(auto_now=True)),
23+
('author', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
24+
],
25+
options={
26+
},
27+
bases=(models.Model,),
28+
),
29+
]
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('blog', '0001_initial'),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='Comment',
16+
fields=[
17+
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
18+
('name', models.CharField(max_length=100)),
19+
('email', models.EmailField(max_length=75)),
20+
('body', models.TextField()),
21+
('created_at', models.DateTimeField(auto_now_add=True)),
22+
('modified_at', models.DateTimeField(auto_now=True)),
23+
('entry', models.ForeignKey(to='blog.Entry')),
24+
],
25+
options={
26+
},
27+
bases=(models.Model,),
28+
),
29+
migrations.AlterModelOptions(
30+
name='entry',
31+
options={'verbose_name_plural': 'entries'},
32+
),
33+
]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('blog', '0002_auto_20141019_0232'),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name='entry',
16+
name='slug',
17+
field=models.SlugField(default=''),
18+
preserve_default=True,
19+
),
20+
]

myblog/blog/migrations/__init__.py

Whitespace-only changes.

myblog/blog/models.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ class Entry(models.Model):
1010
body = models.TextField()
1111
created_at = models.DateTimeField(auto_now_add=True, editable=False)
1212
modified_at = models.DateTimeField(auto_now=True, editable=False)
13-
slug = models.SlugField(editable=False)
13+
slug = models.SlugField(default='', editable=False)
1414

1515
class Meta:
1616
verbose_name_plural = "entries"
1717

18-
def __unicode__(self):
18+
def __str__(self):
1919
return self.title
2020

2121
def get_absolute_url(self):
@@ -24,11 +24,11 @@ def get_absolute_url(self):
2424
'day': self.created_at.day,
2525
'slug': self.slug,
2626
'pk': self.pk}
27-
return reverse('blog.views.entry_detail', kwargs=kwargs)
27+
return reverse('entry_detail', kwargs=kwargs)
2828

2929
def save(self, *args, **kwargs):
3030
self.slug = slugify(self.title)
31-
super(Entry, self).save(*args, **kwargs)
31+
super().save(*args, **kwargs)
3232

3333
class Comment(models.Model):
3434
entry = models.ForeignKey(Entry)
@@ -38,14 +38,12 @@ class Comment(models.Model):
3838
created_at = models.DateTimeField(auto_now_add=True, editable=False)
3939
modified_at = models.DateTimeField(auto_now=True, editable=False)
4040

41-
def __unicode__(self):
41+
def __str__(self):
4242
return self.body
4343

4444
def gravatar_url(self):
4545
# Get the md5 hash of the email address
46-
md5 = hashlib.new('md5')
47-
md5.update(unicode(self.email))
46+
md5 = hashlib.md5(self.email.encode())
4847
digest = md5.hexdigest()
4948

50-
url = 'https://www.gravatar.com/avatar/{}'.format(digest)
51-
return url
49+
return 'http://www.gravatar.com/avatar/{}'.format(digest)

myblog/blog/templatetags/blog_tags.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
from ..models import Entry
44

5-
65
register = template.Library()
76

87

myblog/blog/tests.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,28 @@
1212

1313
class EntryModelTest(TestCase):
1414

15-
def test_unicode_representation(self):
15+
def test_string_representation(self):
1616
entry = Entry(title="My entry title")
17-
self.assertEqual(unicode(entry), entry.title)
17+
self.assertEqual(str(entry), entry.title)
1818

1919
def test_get_absolute_url(self):
2020
user = get_user_model().objects.create(username='some_user')
2121
entry = Entry.objects.create(title="My entry title", author=user)
2222
self.assertIsNotNone(entry.get_absolute_url())
2323

2424
def test_verbose_name_plural(self):
25-
self.assertEqual(unicode(Entry._meta.verbose_name_plural), "entries")
25+
self.assertEqual(str(Entry._meta.verbose_name_plural), "entries")
2626

2727

2828
class CommentModelTest(TestCase):
2929

30-
def test_unicode_representation(self):
30+
def test_string_representation(self):
3131
comment = Comment(body="My comment body")
32-
self.assertEqual(unicode(comment), "My comment body")
32+
self.assertEqual(str(comment), "My comment body")
3333

3434
def test_gravatar_url(self):
3535
comment = Comment(body="My comment body", email="[email protected]")
36-
expected = "https://www.gravatar.com/avatar/5658ffccee7f0ebfda2b226238b1eb6e"
36+
expected = "http://www.gravatar.com/avatar/5658ffccee7f0ebfda2b226238b1eb6e"
3737
self.assertEqual(comment.gravatar_url(), expected)
3838

3939

@@ -202,8 +202,8 @@ def test_no_posts(self):
202202
self.assertIn("No recent entries", rendered)
203203

204204
def test_many_posts(self):
205-
for n in range(6):
205+
for n in range(1, 6):
206206
Entry.objects.create(author=self.user, title="Post #{0}".format(n))
207207
rendered = self.TEMPLATE.render(Context({}))
208-
self.assertIn("Post #4", rendered)
209-
self.assertNotIn("Post #5", rendered)
208+
self.assertIn("Post #5", rendered)
209+
self.assertNotIn("Post #6", rendered)

myblog/blog/urls.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
from django.conf.urls import patterns, url
1+
from django.conf.urls import url
22

3+
from . import views
34

4-
urlpatterns = patterns('blog.views',
5-
url(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<pk>\d+)-(?P<slug>[-\w]+)/$', 'entry_detail'),
6-
)
5+
urlpatterns = [
6+
url(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<pk>\d+)-(?P<slug>[-\w]*)/$', views.EntryDetail.as_view(), name='entry_detail'),
7+
]

myblog/blog/views.py

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,23 @@
1-
from django.shortcuts import get_object_or_404
21
from django.views.generic import CreateView
32

4-
from .forms import CommentForm
53
from .models import Entry
4+
from .forms import CommentForm
65

76

87
class EntryDetail(CreateView):
8+
model = Entry
99
template_name = 'blog/entry_detail.html'
1010
form_class = CommentForm
1111

12-
def get_entry(self):
13-
return get_object_or_404(Entry, pk=self.kwargs['pk'])
14-
15-
def dispatch(self, *args, **kwargs):
16-
self.entry = self.get_entry()
17-
return super(EntryDetail, self).dispatch(*args, **kwargs)
18-
1912
def get_form_kwargs(self):
20-
kwargs = super(EntryDetail, self).get_form_kwargs()
21-
kwargs['entry'] = self.entry
13+
kwargs = super().get_form_kwargs()
14+
kwargs['entry'] = self.get_object()
2215
return kwargs
2316

2417
def get_context_data(self, **kwargs):
25-
kwargs['entry'] = self.entry
26-
return super(EntryDetail, self).get_context_data(**kwargs)
18+
d = super().get_context_data(**kwargs)
19+
d['entry'] = self.get_object()
20+
return d
2721

2822
def get_success_url(self):
29-
return self.get_entry().get_absolute_url()
30-
31-
entry_detail = EntryDetail.as_view()
23+
return self.get_object().get_absolute_url()

myblog/myblog/settings.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
Django settings for myblog project.
33
44
For more information on this file, see
5-
https://docs.djangoproject.com/en/1.6/topics/settings/
5+
https://docs.djangoproject.com/en/1.7/topics/settings/
66
77
For the full list of settings and their values, see
8-
https://docs.djangoproject.com/en/1.6/ref/settings/
8+
https://docs.djangoproject.com/en/1.7/ref/settings/
99
"""
1010

1111
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
@@ -14,7 +14,7 @@
1414

1515

1616
# Quick-start development settings - unsuitable for production
17-
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/
17+
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/
1818

1919
# SECURITY WARNING: keep the secret key used in production secret!
2020
SECRET_KEY = 'vnsw3o0jb+lpdfo9@qg(_^44as8-*2lb_-q6x%vdpgfiw68ap^'
@@ -38,14 +38,14 @@
3838
'django.contrib.staticfiles',
3939

4040
'blog',
41-
'south',
4241
)
4342

4443
MIDDLEWARE_CLASSES = (
4544
'django.contrib.sessions.middleware.SessionMiddleware',
4645
'django.middleware.common.CommonMiddleware',
4746
'django.middleware.csrf.CsrfViewMiddleware',
4847
'django.contrib.auth.middleware.AuthenticationMiddleware',
48+
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
4949
'django.contrib.messages.middleware.MessageMiddleware',
5050
'django.middleware.clickjacking.XFrameOptionsMiddleware',
5151
)
@@ -56,7 +56,7 @@
5656

5757

5858
# Database
59-
# https://docs.djangoproject.com/en/1.6/ref/settings/#databases
59+
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases
6060

6161
DATABASES = {
6262
'default': {
@@ -66,7 +66,7 @@
6666
}
6767

6868
# Internationalization
69-
# https://docs.djangoproject.com/en/1.6/topics/i18n/
69+
# https://docs.djangoproject.com/en/1.7/topics/i18n/
7070

7171
LANGUAGE_CODE = 'en-us'
7272

@@ -80,7 +80,7 @@
8080

8181

8282
# Static files (CSS, JavaScript, Images)
83-
# https://docs.djangoproject.com/en/1.6/howto/static-files/
83+
# https://docs.djangoproject.com/en/1.7/howto/static-files/
8484

8585
STATIC_URL = '/static/'
8686

@@ -89,7 +89,7 @@
8989
)
9090

9191
# Template files
92-
# https://docs.djangoproject.com/en/1.6/topics/templates/
92+
# https://docs.djangoproject.com/en/1.7/topics/templates/
9393

9494
TEMPLATE_DIRS = (
9595
os.path.join(BASE_DIR, 'templates'),

myblog/myblog/urls.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
from django.conf.urls import patterns, include, url
2-
from myblog import views
3-
1+
from django.conf.urls import include, url
42
from django.contrib import admin
5-
admin.autodiscover()
63

7-
urlpatterns = patterns('',
8-
url(r'^$', views.home),
9-
url(r'^', include('blog.urls')),
4+
import blog.urls
5+
from . import views
6+
7+
urlpatterns = [
8+
url(r'^$', views.HomeView.as_view(), name='home'),
9+
url(r'^', include(blog.urls)),
1010
url(r'^admin/', include(admin.site.urls)),
11-
)
11+
]

myblog/myblog/views.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,3 @@
66
class HomeView(ListView):
77
template_name = 'index.html'
88
queryset = Entry.objects.order_by('-created_at')
9-
10-
home = HomeView.as_view()

myblog/myblog/wsgi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
It exposes the WSGI callable as a module-level variable named ``application``.
55
66
For more information on this file, see
7-
https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/
7+
https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
88
"""
99

1010
import os

myblog/requirements.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Django==1.6.2
21
coverage==3.7.1
3-
django-webtest==1.7.5
4-
WebTest==2.0.9
2+
Django==1.7
3+
WebTest==2.0.16
4+
django-webtest==1.7.7

0 commit comments

Comments
 (0)