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