##// END OF EJS Templates
Added localization (not fully working). Added tags posting. Changed the design a bit.
neko259 -
r24:bb515fee default
parent child Browse files
Show More
@@ -0,0 +1,38 b''
1 # SOME DESCRIPTIVE TITLE.
2 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 # This file is distributed under the same license as the PACKAGE package.
4 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5 #
6 #, fuzzy
7 msgid ""
8 msgstr ""
9 "Project-Id-Version: PACKAGE VERSION\n"
10 "Report-Msgid-Bugs-To: \n"
11 "POT-Creation-Date: 2013-04-05 20:55+0300\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n"
15 "Language: \n"
16 "MIME-Version: 1.0\n"
17 "Content-Type: text/plain; charset=UTF-8\n"
18 "Content-Transfer-Encoding: 8bit\n"
19 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
22 msgid "Title"
23 msgstr "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ"
24
25 msgid "Text"
26 msgstr "ВСкст"
27
28 msgid "Image"
29 msgstr "ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°"
30
31 msgid "Post"
32 msgstr "ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ"
33
34 msgid "Tags"
35 msgstr "Π’Π΅Π³ΠΈ"
36
37 msgid "View"
38 msgstr "ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€" No newline at end of file
@@ -12,7 +12,7 b" UNKNOWN_UA = ''"
12 12
13 13 class PostManager(models.Manager):
14 14 def create_post(self, title, text, image=None, parent_id=NO_PARENT,
15 ip=NO_IP):
15 ip=NO_IP, tags=None):
16 16 post = self.create(title=title,
17 17 text=text,
18 18 pub_time=timezone.now(),
@@ -21,6 +21,10 b' class PostManager(models.Manager):'
21 21 poster_ip=ip,
22 22 poster_user_agent=UNKNOWN_UA)
23 23
24 if tags:
25 for tag in tags:
26 post.tags.add(tag)
27
24 28 return post
25 29
26 30 def delete_post(self, post):
@@ -1,5 +1,6 b''
1 1 html {
2 2 background: #333;
3 color: #ffffff;
3 4 }
4 5
5 6 #admin_panel {
@@ -12,13 +13,18 b' html {'
12 13 color: #ffcc00;
13 14 }
14 15
15 .text {
16 color: #ffffff;
17 }
18
19 16 .post-form {
20 17 text-align: left;
21 18 color: #ffffff;
19 display: table;
20 }
21
22 .form-row {
23 display: table-row;
24 }
25
26 .form-input {
27 display: table-cell;
22 28 }
23 29
24 30 .link {
@@ -36,4 +42,12 b' html {'
36 42 .block {
37 43 display: inline-block;
38 44 vertical-align: top;
45 }
46
47 .tag {
48 color: #bb7766;
49 }
50
51 .tag:hover {
52 color: #dd8888;
39 53 } No newline at end of file
@@ -3,7 +3,7 b' from django.test.client import Client'
3 3
4 4 import boards
5 5
6 from boards.models import Post, Admin
6 from boards.models import Post, Admin, Tag
7 7
8 8
9 9 class BoardTests(TestCase):
@@ -95,3 +95,8 b' class BoardTests(TestCase):'
95 95 thread = Post.objects.get_thread(op_id)
96 96
97 97 self.assertEqual(3, len(thread))
98
99 def test_create_post_with_tag(self):
100 tag = Tag.objects.create(name='test_tag')
101 post = Post.objects.create_post(title='title', text='text', tags=[tag])
102 self.assertIsNotNone(post) No newline at end of file
@@ -12,9 +12,9 b" urlpatterns = patterns('',"
12 12 url(r'^logout$', views.logout, name='logout'),
13 13
14 14 # /boards/tag/
15 url(r'^tag/(?P<tag>\w+)/$', views.tag, name = 'tag'),
15 url(r'^tag/(?P<tag_name>\w+)/$', views.tag, name = 'tag'),
16 16 # /boards/post_id/
17 url(r'^thread/(?P<id>\w+)/$', views.thread, name = 'thread'),
17 url(r'^thread/(?P<post_id>\w+)/$', views.thread, name = 'thread'),
18 18 # /boards/tag/post/
19 19 url(r'^post.html$', views.new_post,
20 20 name='post'),
@@ -2,7 +2,7 b' from django.template import RequestConte'
2 2 from boards import forms
3 3 import boards
4 4 from boards.forms import NewThreadForm
5 from boards.models import Post, Admin
5 from boards.models import Post, Admin, Tag
6 6 from django.shortcuts import render, get_list_or_404, redirect
7 7 from django.http import HttpResponseRedirect, Http404
8 8
@@ -37,39 +37,57 b' def new_post(request, thread_id=boards.m'
37 37
38 38 ip = request.META['REMOTE_ADDR']
39 39
40 # TODO Get tags list, download image (if link is given)
40 tags = []
41 if thread_id == boards.models.NO_PARENT:
42 tag_strings = request.POST['tags']
43
44 if tag_strings:
45 tag_strings = tag_strings.split(',')
46 for tag_name in tag_strings:
47 tag_name = tag_name.strip()
48 if len(tag_name) > 0:
49 tag, created = Tag.objects.get_or_create(name=tag_name)
50 tags.append(tag)
51
52 # TODO Add a possibility to define a link image instead of an image file.
53 # If a link is given, download the image automatically.
41 54
42 55 post = Post.objects.create_post(title=title, text=text, ip=ip,
43 parent_id=thread_id, image=image)
56 parent_id=thread_id, image=image,
57 tags=tags)
44 58
45 59 thread_to_show = (post.id if thread_id == boards.models.NO_PARENT else
46 60 thread_id)
47 return redirect(thread, id=thread_to_show)
61 return redirect(thread, post_id=thread_to_show)
48 62
49 63
50 def tag(request):
64 def tag(request, tag_name):
51 65 """Get all tag threads (posts without a parent)."""
52 66
53 tag_name = request.GET['tag']
67 tag = Tag.objects.get(name=tag_name)
68 threads = get_list_or_404(Post, tags=tag)
54 69
55 threads = get_list_or_404(Post, tag=tag_name)
56
70 if request.method == 'POST':
71 return new_post(request)
72 else:
57 73 context = RequestContext(request)
58 74 context['threads'] = None if len(threads) == 0 else threads
59 75 context['tag'] = tag_name
60 76
77 context['form'] = forms.NewThreadForm(initial={'tags': tag_name})
78
61 79 return render(request, 'posting_general.html',
62 80 context)
63 81
64 82
65 def thread(request, id):
83 def thread(request, post_id):
66 84 """Get all thread posts"""
67 85
68 86 if request.method == 'POST':
69 return new_post(request, id)
87 return new_post(request, post_id)
70 88 else:
71 89 # TODO Show 404 if there is no such thread
72 posts = Post.objects.get_thread(id)
90 posts = Post.objects.get_thread(post_id)
73 91
74 92 context = RequestContext(request)
75 93 context['posts'] = posts
@@ -1,5 +1,7 b''
1 1 {% extends "base.html" %}
2 2
3 {% load i18n %}
4
3 5 {% block content %}
4 6
5 7 {% if threads %}
@@ -14,21 +16,46 b''
14 16 <div class="block">
15 17 <span class="title">{{ thread.title }}</span>
16 18 <a class="link" href="/thread/{{ thread.id }}/">
17 [View]</a><br />
18 <span class="text">{{ thread.text }}</span><br />
19 [{% trans "View" %}]</a><br />
20 {{ thread.text }}<br />
21 {% if thread.tags %}
22 <span class="tags">{% trans 'Tags' %}:
23 {% for tag in thread.tags.all %}
24 <a class="tag" href="/tag/{{ tag.name }}">
25 {{ tag.name }}</a>
26 {% endfor %}
27 </span>
28 {% endif %}
19 29 </div>
20 30 <hr />
21 31 {% endfor %}
22 32 {% else %}
23 <span class="text">No threads found.</span>
33 No threads found.
24 34 <hr />
25 35 {% endif %}
26 36
27 37 <div class="post-form">
38 <div class="post-form">
28 39 <form enctype="multipart/form-data" method="post">{% csrf_token %}
29 {{ form.as_p }}
30 <input type="submit" value="Post!" />
40 <div class="form-row">
41 <div class="form-input">{% trans 'Title' %}</div>
42 <div class="form-input">{{ form.title }}</div>
43 </div>
44 <div class="form-row">
45 <div class="form-input">{% trans 'Text' %}</div>
46 <div class="form-input">{{ form.text }}</div>
47 </div>
48 <div class="form-row">
49 <div class="form-input">{% trans 'Image' %}</div>
50 <div class="form-input">{{ form.image }}</div>
51 </div>
52 <div class="form-row">
53 <div class="form-input">{% trans 'Tags' %}</div>
54 <div class="form-input">{{ form.tags }}</div>
55 </div>
56 <input type="submit" value="{% trans 'Post' %}" />
31 57 </form>
32 58 </div>
59 </div>
33 60
34 61 {% endblock %} No newline at end of file
@@ -1,5 +1,7 b''
1 1 {% extends "base.html" %}
2 2
3 {% load i18n %}
4
3 5 {% block content %}
4 6
5 7 {% if posts %}
@@ -14,7 +16,15 b''
14 16 <div class="block">
15 17 <span class="title">{{ post.title }}</span>
16 18 <span class="post_id">(#{{ post.id }})</span><br />
17 <span class="text">{{ post.text }}</span><br />
19 {{ post.text }}<br />
20 {% if post.tags %}
21 <span class="tags">{% trans 'Tags' %}:
22 {% for tag in post.tags.all %}
23 <a class="tag" href="/tag/{{ tag.name }}">
24 {{ tag.name }}</a>
25 {% endfor %}
26 </span>
27 {% endif %}
18 28 </div>
19 29 <hr />
20 30 {% endfor %}
@@ -25,8 +35,19 b''
25 35
26 36 <div class="post-form">
27 37 <form enctype="multipart/form-data" method="post">{% csrf_token %}
28 {{ form.as_p }}
29 <input type="submit" value="Post!" />
38 <div class="form-row">
39 <div class="form-input">{% trans 'Title' %}</div>
40 <div class="form-input">{{ form.title }}</div>
41 </div>
42 <div class="form-row">
43 <div class="form-input">{% trans 'Text' %}</div>
44 <div class="form-input">{{ form.text }}</div>
45 </div>
46 <div class="form-row">
47 <div class="form-input">{% trans 'Image' %}</div>
48 <div class="form-input">{{ form.image }}</div>
49 </div>
50 <input type="submit" value="{% trans 'Post' %}" />
30 51 </form>
31 52 </div>
32 53
General Comments 0
You need to be logged in to leave comments. Login now