Skip to content
This repository has been archived by the owner on May 7, 2019. It is now read-only.

Commit

Permalink
Added create and show views
Browse files Browse the repository at this point in the history
  • Loading branch information
nylar committed May 16, 2015
1 parent 2b98078 commit c9e9a35
Show file tree
Hide file tree
Showing 8 changed files with 150 additions and 1 deletion.
1 change: 1 addition & 0 deletions fora/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@

urlpatterns = [
url(r'^forums/', include('forums.urls', namespace='forums')),
url(r'^threads/', include('threads.urls', namespace='threads')),
]
1 change: 1 addition & 0 deletions threads/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,4 @@ def __unicode__(self):
def generate_slug(sender, instance, created, **kwargs):
if created:
instance.slug = HASHER.encode(instance.pk)
instance.save()
3 changes: 3 additions & 0 deletions threads/templates/threads/thread_detail.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<h1>{{ object.subject }}</h1>
<p>Forum: <a href="{% url 'forums:show' object.forum.slug %}"></a></p>
<p>{{ object.created }}</p>
5 changes: 5 additions & 0 deletions threads/templates/threads/thread_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Create Thread" />
</form>
33 changes: 33 additions & 0 deletions threads/tests/test_urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from django.core.urlresolvers import reverse
from django.test import Client
from forums.models import Forum
from threads.models import Thread
from .base import BaseThreadTestCase


class ThreadUrlsTestCase(BaseThreadTestCase):

def setUp(self):
super(ThreadUrlsTestCase, self).setUp()
self.client = Client()

def test_new_url(self):
response = self.client.get(reverse('threads:new'))
self.assertEqual(response.status_code, 200)

def test_show_url(self):
forum = Forum.objects.create(
name='Forum',
description='A forum',
active=True,
)
thread = Thread.objects.create(subject='Thread', forum=forum)

response = self.client.get(reverse(
'threads:show', kwargs={'slug': thread.slug}))
self.assertEqual(response.status_code, 200)

def test_show_url_not_valid(self):
response = self.client.get(reverse(
'threads:show', kwargs={'slug': 'does-not-exist'}))
self.assertEqual(response.status_code, 404)
64 changes: 64 additions & 0 deletions threads/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
from .base import BaseThreadTestCase
from django.core.urlresolvers import reverse
from django.test import RequestFactory
from forums.models import Forum
from threads.models import Thread
from threads.views import NewThreadView, ShowThreadView


class NewThreadViewTestCase(BaseThreadTestCase):

def setUp(self):
self.factory = RequestFactory()
super(NewThreadViewTestCase, self).setUp()

def test_get_new_view(self):
request = self.factory.get('/')
response = NewThreadView.as_view()(request)
response.render()

self.assertEqual(response.status_code, 200)
self.assertIn(
'<label for="id_subject">Subject:</label>',
response.content
)
self.assertIn(
'<label for="id_forum">Forum:</label>',
response.content
)

def test_post_form(self):
forum = Forum.objects.create(name='My Forum', description='Hello World')
request = self.factory.post(reverse('threads:new'), data={
'subject': 'My thread',
'forum': forum.pk
})
response = NewThreadView.as_view()(request)

thread = Thread.objects.get(pk=1)

self.assertEqual(response.status_code, 302)
self.assertEqual(response.url, reverse(
'threads:show', kwargs={'slug': thread.slug}))


class ShowThreadViewTestCase(BaseThreadTestCase):

def setUp(self):
self.factory = RequestFactory()
super(ShowThreadViewTestCase, self).setUp()

def test_show_view(self):
forum = Forum.objects.create(
name='Forum',
description='A forum',
active=True,
)
thread = Thread.objects.create(subject='Thread', forum=forum)

request = self.factory.get('/')
response = ShowThreadView.as_view()(request, slug=thread.slug)
response.render()

self.assertEqual(response.status_code, 200)
self.assertIn(thread.subject, response.content)
16 changes: 16 additions & 0 deletions threads/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from django.conf.urls import url
from threads.views import NewThreadView, ShowThreadView


urlpatterns = [
url(
r'^new/$',
NewThreadView.as_view(),
name='new'
),
url(
r'^(?P<slug>[\w-]+)/$',
ShowThreadView.as_view(),
name='show'
),
]
28 changes: 27 additions & 1 deletion threads/views.py
Original file line number Diff line number Diff line change
@@ -1 +1,27 @@
# Create your views here.
from django.core.urlresolvers import reverse
from django.http import Http404
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView
from threads.models import Thread


class ThreadMixin(object):

def get_object(self):
slug = self.kwargs.get('slug')
try:
return Thread.objects.get(slug=slug)
except Thread.DoesNotExist:
raise Http404('No Thread matches the given query.')


class NewThreadView(CreateView):
model = Thread
fields = ['subject', 'forum']

def get_success_url(self):
return reverse('threads:show', kwargs={'slug': self.object.slug})


class ShowThreadView(ThreadMixin, DetailView):
model = Thread

0 comments on commit c9e9a35

Please sign in to comment.