##// END OF EJS Templates
Fixed tag view.
neko259 -
r164:390191f3 default
parent child Browse files
Show More
@@ -1,182 +1,182 b''
1 {% extends "boards/base.html" %}
1 {% extends "boards/base.html" %}
2
2
3 {% load i18n %}
3 {% load i18n %}
4 {% load markup %}
4 {% load markup %}
5
5
6 {% block head %}
6 {% block head %}
7 {% if tag %}
7 {% if tag %}
8 <title>Neboard - {{ tag }}</title>
8 <title>Neboard - {{ tag }}</title>
9 {% else %}
9 {% else %}
10 <title>Neboard</title>
10 <title>Neboard</title>
11 {% endif %}
11 {% endif %}
12 {% endblock %}
12 {% endblock %}
13
13
14 {% block content %}
14 {% block content %}
15
15
16 {% if tag %}
16 {% if tag %}
17 <div class="tag_info">
17 <div class="tag_info">
18 <h2>{% trans 'Tag: ' %}{{ tag }}</h2>
18 <h2>{% trans 'Tag: ' %}{{ tag }}</h2>
19 </div>
19 </div>
20 {% endif %}
20 {% endif %}
21
21
22 {% if threads %}
22 {% if threads %}
23 {% for thread in threads %}
23 {% for thread in threads %}
24 <div class="thread">
24 <div class="thread">
25 {% if thread.bumpable %}
25 {% if thread.bumpable %}
26 <div class="post" id="{{ thread.thread.id }}">
26 <div class="post" id="{{ thread.thread.id }}">
27 {% else %}
27 {% else %}
28 <div class="post dead_post" id="{{ thread.thread.id }}">
28 <div class="post dead_post" id="{{ thread.thread.id }}">
29 {% endif %}
29 {% endif %}
30 {% if thread.thread.image %}
30 {% if thread.thread.image %}
31 <div class="image">
31 <div class="image">
32 <a class="fancy"
32 <a class="fancy"
33 href="{{ thread.thread.image.url }}"><img
33 href="{{ thread.thread.image.url }}"><img
34 src="{{ thread.thread.image.url_200x150 }}"
34 src="{{ thread.thread.image.url_200x150 }}"
35 alt="{% trans 'Post image' %}"
35 alt="{% trans 'Post image' %}"
36 data-width="{{ thread.thread.image_width }}"
36 data-width="{{ thread.thread.image_width }}"
37 data-height="{{ thread.thread.image_height }}" />
37 data-height="{{ thread.thread.image_height }}" />
38 </a>
38 </a>
39 </div>
39 </div>
40 {% endif %}
40 {% endif %}
41 <div class="message">
41 <div class="message">
42 <div class="post-info">
42 <div class="post-info">
43 <span class="title">{{ thread.thread.title }}</span>
43 <span class="title">{{ thread.thread.title }}</span>
44 <a class="post_id" href="{% url 'thread' thread.thread.id %}"
44 <a class="post_id" href="{% url 'thread' thread.thread.id %}"
45 >(#{{ thread.thread.id }})</a>
45 >(#{{ thread.thread.id }})</a>
46 [{{ thread.thread.pub_time }}]
46 [{{ thread.thread.pub_time }}]
47 [<a class="link" href="{% url 'thread' thread.thread.id %}#form"
47 [<a class="link" href="{% url 'thread' thread.thread.id %}#form"
48 >{% trans "Reply" %}</a>]
48 >{% trans "Reply" %}</a>]
49
49
50 {% if user.is_moderator %}
50 {% if user.is_moderator %}
51 <span class="moderator_info">
51 <span class="moderator_info">
52 [<a href="{% url 'delete' post_id=thread.thread.id %}?next={{ request.path }}"
52 [<a href="{% url 'delete' post_id=thread.thread.id %}?next={{ request.path }}"
53 >{% trans 'Delete' %}</a>]
53 >{% trans 'Delete' %}</a>]
54 ({{ thread.thread.poster_ip }})
54 ({{ thread.thread.poster_ip }})
55 [<a href="{% url 'ban' post_id=thread.thread.id %}?next={{ request.path }}"
55 [<a href="{% url 'ban' post_id=thread.thread.id %}?next={{ request.path }}"
56 >{% trans 'Ban IP' %}</a>]
56 >{% trans 'Ban IP' %}</a>]
57 </span>
57 </span>
58 {% endif %}
58 {% endif %}
59 </div>
59 </div>
60 {% autoescape off %}
60 {% autoescape off %}
61 {{ thread.thread.text.rendered|truncatewords_html:50 }}
61 {{ thread.thread.text.rendered|truncatewords_html:50 }}
62 {% endautoescape %}
62 {% endautoescape %}
63 </div>
63 </div>
64 <div class="metadata">
64 <div class="metadata">
65 {{ thread.thread.get_reply_count }} {% trans 'replies' %},
65 {{ thread.thread.get_reply_count }} {% trans 'replies' %},
66 {{ thread.thread.get_images_count }} {% trans 'images' %}.
66 {{ thread.thread.get_images_count }} {% trans 'images' %}.
67 {% if thread.tags.exists %}
67 {% if thread.tags.exists %}
68 <span class="tags">{% trans 'Tags' %}:
68 <span class="tags">{% trans 'Tags' %}:
69 {% for tag in thread.thread.tags.all %}
69 {% for tag in thread.thread.tags.all %}
70 <a class="tag" href="
70 <a class="tag" href="
71 {% url 'tag' tag_name=tag.name %}">
71 {% url 'tag' tag_name=tag.name %}">
72 {{ tag.name }}</a>
72 {{ tag.name }}</a>
73 {% endfor %}
73 {% endfor %}
74 </span>
74 </span>
75 {% endif %}
75 {% endif %}
76 </div>
76 </div>
77 </div>
77 </div>
78 {% if thread.thread.get_last_replies %}
78 {% if thread.thread.get_last_replies %}
79 <div class="last-replies">
79 <div class="last-replies">
80 {% for post in thread.thread.get_last_replies %}
80 {% for post in thread.thread.get_last_replies %}
81 {% if thread.bumpable %}
81 {% if thread.bumpable %}
82 <div class="post" id="{{ post.id }}">
82 <div class="post" id="{{ post.id }}">
83 {% else %}
83 {% else %}
84 <div class="post dead_post" id="{{ post.id }}">
84 <div class="post dead_post" id="{{ post.id }}">
85 {% endif %}
85 {% endif %}
86 {% if post.image %}
86 {% if post.image %}
87 <div class="image">
87 <div class="image">
88 <a class="fancy"
88 <a class="fancy"
89 href="{{ post.image.url }}"><img
89 href="{{ post.image.url }}"><img
90 src=" {{ post.image.url_200x150 }}"
90 src=" {{ post.image.url_200x150 }}"
91 alt="{% trans 'Post image' %}"
91 alt="{% trans 'Post image' %}"
92 data-width="{{ post.image_width }}"
92 data-width="{{ post.image_width }}"
93 data-height="{{ post.image_height }}"/>
93 data-height="{{ post.image_height }}"/>
94 </a>
94 </a>
95 </div>
95 </div>
96 {% endif %}
96 {% endif %}
97 <div class="message">
97 <div class="message">
98 <div class="post-info">
98 <div class="post-info">
99 <span class="title">{{ post.title }}</span>
99 <span class="title">{{ post.title }}</span>
100 <a class="post_id" href="
100 <a class="post_id" href="
101 {% url 'thread' thread.thread.id %}#{{ post.id }}">
101 {% url 'thread' thread.thread.id %}#{{ post.id }}">
102 (#{{ post.id }})</a>
102 (#{{ post.id }})</a>
103 [{{ post.pub_time }}]
103 [{{ post.pub_time }}]
104 </div>
104 </div>
105 {% autoescape off %}
105 {% autoescape off %}
106 {{ post.text.rendered|truncatewords_html:50 }}
106 {{ post.text.rendered|truncatewords_html:50 }}
107 {% endautoescape %}
107 {% endautoescape %}
108 </div>
108 </div>
109 </div>
109 </div>
110 {% endfor %}
110 {% endfor %}
111 </div>
111 </div>
112 {% endif %}
112 {% endif %}
113 </div>
113 </div>
114 {% endfor %}
114 {% endfor %}
115 {% else %}
115 {% else %}
116 <div class="post">
116 <div class="post">
117 {% trans 'No threads exist. Create the first one!' %}</div>
117 {% trans 'No threads exist. Create the first one!' %}</div>
118 {% endif %}
118 {% endif %}
119
119
120 <form enctype="multipart/form-data" method="post">{% csrf_token %}
120 <form enctype="multipart/form-data" method="post">{% csrf_token %}
121 <div class="post-form-w">
121 <div class="post-form-w">
122
122
123 <div class="form-title">{% trans "Create new thread" %}</div>
123 <div class="form-title">{% trans "Create new thread" %}</div>
124 <div class="post-form">
124 <div class="post-form">
125 <div class="form-row">
125 <div class="form-row">
126 <div class="form-label">{% trans 'Title' %}</div>
126 <div class="form-label">{% trans 'Title' %}</div>
127 <div class="form-input">{{ form.title }}</div>
127 <div class="form-input">{{ form.title }}</div>
128 <div class="form-errors">{{ form.title.errors }}</div>
128 <div class="form-errors">{{ form.title.errors }}</div>
129 </div>
129 </div>
130 <div class="form-row">
130 <div class="form-row">
131 <div class="form-label">{% trans 'Text' %}</div>
131 <div class="form-label">{% trans 'Text' %}</div>
132 <div class="form-input">{{ form.text }}</div>
132 <div class="form-input">{{ form.text }}</div>
133 <div class="form-errors">{{ form.text.errors }}</div>
133 <div class="form-errors">{{ form.text.errors }}</div>
134 </div>
134 </div>
135 <div class="form-row">
135 <div class="form-row">
136 <div class="form-label">{% trans 'Image' %}</div>
136 <div class="form-label">{% trans 'Image' %}</div>
137 <div class="form-input">{{ form.image }}</div>
137 <div class="form-input">{{ form.image }}</div>
138 <div class="form-errors">{{ form.image.errors }}</div>
138 <div class="form-errors">{{ form.image.errors }}</div>
139 </div>
139 </div>
140 <div class="form-row">
140 <div class="form-row">
141 <div class="form-label">{% trans 'Tags' %}</div>
141 <div class="form-label">{% trans 'Tags' %}</div>
142 <div class="form-input">{{ form.tags }}</div>
142 <div class="form-input">{{ form.tags }}</div>
143 <div class="form-errors">{{ form.tags.errors }}</div>
143 <div class="form-errors">{{ form.tags.errors }}</div>
144 </div>
144 </div>
145 <div class="form-row">
145 <div class="form-row">
146 {{ form.captcha }}
146 {{ form.captcha }}
147 <div class="form-errors">{{ form.captcha.errors }}</div>
147 <div class="form-errors">{{ form.captcha.errors }}</div>
148 </div>
148 </div>
149 <div class="form-row">
149 <div class="form-row">
150 <div class="form-errors">{{ form.other.errors }}</div>
150 <div class="form-errors">{{ form.other.errors }}</div>
151 </div>
151 </div>
152 </div>
152 </div>
153 <div class="form-submit">
153 <div class="form-submit">
154 <input type="submit" value="{% trans "Post" %}"/></div>
154 <input type="submit" value="{% trans "Post" %}"/></div>
155 <div>
155 <div>
156 {% trans 'Tags must be delimited by spaces. Text or image is required.' %}
156 {% trans 'Tags must be delimited by spaces. Text or image is required.' %}
157 </div>
157 </div>
158 <div><a href="{% url "staticpage" name="help" %}">
158 <div><a href="{% url "staticpage" name="help" %}">
159 {% trans 'Text syntax' %}</a></div>
159 {% trans 'Text syntax' %}</a></div>
160 </div>
160 </div>
161 </form>
161 </form>
162
162
163 {% endblock %}
163 {% endblock %}
164
164
165 {% block metapanel %}
165 {% block metapanel %}
166
166
167 <span class="metapanel">
167 <span class="metapanel">
168 <b><a href="{% url "authors" %}">Neboard</a> 1.1</b>
168 <b><a href="{% url "authors" %}">Neboard</a> 1.1</b>
169 {% trans "Pages:" %}
169 {% trans "Pages:" %}
170 {% for page in pages %}
170 {% for page in pages %}
171 [<a href="
171 [<a href="
172 {% if tag %}
172 {% if tag %}
173 {% url "tag" tag_name=tag page=page %}
173 {% url "tag" tag_name=tag page=page %}
174 {% else %}
174 {% else %}
175 {% url "index" page=page %}
175 {% url "index" page=page %}
176 {% endif %}
176 {% endif %}
177 ">{{ page }}</a>]
177 ">{{ page }}</a>]
178 {% endfor %}
178 {% endfor %}
179 [<a href="rss/">RSS</a>]
179 [<a href="rss/">RSS</a>]
180 </span>
180 </span>
181
181
182 {% endblock %}
182 {% endblock %}
@@ -1,355 +1,358 b''
1 import hashlib
1 import hashlib
2 from django.core.urlresolvers import reverse
2 from django.core.urlresolvers import reverse
3 from django.http import HttpResponseRedirect
3 from django.http import HttpResponseRedirect
4 from django.template import RequestContext
4 from django.template import RequestContext
5 from django.shortcuts import render, redirect, get_object_or_404
5 from django.shortcuts import render, redirect, get_object_or_404
6 from django.utils import timezone
6 from django.utils import timezone
7
7
8 from boards import forms
8 from boards import forms
9 import boards
9 import boards
10 from boards import utils
10 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, LoginForm
12 ThreadCaptchaForm, PostCaptchaForm, LoginForm
13
13
14 from boards.models import Post, Tag, Ban, User, RANK_USER, NO_PARENT
14 from boards.models import Post, Tag, Ban, User, RANK_USER, NO_PARENT
15 from boards import authors
15 from boards import authors
16 import neboard
16 import neboard
17
17
18
18
19 def index(request, page=0):
19 def index(request, page=0):
20 context = _init_default_context(request)
20 context = _init_default_context(request)
21
21
22 if utils.need_include_captcha(request):
22 if utils.need_include_captcha(request):
23 threadFormClass = ThreadCaptchaForm
23 threadFormClass = ThreadCaptchaForm
24 kwargs = {'request': request}
24 kwargs = {'request': request}
25 else:
25 else:
26 threadFormClass = ThreadForm
26 threadFormClass = ThreadForm
27 kwargs = {}
27 kwargs = {}
28
28
29 if request.method == 'POST':
29 if request.method == 'POST':
30 form = threadFormClass(request.POST, request.FILES,
30 form = threadFormClass(request.POST, request.FILES,
31 error_class=PlainErrorList, **kwargs)
31 error_class=PlainErrorList, **kwargs)
32 form.session = request.session
32 form.session = request.session
33
33
34 if form.is_valid():
34 if form.is_valid():
35 return _new_post(request, form)
35 return _new_post(request, form)
36 else:
36 else:
37 form = threadFormClass(error_class=PlainErrorList, **kwargs)
37 form = threadFormClass(error_class=PlainErrorList, **kwargs)
38
38
39 threads = []
39 threads = []
40 for thread in Post.objects.get_threads(page=int(page)):
40 for thread in Post.objects.get_threads(page=int(page)):
41 threads.append({'thread': thread,
41 threads.append({'thread': thread,
42 'bumpable': thread.can_bump()})
42 'bumpable': thread.can_bump()})
43
43
44 context['threads'] = None if len(threads) == 0 else threads
44 context['threads'] = None if len(threads) == 0 else threads
45 context['form'] = form
45 context['form'] = form
46 context['pages'] = range(Post.objects.get_thread_page_count())
46 context['pages'] = range(Post.objects.get_thread_page_count())
47
47
48 return render(request, 'boards/posting_general.html',
48 return render(request, 'boards/posting_general.html',
49 context)
49 context)
50
50
51
51
52 def _new_post(request, form, thread_id=boards.models.NO_PARENT):
52 def _new_post(request, form, thread_id=boards.models.NO_PARENT):
53 """Add a new post (in thread or as a reply)."""
53 """Add a new post (in thread or as a reply)."""
54
54
55 ip = _get_client_ip(request)
55 ip = _get_client_ip(request)
56 is_banned = Ban.objects.filter(ip=ip).count() > 0
56 is_banned = Ban.objects.filter(ip=ip).count() > 0
57
57
58 if is_banned:
58 if is_banned:
59 return redirect(you_are_banned)
59 return redirect(you_are_banned)
60
60
61 data = form.cleaned_data
61 data = form.cleaned_data
62
62
63 title = data['title']
63 title = data['title']
64 text = data['text']
64 text = data['text']
65
65
66 if 'image' in data.keys():
66 if 'image' in data.keys():
67 image = data['image']
67 image = data['image']
68 else:
68 else:
69 image = None
69 image = None
70
70
71 tags = []
71 tags = []
72
72
73 new_thread = thread_id == boards.models.NO_PARENT
73 new_thread = thread_id == boards.models.NO_PARENT
74 if new_thread:
74 if new_thread:
75 tag_strings = data['tags']
75 tag_strings = data['tags']
76
76
77 if tag_strings:
77 if tag_strings:
78 tag_strings = tag_strings.split(' ')
78 tag_strings = tag_strings.split(' ')
79 for tag_name in tag_strings:
79 for tag_name in tag_strings:
80 tag_name = tag_name.strip()
80 tag_name = tag_name.strip()
81 if len(tag_name) > 0:
81 if len(tag_name) > 0:
82 tag, created = Tag.objects.get_or_create(name=tag_name)
82 tag, created = Tag.objects.get_or_create(name=tag_name)
83 tags.append(tag)
83 tags.append(tag)
84
84
85 # TODO Add a possibility to define a link image instead of an image file.
85 # TODO Add a possibility to define a link image instead of an image file.
86 # If a link is given, download the image automatically.
86 # If a link is given, download the image automatically.
87
87
88 post = Post.objects.create_post(title=title, text=text, ip=ip,
88 post = Post.objects.create_post(title=title, text=text, ip=ip,
89 parent_id=thread_id, image=image,
89 parent_id=thread_id, image=image,
90 tags=tags)
90 tags=tags)
91
91
92 thread_to_show = (post.id if new_thread else thread_id)
92 thread_to_show = (post.id if new_thread else thread_id)
93
93
94 if new_thread:
94 if new_thread:
95 return redirect(thread, post_id=thread_to_show)
95 return redirect(thread, post_id=thread_to_show)
96 else:
96 else:
97 return redirect(reverse(thread,
97 return redirect(reverse(thread,
98 kwargs={'post_id': thread_to_show}) + '#'
98 kwargs={'post_id': thread_to_show}) + '#'
99 + str(post.id))
99 + str(post.id))
100
100
101
101
102 def tag(request, tag_name, page=0):
102 def tag(request, tag_name, page=0):
103 """Get all tag threads (posts without a parent)."""
103 """Get all tag threads (posts without a parent)."""
104
104
105 tag = get_object_or_404(Tag, name=tag_name)
105 tag = get_object_or_404(Tag, name=tag_name)
106 threads = Post.objects.get_threads(tag=tag, page=int(page))
106 threads = []
107 for thread in Post.objects.get_threads(tag=tag, page=int(page)):
108 threads.append({'thread': thread,
109 'bumpable': thread.can_bump()})
107
110
108 if request.method == 'POST':
111 if request.method == 'POST':
109 form = ThreadForm(request.POST, request.FILES,
112 form = ThreadForm(request.POST, request.FILES,
110 error_class=PlainErrorList)
113 error_class=PlainErrorList)
111 if form.is_valid():
114 if form.is_valid():
112 return _new_post(request, form)
115 return _new_post(request, form)
113 else:
116 else:
114 form = forms.ThreadForm(initial={'tags': tag_name},
117 form = forms.ThreadForm(initial={'tags': tag_name},
115 error_class=PlainErrorList)
118 error_class=PlainErrorList)
116
119
117 context = _init_default_context(request)
120 context = _init_default_context(request)
118 context['threads'] = None if len(threads) == 0 else threads
121 context['threads'] = None if len(threads) == 0 else threads
119 context['tag'] = tag_name
122 context['tag'] = tag_name
120 context['pages'] = range(Post.objects.get_thread_page_count(tag=tag))
123 context['pages'] = range(Post.objects.get_thread_page_count(tag=tag))
121
124
122 context['form'] = form
125 context['form'] = form
123
126
124 return render(request, 'boards/posting_general.html',
127 return render(request, 'boards/posting_general.html',
125 context)
128 context)
126
129
127
130
128 def thread(request, post_id):
131 def thread(request, post_id):
129 """Get all thread posts"""
132 """Get all thread posts"""
130
133
131 if utils.need_include_captcha(request):
134 if utils.need_include_captcha(request):
132 postFormClass = PostCaptchaForm
135 postFormClass = PostCaptchaForm
133 kwargs = {'request': request}
136 kwargs = {'request': request}
134 else:
137 else:
135 postFormClass = PostForm
138 postFormClass = PostForm
136 kwargs = {}
139 kwargs = {}
137
140
138 if request.method == 'POST':
141 if request.method == 'POST':
139 form = postFormClass(request.POST, request.FILES,
142 form = postFormClass(request.POST, request.FILES,
140 error_class=PlainErrorList, **kwargs)
143 error_class=PlainErrorList, **kwargs)
141 form.session = request.session
144 form.session = request.session
142
145
143 if form.is_valid():
146 if form.is_valid():
144 return _new_post(request, form, post_id)
147 return _new_post(request, form, post_id)
145 else:
148 else:
146 form = postFormClass(error_class=PlainErrorList, **kwargs)
149 form = postFormClass(error_class=PlainErrorList, **kwargs)
147
150
148 posts = Post.objects.get_thread(post_id)
151 posts = Post.objects.get_thread(post_id)
149
152
150 context = _init_default_context(request)
153 context = _init_default_context(request)
151
154
152 context['posts'] = posts
155 context['posts'] = posts
153 context['form'] = form
156 context['form'] = form
154 context['bumpable'] = posts[0].can_bump()
157 context['bumpable'] = posts[0].can_bump()
155
158
156 return render(request, 'boards/thread.html', context)
159 return render(request, 'boards/thread.html', context)
157
160
158
161
159 def login(request):
162 def login(request):
160 """Log in with user id"""
163 """Log in with user id"""
161
164
162 context = _init_default_context(request)
165 context = _init_default_context(request)
163
166
164 if request.method == 'POST':
167 if request.method == 'POST':
165 form = LoginForm(request.POST, request.FILES,
168 form = LoginForm(request.POST, request.FILES,
166 error_class=PlainErrorList)
169 error_class=PlainErrorList)
167 if form.is_valid():
170 if form.is_valid():
168 user = User.objects.get(user_id=form.cleaned_data['user_id'])
171 user = User.objects.get(user_id=form.cleaned_data['user_id'])
169 request.session['user_id'] = user.id
172 request.session['user_id'] = user.id
170 return redirect(index)
173 return redirect(index)
171
174
172 else:
175 else:
173 form = LoginForm()
176 form = LoginForm()
174
177
175 context['form'] = form
178 context['form'] = form
176
179
177 return render(request, 'boards/login.html', context)
180 return render(request, 'boards/login.html', context)
178
181
179
182
180 def settings(request):
183 def settings(request):
181 """User's settings"""
184 """User's settings"""
182
185
183 context = _init_default_context(request)
186 context = _init_default_context(request)
184
187
185 if request.method == 'POST':
188 if request.method == 'POST':
186 form = SettingsForm(request.POST)
189 form = SettingsForm(request.POST)
187 if form.is_valid():
190 if form.is_valid():
188 selected_theme = form.cleaned_data['theme']
191 selected_theme = form.cleaned_data['theme']
189
192
190 user = _get_user(request)
193 user = _get_user(request)
191 user.save_setting('theme', selected_theme)
194 user.save_setting('theme', selected_theme)
192
195
193 return redirect(settings)
196 return redirect(settings)
194 else:
197 else:
195 selected_theme = _get_theme(request)
198 selected_theme = _get_theme(request)
196 form = SettingsForm(initial={'theme': selected_theme})
199 form = SettingsForm(initial={'theme': selected_theme})
197 context['form'] = form
200 context['form'] = form
198
201
199 return render(request, 'boards/settings.html', context)
202 return render(request, 'boards/settings.html', context)
200
203
201
204
202 def all_tags(request):
205 def all_tags(request):
203 """All tags list"""
206 """All tags list"""
204
207
205 context = _init_default_context(request)
208 context = _init_default_context(request)
206 context['all_tags'] = Tag.objects.get_not_empty_tags()
209 context['all_tags'] = Tag.objects.get_not_empty_tags()
207
210
208 return render(request, 'boards/tags.html', context)
211 return render(request, 'boards/tags.html', context)
209
212
210
213
211 def jump_to_post(request, post_id):
214 def jump_to_post(request, post_id):
212 """Determine thread in which the requested post is and open it's page"""
215 """Determine thread in which the requested post is and open it's page"""
213
216
214 post = get_object_or_404(Post, id=post_id)
217 post = get_object_or_404(Post, id=post_id)
215
218
216 if boards.models.NO_PARENT == post.parent:
219 if boards.models.NO_PARENT == post.parent:
217 return redirect(thread, post_id=post.id)
220 return redirect(thread, post_id=post.id)
218 else:
221 else:
219 parent_thread = get_object_or_404(Post, id=post.parent)
222 parent_thread = get_object_or_404(Post, id=post.parent)
220 return redirect(reverse(thread, kwargs={'post_id': parent_thread.id})
223 return redirect(reverse(thread, kwargs={'post_id': parent_thread.id})
221 + '#' + str(post.id))
224 + '#' + str(post.id))
222
225
223
226
224 def authors(request):
227 def authors(request):
225 context = _init_default_context(request)
228 context = _init_default_context(request)
226 context['authors'] = boards.authors.authors
229 context['authors'] = boards.authors.authors
227
230
228 return render(request, 'boards/authors.html', context)
231 return render(request, 'boards/authors.html', context)
229
232
230
233
231 def delete(request, post_id):
234 def delete(request, post_id):
232 user = _get_user(request)
235 user = _get_user(request)
233 post = get_object_or_404(Post, id=post_id)
236 post = get_object_or_404(Post, id=post_id)
234
237
235 if user.is_moderator():
238 if user.is_moderator():
236 # TODO Show confirmation page before deletion
239 # TODO Show confirmation page before deletion
237 Post.objects.delete_post(post)
240 Post.objects.delete_post(post)
238
241
239 if NO_PARENT == post.parent:
242 if NO_PARENT == post.parent:
240 return _redirect_to_next(request)
243 return _redirect_to_next(request)
241 else:
244 else:
242 return redirect(thread, post_id=post.parent)
245 return redirect(thread, post_id=post.parent)
243
246
244
247
245 def ban(request, post_id):
248 def ban(request, post_id):
246 user = _get_user(request)
249 user = _get_user(request)
247 post = get_object_or_404(Post, id=post_id)
250 post = get_object_or_404(Post, id=post_id)
248
251
249 if user.is_moderator():
252 if user.is_moderator():
250 # TODO Show confirmation page before ban
253 # TODO Show confirmation page before ban
251 Ban.objects.get_or_create(ip=post.poster_ip)
254 Ban.objects.get_or_create(ip=post.poster_ip)
252
255
253 return _redirect_to_next(request)
256 return _redirect_to_next(request)
254
257
255
258
256 def you_are_banned(request):
259 def you_are_banned(request):
257 context = _init_default_context(request)
260 context = _init_default_context(request)
258 return render(request, 'boards/staticpages/banned.html', context)
261 return render(request, 'boards/staticpages/banned.html', context)
259
262
260
263
261 def page_404(request):
264 def page_404(request):
262 context = _init_default_context(request)
265 context = _init_default_context(request)
263 return render(request, 'boards/404.html', context)
266 return render(request, 'boards/404.html', context)
264
267
265
268
266 def tag_subscribe(request, tag_name):
269 def tag_subscribe(request, tag_name):
267 user = _get_user(request)
270 user = _get_user(request)
268 tag = get_object_or_404(Tag, name=tag_name)
271 tag = get_object_or_404(Tag, name=tag_name)
269
272
270 if not tag in user.fav_tags.all():
273 if not tag in user.fav_tags.all():
271 user.fav_tags.add(tag)
274 user.fav_tags.add(tag)
272
275
273 return redirect(all_tags)
276 return redirect(all_tags)
274
277
275
278
276 def tag_unsubscribe(request, tag_name):
279 def tag_unsubscribe(request, tag_name):
277 user = _get_user(request)
280 user = _get_user(request)
278 tag = get_object_or_404(Tag, name=tag_name)
281 tag = get_object_or_404(Tag, name=tag_name)
279
282
280 if tag in user.fav_tags.all():
283 if tag in user.fav_tags.all():
281 user.fav_tags.remove(tag)
284 user.fav_tags.remove(tag)
282
285
283 return redirect(all_tags)
286 return redirect(all_tags)
284
287
285
288
286 def static_page(request, name):
289 def static_page(request, name):
287 context = _init_default_context(request)
290 context = _init_default_context(request)
288 return render(request, 'boards/staticpages/' + name + '.html', context)
291 return render(request, 'boards/staticpages/' + name + '.html', context)
289
292
290
293
291 def _get_theme(request, user=None):
294 def _get_theme(request, user=None):
292 """Get user's CSS theme"""
295 """Get user's CSS theme"""
293
296
294 if not user:
297 if not user:
295 user = _get_user(request)
298 user = _get_user(request)
296 theme = user.get_setting('theme')
299 theme = user.get_setting('theme')
297 if not theme:
300 if not theme:
298 theme = neboard.settings.DEFAULT_THEME
301 theme = neboard.settings.DEFAULT_THEME
299
302
300 return theme
303 return theme
301
304
302
305
303 def _get_client_ip(request):
306 def _get_client_ip(request):
304 x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
307 x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
305 if x_forwarded_for:
308 if x_forwarded_for:
306 ip = x_forwarded_for.split(',')[-1].strip()
309 ip = x_forwarded_for.split(',')[-1].strip()
307 else:
310 else:
308 ip = request.META.get('REMOTE_ADDR')
311 ip = request.META.get('REMOTE_ADDR')
309 return ip
312 return ip
310
313
311
314
312 def _init_default_context(request):
315 def _init_default_context(request):
313 """Create context with default values that are used in most views"""
316 """Create context with default values that are used in most views"""
314
317
315 context = RequestContext(request)
318 context = RequestContext(request)
316
319
317 user = _get_user(request)
320 user = _get_user(request)
318 context['user'] = user
321 context['user'] = user
319 context['tags'] = user.get_sorted_fav_tags()
322 context['tags'] = user.get_sorted_fav_tags()
320 context['theme'] = _get_theme(request, user)
323 context['theme'] = _get_theme(request, user)
321
324
322 return context
325 return context
323
326
324
327
325 def _get_user(request):
328 def _get_user(request):
326 """Get current user from the session"""
329 """Get current user from the session"""
327
330
328 session = request.session
331 session = request.session
329 if not 'user_id' in session:
332 if not 'user_id' in session:
330 request.session.save()
333 request.session.save()
331
334
332 md5 = hashlib.md5()
335 md5 = hashlib.md5()
333 md5.update(session.session_key)
336 md5.update(session.session_key)
334 new_id = md5.hexdigest()
337 new_id = md5.hexdigest()
335
338
336 time_now = timezone.now()
339 time_now = timezone.now()
337 user = User.objects.create(user_id=new_id, rank=RANK_USER,
340 user = User.objects.create(user_id=new_id, rank=RANK_USER,
338 registration_time=time_now,
341 registration_time=time_now,
339 last_access_time=time_now)
342 last_access_time=time_now)
340
343
341 session['user_id'] = user.id
344 session['user_id'] = user.id
342 else:
345 else:
343 user = User.objects.get(id=session['user_id'])
346 user = User.objects.get(id=session['user_id'])
344 user.last_access_time = timezone.now()
347 user.last_access_time = timezone.now()
345 user.save()
348 user.save()
346
349
347 return user
350 return user
348
351
349
352
350 def _redirect_to_next(request):
353 def _redirect_to_next(request):
351 if 'next' in request.GET:
354 if 'next' in request.GET:
352 next_page = request.GET['next']
355 next_page = request.GET['next']
353 return HttpResponseRedirect(next_page)
356 return HttpResponseRedirect(next_page)
354 else:
357 else:
355 return redirect(index)
358 return redirect(index)
General Comments 0
You need to be logged in to leave comments. Login now