##// END OF EJS Templates
Updating bumplimit progress on thread update
neko259 -
r420:fbd9ed91 default
parent child Browse files
Show More
@@ -1,127 +1,147 b''
1 /*
1 /*
2 @licstart The following is the entire license notice for the
2 @licstart The following is the entire license notice for the
3 JavaScript code in this page.
3 JavaScript code in this page.
4
4
5
5
6 Copyright (C) 2013 neko259
6 Copyright (C) 2013 neko259
7
7
8 The JavaScript code in this page is free software: you can
8 The JavaScript code in this page is free software: you can
9 redistribute it and/or modify it under the terms of the GNU
9 redistribute it and/or modify it under the terms of the GNU
10 General Public License (GNU GPL) as published by the Free Software
10 General Public License (GNU GPL) as published by the Free Software
11 Foundation, either version 3 of the License, or (at your option)
11 Foundation, either version 3 of the License, or (at your option)
12 any later version. The code is distributed WITHOUT ANY WARRANTY;
12 any later version. The code is distributed WITHOUT ANY WARRANTY;
13 without even the implied warranty of MERCHANTABILITY or FITNESS
13 without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
14 FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
15
15
16 As additional permission under GNU GPL version 3 section 7, you
16 As additional permission under GNU GPL version 3 section 7, you
17 may distribute non-source (e.g., minimized or compacted) forms of
17 may distribute non-source (e.g., minimized or compacted) forms of
18 that code without the copy of the GNU GPL normally required by
18 that code without the copy of the GNU GPL normally required by
19 section 4, provided you include this license notice and a URL
19 section 4, provided you include this license notice and a URL
20 through which recipients can access the Corresponding Source.
20 through which recipients can access the Corresponding Source.
21
21
22 @licend The above is the entire license notice
22 @licend The above is the entire license notice
23 for the JavaScript code in this page.
23 for the JavaScript code in this page.
24 */
24 */
25
25
26 var THREAD_UPDATE_DELAY = 10000;
26 var THREAD_UPDATE_DELAY = 10000;
27
27
28 var loading = false;
28 var loading = false;
29 var lastUpdateTime = null;
29 var lastUpdateTime = null;
30
30
31 function blink(node) {
31 function blink(node) {
32 var blinkCount = 2;
32 var blinkCount = 2;
33 var blinkDelay = 250;
33 var blinkDelay = 250;
34
34
35 var nodeToAnimate = node;
35 var nodeToAnimate = node;
36 for (var i = 0; i < blinkCount; i++) {
36 for (var i = 0; i < blinkCount; i++) {
37 nodeToAnimate = nodeToAnimate.fadeOut(blinkDelay).fadeIn(blinkDelay);
37 nodeToAnimate = nodeToAnimate.fadeOut(blinkDelay).fadeIn(blinkDelay);
38 }
38 }
39 }
39 }
40
40
41 function updateThread() {
41 function updateThread() {
42 if (loading) {
42 if (loading) {
43 return;
43 return;
44 }
44 }
45
45
46 loading = true;
46 loading = true;
47
47
48 var threadPosts = $('div.thread').children('.post');
48 var threadPosts = $('div.thread').children('.post');
49
49
50 var lastPost = threadPosts.last();
50 var lastPost = threadPosts.last();
51 var threadId = threadPosts.first().attr('id');
51 var threadId = threadPosts.first().attr('id');
52
52
53 var diffUrl = '/api/diff_thread/' + threadId + '/' + lastUpdateTime + '/';
53 var diffUrl = '/api/diff_thread/' + threadId + '/' + lastUpdateTime + '/';
54 $.getJSON(diffUrl)
54 $.getJSON(diffUrl)
55 .success(function(data) {
55 .success(function(data) {
56 var bottom = isPageBottom();
56 var bottom = isPageBottom();
57
57
58 var addedPosts = data.added;
58 var addedPosts = data.added;
59
60 for (var i = 0; i < addedPosts.length; i++) {
59 for (var i = 0; i < addedPosts.length; i++) {
61 var postText = addedPosts[i];
60 var postText = addedPosts[i];
62
61
63 var post = $(postText);
62 var post = $(postText);
64 post.appendTo(lastPost.parent());
63 post.appendTo(lastPost.parent());
65 addRefLinkPreview(post[0]);
64 addRefLinkPreview(post[0]);
66
65
67 lastPost = post;
66 lastPost = post;
68 blink(post);
67 blink(post);
69 }
68 }
70
69
71 var updatedPosts = data.updated;
70 var updatedPosts = data.updated;
72 for (var i = 0; i < updatedPosts.length; i++) {
71 for (var i = 0; i < updatedPosts.length; i++) {
73 var postText = updatedPosts[i];
72 var postText = updatedPosts[i];
74
73
75 var post = $(postText);
74 var post = $(postText);
76 var postId = post.attr('id');
75 var postId = post.attr('id');
77
76
78 var oldPost = $('div.thread').children('.post[id=' + postId + ']');
77 var oldPost = $('div.thread').children('.post[id=' + postId + ']');
79
78
80 oldPost.replaceWith(post);
79 oldPost.replaceWith(post);
81 addRefLinkPreview(post[0]);
80 addRefLinkPreview(post[0]);
82
81
83 blink(post);
82 blink(post);
84 }
83 }
85
84
86 // TODO Process deleted posts
85 // TODO Process deleted posts
87
86
88 lastUpdateTime = data.last_update;
87 lastUpdateTime = data.last_update;
89 loading = false;
88 loading = false;
90
89
91 if (bottom) {
90 if (bottom) {
92 var $target = $('html,body');
91 var $target = $('html,body');
93 $target.animate({scrollTop: $target.height()}, 1000);
92 $target.animate({scrollTop: $target.height()}, 1000);
94 }
93 }
95
94
96 $('#reply-count').text(getReplyCount());
95 $('#reply-count').text(getReplyCount());
97 $('#image-count').text(getImageCount());
96 $('#image-count').text(getImageCount());
97
98 updateBumplimitProgress(data.added.length + data.updated.length);
98 })
99 })
99 .error(function(data) {
100 .error(function(data) {
100 // TODO Show error message that server is unavailable?
101 // TODO Show error message that server is unavailable?
101
102
102 loading = false;
103 loading = false;
103 });
104 });
104 }
105 }
105
106
106 function isPageBottom() {
107 function isPageBottom() {
107 var scroll = $(window).scrollTop() / ($(document).height()
108 var scroll = $(window).scrollTop() / ($(document).height()
108 - $(window).height())
109 - $(window).height())
109
110
110 return scroll == 1
111 return scroll == 1
111 }
112 }
112
113
113 function initAutoupdate() {
114 function initAutoupdate() {
114 loading = false;
115 loading = false;
115
116
116 lastUpdateTime = $('.metapanel').attr('data-last-update');
117 lastUpdateTime = $('.metapanel').attr('data-last-update');
117
118
118 setInterval(updateThread, THREAD_UPDATE_DELAY);
119 setInterval(updateThread, THREAD_UPDATE_DELAY);
119 }
120 }
120
121
121 function getReplyCount() {
122 function getReplyCount() {
122 return $('.thread').children('.post').length
123 return $('.thread').children('.post').length
123 }
124 }
124
125
125 function getImageCount() {
126 function getImageCount() {
126 return $('.thread').find('img').length
127 return $('.thread').find('img').length
127 }
128 }
129
130 function updateBumplimitProgress(postDelta) {
131 var progressBar = $('#bumplimit_progress');
132 if (progressBar) {
133 var postsToLimitElement = $('#left_to_limit');
134
135 var oldPostsToLimit = parseInt(postsToLimitElement.text());
136 var postCount = getReplyCount();
137 var bumplimit = postCount - postDelta + oldPostsToLimit;
138
139 var newPostsToLimit = bumplimit - postCount;
140 if (newPostsToLimit < 0) {
141 progressBar.remove();
142 } else {
143 postsToLimitElement.text(newPostsToLimit);
144 progressBar.width((100 - postCount / bumplimit * 100.0) + '%');
145 }
146 }
147 } No newline at end of file
@@ -1,68 +1,70 b''
1 {% load i18n %}
1 {% load i18n %}
2 {% load board %}
2 {% load board %}
3
3
4 {% spaceless %}
4 {% if can_bump %}
5 {% if can_bump %}
5 <div class="post" id="{{ post.id }}">
6 <div class="post" id="{{ post.id }}">
6 {% else %}
7 {% else %}
7 <div class="post dead_post" id="{{ post.id }}">
8 <div class="post dead_post" id="{{ post.id }}">
8 {% endif %}
9 {% endif %}
9
10
10 {% if post.image %}
11 {% if post.image %}
11 <div class="image">
12 <div class="image">
12 <a
13 <a
13 class="thumb"
14 class="thumb"
14 href="{{ post.image.url }}"><img
15 href="{{ post.image.url }}"><img
15 src="{{ post.image.url_200x150 }}"
16 src="{{ post.image.url_200x150 }}"
16 alt="{{ post.id }}"
17 alt="{{ post.id }}"
17 data-width="{{ post.image_width }}"
18 data-width="{{ post.image_width }}"
18 data-height="{{ post.image_height }}"/>
19 data-height="{{ post.image_height }}"/>
19 </a>
20 </a>
20 </div>
21 </div>
21 {% endif %}
22 {% endif %}
22 <div class="message">
23 <div class="message">
23 <div class="post-info">
24 <div class="post-info">
24 <span class="title">{{ post.title }}</span>
25 <span class="title">{{ post.title }}</span>
25 <a class="post_id" href="#{{ post.id }}">
26 <a class="post_id" href="#{{ post.id }}">
26 ({{ post.id }})</a>
27 ({{ post.id }})</a>
27 [{{ post.pub_time }}]
28 [{{ post.pub_time }}]
28 [<a href="#" onclick="javascript:addQuickReply('{{ post.id }}')
29 [<a href="#" onclick="javascript:addQuickReply('{{ post.id }}')
29 ; return false;">&gt;&gt;</a>]
30 ; return false;">&gt;&gt;</a>]
30
31
31 {% if moderator %}
32 {% if moderator %}
32 <span class="moderator_info">
33 <span class="moderator_info">
33 [<a href="{% url 'delete' post_id=post.id %}"
34 [<a href="{% url 'delete' post_id=post.id %}"
34 >{% trans 'Delete' %}</a>]
35 >{% trans 'Delete' %}</a>]
35 ({{ post.poster_ip }})
36 ({{ post.poster_ip }})
36 [<a href="{% url 'ban' post_id=post.id %}?next={{ request.path }}"
37 [<a href="{% url 'ban' post_id=post.id %}?next={{ request.path }}"
37 >{% trans 'Ban IP' %}</a>]
38 >{% trans 'Ban IP' %}</a>]
38 </span>
39 </span>
39 {% endif %}
40 {% endif %}
40 </div>
41 </div>
41 {% autoescape off %}
42 {% autoescape off %}
42 {% if truncated %}
43 {% if truncated %}
43 {{ post.text.rendered|truncatewords_html:50 }}
44 {{ post.text.rendered|truncatewords_html:50 }}
44 {% else %}
45 {% else %}
45 {{ post.text.rendered }}
46 {{ post.text.rendered }}
46 {% endif %}
47 {% endif %}
47 {% endautoescape %}
48 {% endautoescape %}
48 {% if post.is_referenced %}
49 {% if post.is_referenced %}
49 <div class="refmap">
50 <div class="refmap">
50 {% trans "Replies" %}:
51 {% trans "Replies" %}:
51 {% for ref_post in post.get_sorted_referenced_posts %}
52 {% for ref_post in post.get_sorted_referenced_posts %}
52 <a href="{% post_url ref_post.id %}">&gt;&gt;{{ ref_post.id }}</a
53 <a href="{% post_url ref_post.id %}">&gt;&gt;{{ ref_post.id }}</a
53 >{% if not forloop.last %},{% endif %}
54 >{% if not forloop.last %},{% endif %}
54 {% endfor %}
55 {% endfor %}
55 </div>
56 </div>
56 {% endif %}
57 {% endif %}
57 </div>
58 </div>
58 {% if post.thread.tags.exists %}
59 {% if post.thread.tags.exists %}
59 <div class="metadata">
60 <div class="metadata">
60 <span class="tags">{% trans 'Tags' %}:
61 <span class="tags">{% trans 'Tags' %}:
61 {% for tag in post.thread.get_tags %}
62 {% for tag in post.thread.get_tags %}
62 <a class="tag" href="{% url 'tag' tag.name %}">
63 <a class="tag" href="{% url 'tag' tag.name %}">
63 {{ tag.name }}</a>
64 {{ tag.name }}</a>
64 {% endfor %}
65 {% endfor %}
65 </span>
66 </span>
66 </div>
67 </div>
67 {% endif %}
68 {% endif %}
68 </div>
69 </div>
70 {% endspaceless %} No newline at end of file
@@ -1,161 +1,163 b''
1 {% extends "boards/base.html" %}
1 {% extends "boards/base.html" %}
2
2
3 {% load i18n %}
3 {% load i18n %}
4 {% load cache %}
4 {% load cache %}
5 {% load static from staticfiles %}
5 {% load static from staticfiles %}
6 {% load board %}
6 {% load board %}
7
7
8 {% block head %}
8 {% block head %}
9 <title>Neboard - {{ thread.get_replies.0.get_title }}</title>
9 <title>Neboard - {{ thread.get_replies.0.get_title }}</title>
10 {% endblock %}
10 {% endblock %}
11
11
12 {% block content %}
12 {% block content %}
13 {% spaceless %}
13 {% get_current_language as LANGUAGE_CODE %}
14 {% get_current_language as LANGUAGE_CODE %}
14
15
15 <script src="{% static 'js/thread_update.js' %}"></script>
16 <script src="{% static 'js/thread_update.js' %}"></script>
16 <script src="{% static 'js/thread.js' %}"></script>
17 <script src="{% static 'js/thread.js' %}"></script>
17
18
18 {% cache 600 thread_view thread.id thread.last_edit_time moderator LANGUAGE_CODE %}
19 {% cache 600 thread_view thread.id thread.last_edit_time moderator LANGUAGE_CODE %}
19 {% if bumpable %}
20 {% if bumpable %}
20 <div class="bar-bg">
21 <div class="bar-bg">
21 <div class="bar-value" style="width:{{ bumplimit_progress }}%">
22 <div class="bar-value" style="width:{{ bumplimit_progress }}%" id="bumplimit_progress">
22 </div>
23 </div>
23 <div class="bar-text">
24 <div class="bar-text">
24 {{ posts_left }} {% trans 'posts to bumplimit' %}
25 <span id="left_to_limit">{{ posts_left }}</span> {% trans 'posts to bumplimit' %}
25 </div>
26 </div>
26 </div>
27 </div>
27 {% endif %}
28 {% endif %}
28 <div class="thread">
29 <div class="thread">
29 {% for post in thread.get_replies %}
30 {% for post in thread.get_replies %}
30 {% if bumpable %}
31 {% if bumpable %}
31 <div class="post" id="{{ post.id }}">
32 <div class="post" id="{{ post.id }}">
32 {% else %}
33 {% else %}
33 <div class="post dead_post" id="{{ post.id }}">
34 <div class="post dead_post" id="{{ post.id }}">
34 {% endif %}
35 {% endif %}
35 {% if post.image %}
36 {% if post.image %}
36 <div class="image">
37 <div class="image">
37 <a
38 <a
38 class="thumb"
39 class="thumb"
39 href="{{ post.image.url }}"><img
40 href="{{ post.image.url }}"><img
40 src="{{ post.image.url_200x150 }}"
41 src="{{ post.image.url_200x150 }}"
41 alt="{{ post.id }}"
42 alt="{{ post.id }}"
42 data-width="{{ post.image_width }}"
43 data-width="{{ post.image_width }}"
43 data-height="{{ post.image_height }}"/>
44 data-height="{{ post.image_height }}"/>
44 </a>
45 </a>
45 </div>
46 </div>
46 {% endif %}
47 {% endif %}
47 <div class="message">
48 <div class="message">
48 <div class="post-info">
49 <div class="post-info">
49 <span class="title">{{ post.title }}</span>
50 <span class="title">{{ post.title }}</span>
50 <a class="post_id" href="#{{ post.id }}">
51 <a class="post_id" href="#{{ post.id }}">
51 ({{ post.id }})</a>
52 ({{ post.id }})</a>
52 [{{ post.pub_time }}]
53 [{{ post.pub_time }}]
53 [<a href="#" onclick="javascript:addQuickReply('{{ post.id }}')
54 [<a href="#" onclick="javascript:addQuickReply('{{ post.id }}')
54 ; return false;">&gt;&gt;</a>]
55 ; return false;">&gt;&gt;</a>]
55
56
56 {% if moderator %}
57 {% if moderator %}
57 <span class="moderator_info">
58 <span class="moderator_info">
58 [<a href="{% url 'delete' post_id=post.id %}"
59 [<a href="{% url 'delete' post_id=post.id %}"
59 >{% trans 'Delete' %}</a>]
60 >{% trans 'Delete' %}</a>]
60 ({{ post.poster_ip }})
61 ({{ post.poster_ip }})
61 [<a href="{% url 'ban' post_id=post.id %}?next={{ request.path }}"
62 [<a href="{% url 'ban' post_id=post.id %}?next={{ request.path }}"
62 >{% trans 'Ban IP' %}</a>]
63 >{% trans 'Ban IP' %}</a>]
63 </span>
64 </span>
64 {% endif %}
65 {% endif %}
65 </div>
66 </div>
66 {% autoescape off %}
67 {% autoescape off %}
67 {{ post.text.rendered }}
68 {{ post.text.rendered }}
68 {% endautoescape %}
69 {% endautoescape %}
69 {% if post.is_referenced %}
70 {% if post.is_referenced %}
70 <div class="refmap">
71 <div class="refmap">
71 {% trans "Replies" %}:
72 {% trans "Replies" %}:
72 {% for ref_post in post.get_sorted_referenced_posts %}
73 {% for ref_post in post.get_sorted_referenced_posts %}
73 <a href="{% post_url ref_post.id %}">&gt;&gt;{{ ref_post.id }}</a
74 <a href="{% post_url ref_post.id %}">&gt;&gt;{{ ref_post.id }}</a
74 >{% if not forloop.last %},{% endif %}
75 >{% if not forloop.last %},{% endif %}
75 {% endfor %}
76 {% endfor %}
76 </div>
77 </div>
77 {% endif %}
78 {% endif %}
78 </div>
79 </div>
79 {% if forloop.first %}
80 {% if forloop.first %}
80 <div class="metadata">
81 <div class="metadata">
81 <span class="tags">
82 <span class="tags">
82 {% for tag in thread.get_tags %}
83 {% for tag in thread.get_tags %}
83 <a class="tag" href="{% url 'tag' tag.name %}">
84 <a class="tag" href="{% url 'tag' tag.name %}">
84 #{{ tag.name }}</a
85 #{{ tag.name }}</a
85 >{% if not forloop.last %},{% endif %}
86 >{% if not forloop.last %},{% endif %}
86 {% endfor %}
87 {% endfor %}
87 </span>
88 </span>
88 </div>
89 </div>
89 {% endif %}
90 {% endif %}
90 </div>
91 </div>
91 {% endfor %}
92 {% endfor %}
92 </div>
93 </div>
93 {% endcache %}
94 {% endcache %}
94
95
95 <form id="form" enctype="multipart/form-data" method="post"
96 <form id="form" enctype="multipart/form-data" method="post"
96 >{% csrf_token %}
97 >{% csrf_token %}
97 <div class="post-form-w">
98 <div class="post-form-w">
98 <div class="form-title">{% trans "Reply to thread" %} #{{ thread.get_opening_post.id }}</div>
99 <div class="form-title">{% trans "Reply to thread" %} #{{ thread.get_opening_post.id }}</div>
99 <div class="post-form">
100 <div class="post-form">
100 <div class="form-row">
101 <div class="form-row">
101 <div class="form-label">{% trans 'Title' %}</div>
102 <div class="form-label">{% trans 'Title' %}</div>
102 <div class="form-input">{{ form.title }}</div>
103 <div class="form-input">{{ form.title }}</div>
103 <div class="form-errors">{{ form.title.errors }}</div>
104 <div class="form-errors">{{ form.title.errors }}</div>
104 </div>
105 </div>
105 <div class="form-row">
106 <div class="form-row">
106 <div class="form-label">{% trans 'Formatting' %}</div>
107 <div class="form-label">{% trans 'Formatting' %}</div>
107 <div class="form-input" id="mark_panel">
108 <div class="form-input" id="mark_panel">
108 <span class="mark_btn" id="quote"><span class="quote">&gt;{% trans 'quote' %}</span></span>
109 <span class="mark_btn" id="quote"><span class="quote">&gt;{% trans 'quote' %}</span></span>
109 <span class="mark_btn" id="italic"><i>{% trans 'italic' %}</i></span>
110 <span class="mark_btn" id="italic"><i>{% trans 'italic' %}</i></span>
110 <span class="mark_btn" id="bold"><b>{% trans 'bold' %}</b></span>
111 <span class="mark_btn" id="bold"><b>{% trans 'bold' %}</b></span>
111 <span class="mark_btn" id="spoiler"><span class="spoiler">{% trans 'spoiler' %}</span></span>
112 <span class="mark_btn" id="spoiler"><span class="spoiler">{% trans 'spoiler' %}</span></span>
112 <span class="mark_btn" id="comment"><span class="comment">// {% trans 'comment' %}</span></span>
113 <span class="mark_btn" id="comment"><span class="comment">// {% trans 'comment' %}</span></span>
113 </div>
114 </div>
114 </div>
115 </div>
115 <div class="form-row">
116 <div class="form-row">
116 <div class="form-label">{% trans 'Text' %}</div>
117 <div class="form-label">{% trans 'Text' %}</div>
117 <div class="form-input">{{ form.text }}</div>
118 <div class="form-input">{{ form.text }}</div>
118 <div class="form-errors">{{ form.text.errors }}</div>
119 <div class="form-errors">{{ form.text.errors }}</div>
119 </div>
120 </div>
120 <div class="form-row">
121 <div class="form-row">
121 <div class="form-label">{% trans 'Image' %}</div>
122 <div class="form-label">{% trans 'Image' %}</div>
122 <div class="form-input">{{ form.image }}</div>
123 <div class="form-input">{{ form.image }}</div>
123 <div class="form-errors">{{ form.image.errors }}</div>
124 <div class="form-errors">{{ form.image.errors }}</div>
124 </div>
125 </div>
125 <div class="form-row form-email">
126 <div class="form-row form-email">
126 <div class="form-label">{% trans 'e-mail' %}</div>
127 <div class="form-label">{% trans 'e-mail' %}</div>
127 <div class="form-input">{{ form.email }}</div>
128 <div class="form-input">{{ form.email }}</div>
128 <div class="form-errors">{{ form.email.errors }}</div>
129 <div class="form-errors">{{ form.email.errors }}</div>
129 </div>
130 </div>
130 <div class="form-row">
131 <div class="form-row">
131 {{ form.captcha }}
132 {{ form.captcha }}
132 <div class="form-errors">{{ form.captcha.errors }}</div>
133 <div class="form-errors">{{ form.captcha.errors }}</div>
133 </div>
134 </div>
134 <div class="form-row">
135 <div class="form-row">
135 <div class="form-errors">{{ form.other.errors }}</div>
136 <div class="form-errors">{{ form.other.errors }}</div>
136 </div>
137 </div>
137 </div>
138 </div>
138
139
139 <div class="form-submit"><input type="submit"
140 <div class="form-submit"><input type="submit"
140 value="{% trans "Post" %}"/></div>
141 value="{% trans "Post" %}"/></div>
141 <div><a href="{% url "staticpage" name="help" %}">
142 <div><a href="{% url "staticpage" name="help" %}">
142 {% trans 'Text syntax' %}</a></div>
143 {% trans 'Text syntax' %}</a></div>
143 </div>
144 </div>
144 </form>
145 </form>
145
146
147 {% endspaceless %}
146 {% endblock %}
148 {% endblock %}
147
149
148 {% block metapanel %}
150 {% block metapanel %}
149
151
150 {% get_current_language as LANGUAGE_CODE %}
152 {% get_current_language as LANGUAGE_CODE %}
151
153
152 <span class="metapanel" data-last-update="{{ last_update }}">
154 <span class="metapanel" data-last-update="{{ last_update }}">
153 {% cache 600 thread_meta thread.last_edit_time moderator LANGUAGE_CODE %}
155 {% cache 600 thread_meta thread.last_edit_time moderator LANGUAGE_CODE %}
154 <span id="reply-count">{{ thread.get_reply_count }}</span> {% trans 'replies' %},
156 <span id="reply-count">{{ thread.get_reply_count }}</span> {% trans 'replies' %},
155 <span id="image-count">{{ thread.get_images_count }}</span> {% trans 'images' %}.
157 <span id="image-count">{{ thread.get_images_count }}</span> {% trans 'images' %}.
156 {% trans 'Last update: ' %}{{ thread.last_edit_time }}
158 {% trans 'Last update: ' %}{{ thread.last_edit_time }}
157 [<a href="rss/">RSS</a>]
159 [<a href="rss/">RSS</a>]
158 {% endcache %}
160 {% endcache %}
159 </span>
161 </span>
160
162
161 {% endblock %}
163 {% endblock %}
General Comments 0
You need to be logged in to leave comments. Login now