##// END OF EJS Templates
Pass all GET params over thread list links
neko259 -
r1375:b88219b9 default
parent child Browse files
Show More
@@ -1,153 +1,157 b''
1 from django.core.urlresolvers import reverse
1 from django.core.urlresolvers import reverse
2 from django.core.files import File
2 from django.core.files import File
3 from django.core.files.temp import NamedTemporaryFile
3 from django.core.files.temp import NamedTemporaryFile
4 from django.core.paginator import EmptyPage
4 from django.core.paginator import EmptyPage
5 from django.db import transaction
5 from django.db import transaction
6 from django.http import Http404
6 from django.http import Http404
7 from django.shortcuts import render, redirect
7 from django.shortcuts import render, redirect
8 import requests
8 import requests
9
9
10 from boards import utils, settings
10 from boards import utils, settings
11 from boards.abstracts.paginator import get_paginator
11 from boards.abstracts.paginator import get_paginator
12 from boards.abstracts.settingsmanager import get_settings_manager
12 from boards.abstracts.settingsmanager import get_settings_manager
13 from boards.forms import ThreadForm, PlainErrorList
13 from boards.forms import ThreadForm, PlainErrorList
14 from boards.models import Post, Thread, Ban, Tag, PostImage, Banner
14 from boards.models import Post, Thread, Ban, Tag, PostImage, Banner
15 from boards.views.banned import BannedView
15 from boards.views.banned import BannedView
16 from boards.views.base import BaseBoardView, CONTEXT_FORM
16 from boards.views.base import BaseBoardView, CONTEXT_FORM
17 from boards.views.posting_mixin import PostMixin
17 from boards.views.posting_mixin import PostMixin
18
18
19
19
20 FORM_TAGS = 'tags'
20 FORM_TAGS = 'tags'
21 FORM_TEXT = 'text'
21 FORM_TEXT = 'text'
22 FORM_TITLE = 'title'
22 FORM_TITLE = 'title'
23 FORM_IMAGE = 'image'
23 FORM_IMAGE = 'image'
24 FORM_THREADS = 'threads'
24 FORM_THREADS = 'threads'
25
25
26 TAG_DELIMITER = ' '
26 TAG_DELIMITER = ' '
27
27
28 PARAMETER_CURRENT_PAGE = 'current_page'
28 PARAMETER_CURRENT_PAGE = 'current_page'
29 PARAMETER_PAGINATOR = 'paginator'
29 PARAMETER_PAGINATOR = 'paginator'
30 PARAMETER_THREADS = 'threads'
30 PARAMETER_THREADS = 'threads'
31 PARAMETER_BANNERS = 'banners'
31 PARAMETER_BANNERS = 'banners'
32
32
33 PARAMETER_PREV_LINK = 'prev_page_link'
33 PARAMETER_PREV_LINK = 'prev_page_link'
34 PARAMETER_NEXT_LINK = 'next_page_link'
34 PARAMETER_NEXT_LINK = 'next_page_link'
35
35
36 TEMPLATE = 'boards/all_threads.html'
36 TEMPLATE = 'boards/all_threads.html'
37 DEFAULT_PAGE = 1
37 DEFAULT_PAGE = 1
38
38
39
39
40 class AllThreadsView(PostMixin, BaseBoardView):
40 class AllThreadsView(PostMixin, BaseBoardView):
41
41
42 def __init__(self):
42 def __init__(self):
43 self.settings_manager = None
43 self.settings_manager = None
44 super(AllThreadsView, self).__init__()
44 super(AllThreadsView, self).__init__()
45
45
46 def get(self, request, form: ThreadForm=None):
46 def get(self, request, form: ThreadForm=None):
47 page = request.GET.get('page', DEFAULT_PAGE)
47 page = request.GET.get('page', DEFAULT_PAGE)
48
48
49 params = self.get_context_data(request=request)
49 params = self.get_context_data(request=request)
50
50
51 if not form:
51 if not form:
52 form = ThreadForm(error_class=PlainErrorList)
52 form = ThreadForm(error_class=PlainErrorList)
53
53
54 self.settings_manager = get_settings_manager(request)
54 self.settings_manager = get_settings_manager(request)
55 paginator = get_paginator(self.get_threads().order_by('-bump_time'),
55 paginator = get_paginator(self.get_threads().order_by('-bump_time'),
56 settings.get_int('View', 'ThreadsPerPage'))
56 settings.get_int('View', 'ThreadsPerPage'))
57 paginator.current_page = int(page)
57 paginator.current_page = int(page)
58
58
59 try:
59 try:
60 threads = paginator.page(page).object_list
60 threads = paginator.page(page).object_list
61 except EmptyPage:
61 except EmptyPage:
62 raise Http404()
62 raise Http404()
63
63
64 params[PARAMETER_THREADS] = threads
64 params[PARAMETER_THREADS] = threads
65 params[CONTEXT_FORM] = form
65 params[CONTEXT_FORM] = form
66 params[PARAMETER_BANNERS] = Banner.objects.order_by('-id').all()
66 params[PARAMETER_BANNERS] = Banner.objects.order_by('-id').all()
67
67
68 self.get_page_context(paginator, params, page)
68 self.get_page_context(paginator, params, page, request.GET.dict())
69
69
70 return render(request, TEMPLATE, params)
70 return render(request, TEMPLATE, params)
71
71
72 def post(self, request):
72 def post(self, request):
73 form = ThreadForm(request.POST, request.FILES,
73 form = ThreadForm(request.POST, request.FILES,
74 error_class=PlainErrorList)
74 error_class=PlainErrorList)
75 form.session = request.session
75 form.session = request.session
76
76
77 if form.is_valid():
77 if form.is_valid():
78 return self.create_thread(request, form)
78 return self.create_thread(request, form)
79 if form.need_to_ban:
79 if form.need_to_ban:
80 # Ban user because he is suspected to be a bot
80 # Ban user because he is suspected to be a bot
81 self._ban_current_user(request)
81 self._ban_current_user(request)
82
82
83 return self.get(request, form)
83 return self.get(request, form)
84
84
85 def get_page_context(self, paginator, params, page):
85 def get_page_context(self, paginator, params, page, url_params):
86 """
86 """
87 Get pagination context variables
87 Get pagination context variables
88 """
88 """
89
89
90 params[PARAMETER_PAGINATOR] = paginator
90 params[PARAMETER_PAGINATOR] = paginator
91 current_page = paginator.page(int(page))
91 current_page = paginator.page(int(page))
92 params[PARAMETER_CURRENT_PAGE] = current_page
92 params[PARAMETER_CURRENT_PAGE] = current_page
93 if current_page.has_previous():
93 if current_page.has_previous():
94 params[PARAMETER_PREV_LINK] = self.get_previous_page_link(
94 params[PARAMETER_PREV_LINK] = self.get_previous_page_link(
95 current_page)
95 current_page, url_params)
96 if current_page.has_next():
96 if current_page.has_next():
97 params[PARAMETER_NEXT_LINK] = self.get_next_page_link(current_page)
97 params[PARAMETER_NEXT_LINK] = self.get_next_page_link(current_page,
98 url_params)
99
100 def get_previous_page_link(self, current_page, params):
101 params['page'] = current_page.previous_page_number()
102 return self.get_reverse_url(params)
98
103
99 def get_previous_page_link(self, current_page):
104 def get_next_page_link(self, current_page, params):
100 return self.get_reverse_url() + '?page=' \
105 params['page'] = current_page.next_page_number()
101 + str(current_page.previous_page_number())
106 return self.get_reverse_url(params)
102
107
103 def get_next_page_link(self, current_page):
108 def get_url_params(self, params):
104 return self.get_reverse_url() + '?page=' \
109 return '?' + '&'.join(['{}={}'.format(key, params[key]) for key in params.keys()])
105 + str(current_page.next_page_number())
106
110
107 def get_reverse_url(self):
111 def get_reverse_url(self, params):
108 return reverse('index')
112 return reverse('index') + self.get_url_params(params)
109
113
110 @transaction.atomic
114 @transaction.atomic
111 def create_thread(self, request, form: ThreadForm, html_response=True):
115 def create_thread(self, request, form: ThreadForm, html_response=True):
112 """
116 """
113 Creates a new thread with an opening post.
117 Creates a new thread with an opening post.
114 """
118 """
115
119
116 ip = utils.get_client_ip(request)
120 ip = utils.get_client_ip(request)
117 is_banned = Ban.objects.filter(ip=ip).exists()
121 is_banned = Ban.objects.filter(ip=ip).exists()
118
122
119 if is_banned:
123 if is_banned:
120 if html_response:
124 if html_response:
121 return redirect(BannedView().as_view())
125 return redirect(BannedView().as_view())
122 else:
126 else:
123 return
127 return
124
128
125 data = form.cleaned_data
129 data = form.cleaned_data
126
130
127 title = form.get_title()
131 title = form.get_title()
128 text = data[FORM_TEXT]
132 text = data[FORM_TEXT]
129 file = form.get_file()
133 file = form.get_file()
130 threads = data[FORM_THREADS]
134 threads = data[FORM_THREADS]
131
135
132 text = self._remove_invalid_links(text)
136 text = self._remove_invalid_links(text)
133
137
134 tags = data[FORM_TAGS]
138 tags = data[FORM_TAGS]
135
139
136 post = Post.objects.create_post(title=title, text=text, file=file,
140 post = Post.objects.create_post(title=title, text=text, file=file,
137 ip=ip, tags=tags, opening_posts=threads,
141 ip=ip, tags=tags, opening_posts=threads,
138 tripcode=form.get_tripcode())
142 tripcode=form.get_tripcode())
139
143
140 # This is required to update the threads to which posts we have replied
144 # This is required to update the threads to which posts we have replied
141 # when creating this one
145 # when creating this one
142 post.notify_clients()
146 post.notify_clients()
143
147
144 if html_response:
148 if html_response:
145 return redirect(post.get_absolute_url())
149 return redirect(post.get_absolute_url())
146
150
147 def get_threads(self):
151 def get_threads(self):
148 """
152 """
149 Gets list of threads that will be shown on a page.
153 Gets list of threads that will be shown on a page.
150 """
154 """
151
155
152 return Thread.objects\
156 return Thread.objects\
153 .exclude(tags__in=self.settings_manager.get_hidden_tags())
157 .exclude(tags__in=self.settings_manager.get_hidden_tags())
@@ -1,119 +1,118 b''
1 from django.shortcuts import get_object_or_404, redirect
1 from django.shortcuts import get_object_or_404, redirect
2 from django.core.urlresolvers import reverse
2 from django.core.urlresolvers import reverse
3
3
4 from boards.abstracts.settingsmanager import get_settings_manager, \
4 from boards.abstracts.settingsmanager import get_settings_manager, \
5 SETTING_FAVORITE_TAGS, SETTING_HIDDEN_TAGS
5 SETTING_FAVORITE_TAGS, SETTING_HIDDEN_TAGS
6 from boards.models import Tag, PostImage
6 from boards.models import Tag, PostImage
7 from boards.views.all_threads import AllThreadsView, DEFAULT_PAGE
7 from boards.views.all_threads import AllThreadsView, DEFAULT_PAGE
8 from boards.views.mixins import DispatcherMixin, PARAMETER_METHOD
8 from boards.views.mixins import DispatcherMixin, PARAMETER_METHOD
9 from boards.forms import ThreadForm, PlainErrorList
9 from boards.forms import ThreadForm, PlainErrorList
10
10
11 PARAM_HIDDEN_TAGS = 'hidden_tags'
11 PARAM_HIDDEN_TAGS = 'hidden_tags'
12 PARAM_TAG = 'tag'
12 PARAM_TAG = 'tag'
13 PARAM_IS_FAVORITE = 'is_favorite'
13 PARAM_IS_FAVORITE = 'is_favorite'
14 PARAM_IS_HIDDEN = 'is_hidden'
14 PARAM_IS_HIDDEN = 'is_hidden'
15 PARAM_RANDOM_IMAGE_POST = 'random_image_post'
15 PARAM_RANDOM_IMAGE_POST = 'random_image_post'
16 PARAM_RELATED_TAGS = 'related_tags'
16 PARAM_RELATED_TAGS = 'related_tags'
17
17
18
18
19 __author__ = 'neko259'
19 __author__ = 'neko259'
20
20
21
21
22 class TagView(AllThreadsView, DispatcherMixin):
22 class TagView(AllThreadsView, DispatcherMixin):
23
23
24 tag_name = None
24 tag_name = None
25
25
26 def get_threads(self):
26 def get_threads(self):
27 tag = get_object_or_404(Tag, name=self.tag_name)
27 tag = get_object_or_404(Tag, name=self.tag_name)
28
28
29 hidden_tags = self.settings_manager.get_hidden_tags()
29 hidden_tags = self.settings_manager.get_hidden_tags()
30
30
31 try:
31 try:
32 hidden_tags.remove(tag)
32 hidden_tags.remove(tag)
33 except ValueError:
33 except ValueError:
34 pass
34 pass
35
35
36 return tag.get_threads().exclude(
36 return tag.get_threads().exclude(
37 tags__in=hidden_tags)
37 tags__in=hidden_tags)
38
38
39 def get_context_data(self, **kwargs):
39 def get_context_data(self, **kwargs):
40 params = super(TagView, self).get_context_data(**kwargs)
40 params = super(TagView, self).get_context_data(**kwargs)
41
41
42 settings_manager = get_settings_manager(kwargs['request'])
42 settings_manager = get_settings_manager(kwargs['request'])
43
43
44 tag = get_object_or_404(Tag, name=self.tag_name)
44 tag = get_object_or_404(Tag, name=self.tag_name)
45 params[PARAM_TAG] = tag
45 params[PARAM_TAG] = tag
46
46
47 fav_tag_names = settings_manager.get_setting(SETTING_FAVORITE_TAGS)
47 fav_tag_names = settings_manager.get_setting(SETTING_FAVORITE_TAGS)
48 hidden_tag_names = settings_manager.get_setting(SETTING_HIDDEN_TAGS)
48 hidden_tag_names = settings_manager.get_setting(SETTING_HIDDEN_TAGS)
49
49
50 params[PARAM_IS_FAVORITE] = fav_tag_names is not None and tag.name in fav_tag_names
50 params[PARAM_IS_FAVORITE] = fav_tag_names is not None and tag.name in fav_tag_names
51 params[PARAM_IS_HIDDEN] = hidden_tag_names is not None and tag.name in hidden_tag_names
51 params[PARAM_IS_HIDDEN] = hidden_tag_names is not None and tag.name in hidden_tag_names
52
52
53 params[PARAM_RANDOM_IMAGE_POST] = tag.get_random_image_post()
53 params[PARAM_RANDOM_IMAGE_POST] = tag.get_random_image_post()
54 params[PARAM_RELATED_TAGS] = tag.get_related_tags()
54 params[PARAM_RELATED_TAGS] = tag.get_related_tags()
55
55
56 return params
56 return params
57
57
58 def get_reverse_url(self):
58 def get_reverse_url(self, params):
59 return reverse('tag', kwargs={
59 return reverse('tag', kwargs={'tag_name': self.tag_name}) + self.get_url_params(params)
60 'tag_name': self.tag_name})
61
60
62 def get(self, request, tag_name, form=None):
61 def get(self, request, tag_name, form=None):
63 self.tag_name = tag_name
62 self.tag_name = tag_name
64
63
65 return super(TagView, self).get(request, form)
64 return super(TagView, self).get(request, form)
66
65
67
66
68 def post(self, request, tag_name):
67 def post(self, request, tag_name):
69 self.tag_name = tag_name
68 self.tag_name = tag_name
70
69
71 if PARAMETER_METHOD in request.POST:
70 if PARAMETER_METHOD in request.POST:
72 self.dispatch_method(request)
71 self.dispatch_method(request)
73
72
74 return redirect('tag', tag_name)
73 return redirect('tag', tag_name)
75 else:
74 else:
76 form = ThreadForm(request.POST, request.FILES,
75 form = ThreadForm(request.POST, request.FILES,
77 error_class=PlainErrorList)
76 error_class=PlainErrorList)
78 form.session = request.session
77 form.session = request.session
79
78
80 if form.is_valid():
79 if form.is_valid():
81 return self.create_thread(request, form)
80 return self.create_thread(request, form)
82 if form.need_to_ban:
81 if form.need_to_ban:
83 # Ban user because he is suspected to be a bot
82 # Ban user because he is suspected to be a bot
84 self._ban_current_user(request)
83 self._ban_current_user(request)
85
84
86 return self.get(request, tag_name, form)
85 return self.get(request, tag_name, form)
87
86
88 def subscribe(self, request):
87 def subscribe(self, request):
89 tag = get_object_or_404(Tag, name=self.tag_name)
88 tag = get_object_or_404(Tag, name=self.tag_name)
90
89
91 settings_manager = get_settings_manager(request)
90 settings_manager = get_settings_manager(request)
92 settings_manager.add_fav_tag(tag)
91 settings_manager.add_fav_tag(tag)
93
92
94 def unsubscribe(self, request):
93 def unsubscribe(self, request):
95 tag = get_object_or_404(Tag, name=self.tag_name)
94 tag = get_object_or_404(Tag, name=self.tag_name)
96
95
97 settings_manager = get_settings_manager(request)
96 settings_manager = get_settings_manager(request)
98 settings_manager.del_fav_tag(tag)
97 settings_manager.del_fav_tag(tag)
99
98
100 def hide(self, request):
99 def hide(self, request):
101 """
100 """
102 Adds tag to user's hidden tags. Threads with this tag will not be
101 Adds tag to user's hidden tags. Threads with this tag will not be
103 shown.
102 shown.
104 """
103 """
105
104
106 tag = get_object_or_404(Tag, name=self.tag_name)
105 tag = get_object_or_404(Tag, name=self.tag_name)
107
106
108 settings_manager = get_settings_manager(request)
107 settings_manager = get_settings_manager(request)
109 settings_manager.add_hidden_tag(tag)
108 settings_manager.add_hidden_tag(tag)
110
109
111 def unhide(self, request):
110 def unhide(self, request):
112 """
111 """
113 Removed tag from user's hidden tags.
112 Removed tag from user's hidden tags.
114 """
113 """
115
114
116 tag = get_object_or_404(Tag, name=self.tag_name)
115 tag = get_object_or_404(Tag, name=self.tag_name)
117
116
118 settings_manager = get_settings_manager(request)
117 settings_manager = get_settings_manager(request)
119 settings_manager.del_hidden_tag(tag)
118 settings_manager.del_hidden_tag(tag)
General Comments 0
You need to be logged in to leave comments. Login now