##// END OF EJS Templates
Added missing all_tags module. Moved authors view to class-based
neko259 -
r551:37f54a4a 1.7-dev
parent child Browse files
Show More
@@ -0,0 +1,12
1 from django.shortcuts import render
2
3 from boards.views.base import BaseBoardView
4 from boards.models.tag import Tag
5
6 class AllTagsView(BaseBoardView):
7
8 def get(self, request):
9 context = self.get_context_data(request=request)
10 context['all_tags'] = Tag.objects.get_not_empty_tags()
11
12 return render(request, 'boards/tags.html', context)
@@ -0,0 +1,12
1 from django.shortcuts import render
2
3 from boards.authors import authors
4 from boards.views.base import BaseBoardView
5
6 class AuthorsView(BaseBoardView):
7
8 def get(self, request):
9 context = self.get_context_data(request=request)
10 context['authors'] = authors
11
12 return render(request, 'boards/authors.html', context)
@@ -1,78 +1,79
1 1 from django.conf.urls import patterns, url, include
2 2 from boards import views
3 3 from boards.rss import AllThreadsFeed, TagThreadsFeed, ThreadPostsFeed
4 4 from boards.views import api, tag_threads, all_threads, archived_threads, \
5 5 login, settings, all_tags
6 from boards.views.authors import AuthorsView
6 7
7 8 js_info_dict = {
8 9 'packages': ('boards',),
9 10 }
10 11
11 12 urlpatterns = patterns('',
12 13
13 14 # /boards/
14 15 url(r'^$', all_threads.AllThreadsView.as_view(), name='index'),
15 16 # /boards/page/
16 17 url(r'^page/(?P<page>\w+)/$', all_threads.AllThreadsView.as_view(),
17 18 name='index'),
18 19
19 20 url(r'^archive/$', archived_threads.ArchiveView.as_view(), name='archive'),
20 21 url(r'^archive/page/(?P<page>\w+)/$',
21 22 archived_threads.ArchiveView.as_view(), name='archive'),
22 23
23 24 # login page
24 25 url(r'^login/$', login.LoginView.as_view(), name='login'),
25 26
26 27 # /boards/tag/tag_name/
27 28 url(r'^tag/(?P<tag_name>\w+)/$', tag_threads.TagView.as_view(),
28 29 name='tag'),
29 30 # /boards/tag/tag_id/page/
30 31 url(r'^tag/(?P<tag_name>\w+)/page/(?P<page>\w+)/$',
31 32 tag_threads.TagView.as_view(), name='tag'),
32 33
33 34 # /boards/tag/tag_name/unsubscribe/
34 35 url(r'^tag/(?P<tag_name>\w+)/subscribe/$', views.tag_subscribe,
35 36 name='tag_subscribe'),
36 37 # /boards/tag/tag_name/unsubscribe/
37 38 url(r'^tag/(?P<tag_name>\w+)/unsubscribe/$', views.tag_unsubscribe,
38 39 name='tag_unsubscribe'),
39 40
40 41 # /boards/thread/
41 42 url(r'^thread/(?P<post_id>\w+)/$', views.thread.ThreadView.as_view(),
42 43 name='thread'),
43 44 url(r'^thread/(?P<post_id>\w+)/(?P<mode>\w+)/$', views.thread.ThreadView
44 45 .as_view(), name='thread_mode'),
45 46
46 47 url(r'^settings/$', settings.SettingsView.as_view(), name='settings'),
47 48 url(r'^tags/$', all_tags.AllTagsView.as_view(), name='tags'),
48 49 url(r'^captcha/', include('captcha.urls')),
49 50 url(r'^jump/(?P<post_id>\w+)/$', views.jump_to_post, name='jumper'),
50 url(r'^authors/$', views.authors, name='authors'),
51 url(r'^authors/$', AuthorsView.as_view(), name='authors'),
51 52 url(r'^delete/(?P<post_id>\w+)/$', views.delete, name='delete'),
52 53 url(r'^ban/(?P<post_id>\w+)/$', views.ban, name='ban'),
53 54
54 55 url(r'^banned/$', views.banned.BannedView.as_view(), name='banned'),
55 56 url(r'^staticpage/(?P<name>\w+)/$', views.static_page, name='staticpage'),
56 57
57 58 # RSS feeds
58 59 url(r'^rss/$', AllThreadsFeed()),
59 60 url(r'^page/(?P<page>\w+)/rss/$', AllThreadsFeed()),
60 61 url(r'^tag/(?P<tag_name>\w+)/rss/$', TagThreadsFeed()),
61 62 url(r'^tag/(?P<tag_name>\w+)/page/(?P<page>\w+)/rss/$', TagThreadsFeed()),
62 63 url(r'^thread/(?P<post_id>\w+)/rss/$', ThreadPostsFeed()),
63 64
64 65 # i18n
65 66 url(r'^jsi18n/$', 'boards.views.cached_js_catalog', js_info_dict, name='js_info_dict'),
66 67
67 68 # API
68 69 url(r'^api/post/(?P<post_id>\w+)/$', api.get_post, name="get_post"),
69 70 url(r'^api/diff_thread/(?P<thread_id>\w+)/(?P<last_update_time>\w+)/$',
70 71 api.api_get_threaddiff, name="get_thread_diff"),
71 72 url(r'^api/threads/(?P<count>\w+)/$', api.api_get_threads,
72 73 name='get_threads'),
73 74 url(r'^api/tags/$', api.api_get_tags, name='get_tags'),
74 75 url(r'^api/thread/(?P<opening_post_id>\w+)/$', api.api_get_thread_posts,
75 76 name='get_thread'),
76 77 url(r'^api/add_post/(?P<opening_post_id>\w+)/$', api.api_add_post, name='add_post'),
77 78
78 79 )
@@ -1,234 +1,227
1 1 __author__ = 'neko259'
2 2
3 3 import hashlib
4 4
5 5 from django.core import serializers
6 6 from django.core.urlresolvers import reverse
7 7 from django.http import HttpResponseRedirect
8 8 from django.http.response import HttpResponse
9 9 from django.template import RequestContext
10 10 from django.shortcuts import render, redirect, get_object_or_404
11 11 from django.utils import timezone
12 12 from django.db import transaction
13 13 from django.views.decorators.cache import cache_page
14 14 from django.views.i18n import javascript_catalog
15 15
16 16 import boards
17 17 from boards.forms import PlainErrorList
18 18 from boards.models import Post, Tag, Ban, User
19 19 from boards.models.post import SETTING_MODERATE
20 20 from boards.models.user import RANK_USER
21 21 from boards import authors
22 22 import neboard
23 23
24 24
25 25 BAN_REASON_SPAM = 'Autoban: spam bot'
26 26
27 27 DEFAULT_PAGE = 1
28 28
29 29
30 30 # TODO Maybe this jumper is not needed any more? Only as a hack to find some
31 31 # post without knowing its thread
32 32 def jump_to_post(request, post_id):
33 33 """Determine thread in which the requested post is and open it's page"""
34 34
35 35 post = get_object_or_404(Post, id=post_id)
36 36
37 37 if not post.thread:
38 38 return redirect('thread', post_id=post.id)
39 39 else:
40 40 return redirect(reverse('thread', kwargs={'post_id': post.thread.id})
41 41 + '#' + str(post.id))
42 42
43 43
44 def authors(request):
45 """Show authors list"""
46
47 context = _init_default_context(request)
48 context['authors'] = boards.authors.authors
49
50 return render(request, 'boards/authors.html', context)
51 44
52 45
53 46 @transaction.atomic
54 47 def delete(request, post_id):
55 48 """Delete post"""
56 49
57 50 user = _get_user(request)
58 51 post = get_object_or_404(Post, id=post_id)
59 52
60 53 if user.is_moderator():
61 54 # TODO Show confirmation page before deletion
62 55 Post.objects.delete_post(post)
63 56
64 57 if not post.thread:
65 58 return _redirect_to_next(request)
66 59 else:
67 60 return redirect('thread', post_id=post.thread.id)
68 61
69 62
70 63 @transaction.atomic
71 64 def ban(request, post_id):
72 65 """Ban user"""
73 66
74 67 user = _get_user(request)
75 68 post = get_object_or_404(Post, id=post_id)
76 69
77 70 if user.is_moderator():
78 71 # TODO Show confirmation page before ban
79 72 ban, created = Ban.objects.get_or_create(ip=post.poster_ip)
80 73 if created:
81 74 ban.reason = 'Banned for post ' + str(post_id)
82 75 ban.save()
83 76
84 77 return _redirect_to_next(request)
85 78
86 79
87 80 def page_404(request):
88 81 """Show page 404 (not found error)"""
89 82
90 83 context = _init_default_context(request)
91 84 return render(request, 'boards/404.html', context)
92 85
93 86
94 87 @transaction.atomic
95 88 def tag_subscribe(request, tag_name):
96 89 """Add tag to favorites"""
97 90
98 91 user = _get_user(request)
99 92 tag = get_object_or_404(Tag, name=tag_name)
100 93
101 94 if not tag in user.fav_tags.all():
102 95 user.add_tag(tag)
103 96
104 97 return _redirect_to_next(request)
105 98
106 99
107 100 @transaction.atomic
108 101 def tag_unsubscribe(request, tag_name):
109 102 """Remove tag from favorites"""
110 103
111 104 user = _get_user(request)
112 105 tag = get_object_or_404(Tag, name=tag_name)
113 106
114 107 if tag in user.fav_tags.all():
115 108 user.remove_tag(tag)
116 109
117 110 return _redirect_to_next(request)
118 111
119 112
120 113 def static_page(request, name):
121 114 """Show a static page that needs only tags list and a CSS"""
122 115
123 116 context = _init_default_context(request)
124 117 return render(request, 'boards/staticpages/' + name + '.html', context)
125 118
126 119
127 120 # TODO This has to be moved under the api module
128 121 def api_get_post(request, post_id):
129 122 """
130 123 Get the JSON of a post. This can be
131 124 used as and API for external clients.
132 125 """
133 126
134 127 post = get_object_or_404(Post, id=post_id)
135 128
136 129 json = serializers.serialize("json", [post], fields=(
137 130 "pub_time", "_text_rendered", "title", "text", "image",
138 131 "image_width", "image_height", "replies", "tags"
139 132 ))
140 133
141 134 return HttpResponse(content=json)
142 135
143 136
144 137 @cache_page(86400)
145 138 def cached_js_catalog(request, domain='djangojs', packages=None):
146 139 return javascript_catalog(request, domain, packages)
147 140
148 141
149 142 # TODO This method is deprecated and should be removed after switching to
150 143 # class-based view
151 144 def _get_theme(request, user=None):
152 145 """Get user's CSS theme"""
153 146
154 147 if not user:
155 148 user = _get_user(request)
156 149 theme = user.get_setting('theme')
157 150 if not theme:
158 151 theme = neboard.settings.DEFAULT_THEME
159 152
160 153 return theme
161 154
162 155
163 156 # TODO This method is deprecated and should be removed after switching to
164 157 # class-based view
165 158 def _init_default_context(request):
166 159 """Create context with default values that are used in most views"""
167 160
168 161 context = RequestContext(request)
169 162
170 163 user = _get_user(request)
171 164 context['user'] = user
172 165 context['tags'] = user.get_sorted_fav_tags()
173 166 context['posts_per_day'] = float(Post.objects.get_posts_per_day())
174 167
175 168 theme = _get_theme(request, user)
176 169 context['theme'] = theme
177 170 context['theme_css'] = 'css/' + theme + '/base_page.css'
178 171
179 172 # This shows the moderator panel
180 173 moderate = user.get_setting(SETTING_MODERATE)
181 174 if moderate == 'True':
182 175 context['moderator'] = user.is_moderator()
183 176 else:
184 177 context['moderator'] = False
185 178
186 179 return context
187 180
188 181
189 182 # TODO This method is deprecated and should be removed after switching to
190 183 # class-based view
191 184 def _get_user(request):
192 185 """
193 186 Get current user from the session. If the user does not exist, create
194 187 a new one.
195 188 """
196 189
197 190 session = request.session
198 191 if not 'user_id' in session:
199 192 request.session.save()
200 193
201 194 md5 = hashlib.md5()
202 195 md5.update(session.session_key)
203 196 new_id = md5.hexdigest()
204 197
205 198 while User.objects.filter(user_id=new_id).exists():
206 199 md5.update(str(timezone.now()))
207 200 new_id = md5.hexdigest()
208 201
209 202 time_now = timezone.now()
210 203 user = User.objects.create(user_id=new_id, rank=RANK_USER,
211 204 registration_time=time_now)
212 205
213 206 # TODO This is just a test. This method should be removed
214 207 # _delete_old_users()
215 208
216 209 session['user_id'] = user.id
217 210 else:
218 211 user = User.objects.get(id=session['user_id'])
219 212
220 213 return user
221 214
222 215
223 216 def _redirect_to_next(request):
224 217 """
225 218 If a 'next' parameter was specified, redirect to the next page. This is
226 219 used when the user is required to return to some page after the current
227 220 view has finished its work.
228 221 """
229 222
230 223 if 'next' in request.GET:
231 224 next_page = request.GET['next']
232 225 return HttpResponseRedirect(next_page)
233 226 else:
234 227 return redirect('index')
General Comments 0
You need to be logged in to leave comments. Login now