##// END OF EJS Templates
Use intelligent number-incrementing thread title when rolling over a thread
neko259 -
r2112:877947af default
parent child Browse files
Show More
@@ -1,151 +1,170 b''
1 import re
2
1 from django.core.paginator import EmptyPage
3 from django.core.paginator import EmptyPage
2 from django.http import Http404
4 from django.http import Http404
3 from django.shortcuts import render, redirect
5 from django.shortcuts import render, redirect
4 from django.urls import reverse
6 from django.urls import reverse
5 from django.utils.decorators import method_decorator
7 from django.utils.decorators import method_decorator
6 from django.views.decorators.csrf import csrf_protect
8 from django.views.decorators.csrf import csrf_protect
7
9
8 from boards import settings
10 from boards import settings
9 from boards.abstracts.constants import PARAM_PAGE
11 from boards.abstracts.constants import PARAM_PAGE
10 from boards.abstracts.paginator import get_paginator
12 from boards.abstracts.paginator import get_paginator
11 from boards.abstracts.settingsmanager import get_settings_manager, \
13 from boards.abstracts.settingsmanager import get_settings_manager, \
12 SETTING_ONLY_FAVORITES, SETTING_SUBSCRIBE_BY_DEFAULT
14 SETTING_ONLY_FAVORITES, SETTING_SUBSCRIBE_BY_DEFAULT
13 from boards.forms import ThreadForm, PlainErrorList
15 from boards.forms import ThreadForm, PlainErrorList
14 from boards.models import Post, Thread
16 from boards.models import Post, Thread
15 from boards.settings import SECTION_VIEW
17 from boards.settings import SECTION_VIEW
16 from boards.views.base import BaseBoardView, CONTEXT_FORM
18 from boards.views.base import BaseBoardView, CONTEXT_FORM
17 from boards.views.mixins import PaginatedMixin, \
19 from boards.views.mixins import PaginatedMixin, \
18 DispatcherMixin, PARAMETER_METHOD
20 DispatcherMixin, PARAMETER_METHOD
19
21
20 ORDER_BUMP = 'bump'
22 ORDER_BUMP = 'bump'
21
23
22 PARAM_ORDER = 'order'
24 PARAM_ORDER = 'order'
23
25
24 FORM_TAGS = 'tags'
26 FORM_TAGS = 'tags'
25 FORM_TEXT = 'text'
27 FORM_TEXT = 'text'
26 FORM_TITLE = 'title'
28 FORM_TITLE = 'title'
27 FORM_IMAGE = 'image'
29 FORM_IMAGE = 'image'
28 FORM_THREADS = 'threads'
30 FORM_THREADS = 'threads'
29
31
30 TAG_DELIMITER = ' '
32 TAG_DELIMITER = ' '
31
33
32 PARAMETER_CURRENT_PAGE = 'current_page'
34 PARAMETER_CURRENT_PAGE = 'current_page'
33 PARAMETER_PAGINATOR = 'paginator'
35 PARAMETER_PAGINATOR = 'paginator'
34 PARAMETER_THREADS = 'threads'
36 PARAMETER_THREADS = 'threads'
35 PARAMETER_ADDITIONAL = 'additional_params'
37 PARAMETER_ADDITIONAL = 'additional_params'
36 PARAMETER_RSS_URL = 'rss_url'
38 PARAMETER_RSS_URL = 'rss_url'
37
39
38 TEMPLATE = 'boards/all_threads.html'
40 TEMPLATE = 'boards/all_threads.html'
39 DEFAULT_PAGE = 1
41 DEFAULT_PAGE = 1
40
42
43 PATTERN_THREAD_NUMBER = re.compile(r'^(\D*)(\d+)(\D*)$')
41
44
42 class AllThreadsView(BaseBoardView, PaginatedMixin, DispatcherMixin):
45 class AllThreadsView(BaseBoardView, PaginatedMixin, DispatcherMixin):
43
46
44 tag_name = ''
47 tag_name = ''
45
48
46 def __init__(self):
49 def __init__(self):
47 self.settings_manager = None
50 self.settings_manager = None
48 super(AllThreadsView, self).__init__()
51 super(AllThreadsView, self).__init__()
49
52
50 @method_decorator(csrf_protect)
53 @method_decorator(csrf_protect)
51 def get(self, request, form: ThreadForm=None):
54 def get(self, request, form: ThreadForm=None):
52 page = request.GET.get(PARAM_PAGE, DEFAULT_PAGE)
55 page = request.GET.get(PARAM_PAGE, DEFAULT_PAGE)
53
56
54 params = self.get_context_data(request=request)
57 params = self.get_context_data(request=request)
55
58
56 subscribe_by_default = get_settings_manager(request).get_setting(
59 subscribe_by_default = get_settings_manager(request).get_setting(
57 SETTING_SUBSCRIBE_BY_DEFAULT, False)
60 SETTING_SUBSCRIBE_BY_DEFAULT, False)
58
61
59 if not form:
62 if not form:
60 t_from_id = request.GET.get('t_from_id')
63 t_from_id = request.GET.get('t_from_id')
61 if t_from_id:
64 if t_from_id:
62 source_op = Post.objects.get(id=int(t_from_id))
65 form = self.get_rollover_form(request, t_from_id,
63 tags_str = ' '.join([tag.get_name() for tag in source_op.get_thread().get_tags()])
66 subscribe_by_default)
64 post_link = '[post]{}[/post]'.format(source_op.id) #FIXME To constants
65 new_title = source_op.get_title() + ' NEW' # TODO More intelligent name change
66
67 form = ThreadForm(error_class=PlainErrorList,
68 initial={
69 FORM_TAGS: tags_str,
70 'subscribe': subscribe_by_default,
71 FORM_TEXT: post_link,
72 FORM_TITLE: new_title,
73 })
74 else:
67 else:
75 form = ThreadForm(error_class=PlainErrorList,
68 form = ThreadForm(error_class=PlainErrorList,
76 initial={FORM_TAGS: self.tag_name,
69 initial={FORM_TAGS: self.tag_name,
77 'subscribe': subscribe_by_default})
70 'subscribe': subscribe_by_default})
78
71
79 self.settings_manager = get_settings_manager(request)
72 self.settings_manager = get_settings_manager(request)
80
73
81 threads = self.get_threads()
74 threads = self.get_threads()
82
75
83 order = request.GET.get(PARAM_ORDER, ORDER_BUMP)
76 order = request.GET.get(PARAM_ORDER, ORDER_BUMP)
84 if order == ORDER_BUMP:
77 if order == ORDER_BUMP:
85 threads = threads.order_by('-bump_time')
78 threads = threads.order_by('-bump_time')
86 else:
79 else:
87 threads = threads.filter(replies__opening=True)\
80 threads = threads.filter(replies__opening=True)\
88 .order_by('-replies__pub_time')
81 .order_by('-replies__pub_time')
89 threads = threads.distinct()
82 threads = threads.distinct()
90
83
91 paginator = get_paginator(threads, settings.get_int(
84 paginator = get_paginator(threads, settings.get_int(
92 SECTION_VIEW, 'ThreadsPerPage'),
85 SECTION_VIEW, 'ThreadsPerPage'),
93 link=self.get_reverse_url(),
86 link=self.get_reverse_url(),
94 params=request.GET.dict())
87 params=request.GET.dict())
95 paginator.current_page = int(page)
88 paginator.current_page = int(page)
96
89
97 try:
90 try:
98 threads = paginator.page(page).object_list
91 threads = paginator.page(page).object_list
99 except EmptyPage:
92 except EmptyPage:
100 raise Http404()
93 raise Http404()
101
94
102 params[PARAMETER_THREADS] = threads
95 params[PARAMETER_THREADS] = threads
103 params[CONTEXT_FORM] = form
96 params[CONTEXT_FORM] = form
104 params[PARAMETER_RSS_URL] = self.get_rss_url()
97 params[PARAMETER_RSS_URL] = self.get_rss_url()
105
98
106 params.update(self.get_page_context(paginator, page))
99 params.update(self.get_page_context(paginator, page))
107
100
108 return render(request, TEMPLATE, params)
101 return render(request, TEMPLATE, params)
109
102
110 @method_decorator(csrf_protect)
103 @method_decorator(csrf_protect)
111 def post(self, request):
104 def post(self, request):
112 if PARAMETER_METHOD in request.POST:
105 if PARAMETER_METHOD in request.POST:
113 self.dispatch_method(request)
106 self.dispatch_method(request)
114
107
115 return redirect(self.get_reverse_url())
108 return redirect(self.get_reverse_url())
116
109
117 form = ThreadForm(request.POST, request.FILES,
110 form = ThreadForm(request.POST, request.FILES,
118 error_class=PlainErrorList, session=request.session)
111 error_class=PlainErrorList, session=request.session)
119
112
120 if form.is_valid():
113 if form.is_valid():
121 return Post.objects.create_from_form(request, form, None)
114 return Post.objects.create_from_form(request, form, None)
122 if form.need_to_ban:
115 if form.need_to_ban:
123 # Ban user because he is suspected to be a bot
116 # Ban user because he is suspected to be a bot
124 self._ban_current_user(request)
117 self._ban_current_user(request)
125
118
126 return self.get(request, form)
119 return self.get(request, form)
127
120
128 def get_reverse_url(self):
121 def get_reverse_url(self):
129 return reverse('index')
122 return reverse('index')
130
123
131 def get_threads(self):
124 def get_threads(self):
132 """
125 """
133 Gets list of threads that will be shown on a page.
126 Gets list of threads that will be shown on a page.
134 """
127 """
135
128
136 threads = Thread.objects\
129 threads = Thread.objects\
137 .exclude(tags__in=self.settings_manager.get_hidden_tags())
130 .exclude(tags__in=self.settings_manager.get_hidden_tags())
138 if self.settings_manager.get_setting(SETTING_ONLY_FAVORITES):
131 if self.settings_manager.get_setting(SETTING_ONLY_FAVORITES):
139 fav_tags = self.settings_manager.get_fav_tags()
132 fav_tags = self.settings_manager.get_fav_tags()
140 if len(fav_tags) > 0:
133 if len(fav_tags) > 0:
141 threads = threads.filter(tags__in=fav_tags)
134 threads = threads.filter(tags__in=fav_tags)
142
135
143 return threads
136 return threads
144
137
145 def get_rss_url(self):
138 def get_rss_url(self):
146 return self.get_reverse_url() + 'rss/'
139 return self.get_reverse_url() + 'rss/'
147
140
148 def toggle_fav(self, request):
141 def toggle_fav(self, request):
149 settings_manager = get_settings_manager(request)
142 settings_manager = get_settings_manager(request)
150 settings_manager.set_setting(SETTING_ONLY_FAVORITES,
143 settings_manager.set_setting(SETTING_ONLY_FAVORITES,
151 not settings_manager.get_setting(SETTING_ONLY_FAVORITES, False))
144 not settings_manager.get_setting(SETTING_ONLY_FAVORITES, False))
145
146 def get_rollover_form(self, request, t_from_id, subscribe_by_default):
147 """
148 Create a new form template, passing on threads, link to the old thread,
149 and incremeting the thread number in the title if there is any
150 (or adding 2 if there isn't, normally meaning this was the first
151 thread in a series).
152 """
153 source_op = Post.objects.get(id=int(t_from_id))
154 tags_str = ' '.join([tag.get_name() for tag in source_op.get_thread().get_tags()])
155 post_link = '[post]{}[/post]'.format(source_op.id) #FIXME To constants
156
157 old_title = source_op.get_title()
158 m = PATTERN_THREAD_NUMBER.match(old_title)
159 if m:
160 new_title = m.group(1) + str(int(m.group(2)) + 1) + m.group(3)
161 else:
162 new_title = old_title + ' 2'
163
164 return ThreadForm(error_class=PlainErrorList,
165 initial={
166 FORM_TAGS: tags_str,
167 'subscribe': subscribe_by_default,
168 FORM_TEXT: post_link,
169 FORM_TITLE: new_title,
170 })
General Comments 0
You need to be logged in to leave comments. Login now