##// END OF EJS Templates
Merged with default branch
neko259 -
r137:fe230882 merge 1.1
parent child Browse files
Show More
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,32 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-08-27 23:21+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 #: static/js/thread.js:17
23 msgid "Normal"
24 msgstr "Нормальный"
25
26 #: static/js/thread.js:24
27 msgid "Gallery"
28 msgstr "Галерея"
29
30 #: static/js/thread.js:125
31 msgid "Replies"
32 msgstr "Ответы"
@@ -0,0 +1,95 b''
1 # -*- coding: utf-8 -*-
2 import datetime
3 from south.db import db
4 from south.v2 import SchemaMigration
5 from django.db import models
6
7
8 class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Adding model 'Tag'
12 db.create_table(u'boards_tag', (
13 (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
14 ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
15 ))
16 db.send_create_signal(u'boards', ['Tag'])
17
18 # Adding model 'Post'
19 db.create_table(u'boards_post', (
20 (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
21 ('title', self.gf('django.db.models.fields.CharField')(max_length=50)),
22 ('pub_time', self.gf('django.db.models.fields.DateTimeField')()),
23 ('text', self.gf('markupfield.fields.MarkupField')(rendered_field=True)),
24 ('text_markup_type', self.gf('django.db.models.fields.CharField')(default='markdown', max_length=30)),
25 ('image', self.gf('boards.thumbs.ImageWithThumbsField')(max_length=100, blank=True)),
26 ('poster_ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15)),
27 ('_text_rendered', self.gf('django.db.models.fields.TextField')()),
28 ('poster_user_agent', self.gf('django.db.models.fields.TextField')()),
29 ('parent', self.gf('django.db.models.fields.BigIntegerField')()),
30 ('last_edit_time', self.gf('django.db.models.fields.DateTimeField')()),
31 ))
32 db.send_create_signal(u'boards', ['Post'])
33
34 # Adding M2M table for field tags on 'Post'
35 m2m_table_name = db.shorten_name(u'boards_post_tags')
36 db.create_table(m2m_table_name, (
37 ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
38 ('post', models.ForeignKey(orm[u'boards.post'], null=False)),
39 ('tag', models.ForeignKey(orm[u'boards.tag'], null=False))
40 ))
41 db.create_unique(m2m_table_name, ['post_id', 'tag_id'])
42
43 # Adding model 'Admin'
44 db.create_table(u'boards_admin', (
45 (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
46 ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
47 ('password', self.gf('django.db.models.fields.CharField')(max_length=100)),
48 ))
49 db.send_create_signal(u'boards', ['Admin'])
50
51
52 def backwards(self, orm):
53 # Deleting model 'Tag'
54 db.delete_table(u'boards_tag')
55
56 # Deleting model 'Post'
57 db.delete_table(u'boards_post')
58
59 # Removing M2M table for field tags on 'Post'
60 db.delete_table(db.shorten_name(u'boards_post_tags'))
61
62 # Deleting model 'Admin'
63 db.delete_table(u'boards_admin')
64
65
66 models = {
67 u'boards.admin': {
68 'Meta': {'object_name': 'Admin'},
69 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
70 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
71 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'})
72 },
73 u'boards.post': {
74 'Meta': {'object_name': 'Post'},
75 '_text_rendered': ('django.db.models.fields.TextField', [], {}),
76 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
77 'image': ('boards.thumbs.ImageWithThumbsField', [], {'max_length': '100', 'blank': 'True'}),
78 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}),
79 'parent': ('django.db.models.fields.BigIntegerField', [], {}),
80 'poster_ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
81 'poster_user_agent': ('django.db.models.fields.TextField', [], {}),
82 'pub_time': ('django.db.models.fields.DateTimeField', [], {}),
83 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['boards.Tag']", 'symmetrical': 'False'}),
84 'text': ('markupfield.fields.MarkupField', [], {'rendered_field': 'True'}),
85 'text_markup_type': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '30'}),
86 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
87 },
88 u'boards.tag': {
89 'Meta': {'object_name': 'Tag'},
90 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
91 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
92 }
93 }
94
95 complete_apps = ['boards'] No newline at end of file
@@ -0,0 +1,64 b''
1 # -*- coding: utf-8 -*-
2 import datetime
3 from south.db import db
4 from south.v2 import SchemaMigration
5 from django.db import models
6
7
8 class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Adding model 'Ban'
12 db.create_table(u'boards_ban', (
13 (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
14 ('ip', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39)),
15 ))
16 db.send_create_signal(u'boards', ['Ban'])
17
18
19 # Changing field 'Post.poster_ip'
20 db.alter_column(u'boards_post', 'poster_ip', self.gf('django.db.models.fields.GenericIPAddressField')(max_length=39))
21
22 def backwards(self, orm):
23 # Deleting model 'Ban'
24 db.delete_table(u'boards_ban')
25
26
27 # Changing field 'Post.poster_ip'
28 db.alter_column(u'boards_post', 'poster_ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15))
29
30 models = {
31 u'boards.admin': {
32 'Meta': {'object_name': 'Admin'},
33 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
34 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
35 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'})
36 },
37 u'boards.ban': {
38 'Meta': {'object_name': 'Ban'},
39 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
40 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'})
41 },
42 u'boards.post': {
43 'Meta': {'object_name': 'Post'},
44 '_text_rendered': ('django.db.models.fields.TextField', [], {}),
45 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
46 'image': ('boards.thumbs.ImageWithThumbsField', [], {'max_length': '100', 'blank': 'True'}),
47 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}),
48 'parent': ('django.db.models.fields.BigIntegerField', [], {}),
49 'poster_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
50 'poster_user_agent': ('django.db.models.fields.TextField', [], {}),
51 'pub_time': ('django.db.models.fields.DateTimeField', [], {}),
52 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['boards.Tag']", 'symmetrical': 'False'}),
53 'text': ('markupfield.fields.MarkupField', [], {'rendered_field': 'True'}),
54 'text_markup_type': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '30'}),
55 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
56 },
57 u'boards.tag': {
58 'Meta': {'object_name': 'Tag'},
59 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
60 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
61 }
62 }
63
64 complete_apps = ['boards'] No newline at end of file
@@ -0,0 +1,66 b''
1 # -*- coding: utf-8 -*-
2 import datetime
3 from south.db import db
4 from south.v2 import SchemaMigration
5 from django.db import models
6
7
8 class Migration(SchemaMigration):
9
10 def forwards(self, orm):
11 # Adding field 'Post.image_width'
12 db.add_column(u'boards_post', 'image_width',
13 self.gf('django.db.models.fields.IntegerField')(default=0),
14 keep_default=False)
15
16 # Adding field 'Post.image_height'
17 db.add_column(u'boards_post', 'image_height',
18 self.gf('django.db.models.fields.IntegerField')(default=0),
19 keep_default=False)
20
21
22 def backwards(self, orm):
23 # Deleting field 'Post.image_width'
24 db.delete_column(u'boards_post', 'image_width')
25
26 # Deleting field 'Post.image_height'
27 db.delete_column(u'boards_post', 'image_height')
28
29
30 models = {
31 u'boards.admin': {
32 'Meta': {'object_name': 'Admin'},
33 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
34 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
35 'password': ('django.db.models.fields.CharField', [], {'max_length': '100'})
36 },
37 u'boards.ban': {
38 'Meta': {'object_name': 'Ban'},
39 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
40 'ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'})
41 },
42 u'boards.post': {
43 'Meta': {'object_name': 'Post'},
44 '_text_rendered': ('django.db.models.fields.TextField', [], {}),
45 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
46 'image': ('boards.thumbs.ImageWithThumbsField', [], {'max_length': '100', 'blank': 'True'}),
47 'image_height': ('django.db.models.fields.IntegerField', [], {}),
48 'image_width': ('django.db.models.fields.IntegerField', [], {}),
49 'last_edit_time': ('django.db.models.fields.DateTimeField', [], {}),
50 'parent': ('django.db.models.fields.BigIntegerField', [], {}),
51 'poster_ip': ('django.db.models.fields.GenericIPAddressField', [], {'max_length': '39'}),
52 'poster_user_agent': ('django.db.models.fields.TextField', [], {}),
53 'pub_time': ('django.db.models.fields.DateTimeField', [], {}),
54 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['boards.Tag']", 'symmetrical': 'False'}),
55 'text': ('markupfield.fields.MarkupField', [], {'rendered_field': 'True'}),
56 'text_markup_type': ('django.db.models.fields.CharField', [], {'default': "'markdown'", 'max_length': '30'}),
57 'title': ('django.db.models.fields.CharField', [], {'max_length': '50'})
58 },
59 u'boards.tag': {
60 'Meta': {'object_name': 'Tag'},
61 u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
62 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
63 }
64 }
65
66 complete_apps = ['boards'] No newline at end of file
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,38 b''
1 function addRefLinkMap() {
2 var postByNum = [], refMap = [];
3
4 $('.post').each(function() {
5 var self = $(this);
6
7 var postNum = self.attr('id');
8 //add post by id
9 postByNum[postNum] = self;
10 //add ref link
11 self.find('p').children('a').each(function() {
12 if($(this).text().indexOf('>>') == 0) {
13 var refNum = $(this).text().match(/\d+/);
14
15 if(postByNum[refNum]) {
16 if(!refMap[refNum])
17 refMap[refNum] = [];
18
19 //if !exist
20 if((',' + refMap[refNum].toString() + ',').indexOf(',' + postNum + ',') < 0) {
21 refMap[refNum].push(postNum);
22 };
23 }
24 }
25 });
26 });
27
28 var label_replies = gettext('Replies') + ':';
29 for(var pNum in refMap) {
30 if(typeof refMap[pNum] === 'object') {
31 //append refmap panel
32 if(!$("#refmap_"+pNum).length) {
33 var data = label_replies + refMap[pNum].toString().replace(/(\d+)/g, ' <a href="/jump/$1/">>>$1</a>');
34 $('#'+pNum+'').find('.message').after($('<div class="refmap" id="refmap_'+pNum+'">'+data+'</div>'));
35 }
36 }
37 }
38 }
@@ -1,6 +1,7 b''
1 from django.contrib import admin
1 from django.contrib import admin
2 from boards.models import Post, Tag, User
2 from boards.models import Post, Tag, User, Ban
3
3
4 admin.site.register(Post)
4 admin.site.register(Post)
5 admin.site.register(Tag)
5 admin.site.register(Tag)
6 admin.site.register(User)
6 admin.site.register(User)
7 admin.site.register(Ban)
@@ -10,5 +10,15 b' authors = {'
10 'name': 'Ilyas Babayev',
10 'name': 'Ilyas Babayev',
11 'contacts': ['zamesilyasa@gmail.com'],
11 'contacts': ['zamesilyasa@gmail.com'],
12 'roles': ['author', 'developer'],
12 'roles': ['author', 'developer'],
13 }
13 },
14 'ritsufag': {
15 'name': 'Aiko Kirino',
16 'contacts': ['ritsufag@gmail.com'],
17 'roles': ['javascript developer', 'designer'],
18 },
19 'Tenno Seremel': {
20 'name': 'anonymous',
21 'contacts': ['html@serenareem.net'],
22 'roles': ['javascript developer', 'designer'],
23 },
14 } No newline at end of file
24 }
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -7,7 +7,7 b' msgid ""'
7 msgstr ""
7 msgstr ""
8 "Project-Id-Version: PACKAGE VERSION\n"
8 "Project-Id-Version: PACKAGE VERSION\n"
9 "Report-Msgid-Bugs-To: \n"
9 "Report-Msgid-Bugs-To: \n"
10 "POT-Creation-Date: 2013-08-21 20:49+0300\n"
10 "POT-Creation-Date: 2013-08-30 18:54+0300\n"
11 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
11 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 "Language-Team: LANGUAGE <LL@li.org>\n"
13 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,6 +18,14 b' msgstr ""'
18 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
18 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
20
20
21 #: templates/boards/404.html:6
22 msgid "Not found"
23 msgstr "Не найдено"
24
25 #: templates/boards/404.html:12
26 msgid "This page does not exist"
27 msgstr "Этой страницы не существует"
28
21 #: templates/boards/authors.html:6
29 #: templates/boards/authors.html:6
22 msgid "Authors"
30 msgid "Authors"
23 msgstr "Авторы"
31 msgstr "Авторы"
@@ -34,19 +42,27 b' msgstr "\xd0\xbb\xd0\xb8\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb7\xd0\xb8\xd0\xb5\xd0\xb9"'
34 msgid "Repository"
42 msgid "Repository"
35 msgstr "Репозиторий"
43 msgstr "Репозиторий"
36
44
45 #: templates/boards/banned.html:6
46 msgid "Banned"
47 msgstr "Заблокирован"
48
49 #: templates/boards/banned.html:11
50 msgid "Your IP address has been banned. Contact the administrator"
51 msgstr "Ваш IP адрес был заблокирован. Свяжитесь с администратором"
52
37 #: templates/boards/base.html:12
53 #: templates/boards/base.html:12
38 msgid "Feed"
54 msgid "Feed"
39 msgstr "Лента"
55 msgstr "Лента"
40
56
41 #: templates/boards/base.html:27
57 #: templates/boards/base.html:36
42 msgid "All threads"
58 msgid "All threads"
43 msgstr "Все темы"
59 msgstr "Все темы"
44
60
45 #: templates/boards/base.html:33
61 #: templates/boards/base.html:42
46 msgid "Settings"
62 msgid "Settings"
47 msgstr "Настройки"
63 msgstr "Настройки"
48
64
49 #: templates/boards/base.html:41
65 #: templates/boards/base.html:50
50 msgid "Up"
66 msgid "Up"
51 msgstr "Вверх"
67 msgstr "Вверх"
52
68
@@ -55,12 +71,12 b' msgid "Tag: "'
55 msgstr "Тег: "
71 msgstr "Тег: "
56
72
57 #: templates/boards/posting_general.html:35
73 #: templates/boards/posting_general.html:35
58 #: templates/boards/posting_general.html:87 templates/boards/thread.html:27
74 #: templates/boards/posting_general.html:81 templates/boards/thread.html:27
59 #: templates/boards/rss/post.html:5
75 #: templates/boards/rss/post.html:5
60 msgid "Post image"
76 msgid "Post image"
61 msgstr "Изображение сообщения"
77 msgstr "Изображение сообщения"
62
78
63 #: templates/boards/posting_general.html:46
79 #: templates/boards/posting_general.html:48
64 msgid "Reply"
80 msgid "Reply"
65 msgstr "Ответ"
81 msgstr "Ответ"
66
82
@@ -68,50 +84,50 b' msgstr "\xd0\x9e\xd1\x82\xd0\xb2\xd0\xb5\xd1\x82"'
68 msgid "Delete"
84 msgid "Delete"
69 msgstr "Удалить"
85 msgstr "Удалить"
70
86
71 #: templates/boards/posting_general.html:61 templates/boards/thread.html:119
87 #: templates/boards/posting_general.html:55 templates/boards/thread.html:108
72 msgid "replies"
88 msgid "replies"
73 msgstr "ответов"
89 msgstr "ответов"
74
90
75 #: templates/boards/posting_general.html:62 templates/boards/thread.html:120
91 #: templates/boards/posting_general.html:56 templates/boards/thread.html:109
76 msgid "images"
92 msgid "images"
77 msgstr "изображений"
93 msgstr "изображений"
78
94
79 #: templates/boards/posting_general.html:64
95 #: templates/boards/posting_general.html:58
80 #: templates/boards/posting_general.html:135 templates/boards/thread.html:59
96 #: templates/boards/posting_general.html:131 templates/boards/thread.html:48
81 #: templates/boards/rss/post.html:10
97 #: templates/boards/rss/post.html:10
82 msgid "Tags"
98 msgid "Tags"
83 msgstr "Теги"
99 msgstr "Теги"
84
100
85 #: templates/boards/posting_general.html:117
101 #: templates/boards/posting_general.html:113
86 msgid "Create new thread"
102 msgid "Create new thread"
87 msgstr "Создать новую тему"
103 msgstr "Создать новую тему"
88
104
89 #: templates/boards/posting_general.html:120 templates/boards/thread.html:81
105 #: templates/boards/posting_general.html:116 templates/boards/thread.html:70
90 msgid "Title"
106 msgid "Title"
91 msgstr "Заголовок"
107 msgstr "Заголовок"
92
108
93 #: templates/boards/posting_general.html:125 templates/boards/thread.html:86
109 #: templates/boards/posting_general.html:121 templates/boards/thread.html:75
94 msgid "Text"
110 msgid "Text"
95 msgstr "Текст"
111 msgstr "Текст"
96
112
97 #: templates/boards/posting_general.html:130 templates/boards/thread.html:91
113 #: templates/boards/posting_general.html:126 templates/boards/thread.html:80
98 msgid "Image"
114 msgid "Image"
99 msgstr "Изображение"
115 msgstr "Изображение"
100
116
101 #: templates/boards/posting_general.html:145 templates/boards/thread.html:102
117 #: templates/boards/posting_general.html:141 templates/boards/thread.html:91
102 msgid "Post"
118 msgid "Post"
103 msgstr "Отправить"
119 msgstr "Отправить"
104
120
105 #: templates/boards/posting_general.html:147
121 #: templates/boards/posting_general.html:143
106 msgid "Tags must be delimited by spaces. Text or image is required."
122 msgid "Tags must be delimited by spaces. Text or image is required."
107 msgstr ""
123 msgstr ""
108 "Теги должны быть разделены пробелами. Текст или изображение обязательны."
124 "Теги должны быть разделены пробелами. Текст или изображение обязательны."
109
125
110 #: templates/boards/posting_general.html:150 templates/boards/thread.html:104
126 #: templates/boards/posting_general.html:146 templates/boards/thread.html:93
111 msgid "Basic markdown syntax."
127 msgid "Basic markdown syntax."
112 msgstr "Базовый синтаксис markdown."
128 msgstr "Базовый синтаксис markdown."
113
129
114 #: templates/boards/posting_general.html:160
130 #: templates/boards/posting_general.html:156
115 msgid "Pages:"
131 msgid "Pages:"
116 msgstr "Страницы: "
132 msgstr "Страницы: "
117
133
@@ -139,34 +155,37 b' msgstr "\xd1\x82\xd0\xb5\xd0\xb3\xd0\xbe\xd0\xb2"'
139 msgid "Get!"
155 msgid "Get!"
140 msgstr "Гет!"
156 msgstr "Гет!"
141
157
142 #: templates/boards/thread.html:78
158 #: templates/boards/thread.html:67
143 msgid "Reply to thread"
159 msgid "Reply to thread"
144 msgstr "Ответить в тему"
160 msgstr "Ответить в тему"
145
161
146 #: templates/boards/thread.html:105
162 #: templates/boards/thread.html:94
147 msgid "Example: "
163 msgid "Example: "
148 msgstr "Пример: "
164 msgstr "Пример: "
149
165
150 #: templates/boards/thread.html:105
166 #: templates/boards/thread.html:94
151 msgid "italic"
167 msgid "italic"
152 msgstr "курсив"
168 msgstr "курсив"
153
169
154 #: templates/boards/thread.html:106
170 #: templates/boards/thread.html:95
155 msgid "bold"
171 msgid "bold"
156 msgstr "полужирный"
172 msgstr "полужирный"
157
173
158 #: templates/boards/thread.html:107
174 #: templates/boards/thread.html:96
159 msgid "Quotes can be inserted with"
175 msgid "Quotes can be inserted with"
160 msgstr "Цитаты могут быть вставлены при помощи"
176 msgstr "Цитаты могут быть вставлены при помощи"
161
177
162 #: templates/boards/thread.html:108
178 #: templates/boards/thread.html:97
163 msgid "Links to answers can be inserted with"
179 msgid "Links to answers can be inserted with"
164 msgstr "Ссылки на ответы могут быть вставлены с помощью"
180 msgstr "Ссылки на ответы могут быть вставлены с помощью"
165
181
166 #: templates/boards/thread.html:121
182 #: templates/boards/thread.html:110
167 msgid "Last update: "
183 msgid "Last update: "
168 msgstr "Последнее обновление: "
184 msgstr "Последнее обновление: "
169
185
186 #~ msgid "Get!"
187 #~ msgstr "Гет!"
188
170 #~ msgid "View"
189 #~ msgid "View"
171 #~ msgstr "Просмотр"
190 #~ msgstr "Просмотр"
172
191
@@ -178,3 +197,9 b' msgstr "\xd0\x9f\xd0\xbe\xd1\x81\xd0\xbb\xd0\xb5\xd0\xb4\xd0\xbd\xd0\xb5\xd0\xb5 \xd0\xbe\xd0\xb1\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5: "'
178
197
179 #~ msgid "developer"
198 #~ msgid "developer"
180 #~ msgstr "разработчик"
199 #~ msgstr "разработчик"
200
201 #~ msgid "javascript developer"
202 #~ msgstr "разработчик javascript"
203
204 #~ msgid "designer"
205 #~ msgstr "дизайнер"
@@ -27,14 +27,10 b' OPENING_POST_POPULARITY_WEIGHT = 2'
27 IMAGES_DIRECTORY = 'images/'
27 IMAGES_DIRECTORY = 'images/'
28 FILE_EXTENSION_DELIMITER = '.'
28 FILE_EXTENSION_DELIMITER = '.'
29
29
30 REGEX_PRETTY = re.compile(r'^\d(0)+$')
31 REGEX_SAME = re.compile(r'^(.)\1+$')
32
33 RANK_ADMIN = 0
30 RANK_ADMIN = 0
34 RANK_MODERATOR = 10
31 RANK_MODERATOR = 10
35 RANK_USER = 100
32 RANK_USER = 100
36
33
37
38 class PostManager(models.Manager):
34 class PostManager(models.Manager):
39 def create_post(self, title, text, image=None, parent_id=NO_PARENT,
35 def create_post(self, title, text, image=None, parent_id=NO_PARENT,
40 ip=NO_IP, tags=None, user=None):
36 ip=NO_IP, tags=None, user=None):
@@ -218,9 +214,16 b' class Post(models.Model):'
218 pub_time = models.DateTimeField()
214 pub_time = models.DateTimeField()
219 text = MarkupField(default_markup_type=DEFAULT_MARKUP_TYPE,
215 text = MarkupField(default_markup_type=DEFAULT_MARKUP_TYPE,
220 escape_html=False)
216 escape_html=False)
217
218 image_width = models.IntegerField(default=0)
219 image_height = models.IntegerField(default=0)
220
221 image = thumbs.ImageWithThumbsField(upload_to=_update_image_filename,
221 image = thumbs.ImageWithThumbsField(upload_to=_update_image_filename,
222 blank=True, sizes=(IMAGE_THUMB_SIZE,))
222 blank=True, sizes=(IMAGE_THUMB_SIZE,),
223 poster_ip = models.IPAddressField()
223 width_field='image_width',
224 height_field='image_height')
225
226 poster_ip = models.GenericIPAddressField()
224 poster_user_agent = models.TextField()
227 poster_user_agent = models.TextField()
225 parent = models.BigIntegerField()
228 parent = models.BigIntegerField()
226 tags = models.ManyToManyField(Tag)
229 tags = models.ManyToManyField(Tag)
@@ -228,8 +231,8 b' class Post(models.Model):'
228 user = models.ForeignKey(User, null=True, default=None)
231 user = models.ForeignKey(User, null=True, default=None)
229
232
230 def __unicode__(self):
233 def __unicode__(self):
231 return '#' + str(self.id) + ' ' + self.title + ' (' + self.text.raw + \
234 return '#' + str(self.id) + ' ' + self.title + ' (' + \
232 ')'
235 self.text.raw[:50] + ')'
233
236
234 def _get_replies(self):
237 def _get_replies(self):
235 return Post.objects.filter(parent=self.id)
238 return Post.objects.filter(parent=self.id)
@@ -253,17 +256,6 b' class Post(models.Model):'
253
256
254 return gets_count
257 return gets_count
255
258
256 def is_get(self):
257 """If the post has pretty id (1, 1000, 77777), than it is called GET"""
258
259 first = self.id == 1
260
261 id_str = str(self.id)
262 pretty = REGEX_PRETTY.match(id_str)
263 same_digits = REGEX_SAME.match(id_str)
264
265 return first or pretty or same_digits
266
267 def can_bump(self):
259 def can_bump(self):
268 """Check if the thread can be bumped by replying"""
260 """Check if the thread can be bumped by replying"""
269
261
@@ -322,9 +314,14 b' class User(models.Model):'
322 def __unicode__(self):
314 def __unicode__(self):
323 return self.user_id
315 return self.user_id
324
316
325
326 class Setting(models.Model):
317 class Setting(models.Model):
327
318
328 name = models.CharField(max_length=50)
319 name = models.CharField(max_length=50)
329 value = models.CharField(max_length=50)
320 value = models.CharField(max_length=50)
330 user = models.ForeignKey(User)
321 user = models.ForeignKey(User)
322
323 class Ban(models.Model):
324 ip = models.GenericIPAddressField()
325
326 def __unicode__(self):
327 return self.ip
@@ -47,7 +47,7 b' html {'
47 background: #333;
47 background: #333;
48 margin: 5px;
48 margin: 5px;
49 padding: 10px;
49 padding: 10px;
50 border-radius: 5px;
50 border: solid 1px #888;
51 clear: left;
51 clear: left;
52 word-wrap: break-word;
52 word-wrap: break-word;
53 }
53 }
@@ -65,7 +65,7 b' html {'
65 background: #444;
65 background: #444;
66 margin: 5px;
66 margin: 5px;
67 padding: 10px;
67 padding: 10px;
68 border-radius: 5px;
68 border: solid 1px #888;
69 color: #eee;
69 color: #eee;
70 }
70 }
71
71
@@ -102,7 +102,7 b' p {'
102 .post-form-w {
102 .post-form-w {
103 display: table;
103 display: table;
104 background: #333344;
104 background: #333344;
105 border-radius: 5px;
105 border: solid 1px #888;
106 color: #fff;
106 color: #fff;
107 padding: 10px;
107 padding: 10px;
108 margin: 5px
108 margin: 5px
@@ -166,7 +166,6 b' blockquote {'
166 float: left;
166 float: left;
167 margin: 0 1ex .5ex 0;
167 margin: 0 1ex .5ex 0;
168 min-width: 1px;
168 min-width: 1px;
169 height: 150px;
170 text-align: center;
169 text-align: center;
171 display: table-row;
170 display: table-row;
172 }
171 }
@@ -190,6 +189,7 b' blockquote {'
190
189
191 .quote {
190 .quote {
192 color: #92cf38;
191 color: #92cf38;
192 font-style: italic;
193 }
193 }
194
194
195 .spoiler {
195 .spoiler {
@@ -198,7 +198,7 b' blockquote {'
198 }
198 }
199
199
200 .spoiler:hover {
200 .spoiler:hover {
201 background: black;
201 color: black;
202 }
202 }
203
203
204 .comment {
204 .comment {
@@ -247,7 +247,7 b' li {'
247 display: table;
247 display: table;
248 margin: 5px;
248 margin: 5px;
249 padding: 5px;
249 padding: 5px;
250 border-radius: 5px;
250 border: 1px solid #888;
251 }
251 }
252
252
253 .image-mode-tab > label {
253 .image-mode-tab > label {
@@ -277,4 +277,10 b' li {'
277 .moderator_info {
277 .moderator_info {
278 color: #e99d41;
278 color: #e99d41;
279 float: right;
279 float: right;
280 } No newline at end of file
280 }
281
282 .refmap {
283 font-size: 0.9em;
284 color: #ccc;
285 margin-top: 1em;
286 }
@@ -266,4 +266,10 b' li {'
266 .moderator_info {
266 .moderator_info {
267 font-weight: bold;
267 font-weight: bold;
268 float: right;
268 float: right;
269 } No newline at end of file
269 }
270
271 .refmap {
272 border: 1px dashed #aaa;
273 padding: 0.5em;
274 display: table;
275 }
@@ -7,8 +7,10 b''
7 $(".fancy").fancybox({
7 $(".fancy").fancybox({
8 closeBtn: false,
8 closeBtn: false,
9 closeClick: true,
9 closeClick: true,
10 padding: 7,
10 padding: 0,
11 openEffect: 'none',
11 openEffect: 'none',
12 closeEffect: 'none'
12 closeEffect: 'none'
13 });
13 });
14 }) No newline at end of file
14
15 addRefLinkMap();
16 })
@@ -13,12 +13,16 b' function add_panel(after)'
13
13
14 tab = $('<input type="radio" class="image-mode-normal" name="image-mode" value="0" checked="checked"/>');
14 tab = $('<input type="radio" class="image-mode-normal" name="image-mode" value="0" checked="checked"/>');
15 tab.on("change", tab_handler);
15 tab.on("change", tab_handler);
16 tab = $('<label>Normal</label>').prepend(tab);
16
17 var label_normal = gettext('Normal');
18 tab = $('<label>' + label_normal + '</label>').prepend(tab);
17 tab_bar.append(tab);
19 tab_bar.append(tab);
18
20
19 tab = $('<input type="radio" class="image-mode-table" name="image-mode" value="1"/>');
21 tab = $('<input type="radio" class="image-mode-table" name="image-mode" value="1"/>');
20 tab.on("change", tab_handler);
22 tab.on("change", tab_handler);
21 tab = $('<label>Gallery</label>').prepend(tab);
23
24 var label_gallery = gettext('Gallery');
25 tab = $('<label>' + label_gallery + '</label>').prepend(tab);
22 tab_bar.append(tab);
26 tab_bar.append(tab);
23
27
24 tab_bar.insertAfter(nav_top);
28 tab_bar.insertAfter(nav_top);
@@ -68,13 +72,32 b' function make_table_dom()'
68 );
72 );
69 }
73 }
70
74
75 function moveCaretToEnd(el) {
76 if (typeof el.selectionStart == "number") {
77 el.selectionStart = el.selectionEnd = el.value.length;
78 } else if (typeof el.createTextRange != "undefined") {
79 el.focus();
80 var range = el.createTextRange();
81 range.collapse(false);
82 range.select();
83 }
84 }
85
71 function addQuickReply(postId) {
86 function addQuickReply(postId) {
72 var textToAdd = '>>' + postId + '\n\n';
87 var textToAdd = '>>' + postId + '\n\n';
73 $('#id_text').val($('#id_text').val()+ textToAdd);
88 var textAreaId = '#id_text';
89 $(textAreaId).val($(textAreaId).val()+ textToAdd);
74
90
75 $("html, body").animate({ scrollTop: $('#id_text').offset().top }, "slow");
91 var textarea = document.getElementById('id_text');
92 $(textAreaId).focus();
93 moveCaretToEnd(textarea);
94
95 $("html, body").animate({ scrollTop: $(textAreaId).offset().top }, "slow");
76 }
96 }
77
97
98
99
78 $(document).ready(function(){
100 $(document).ready(function(){
79 add_panel('.navigation_panel');
101 add_panel('.navigation_panel');
80 }); No newline at end of file
102 addRefLinkMap();
103 });
@@ -3,28 +3,12 b''
3 {% load i18n %}
3 {% load i18n %}
4
4
5 {% block head %}
5 {% block head %}
6 <title>{% trans "Authors" %}</title>
6 <title>{% trans "Not found" %}</title>
7 {% endblock %}
7 {% endblock %}
8
8
9 {% block content %}
9 {% block content %}
10 <div class="post">
10 <div class="post">
11 <h2>Authors</h2>
11 <p><img src="{{ STATIC_URL }}images/404.png" width="200" /></p>
12 {% for nick, values in authors.items %}
12 <p>{% trans 'This page does not exist' %}</p>
13 <p>
14 <b>{{ nick }}</b> ({{ values.name }}):
15 {% for value in values.contacts %}
16 <a href="mailto:{{ value }}">{{ value }}</a>
17 {% endfor %} -
18 {% for role in values.roles %}
19 {% trans role %}
20 {% endfor %}
21 </p>
22 {% endfor %}
23 <br />
24 <p>{% trans "Distributed under the" %}
25 <a href="http://www.gnu.org/licenses/gpl.html" >GNU GPLv3</a>
26 {% trans "license" %}</p>
27 <p><a href="https://bitbucket.org/neko259/neboard">
28 {% trans "Repository" %}</a></p>
29 </div>
13 </div>
30 {% endblock %} No newline at end of file
14 {% endblock %}
@@ -3,28 +3,11 b''
3 {% load i18n %}
3 {% load i18n %}
4
4
5 {% block head %}
5 {% block head %}
6 <title>{% trans "Authors" %}</title>
6 <title>{% trans "Banned" %}</title>
7 {% endblock %}
7 {% endblock %}
8
8
9 {% block content %}
9 {% block content %}
10 <div class="post">
10 <div class="post">
11 <h2>Authors</h2>
11 {% trans 'Your IP address has been banned. Contact the administrator' %}
12 {% for nick, values in authors.items %}
13 <p>
14 <b>{{ nick }}</b> ({{ values.name }}):
15 {% for value in values.contacts %}
16 <a href="mailto:{{ value }}">{{ value }}</a>
17 {% endfor %} -
18 {% for role in values.roles %}
19 {% trans role %}
20 {% endfor %}
21 </p>
22 {% endfor %}
23 <br />
24 <p>{% trans "Distributed under the" %}
25 <a href="http://www.gnu.org/licenses/gpl.html" >GNU GPLv3</a>
26 {% trans "license" %}</p>
27 <p><a href="https://bitbucket.org/neko259/neboard">
28 {% trans "Repository" %}</a></p>
29 </div>
12 </div>
30 {% endblock %} No newline at end of file
13 {% endblock %}
@@ -21,6 +21,8 b''
21 <body>
21 <body>
22 <script src="{{ STATIC_URL }}js/jquery-2.0.1.min.js"></script>
22 <script src="{{ STATIC_URL }}js/jquery-2.0.1.min.js"></script>
23 <script src="{{ STATIC_URL }}js/jquery.fancybox.pack.js"></script>
23 <script src="{{ STATIC_URL }}js/jquery.fancybox.pack.js"></script>
24 <script src="{% url 'django.views.i18n.javascript_catalog' %}"></script>
25 <script src="{{ STATIC_URL }}js/refmaps.js"></script>
24 <script src="{{ STATIC_URL }}js/main.js"></script>
26 <script src="{{ STATIC_URL }}js/main.js"></script>
25
27
26 <div class="navigation_panel">
28 <div class="navigation_panel">
@@ -42,4 +44,4 b''
42 </div>
44 </div>
43
45
44 </body>
46 </body>
45 </html> No newline at end of file
47 </html>
@@ -23,24 +23,26 b''
23 {% for thread in threads %}
23 {% for thread in threads %}
24 <div class="thread">
24 <div class="thread">
25 {% if thread.can_bump %}
25 {% if thread.can_bump %}
26 <div class="post">
26 <div class="post" id="{{thread.id}}">
27 {% else %}
27 {% else %}
28 <div class="post dead_post">
28 <div class="post dead_post" id="{{ thread.id }}">
29 {% endif %}
29 {% endif %}
30 {% if thread.image %}
30 {% if thread.image %}
31 <div class="image">
31 <div class="image">
32 <a class="fancy"
32 <a class="fancy"
33 href="{{ thread.image.url }}"><img
33 href="{{ thread.image.url }}"><img
34 src="{{ thread.image.url_200x150 }}"
34 src="{{ thread.image.url_200x150 }}"
35 alt="{% trans 'Post image' %}" />
35 alt="{% trans 'Post image' %}"
36 data-width="{{ thread.image_width }}"
37 data-height="{{ thread.image_height }}" />
36 </a>
38 </a>
37 </div>
39 </div>
38 {% endif %}
40 {% endif %}
39 <div class="message">
41 <div class="message">
40 <div class="post-info">
42 <div class="post-info">
41 <span class="title">{{ thread.title }}</span>
43 <span class="title">{{ thread.title }}</span>
42 <a class="post_id" href="{% url 'thread' thread.id %}">
44 <a class="post_id" href="{% url 'thread' thread.id %}"
43 (#{{ thread.id }})</a>
45 >(#{{ thread.id }})</a>
44 [{{ thread.pub_time }}]
46 [{{ thread.pub_time }}]
45 [<a class="link" href="{% url 'thread' thread.id %}#form"
47 [<a class="link" href="{% url 'thread' thread.id %}#form"
46 >{% trans "Reply" %}</a>]
48 >{% trans "Reply" %}</a>]
@@ -75,16 +77,18 b''
75 <div class="last-replies">
77 <div class="last-replies">
76 {% for post in thread.get_last_replies %}
78 {% for post in thread.get_last_replies %}
77 {% if thread.can_bump %}
79 {% if thread.can_bump %}
78 <div class="post">
80 <div class="post" id="{{ post.id }}">
79 {% else %}
81 {% else %}
80 <div class="post dead_post">
82 <div class="post dead_post id="{{ post.id }}"">
81 {% endif %}
83 {% endif %}
82 {% if post.image %}
84 {% if post.image %}
83 <div class="image">
85 <div class="image">
84 <a class="fancy"
86 <a class="fancy"
85 href="{{ post.image.url }}"><img
87 href="{{ post.image.url }}"><img
86 src=" {{ post.image.url_200x150 }}"
88 src=" {{ post.image.url_200x150 }}"
87 alt="{% trans 'Post image' %}" />
89 alt="{% trans 'Post image' %}"
90 data-width="{{ post.image_width }}"
91 data-height="{{ post.image_height }}"/>
88 </a>
92 </a>
89 </div>
93 </div>
90 {% endif %}
94 {% endif %}
@@ -24,7 +24,9 b''
24 class="fancy"
24 class="fancy"
25 href="{{ post.image.url }}"><img
25 href="{{ post.image.url }}"><img
26 src="{{ post.image.url_200x150 }}"
26 src="{{ post.image.url_200x150 }}"
27 alt="{% trans 'Post image' %}" />
27 alt="{% trans 'Post image' %}"
28 data-width="{{ post.image_width }}"
29 data-height="{{ post.image_height }}"/>
28 </a>
30 </a>
29 </div>
31 </div>
30 {% endif %}
32 {% endif %}
@@ -34,11 +36,6 b''
34 <a class="post_id" href="#{{ post.id }}">
36 <a class="post_id" href="#{{ post.id }}">
35 (#{{ post.id }})</a>
37 (#{{ post.id }})</a>
36 [{{ post.pub_time }}]
38 [{{ post.pub_time }}]
37 {% if post.is_get %}
38 <span class="get">
39 {% trans "Get!" %}
40 </span>
41 {% endif %}
42 [<a href="#" onclick="javascript:addQuickReply('{{ post.id }}')
39 [<a href="#" onclick="javascript:addQuickReply('{{ post.id }}')
43 ; return false;">&gt;&gt;</a>]
40 ; return false;">&gt;&gt;</a>]
44
41
@@ -121,4 +118,4 b''
121 {% trans 'Last update: ' %}{{ posts.0.last_edit_time }}
118 {% trans 'Last update: ' %}{{ posts.0.last_edit_time }}
122 </span>
119 </span>
123
120
124 {% endblock %} No newline at end of file
121 {% endblock %}
@@ -155,6 +155,7 b' class ImageWithThumbsField(ImageField):'
155 To do:
155 To do:
156 ======
156 ======
157 Add method to regenerate thubmnails
157 Add method to regenerate thubmnails
158
158
159
159 """
160 """
160
161
@@ -169,5 +170,4 b' class ImageWithThumbsField(ImageField):'
169
170
170
171
171 from south.modelsinspector import add_introspection_rules
172 from south.modelsinspector import add_introspection_rules
172
173 add_introspection_rules([], ["^boards\.thumbs\.ImageWithThumbsField"])
173 add_introspection_rules([], ["^boards\.thumbs\.ImageWithThumbsField"]) No newline at end of file
@@ -2,6 +2,10 b' from django.conf.urls import patterns, u'
2 from boards import views
2 from boards import views
3 from boards.rss import AllThreadsFeed, TagThreadsFeed, ThreadPostsFeed
3 from boards.rss import AllThreadsFeed, TagThreadsFeed, ThreadPostsFeed
4
4
5 js_info_dict = {
6 'packages': ('boards',),
7 }
8
5 urlpatterns = patterns('',
9 urlpatterns = patterns('',
6
10
7 # /boards/
11 # /boards/
@@ -27,6 +31,7 b" urlpatterns = patterns('',"
27 url(r'^jump/(?P<post_id>\w+)/$', views.jump_to_post, name='jumper'),
31 url(r'^jump/(?P<post_id>\w+)/$', views.jump_to_post, name='jumper'),
28 url(r'^authors/$', views.authors, name='authors'),
32 url(r'^authors/$', views.authors, name='authors'),
29 url(r'^delete/(?P<post_id>\w+)/$', views.delete, name='delete'),
33 url(r'^delete/(?P<post_id>\w+)/$', views.delete, name='delete'),
34 url(r'^banned/$', views.you_are_banned, name='banned'),
30
35
31 # RSS feeds
36 # RSS feeds
32 url(r'^rss/$', AllThreadsFeed()),
37 url(r'^rss/$', AllThreadsFeed()),
@@ -34,4 +39,6 b" urlpatterns = patterns('',"
34 url(r'^tag/(?P<tag_name>\w+)/rss/$', TagThreadsFeed()),
39 url(r'^tag/(?P<tag_name>\w+)/rss/$', TagThreadsFeed()),
35 url(r'^tag/(?P<tag_name>\w+)/page/(?P<page>\w+)/rss/$', TagThreadsFeed()),
40 url(r'^tag/(?P<tag_name>\w+)/page/(?P<page>\w+)/rss/$', TagThreadsFeed()),
36 url(r'^thread/(?P<post_id>\w+)/rss/$', ThreadPostsFeed()),
41 url(r'^thread/(?P<post_id>\w+)/rss/$', ThreadPostsFeed()),
37 ) No newline at end of file
42
43 url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
44 )
@@ -11,7 +11,7 b' from boards import utils'
11 from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
11 from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
12 ThreadCaptchaForm, PostCaptchaForm
12 ThreadCaptchaForm, PostCaptchaForm
13
13
14 from boards.models import Post, Admin, Tag, User, RANK_USER, RANK_MODERATOR, NO_PARENT
14 from boards.models import Post, Admin, Tag, Ban, User, RANK_USER, RANK_MODERATOR, NO_PARENT
15 from boards import authors
15 from boards import authors
16 import neboard
16 import neboard
17
17
@@ -48,6 +48,12 b' def index(request, page=0):'
48 def _new_post(request, form, thread_id=boards.models.NO_PARENT):
48 def _new_post(request, form, thread_id=boards.models.NO_PARENT):
49 """Add a new post (in thread or as a reply)."""
49 """Add a new post (in thread or as a reply)."""
50
50
51 ip = _get_client_ip(request)
52 is_banned = Ban.objects.filter(ip=ip).count() > 0
53
54 if is_banned:
55 return redirect(you_are_banned)
56
51 data = form.cleaned_data
57 data = form.cleaned_data
52
58
53 title = data['title']
59 title = data['title']
@@ -58,8 +64,6 b' def _new_post(request, form, thread_id=b'
58 else:
64 else:
59 image = None
65 image = None
60
66
61 ip = _get_client_ip(request)
62
63 tags = []
67 tags = []
64
68
65 new_thread = thread_id == boards.models.NO_PARENT
69 new_thread = thread_id == boards.models.NO_PARENT
@@ -230,12 +234,21 b' def delete(request, post_id):'
230
234
231 if user.is_moderator():
235 if user.is_moderator():
232 Post.objects.delete_post(post)
236 Post.objects.delete_post(post)
233
237
234 if NO_PARENT == post.parent:
238 if NO_PARENT == post.parent:
235 return redirect(index)
239 return redirect(index)
236 else:
240 else:
237 return redirect(thread, post_id=post.parent)
241 return redirect(thread, post_id=post.parent)
238
242
243 def you_are_banned(request):
244 context = _init_default_context(request)
245 return render(request, 'boards/banned.html', context)
246
247
248 def page_404(request):
249 context = _init_default_context(request)
250 return render(request, 'boards/404.html', context)
251
239
252
240 def _get_theme(request):
253 def _get_theme(request):
241 """Get user's CSS theme"""
254 """Get user's CSS theme"""
@@ -289,4 +302,4 b' def _get_user(request):'
289
302
290 user.last_access_time = timezone.now()
303 user.last_access_time = timezone.now()
291
304
292 return user No newline at end of file
305 return user
@@ -20,4 +20,4 b" urlpatterns = patterns('',"
20 url(r'^', include('boards.urls')),
20 url(r'^', include('boards.urls')),
21 ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
21 ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
22
22
23
23 handler404 = 'boards.views.page_404'
General Comments 0
You need to be logged in to leave comments. Login now