diff --git a/boards/forms.py b/boards/forms.py --- a/boards/forms.py +++ b/boards/forms.py @@ -1,10 +1,9 @@ import re from django import forms from django.forms.util import ErrorList +from boards.models import TITLE_MAX_LENGTH from neboard import settings -TITLE_MAX_LENGTH = 50 - class PlainErrorList(ErrorList): def __unicode__(self): diff --git a/boards/models.py b/boards/models.py --- a/boards/models.py +++ b/boards/models.py @@ -12,6 +12,11 @@ from markupfield.fields import MarkupFie from neboard import settings import thumbs +IMAGE_THUMB_SIZE = (200, 150) + +TITLE_MAX_LENGTH = 50 + +DEFAULT_MARKUP_TYPE = 'markdown' NO_PARENT = -1 NO_IP = '0.0.0.0' @@ -38,8 +43,7 @@ class PostManager(models.Manager): last_edit_time=timezone.now()) if tags: - for tag in tags: - post.tags.add(tag) + map(post.tags.add, tags) if parent_id != NO_PARENT: self._bump_thread(parent_id) @@ -64,6 +68,10 @@ class PostManager(models.Manager): threads = self.filter(parent=NO_PARENT, tags=tag) else: threads = self.filter(parent=NO_PARENT) + + if not threads: + raise Http404 + threads = threads.order_by('-last_edit_time') if page != ALL_PAGES: @@ -78,9 +86,9 @@ class PostManager(models.Manager): return threads def get_thread(self, opening_post_id): - opening_post = self.get(id=opening_post_id) - - if not opening_post: + try: + opening_post = self.get(id=opening_post_id) + except Post.DoesNotExist: raise Http404 if opening_post.parent == NO_PARENT: @@ -200,11 +208,12 @@ class Post(models.Model): return os.path.join(path, new_name) - title = models.CharField(max_length=50) + title = models.CharField(max_length=TITLE_MAX_LENGTH) pub_time = models.DateTimeField() - text = MarkupField(default_markup_type='markdown', escape_html=True) + text = MarkupField(default_markup_type=DEFAULT_MARKUP_TYPE, + escape_html=True) image = thumbs.ImageWithThumbsField(upload_to=_update_image_filename, - blank=True, sizes=((200, 150),)) + blank=True, sizes=(IMAGE_THUMB_SIZE,)) poster_ip = models.IPAddressField() poster_user_agent = models.TextField() parent = models.BigIntegerField() @@ -212,7 +221,8 @@ class Post(models.Model): last_edit_time = models.DateTimeField() def __unicode__(self): - return self.title + ' (' + self.text.raw + ')' + return '#' + str(self.id) + ' ' + self.title + ' (' + self.text.raw + \ + ')' def _get_replies(self): return Post.objects.filter(parent=self.id) diff --git a/boards/tests.py b/boards/tests.py --- a/boards/tests.py +++ b/boards/tests.py @@ -10,8 +10,12 @@ from neboard import settings TEST_TEXT = 'test text' NEW_THREAD_PAGE = '/' -THREAD_PAGE = '/thread/1/' +THREAD_PAGE_ONE = '/thread/1/' +THREAD_PAGE = '/thread/' +TAG_PAGE = '/tag/' HTTP_CODE_REDIRECT = 302 +HTTP_CODE_OK = 200 +HTTP_CODE_NOT_FOUND = 404 class BoardTests(TestCase): @@ -162,11 +166,45 @@ class BoardTests(TestCase): self.assertEqual(1, Post.objects.count(), msg='The validation passed ' 'where it should fail') - response = client.post(THREAD_PAGE, {'text': TEST_TEXT, + response = client.post(THREAD_PAGE_ONE, {'text': TEST_TEXT, 'tags': valid_tags}) - self.assertEqual(response.status_code, HTTP_CODE_REDIRECT, - msg='Posting new message failed: got code ' + + self.assertEqual(HTTP_CODE_REDIRECT, response.status_code, + msg=u'Posting new message failed: got code ' + str(response.status_code)) self.assertEqual(2, Post.objects.count(), - msg='No posts were created') \ No newline at end of file + msg=u'No posts were created') + + def test_404(self): + """Test receiving error 404 when opening a non-existent page""" + + Post.objects.all().delete() + Tag.objects.all().delete() + + tag_name = u'test_tag' + tags, = [Tag.objects.get_or_create(name=tag_name)] + client = Client() + + Post.objects.create_post('title', TEST_TEXT, tags=tags) + + existing_post_id = Post.objects.all()[0].id + response_existing = client.get(THREAD_PAGE + str(existing_post_id) + + '/') + self.assertEqual(HTTP_CODE_OK, response_existing.status_code, + u'Cannot open existing thread') + + response_not_existing = client.get(THREAD_PAGE + str( + existing_post_id + 1) + '/') + self.assertEqual(HTTP_CODE_NOT_FOUND, + response_not_existing.status_code, + u'Not existing thread is opened') + + response_existing = client.get(TAG_PAGE + tag_name + '/') + self.assertEqual(HTTP_CODE_OK, + response_existing.status_code, + u'Cannot open existing tag') + + response_not_existing = client.get(TAG_PAGE + u'not_tag' + '/') + self.assertEqual(HTTP_CODE_NOT_FOUND, + response_not_existing.status_code, + u'Not existing tag is opened') \ No newline at end of file diff --git a/boards/views.py b/boards/views.py --- a/boards/views.py +++ b/boards/views.py @@ -1,6 +1,6 @@ from django.core.urlresolvers import reverse from django.template import RequestContext -from django.shortcuts import render, redirect +from django.shortcuts import render, redirect, get_object_or_404 from django.http import HttpResponseRedirect from boards import forms @@ -83,7 +83,7 @@ def _new_post(request, form, thread_id=b def tag(request, tag_name, page=0): """Get all tag threads (posts without a parent).""" - tag = Tag.objects.get(name=tag_name) + tag = get_object_or_404(Tag, name=tag_name) threads = Post.objects.get_threads(tag=tag, page=int(page)) if request.method == 'POST':