##// END OF EJS Templates
Added admin actions (showing IP, post removal). Added user ranks. This refs #61, #12
neko259 -
r112:1dfea0d0 1.1
parent child Browse files
Show More
@@ -1,6 +1,6 b''
1 1 from django.contrib import admin
2 from boards.models import Post, Tag, Admin
2 from boards.models import Post, Tag, User
3 3
4 4 admin.site.register(Post)
5 5 admin.site.register(Tag)
6 admin.site.register(Admin)
6 admin.site.register(User)
1 NO CONTENT: modified file, binary diff hidden
@@ -7,7 +7,7 b' msgid ""'
7 7 msgstr ""
8 8 "Project-Id-Version: PACKAGE VERSION\n"
9 9 "Report-Msgid-Bugs-To: \n"
10 "POT-Creation-Date: 2013-08-04 14:04+0300\n"
10 "POT-Creation-Date: 2013-08-21 20:49+0300\n"
11 11 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 13 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -38,15 +38,15 b' msgstr "\xd0\xa0\xd0\xb5\xd0\xbf\xd0\xbe\xd0\xb7\xd0\xb8\xd1\x82\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb9"'
38 38 msgid "Feed"
39 39 msgstr "Π›Π΅Π½Ρ‚Π°"
40 40
41 #: templates/boards/base.html:31
41 #: templates/boards/base.html:27
42 42 msgid "All threads"
43 43 msgstr "ВсС Ρ‚Π΅ΠΌΡ‹"
44 44
45 #: templates/boards/base.html:37
45 #: templates/boards/base.html:33
46 46 msgid "Settings"
47 47 msgstr "Настройки"
48 48
49 #: templates/boards/base.html:45
49 #: templates/boards/base.html:41
50 50 msgid "Up"
51 51 msgstr "Π’Π²Π΅Ρ€Ρ…"
52 52
@@ -55,7 +55,7 b' msgid "Tag: "'
55 55 msgstr "Π’Π΅Π³: "
56 56
57 57 #: templates/boards/posting_general.html:35
58 #: templates/boards/posting_general.html:79 templates/boards/thread.html:27
58 #: templates/boards/posting_general.html:87 templates/boards/thread.html:27
59 59 #: templates/boards/rss/post.html:5
60 60 msgid "Post image"
61 61 msgstr "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сообщСния"
@@ -64,58 +64,70 b' msgstr "\xd0\x98\xd0\xb7\xd0\xbe\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb6\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"'
64 64 msgid "Reply"
65 65 msgstr "ΠžΡ‚Π²Π΅Ρ‚"
66 66
67 #: templates/boards/posting_general.html:53 templates/boards/thread.html:111
67 #: templates/boards/posting_general.html:52 templates/boards/thread.html:49
68 msgid "Delete"
69 msgstr "Π£Π΄Π°Π»ΠΈΡ‚ΡŒ"
70
71 #: templates/boards/posting_general.html:61 templates/boards/thread.html:119
68 72 msgid "replies"
69 73 msgstr "ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²"
70 74
71 #: templates/boards/posting_general.html:54 templates/boards/thread.html:112
75 #: templates/boards/posting_general.html:62 templates/boards/thread.html:120
72 76 msgid "images"
73 77 msgstr "ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ"
74 78
75 #: templates/boards/posting_general.html:56
76 #: templates/boards/posting_general.html:127 templates/boards/thread.html:51
79 #: templates/boards/posting_general.html:64
80 #: templates/boards/posting_general.html:135 templates/boards/thread.html:59
77 81 #: templates/boards/rss/post.html:10
78 82 msgid "Tags"
79 83 msgstr "Π’Π΅Π³ΠΈ"
80 84
81 #: templates/boards/posting_general.html:109
85 #: templates/boards/posting_general.html:117
82 86 msgid "Create new thread"
83 87 msgstr "Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ"
84 88
85 #: templates/boards/posting_general.html:112 templates/boards/thread.html:73
89 #: templates/boards/posting_general.html:120 templates/boards/thread.html:81
86 90 msgid "Title"
87 91 msgstr "Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ"
88 92
89 #: templates/boards/posting_general.html:117 templates/boards/thread.html:78
93 #: templates/boards/posting_general.html:125 templates/boards/thread.html:86
90 94 msgid "Text"
91 95 msgstr "ВСкст"
92 96
93 #: templates/boards/posting_general.html:122 templates/boards/thread.html:83
97 #: templates/boards/posting_general.html:130 templates/boards/thread.html:91
94 98 msgid "Image"
95 99 msgstr "Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅"
96 100
97 #: templates/boards/posting_general.html:137 templates/boards/thread.html:94
101 #: templates/boards/posting_general.html:145 templates/boards/thread.html:102
98 102 msgid "Post"
99 103 msgstr "ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ"
100 104
101 #: templates/boards/posting_general.html:139
105 #: templates/boards/posting_general.html:147
102 106 msgid "Tags must be delimited by spaces. Text or image is required."
103 107 msgstr ""
104 108 "Π’Π΅Π³ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. ВСкст ΠΈΠ»ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹."
105 109
106 #: templates/boards/posting_general.html:142 templates/boards/thread.html:96
110 #: templates/boards/posting_general.html:150 templates/boards/thread.html:104
107 111 msgid "Basic markdown syntax."
108 112 msgstr "Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ синтаксис markdown."
109 113
110 #: templates/boards/posting_general.html:152
114 #: templates/boards/posting_general.html:160
111 115 msgid "Pages:"
112 116 msgstr "Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹: "
113 117
114 #: templates/boards/settings.html:13
118 #: templates/boards/settings.html:12
119 msgid "User:"
120 msgstr "ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ:"
121
122 #: templates/boards/settings.html:14
123 msgid "You are moderator."
124 msgstr "Π’Ρ‹ ΠΌΠΎΠ΄Π΅Ρ€Π°Ρ‚ΠΎΡ€."
125
126 #: templates/boards/settings.html:20
115 127 msgid "Theme"
116 128 msgstr "Π’Π΅ΠΌΠ°"
117 129
118 #: templates/boards/settings.html:29
130 #: templates/boards/settings.html:36
119 131 msgid "Save"
120 132 msgstr "Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ"
121 133
@@ -127,31 +139,31 b' msgstr "\xd1\x82\xd0\xb5\xd0\xb3\xd0\xbe\xd0\xb2"'
127 139 msgid "Get!"
128 140 msgstr "Π“Π΅Ρ‚!"
129 141
130 #: templates/boards/thread.html:70
142 #: templates/boards/thread.html:78
131 143 msgid "Reply to thread"
132 144 msgstr "ΠžΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π² Ρ‚Π΅ΠΌΡƒ"
133 145
134 #: templates/boards/thread.html:97
146 #: templates/boards/thread.html:105
135 147 msgid "Example: "
136 148 msgstr "ΠŸΡ€ΠΈΠΌΠ΅Ρ€: "
137 149
138 #: templates/boards/thread.html:97
150 #: templates/boards/thread.html:105
139 151 msgid "italic"
140 152 msgstr "курсив"
141 153
142 #: templates/boards/thread.html:98
154 #: templates/boards/thread.html:106
143 155 msgid "bold"
144 156 msgstr "ΠΏΠΎΠ»ΡƒΠΆΠΈΡ€Π½Ρ‹ΠΉ"
145 157
146 #: templates/boards/thread.html:99
158 #: templates/boards/thread.html:107
147 159 msgid "Quotes can be inserted with"
148 160 msgstr "Π¦ΠΈΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ вставлСны ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ"
149 161
150 #: templates/boards/thread.html:100
162 #: templates/boards/thread.html:108
151 163 msgid "Links to answers can be inserted with"
152 164 msgstr "Бсылки Π½Π° ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ вставлСны с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ"
153 165
154 #: templates/boards/thread.html:113
166 #: templates/boards/thread.html:121
155 167 msgid "Last update: "
156 168 msgstr "ПослСднСС обновлСниС: "
157 169
@@ -161,8 +173,8 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: "'
161 173 #~ msgid "gets"
162 174 #~ msgstr "Π³Π΅Ρ‚ΠΎΠ²"
163 175
164 msgid "author"
165 msgstr "Π°Π²Ρ‚ΠΎΡ€"
176 #~ msgid "author"
177 #~ msgstr "Π°Π²Ρ‚ΠΎΡ€"
166 178
167 msgid "developer"
168 msgstr "Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ" No newline at end of file
179 #~ msgid "developer"
180 #~ msgstr "Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ"
@@ -30,6 +30,10 b" FILE_EXTENSION_DELIMITER = '.'"
30 30 REGEX_PRETTY = re.compile(r'^\d(0)+$')
31 31 REGEX_SAME = re.compile(r'^(.)\1+$')
32 32
33 RANK_ADMIN = 0
34 RANK_MODERATOR = 10
35 RANK_USER = 100
36
33 37
34 38 class PostManager(models.Manager):
35 39 def create_post(self, title, text, image=None, parent_id=NO_PARENT,
@@ -289,26 +293,20 b' class Admin(models.Model):'
289 293 return self.name + '/' + '*' * len(self.password)
290 294
291 295
292 class Setting(models.Model):
293
294 name = models.CharField(max_length=50)
295 value = models.CharField(max_length=50)
296
297
298 296 class User(models.Model):
299 297
300 user_id = models.CharField(max_length=20)
301 settings = models.ManyToManyField(Setting)
298 user_id = models.CharField(max_length=50)
299 rank = models.IntegerField()
302 300
303 301 def save_setting(self, name, value):
304 setting, created = self.settings.get_or_create(name=name)
302 setting, created = Setting.objects.get_or_create(name=name, user=self)
305 303 setting.value = value
306 304 setting.save()
307 305
308 306 return setting
309 307
310 308 def get_setting(self, name):
311 settings = self.settings.filter(name=name)
309 settings = Setting.objects.filter(name=name, user=self)
312 310 if len(settings) > 0:
313 311 setting = settings[0]
314 312 else:
@@ -320,3 +318,16 b' class User(models.Model):'
320 318 setting_value = None
321 319
322 320 return setting_value
321
322 def is_moderator(self):
323 return RANK_MODERATOR >= self.rank
324
325 def __unicode__(self):
326 return self.user_id
327
328
329 class Setting(models.Model):
330
331 name = models.CharField(max_length=50)
332 value = models.CharField(max_length=50)
333 user = models.ForeignKey(User)
@@ -273,3 +273,8 b' li {'
273 273 .post-info {
274 274 color: #ddd;
275 275 }
276
277 .moderator_info {
278 color: #e99d41;
279 float: right;
280 } No newline at end of file
@@ -261,4 +261,9 b' li {'
261 261
262 262 .form-errors {
263 263 margin-left: 1ex;
264 }
265
266 .moderator_info {
267 font-weight: bold;
268 float: right;
264 269 } No newline at end of file
@@ -22,18 +22,11 b''
22 22 <script src="{{ STATIC_URL }}js/jquery-2.0.1.min.js"></script>
23 23 <script src="{{ STATIC_URL }}js/jquery.fancybox.pack.js"></script>
24 24 <script src="{{ STATIC_URL }}js/main.js"></script>
25 <div id="admin_panel">
26
27 {% if request.session.admin == True %}
28 Admin panel TODO: Need to implement <BR />
29 {% endif %}
30
31 </div>
32 25
33 26 <div class="navigation_panel">
34 27 <a class="link" href="{% url 'index' %}">{% trans "All threads" %}</a>
35 28 {% for tag in tags %}
36 <a class="tag" href=" {% url 'tag' tag_name=tag.name %}">
29 <a class="tag" href="{% url 'tag' tag_name=tag.name %}">
37 30 {{ tag.name }}</a>({{ tag.get_post_count }})
38 31 {% endfor %}
39 32 <a class="tag" href="{% url 'tags' %}">[...]</a>
@@ -44,6 +44,14 b''
44 44 [{{ thread.pub_time }}]
45 45 [<a class="link" href="{% url 'thread' thread.id %}#form"
46 46 >{% trans "Reply" %}</a>]
47
48 {% if user.is_moderator %}
49 <span class="moderator_info">
50 ({{ thread.poster_ip }})
51 [<a href="{% url 'delete' post_id=thread.id %}"
52 >{% trans 'Delete' %}</a>]
53 </span>
54 {% endif %}
47 55 </div>
48 56 {% autoescape off %}
49 57 {{ thread.text.rendered|truncatewords_html:50 }}
@@ -9,7 +9,10 b''
9 9 {% block content %}
10 10
11 11 <div class="post">
12 {% trans 'User:' %} <b>{{ request.session.user.user_id }}</b>
12 {% trans 'User:' %} <b>{{ user.user_id }}</b>.
13 {% if user.is_moderator %}
14 {% trans 'You are moderator.' %}
15 {% endif %}
13 16 </div>
14 17
15 18 <div class="post-form-w">
@@ -41,6 +41,14 b''
41 41 {% endif %}
42 42 [<a href="#" onclick="javascript:addQuickReply('{{ post.id }}')
43 43 ; return false;">&gt;&gt;</a>]
44
45 {% if user.is_moderator %}
46 <span class="moderator_info">
47 ({{ post.poster_ip }})
48 [<a href="{% url 'delete' post_id=post.id %}"
49 >{% trans 'Delete' %}</a>]
50 </span>
51 {% endif %}
44 52 </div>
45 53 {% autoescape off %}
46 54 {{ post.text.rendered }}
@@ -26,6 +26,7 b" urlpatterns = patterns('',"
26 26 url(r'^captcha/', include('captcha.urls')),
27 27 url(r'^jump/(?P<post_id>\w+)/$', views.jump_to_post, name='jumper'),
28 28 url(r'^authors/$', views.authors, name='authors'),
29 url(r'^delete/(?P<post_id>\w+)/$', views.delete, name='delete'),
29 30
30 31 # RSS feeds
31 32 url(r'^rss/$', AllThreadsFeed()),
@@ -10,7 +10,7 b' from boards import utils'
10 10 from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
11 11 ThreadCaptchaForm, PostCaptchaForm
12 12
13 from boards.models import Post, Admin, Tag, User
13 from boards.models import Post, Admin, Tag, User, RANK_USER, RANK_MODERATOR, NO_PARENT
14 14 from boards import authors
15 15 import neboard
16 16
@@ -190,7 +190,6 b' def settings(request):'
190 190 selected_theme = _get_theme(request)
191 191 form = SettingsForm(initial={'theme': selected_theme})
192 192 context['form'] = form
193 _get_user(request)
194 193
195 194 return render(request, 'boards/settings.html', context)
196 195
@@ -224,6 +223,19 b' def authors(request):'
224 223 return render(request, 'boards/authors.html', context)
225 224
226 225
226 def delete(request, post_id):
227 user = _get_user(request)
228 post = get_object_or_404(Post, id=post_id)
229
230 if user.is_moderator():
231 Post.objects.delete_post(post)
232
233 if NO_PARENT == post.parent:
234 return redirect(index)
235 else:
236 return redirect(thread, post_id=post.parent)
237
238
227 239 def _get_theme(request):
228 240 """Get user's CSS theme"""
229 241
@@ -250,6 +262,7 b' def _init_default_context(request):'
250 262 context = RequestContext(request)
251 263 context['tags'] = Tag.objects.get_popular_tags()
252 264 context['theme'] = _get_theme(request)
265 context['user'] = _get_user(request)
253 266
254 267 return context
255 268
@@ -258,17 +271,17 b' def _get_user(request):'
258 271 """Get current user from the session"""
259 272
260 273 session = request.session
261 if not 'user' in session:
274 if not 'user_id' in session:
262 275 request.session.save()
263 276
264 277 md5 = hashlib.md5()
265 278 md5.update(session.session_key)
266 279 new_id = md5.hexdigest()
267 280
268 user = User.objects.create(user_id=new_id)
281 user = User.objects.create(user_id=new_id, rank=RANK_USER)
269 282
270 session['user'] = user
283 session['user_id'] = user.id
271 284 else:
272 user = session['user']
285 user = User.objects.get(id=session['user_id'])
273 286
274 287 return user No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now