##// END OF EJS Templates
Improved page showing threads for certain tag. Also some fixes of dependency...
emerge-ng -
r74:4a75764d default
parent child Browse files
Show More
@@ -1,192 +1,192 b''
1 from django.core.urlresolvers import reverse
1 from django.core.urlresolvers import reverse
2 from django.template import RequestContext
2 from django.template import RequestContext
3 from boards import forms
3 from boards import forms
4 import boards
4 import boards
5 from boards.forms import ThreadForm, PostForm, SettingsForm
5 from boards.forms import ThreadForm, PostForm, SettingsForm
6 from boards.models import Post, Admin, Tag
6 from boards.models import Post, Admin, Tag
7 from django.shortcuts import render, get_list_or_404, redirect
7 from django.shortcuts import render, get_list_or_404, redirect
8 from django.http import HttpResponseRedirect, Http404
8 from django.http import HttpResponseRedirect, Http404
9 import neboard
9 import neboard
10
10
11
11
12 def index(request, page=0):
12 def index(request, page=0):
13 context = RequestContext(request)
13 context = RequestContext(request)
14
14
15 if request.method == 'POST':
15 if request.method == 'POST':
16 return new_post(request)
16 return new_post(request)
17 else:
17 else:
18 threads = Post.objects.get_threads(page=int(page))
18 threads = Post.objects.get_threads(page=int(page))
19
19
20 # TODO Get rid of the duplicate code in index and tag views
20 # TODO Get rid of the duplicate code in index and tag views
21 context['threads'] = None if len(threads) == 0 else threads
21 context['threads'] = None if len(threads) == 0 else threads
22 context['form'] = forms.ThreadForm()
22 context['form'] = forms.ThreadForm()
23 context['tags'] = Tag.objects.get_popular_tags()
23 context['tags'] = Tag.objects.get_popular_tags()
24 context['theme'] = _get_theme(request)
24 context['theme'] = _get_theme(request)
25 context['pages'] = range(Post.objects.get_thread_page_count())
25 context['pages'] = range(Post.objects.get_thread_page_count())
26
26
27 return render(request, 'posting_general.html',
27 return render(request, 'posting_general.html',
28 context)
28 context)
29
29
30
30
31 def new_post(request, thread_id=boards.models.NO_PARENT):
31 def new_post(request, thread_id=boards.models.NO_PARENT):
32 """Add a new post (in thread or as a reply)."""
32 """Add a new post (in thread or as a reply)."""
33
33
34 if thread_id == boards.models.NO_PARENT:
34 if thread_id == boards.models.NO_PARENT:
35 form = ThreadForm(request.POST, request.FILES)
35 form = ThreadForm(request.POST, request.FILES)
36 else:
36 else:
37 form = PostForm(request.POST, request.FILES)
37 form = PostForm(request.POST, request.FILES)
38
38
39 if form.is_valid():
39 if form.is_valid():
40 data = form.cleaned_data
40 data = form.cleaned_data
41 else:
41 else:
42 return redirect(index)
42 return redirect(index)
43
43
44 title = data['title']
44 title = data['title']
45 text = data['text']
45 text = data['text']
46
46
47 if 'image' in data.keys():
47 if 'image' in data.keys():
48 image = data['image']
48 image = data['image']
49 else:
49 else:
50 image = None
50 image = None
51
51
52 ip = _get_client_ip(request)
52 ip = _get_client_ip(request)
53
53
54 tags = []
54 tags = []
55
55
56 new_thread = thread_id == boards.models.NO_PARENT
56 new_thread = thread_id == boards.models.NO_PARENT
57 if new_thread:
57 if new_thread:
58 tag_strings = data['tags']
58 tag_strings = data['tags']
59
59
60 if tag_strings:
60 if tag_strings:
61 tag_strings = tag_strings.split(' ')
61 tag_strings = tag_strings.split(' ')
62 for tag_name in tag_strings:
62 for tag_name in tag_strings:
63 tag_name = tag_name.strip()
63 tag_name = tag_name.strip()
64 if len(tag_name) > 0:
64 if len(tag_name) > 0:
65 tag, created = Tag.objects.get_or_create(name=tag_name)
65 tag, created = Tag.objects.get_or_create(name=tag_name)
66 tags.append(tag)
66 tags.append(tag)
67
67
68 # TODO Add a possibility to define a link image instead of an image file.
68 # TODO Add a possibility to define a link image instead of an image file.
69 # If a link is given, download the image automatically.
69 # If a link is given, download the image automatically.
70
70
71 post = Post.objects.create_post(title=title, text=text, ip=ip,
71 post = Post.objects.create_post(title=title, text=text, ip=ip,
72 parent_id=thread_id, image=image,
72 parent_id=thread_id, image=image,
73 tags=tags)
73 tags=tags)
74
74
75 thread_to_show = (post.id if new_thread else thread_id)
75 thread_to_show = (post.id if new_thread else thread_id)
76
76
77 if new_thread:
77 if new_thread:
78 return redirect(thread, post_id=thread_to_show)
78 return redirect(thread, post_id=thread_to_show)
79 else:
79 else:
80 return redirect(reverse(thread,
80 return redirect(reverse(thread,
81 kwargs={'post_id': thread_to_show}) + '#'
81 kwargs={'post_id': thread_to_show}) + '#'
82 + str(post.id))
82 + str(post.id))
83
83
84
84
85 def tag(request, tag_name, page=0):
85 def tag(request, tag_name, page=0):
86 """Get all tag threads (posts without a parent)."""
86 """Get all tag threads (posts without a parent)."""
87
87
88 tag = Tag.objects.get(name=tag_name)
88 tag = Tag.objects.get(name=tag_name)
89 threads = Post.objects.get_threads(tag=tag, page=int(page))
89 threads = Post.objects.get_threads(tag=tag, page=int(page))
90
90
91 if request.method == 'POST':
91 if request.method == 'POST':
92 return new_post(request)
92 return new_post(request)
93 else:
93 else:
94 context = RequestContext(request)
94 context = RequestContext(request)
95 context['threads'] = None if len(threads) == 0 else threads
95 context['threads'] = None if len(threads) == 0 else threads
96 context['tag'] = tag_name
96 context['tag'] = tag_name
97 context['tags'] = Tag.objects.get_popular_tags()
97 context['tags'] = Tag.objects.get_popular_tags()
98 context['theme'] = _get_theme(request)
98 context['theme'] = _get_theme(request)
99 context['pages'] = range(Post.objects.get_thread_page_count(tag=tag))
99 context['pages'] = range(Post.objects.get_thread_page_count(tag=tag))
100
100
101 context['form'] = forms.ThreadForm(initial={'tags': tag_name})
101 context['form'] = forms.ThreadForm(initial={'tags': tag_name})
102
102
103 return render(request, 'posting_general.html',
103 return render(request, 'posting_general.html',
104 context)
104 context)
105
105
106
106
107 def thread(request, post_id):
107 def thread(request, post_id):
108 """Get all thread posts"""
108 """Get all thread posts"""
109
109
110 if request.method == 'POST':
110 if request.method == 'POST':
111 return new_post(request, post_id)
111 return new_post(request, post_id)
112 else:
112 else:
113 posts = Post.objects.get_thread(post_id)
113 posts = Post.objects.get_thread(post_id)
114
114
115 context = RequestContext(request)
115 context = RequestContext(request)
116
116
117 context['posts'] = posts
117 context['posts'] = posts
118 context['form'] = forms.PostForm()
118 context['form'] = forms.PostForm()
119 context['tags'] = Tag.objects.get_popular_tags()
119 context['tags'] = Tag.objects.get_popular_tags()
120 context['theme'] = _get_theme(request)
120 context['theme'] = _get_theme(request)
121
121
122 return render(request, 'thread.html', context)
122 return render(request, 'thread.html', context)
123
123
124
124
125 def login(request):
125 def login(request):
126 """Log in as admin"""
126 """Log in as admin"""
127
127
128 if 'name' in request.POST and 'password' in request.POST:
128 if 'name' in request.POST and 'password' in request.POST:
129 request.session['admin'] = False
129 request.session['admin'] = False
130
130
131 isAdmin = len(Admin.objects.filter(name=request.POST['name'],
131 isAdmin = len(Admin.objects.filter(name=request.POST['name'],
132 password=request.POST[
132 password=request.POST[
133 'password'])) > 0
133 'password'])) > 0
134
134
135 if isAdmin:
135 if isAdmin:
136 request.session['admin'] = True
136 request.session['admin'] = True
137
137
138 response = HttpResponseRedirect('/')
138 response = HttpResponseRedirect('/')
139
139
140 else:
140 else:
141 response = render(request, 'login.html', {'error': 'Login error'})
141 response = render(request, 'login.html', {'error': 'Login error'})
142 else:
142 else:
143 response = render(request, 'login.html', {})
143 response = render(request, 'login.html', {})
144
144
145 return response
145 return response
146
146
147
147
148 def logout(request):
148 def logout(request):
149 request.session['admin'] = False
149 request.session['admin'] = False
150 return HttpResponseRedirect('/')
150 return HttpResponseRedirect('/')
151
151
152
152
153 def settings(request):
153 def settings(request):
154 context = RequestContext(request)
154 context = RequestContext(request)
155
155
156 if request.method == 'POST':
156 if request.method == 'POST':
157 form = SettingsForm(request.POST)
157 form = SettingsForm(request.POST)
158 if form.is_valid():
158 if form.is_valid():
159 selected_theme = form.cleaned_data['theme']
159 selected_theme = form.cleaned_data['theme']
160 request.session['theme'] = selected_theme
160 request.session['theme'] = selected_theme
161
161
162 return redirect(settings)
162 return redirect(settings)
163 else:
163 else:
164 selected_theme = _get_theme(request)
164 selected_theme = _get_theme(request)
165 form = SettingsForm(initial={'theme': selected_theme})
165 form = SettingsForm(initial={'theme': selected_theme})
166 context['form'] = form
166 context['form'] = form
167 context['tags'] = Tag.objects.get_popular_tags()
167 context['tags'] = Tag.objects.get_popular_tags()
168 context['theme'] = _get_theme(request)
168 context['theme'] = _get_theme(request)
169
169
170 return render(request, 'settings.html', context)
170 return render(request, 'settings.html', context)
171
171
172
172
173 def all_tags(request):
173 def all_tags(request):
174 context = RequestContext(request)
174 context = RequestContext(request)
175 context['tags'] = Tag.objects.get_popular_tags()
175 context['tags'] = Tag.objects.get_popular_tags()
176 context['theme'] = _get_theme(request)
176 context['theme'] = _get_theme(request)
177 context['all_tags'] = Tag.objects.get_not_empty_tags()
177 context['all_tags'] = Tag.objects.get_not_empty_tags()
178
178
179 return render(request, 'tags.html', context)
179 return render(request, 'tags.html', context)
180
180
181
181
182 def _get_theme(request):
182 def _get_theme(request):
183 return request.session.get('theme', neboard.settings.DEFAULT_THEME)
183 return request.session.get('theme', neboard.settings.DEFAULT_THEME)
184
184
185
185
186 def _get_client_ip(request):
186 def _get_client_ip(request):
187 x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
187 x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
188 if x_forwarded_for:
188 if x_forwarded_for:
189 ip = x_forwarded_for.split(',')[-1].strip()
189 ip = x_forwarded_for.split(',')[-1].strip()
190 else:
190 else:
191 ip = request.META.get('REMOTE_ADDR')
191 ip = request.META.get('REMOTE_ADDR')
192 return ip No newline at end of file
192 return ip
@@ -1,5 +1,6 b''
1 pil
1 pil
2 django >= 1.5
2 django_cleanup
3 django_cleanup
3 django-markupfield
4 django-markupfield
4 markdown
5 markdown
5
6
@@ -1,144 +1,154 b''
1 {% extends "base.html" %}
1 {% extends "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 %}
8 <title>Neboard - {{ tag }}</title>
9 {% else %}
7 <title>Neboard</title>
10 <title>Neboard</title>
11 {% endif %}
8 {% endblock %}
12 {% endblock %}
9
13
10 {% block content %}
14 {% block content %}
11
15
16 {% if tag %}
17 <div class="tag_info">
18 <h2>{{ tag }}</h2>
19 </div>
20 {% endif %}
21
12 {% if threads %}
22 {% if threads %}
13 {% for thread in threads %}
23 {% for thread in threads %}
14 <div class="thread">
24 <div class="thread">
15 {% if thread.can_bump %}
25 {% if thread.can_bump %}
16 <div class="post">
26 <div class="post">
17 {% else %}
27 {% else %}
18 <div class="post dead_post">
28 <div class="post dead_post">
19 {% endif %}
29 {% endif %}
20 {% if thread.image %}
30 {% if thread.image %}
21 <div class="image">
31 <div class="image">
22 <a class="fancy"
32 <a class="fancy"
23 href="{{ thread.image.url }}"><img
33 href="{{ thread.image.url }}"><img
24 src="{{ thread.image.url_200x150 }}" />
34 src="{{ thread.image.url_200x150 }}" />
25 </a>
35 </a>
26 </div>
36 </div>
27 {% endif %}
37 {% endif %}
28 <div class="message">
38 <div class="message">
29 <div class="post-info">
39 <div class="post-info">
30 <span class="title">{{ thread.title }}</span>
40 <span class="title">{{ thread.title }}</span>
31 <a class="post_id" href="{% url 'thread' thread.id %}">
41 <a class="post_id" href="{% url 'thread' thread.id %}">
32 (#{{ thread.id }})</a>
42 (#{{ thread.id }})</a>
33 [{{ thread.pub_time }}]
43 [{{ thread.pub_time }}]
34 [<a class="link" href="{% url 'thread' thread.id %}#form"
44 [<a class="link" href="{% url 'thread' thread.id %}#form"
35 >{% trans "Reply" %}</a>]
45 >{% trans "Reply" %}</a>]
36 </div>
46 </div>
37 {% autoescape off %}
47 {% autoescape off %}
38 {{ thread.text.rendered|truncatewords_html:50 }}
48 {{ thread.text.rendered|truncatewords_html:50 }}
39 {% endautoescape %}
49 {% endautoescape %}
40 </div>
50 </div>
41 <div class="metadata">
51 <div class="metadata">
42 {{ thread.get_reply_count }} {% trans 'replies' %},
52 {{ thread.get_reply_count }} {% trans 'replies' %},
43 {{ thread.get_images_count }} {% trans 'images' %}.
53 {{ thread.get_images_count }} {% trans 'images' %}.
44 {% if thread.tags.all %}
54 {% if thread.tags.all %}
45 <span class="tags">{% trans 'Tags' %}:
55 <span class="tags">{% trans 'Tags' %}:
46 {% for tag in thread.tags.all %}
56 {% for tag in thread.tags.all %}
47 <a class="tag" href="
57 <a class="tag" href="
48 {% url 'tag' tag_name=tag.name %}">
58 {% url 'tag' tag_name=tag.name %}">
49 {{ tag.name }}</a>
59 {{ tag.name }}</a>
50 {% endfor %}
60 {% endfor %}
51 </span>
61 </span>
52 {% endif %}
62 {% endif %}
53 </div>
63 </div>
54 </div>
64 </div>
55 {% if thread.get_last_replies %}
65 {% if thread.get_last_replies %}
56 <div class="last-replies">
66 <div class="last-replies">
57 {% for post in thread.get_last_replies %}
67 {% for post in thread.get_last_replies %}
58 {% if thread.can_bump %}
68 {% if thread.can_bump %}
59 <div class="post">
69 <div class="post">
60 {% else %}
70 {% else %}
61 <div class="post dead_post">
71 <div class="post dead_post">
62 {% endif %}
72 {% endif %}
63 {% if post.image %}
73 {% if post.image %}
64 <div class="image">
74 <div class="image">
65 <a class="fancy"
75 <a class="fancy"
66 href="{{ post.image.url }}"><img
76 href="{{ post.image.url }}"><img
67 src="{{ post.image.url_200x150 }}" />
77 src="{{ post.image.url_200x150 }}" />
68 </a>
78 </a>
69 </div>
79 </div>
70 {% endif %}
80 {% endif %}
71 <div class="message">
81 <div class="message">
72 <div class="post-info">
82 <div class="post-info">
73 <span class="title">{{ post.title }}</span>
83 <span class="title">{{ post.title }}</span>
74 <a class="post_id" href="
84 <a class="post_id" href="
75 {% url 'thread' thread.id %}#{{ post.id }}">
85 {% url 'thread' thread.id %}#{{ post.id }}">
76 (#{{ post.id }})</a>
86 (#{{ post.id }})</a>
77 [{{ post.pub_time }}]
87 [{{ post.pub_time }}]
78 </div>
88 </div>
79 {% autoescape off %}
89 {% autoescape off %}
80 {{ post.text.rendered|truncatewords_html:50 }}
90 {{ post.text.rendered|truncatewords_html:50 }}
81 {% endautoescape %}
91 {% endautoescape %}
82 </div>
92 </div>
83 </div>
93 </div>
84 {% endfor %}
94 {% endfor %}
85 </div>
95 </div>
86 {% endif %}
96 {% endif %}
87 </div>
97 </div>
88 {% endfor %}
98 {% endfor %}
89 {% else %}
99 {% else %}
90 No threads found.
100 No threads found.
91 <hr />
101 <hr />
92 {% endif %}
102 {% endif %}
93
103
94 <form enctype="multipart/form-data" method="post">{% csrf_token %}
104 <form enctype="multipart/form-data" method="post">{% csrf_token %}
95 <div class="post-form-w">
105 <div class="post-form-w">
96 <div class="form-title">{% trans "Create new thread" %}</div>
106 <div class="form-title">{% trans "Create new thread" %}</div>
97 <div class="post-form">
107 <div class="post-form">
98 <div class="form-row">
108 <div class="form-row">
99 <div class="form-label">{% trans 'Title' %}</div>
109 <div class="form-label">{% trans 'Title' %}</div>
100 <div class="form-input">{{ form.title }}</div>
110 <div class="form-input">{{ form.title }}</div>
101 </div>
111 </div>
102 <div class="form-row">
112 <div class="form-row">
103 <div class="form-label">{% trans 'Text' %}</div>
113 <div class="form-label">{% trans 'Text' %}</div>
104 <div class="form-input">{{ form.text }}</div>
114 <div class="form-input">{{ form.text }}</div>
105 </div>
115 </div>
106 <div class="form-row">
116 <div class="form-row">
107 <div class="form-label">{% trans 'Image' %}</div>
117 <div class="form-label">{% trans 'Image' %}</div>
108 <div class="form-input">{{ form.image }}</div>
118 <div class="form-input">{{ form.image }}</div>
109 </div>
119 </div>
110 <div class="form-row">
120 <div class="form-row">
111 <div class="form-label">{% trans 'Tags' %}</div>
121 <div class="form-label">{% trans 'Tags' %}</div>
112 <div class="form-input">{{ form.tags }}</div>
122 <div class="form-input">{{ form.tags }}</div>
113 </div>
123 </div>
114 </div>
124 </div>
115 <div class="form-submit"><input type="submit"
125 <div class="form-submit"><input type="submit"
116 value="{% trans "Post" %}"/></div>
126 value="{% trans "Post" %}"/></div>
117 <div>Tags must be delimited by spaces. Text or image is required
127 <div>Tags must be delimited by spaces. Text or image is required
118 </div>
128 </div>
119 <div>Use <a
129 <div>Use <a
120 href="http://daringfireball.net/projects/markdown/basics">
130 href="http://daringfireball.net/projects/markdown/basics">
121 markdown</a> syntax for posting.</div>
131 markdown</a> syntax for posting.</div>
122 </div>
132 </div>
123 </form>
133 </form>
124
134
125 {% endblock %}
135 {% endblock %}
126
136
127 {% block metapanel %}
137 {% block metapanel %}
128
138
129 <span class="metapanel">
139 <span class="metapanel">
130 <b><a href="https://bitbucket.org/neko259/neboard/">Neboard</a>
140 <b><a href="https://bitbucket.org/neko259/neboard/">Neboard</a>
131 2013-05 (dev)</b>
141 2013-05 (dev)</b>
132 {% trans "Pages:" %}
142 {% trans "Pages:" %}
133 {% for page in pages %}
143 {% for page in pages %}
134 [<a href="
144 [<a href="
135 {% if tag %}
145 {% if tag %}
136 {% url "tag" tag_name=tag page=page %}
146 {% url "tag" tag_name=tag page=page %}
137 {% else %}
147 {% else %}
138 {% url "index" page=page %}
148 {% url "index" page=page %}
139 {% endif %}
149 {% endif %}
140 ">{{ page }}</a>]
150 ">{{ page }}</a>]
141 {% endfor %}
151 {% endfor %}
142 </span>
152 </span>
143
153
144 {% endblock %} No newline at end of file
154 {% endblock %}
General Comments 0
You need to be logged in to leave comments. Login now