##// END OF EJS Templates
If we are trying to open a hidden tag page, show its threads
neko259 -
r1064:da5d56ec default
parent child Browse files
Show More
@@ -1,146 +1,146 b''
1 from django.shortcuts import get_object_or_404
1 from django.shortcuts import get_object_or_404
2 from boards.models import Tag
2 from boards.models import Tag
3
3
4 __author__ = 'neko259'
4 __author__ = 'neko259'
5
5
6 SESSION_SETTING = 'setting'
6 SESSION_SETTING = 'setting'
7
7
8 # Remove this, it is not used any more cause there is a user's permission
8 # Remove this, it is not used any more cause there is a user's permission
9 PERMISSION_MODERATE = 'moderator'
9 PERMISSION_MODERATE = 'moderator'
10
10
11 SETTING_THEME = 'theme'
11 SETTING_THEME = 'theme'
12 SETTING_FAVORITE_TAGS = 'favorite_tags'
12 SETTING_FAVORITE_TAGS = 'favorite_tags'
13 SETTING_HIDDEN_TAGS = 'hidden_tags'
13 SETTING_HIDDEN_TAGS = 'hidden_tags'
14 SETTING_PERMISSIONS = 'permissions'
14 SETTING_PERMISSIONS = 'permissions'
15 SETTING_USERNAME = 'username'
15 SETTING_USERNAME = 'username'
16 SETTING_LAST_NOTIFICATION_ID = 'last_notification'
16 SETTING_LAST_NOTIFICATION_ID = 'last_notification'
17
17
18 DEFAULT_THEME = 'md'
18 DEFAULT_THEME = 'md'
19
19
20
20
21 class SettingsManager:
21 class SettingsManager:
22 """
22 """
23 Base settings manager class. get_setting and set_setting methods should
23 Base settings manager class. get_setting and set_setting methods should
24 be overriden.
24 be overriden.
25 """
25 """
26 def __init__(self):
26 def __init__(self):
27 pass
27 pass
28
28
29 def get_theme(self):
29 def get_theme(self) -> str:
30 theme = self.get_setting(SETTING_THEME)
30 theme = self.get_setting(SETTING_THEME)
31 if not theme:
31 if not theme:
32 theme = DEFAULT_THEME
32 theme = DEFAULT_THEME
33 self.set_setting(SETTING_THEME, theme)
33 self.set_setting(SETTING_THEME, theme)
34
34
35 return theme
35 return theme
36
36
37 def set_theme(self, theme):
37 def set_theme(self, theme):
38 self.set_setting(SETTING_THEME, theme)
38 self.set_setting(SETTING_THEME, theme)
39
39
40 def has_permission(self, permission):
40 def has_permission(self, permission):
41 permissions = self.get_setting(SETTING_PERMISSIONS)
41 permissions = self.get_setting(SETTING_PERMISSIONS)
42 if permissions:
42 if permissions:
43 return permission in permissions
43 return permission in permissions
44 else:
44 else:
45 return False
45 return False
46
46
47 def get_setting(self, setting):
47 def get_setting(self, setting):
48 pass
48 pass
49
49
50 def set_setting(self, setting, value):
50 def set_setting(self, setting, value):
51 pass
51 pass
52
52
53 def add_permission(self, permission):
53 def add_permission(self, permission):
54 permissions = self.get_setting(SETTING_PERMISSIONS)
54 permissions = self.get_setting(SETTING_PERMISSIONS)
55 if not permissions:
55 if not permissions:
56 permissions = [permission]
56 permissions = [permission]
57 else:
57 else:
58 permissions.append(permission)
58 permissions.append(permission)
59 self.set_setting(SETTING_PERMISSIONS, permissions)
59 self.set_setting(SETTING_PERMISSIONS, permissions)
60
60
61 def del_permission(self, permission):
61 def del_permission(self, permission):
62 permissions = self.get_setting(SETTING_PERMISSIONS)
62 permissions = self.get_setting(SETTING_PERMISSIONS)
63 if not permissions:
63 if not permissions:
64 permissions = []
64 permissions = []
65 else:
65 else:
66 permissions.remove(permission)
66 permissions.remove(permission)
67 self.set_setting(SETTING_PERMISSIONS, permissions)
67 self.set_setting(SETTING_PERMISSIONS, permissions)
68
68
69 def get_fav_tags(self):
69 def get_fav_tags(self) -> list:
70 tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
70 tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
71 tags = []
71 tags = []
72 if tag_names:
72 if tag_names:
73 tags = Tag.objects.filter(name__in=tag_names)
73 tags = Tag.objects.filter(name__in=tag_names)
74 return tags
74 return tags
75
75
76 def add_fav_tag(self, tag):
76 def add_fav_tag(self, tag):
77 tags = self.get_setting(SETTING_FAVORITE_TAGS)
77 tags = self.get_setting(SETTING_FAVORITE_TAGS)
78 if not tags:
78 if not tags:
79 tags = [tag.name]
79 tags = [tag.name]
80 else:
80 else:
81 if not tag.name in tags:
81 if not tag.name in tags:
82 tags.append(tag.name)
82 tags.append(tag.name)
83
83
84 tags.sort()
84 tags.sort()
85 self.set_setting(SETTING_FAVORITE_TAGS, tags)
85 self.set_setting(SETTING_FAVORITE_TAGS, tags)
86
86
87 def del_fav_tag(self, tag):
87 def del_fav_tag(self, tag):
88 tags = self.get_setting(SETTING_FAVORITE_TAGS)
88 tags = self.get_setting(SETTING_FAVORITE_TAGS)
89 if tag.name in tags:
89 if tag.name in tags:
90 tags.remove(tag.name)
90 tags.remove(tag.name)
91 self.set_setting(SETTING_FAVORITE_TAGS, tags)
91 self.set_setting(SETTING_FAVORITE_TAGS, tags)
92
92
93 def get_hidden_tags(self):
93 def get_hidden_tags(self) -> list:
94 tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
94 tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
95 tags = []
95 tags = []
96 if tag_names:
96 if tag_names:
97 for tag_name in tag_names:
97 for tag_name in tag_names:
98 tag = get_object_or_404(Tag, name=tag_name)
98 tag = get_object_or_404(Tag, name=tag_name)
99 tags.append(tag)
99 tags.append(tag)
100
100
101 return tags
101 return tags
102
102
103 def add_hidden_tag(self, tag):
103 def add_hidden_tag(self, tag):
104 tags = self.get_setting(SETTING_HIDDEN_TAGS)
104 tags = self.get_setting(SETTING_HIDDEN_TAGS)
105 if not tags:
105 if not tags:
106 tags = [tag.name]
106 tags = [tag.name]
107 else:
107 else:
108 if not tag.name in tags:
108 if not tag.name in tags:
109 tags.append(tag.name)
109 tags.append(tag.name)
110
110
111 tags.sort()
111 tags.sort()
112 self.set_setting(SETTING_HIDDEN_TAGS, tags)
112 self.set_setting(SETTING_HIDDEN_TAGS, tags)
113
113
114 def del_hidden_tag(self, tag):
114 def del_hidden_tag(self, tag):
115 tags = self.get_setting(SETTING_HIDDEN_TAGS)
115 tags = self.get_setting(SETTING_HIDDEN_TAGS)
116 if tag.name in tags:
116 if tag.name in tags:
117 tags.remove(tag.name)
117 tags.remove(tag.name)
118 self.set_setting(SETTING_HIDDEN_TAGS, tags)
118 self.set_setting(SETTING_HIDDEN_TAGS, tags)
119
119
120
120
121 class SessionSettingsManager(SettingsManager):
121 class SessionSettingsManager(SettingsManager):
122 """
122 """
123 Session-based settings manager. All settings are saved to the user's
123 Session-based settings manager. All settings are saved to the user's
124 session.
124 session.
125 """
125 """
126 def __init__(self, session):
126 def __init__(self, session):
127 SettingsManager.__init__(self)
127 SettingsManager.__init__(self)
128 self.session = session
128 self.session = session
129
129
130 def get_setting(self, setting):
130 def get_setting(self, setting):
131 if setting in self.session:
131 if setting in self.session:
132 return self.session[setting]
132 return self.session[setting]
133 else:
133 else:
134 return None
134 return None
135
135
136 def set_setting(self, setting, value):
136 def set_setting(self, setting, value):
137 self.session[setting] = value
137 self.session[setting] = value
138
138
139
139
140 def get_settings_manager(request) -> SettingsManager:
140 def get_settings_manager(request) -> SettingsManager:
141 """
141 """
142 Get settings manager based on the request object. Currently only
142 Get settings manager based on the request object. Currently only
143 session-based manager is supported. In the future, cookie-based or
143 session-based manager is supported. In the future, cookie-based or
144 database-based managers could be implemented.
144 database-based managers could be implemented.
145 """
145 """
146 return SessionSettingsManager(request.session)
146 return SessionSettingsManager(request.session)
@@ -1,68 +1,67 b''
1 {% extends "boards/thread.html" %}
1 {% extends "boards/thread.html" %}
2
2
3 {% load i18n %}
3 {% load i18n %}
4 {% load cache %}
4 {% load cache %}
5 {% load static from staticfiles %}
5 {% load static from staticfiles %}
6 {% load board %}
6 {% load board %}
7
7
8 {% block content %}
8 {% block content %}
9 {% get_current_language as LANGUAGE_CODE %}
9 {% get_current_language as LANGUAGE_CODE %}
10
10
11 {% cache 600 thread_view thread.id thread.last_edit_time moderator LANGUAGE_CODE %}
11 {% cache 600 thread_view thread.id thread.last_edit_time moderator LANGUAGE_CODE %}
12
12
13 <div class="image-mode-tab">
13 <div class="image-mode-tab">
14 <a class="current_mode" href="{% url 'thread' opening_post.id %}">{% trans 'Normal mode' %}</a>,
14 <a class="current_mode" href="{% url 'thread' opening_post.id %}">{% trans 'Normal mode' %}</a>,
15 <a href="{% url 'thread_gallery' opening_post.id %}">{% trans 'Gallery mode' %}</a>
15 <a href="{% url 'thread_gallery' opening_post.id %}">{% trans 'Gallery mode' %}</a>
16 </div>
16 </div>
17
17
18 {% if bumpable and thread.has_post_limit %}
18 {% if bumpable and thread.has_post_limit %}
19 <div class="bar-bg">
19 <div class="bar-bg">
20 <div class="bar-value" style="width:{{ bumplimit_progress }}%" id="bumplimit_progress">
20 <div class="bar-value" style="width:{{ bumplimit_progress }}%" id="bumplimit_progress">
21 </div>
21 </div>
22 <div class="bar-text">
22 <div class="bar-text">
23 <span id="left_to_limit">{{ posts_left }}</span> {% trans 'posts to bumplimit' %}
23 <span id="left_to_limit">{{ posts_left }}</span> {% trans 'posts to bumplimit' %}
24 </div>
24 </div>
25 </div>
25 </div>
26 {% endif %}
26 {% endif %}
27
27
28 <div class="thread">
28 <div class="thread">
29 {% for post in thread.get_replies %}
29 {% for post in thread.get_replies %}
30 {% post_view post moderator=moderator reply_link=True %}
30 {% post_view post moderator=moderator reply_link=True %}
31 {% endfor %}
31 {% endfor %}
32 </div>
32 </div>
33
33
34 {% if not thread.archived %}
34 {% if not thread.archived %}
35 <div class="post-form-w">
35 <div class="post-form-w">
36 <script src="{% static 'js/panel.js' %}"></script>
36 <script src="{% static 'js/panel.js' %}"></script>
37 <div class="form-title">{% trans "Reply to thread" %} #{{ opening_post.id }}</div>
37 <div class="form-title">{% trans "Reply to thread" %} #{{ opening_post.id }}</div>
38 <div class="post-form" id="compact-form">
38 <div class="post-form" id="compact-form">
39 <div class="swappable-form-full">
39 <div class="swappable-form-full">
40 <form enctype="multipart/form-data" method="post" id="form">{% csrf_token %}
40 <form enctype="multipart/form-data" method="post" id="form">{% csrf_token %}
41 <div class="compact-form-text"></div>
41 <div class="compact-form-text"></div>
42 {{ form.as_div }}
42 {{ form.as_div }}
43 <div class="form-submit">
43 <div class="form-submit">
44 <input type="submit" value="{% trans "Post" %}"/>
44 <input type="submit" value="{% trans "Post" %}"/>
45 </div>
45 </div>
46 (ctrl-enter)
47 </form>
46 </form>
48 </div>
47 </div>
49 <div><a href="{% url "staticpage" name="help" %}">
48 <div><a href="{% url "staticpage" name="help" %}">
50 {% trans 'Text syntax' %}</a></div>
49 {% trans 'Text syntax' %}</a></div>
51 <div><a href="#" onClick="resetFormPosition(); return false;">{% trans 'Close form' %}</a></div>
50 <div><a href="#" onClick="resetFormPosition(); return false;">{% trans 'Close form' %}</a></div>
52 </div>
51 </div>
53 </div>
52 </div>
54
53
55 <script src="{% static 'js/jquery.form.min.js' %}"></script>
54 <script src="{% static 'js/jquery.form.min.js' %}"></script>
56 {% endif %}
55 {% endif %}
57
56
58 <script src="{% static 'js/form.js' %}"></script>
57 <script src="{% static 'js/form.js' %}"></script>
59 <script src="{% static 'js/thread.js' %}"></script>
58 <script src="{% static 'js/thread.js' %}"></script>
60 <script src="{% static 'js/thread_update.js' %}"></script>
59 <script src="{% static 'js/thread_update.js' %}"></script>
61 <script src="{% static 'js/3party/centrifuge.js' %}"></script>
60 <script src="{% static 'js/3party/centrifuge.js' %}"></script>
62
61
63 {% endcache %}
62 {% endcache %}
64 {% endblock %}
63 {% endblock %}
65
64
66 {% block thread_meta_panel %}
65 {% block thread_meta_panel %}
67 <button id="autoupdate">{% trans 'Update' %}</button>
66 <button id="autoupdate">{% trans 'Update' %}</button>
68 {% endblock %}
67 {% endblock %}
@@ -1,100 +1,107 b''
1 from django.shortcuts import get_object_or_404
1 from django.shortcuts import get_object_or_404
2
2
3 from boards.abstracts.settingsmanager import get_settings_manager, \
3 from boards.abstracts.settingsmanager import get_settings_manager, \
4 SETTING_FAVORITE_TAGS, SETTING_HIDDEN_TAGS
4 SETTING_FAVORITE_TAGS, SETTING_HIDDEN_TAGS
5 from boards.models import Tag, Thread
5 from boards.models import Tag
6 from boards.views.all_threads import AllThreadsView, DEFAULT_PAGE
6 from boards.views.all_threads import AllThreadsView, DEFAULT_PAGE
7 from boards.views.mixins import DispatcherMixin, RedirectNextMixin
7 from boards.views.mixins import DispatcherMixin, RedirectNextMixin
8 from boards.forms import ThreadForm, PlainErrorList
8 from boards.forms import ThreadForm, PlainErrorList
9
9
10 PARAM_HIDDEN_TAGS = 'hidden_tags'
10 PARAM_HIDDEN_TAGS = 'hidden_tags'
11 PARAM_TAG = 'tag'
11 PARAM_TAG = 'tag'
12 PARAM_IS_FAVORITE = 'is_favorite'
12 PARAM_IS_FAVORITE = 'is_favorite'
13 PARAM_IS_HIDDEN = 'is_hidden'
13 PARAM_IS_HIDDEN = 'is_hidden'
14
14
15 __author__ = 'neko259'
15 __author__ = 'neko259'
16
16
17
17
18 class TagView(AllThreadsView, DispatcherMixin, RedirectNextMixin):
18 class TagView(AllThreadsView, DispatcherMixin, RedirectNextMixin):
19
19
20 tag_name = None
20 tag_name = None
21
21
22 def get_threads(self):
22 def get_threads(self):
23 tag = get_object_or_404(Tag, name=self.tag_name)
23 tag = get_object_or_404(Tag, name=self.tag_name)
24
24
25 hidden_tags = self.settings_manager.get_hidden_tags()
26
27 try:
28 hidden_tags.remove(tag)
29 except ValueError:
30 pass
31
25 return tag.get_threads().exclude(
32 return tag.get_threads().exclude(
26 tags__in=self.settings_manager.get_hidden_tags())
33 tags__in=hidden_tags)
27
34
28 def get_context_data(self, **kwargs):
35 def get_context_data(self, **kwargs):
29 params = super(TagView, self).get_context_data(**kwargs)
36 params = super(TagView, self).get_context_data(**kwargs)
30
37
31 settings_manager = get_settings_manager(kwargs['request'])
38 settings_manager = get_settings_manager(kwargs['request'])
32
39
33 tag = get_object_or_404(Tag, name=self.tag_name)
40 tag = get_object_or_404(Tag, name=self.tag_name)
34 params[PARAM_TAG] = tag
41 params[PARAM_TAG] = tag
35
42
36 fav_tag_names = settings_manager.get_setting(SETTING_FAVORITE_TAGS)
43 fav_tag_names = settings_manager.get_setting(SETTING_FAVORITE_TAGS)
37 hidden_tag_names = settings_manager.get_setting(SETTING_HIDDEN_TAGS)
44 hidden_tag_names = settings_manager.get_setting(SETTING_HIDDEN_TAGS)
38
45
39 params[PARAM_IS_FAVORITE] = fav_tag_names is not None and tag.name in fav_tag_names
46 params[PARAM_IS_FAVORITE] = fav_tag_names is not None and tag.name in fav_tag_names
40 params[PARAM_IS_HIDDEN] = hidden_tag_names is not None and tag.name in hidden_tag_names
47 params[PARAM_IS_HIDDEN] = hidden_tag_names is not None and tag.name in hidden_tag_names
41
48
42 return params
49 return params
43
50
44 def get(self, request, tag_name, page=DEFAULT_PAGE, form=None):
51 def get(self, request, tag_name, page=DEFAULT_PAGE, form=None):
45 self.tag_name = tag_name
52 self.tag_name = tag_name
46
53
47 return super(TagView, self).get(request, page, form)
54 return super(TagView, self).get(request, page, form)
48
55
49
56
50 def post(self, request, tag_name, page=DEFAULT_PAGE):
57 def post(self, request, tag_name, page=DEFAULT_PAGE):
51 self.tag_name = tag_name
58 self.tag_name = tag_name
52
59
53 if 'method' in request.POST:
60 if 'method' in request.POST:
54 self.dispatch_method(request)
61 self.dispatch_method(request)
55 form = None
62 form = None
56 else:
63 else:
57 form = ThreadForm(request.POST, request.FILES,
64 form = ThreadForm(request.POST, request.FILES,
58 error_class=PlainErrorList)
65 error_class=PlainErrorList)
59 form.session = request.session
66 form.session = request.session
60
67
61 if form.is_valid():
68 if form.is_valid():
62 return self.create_thread(request, form)
69 return self.create_thread(request, form)
63 if form.need_to_ban:
70 if form.need_to_ban:
64 # Ban user because he is suspected to be a bot
71 # Ban user because he is suspected to be a bot
65 self._ban_current_user(request)
72 self._ban_current_user(request)
66
73
67 return self.get(request, tag_name, page, form)
74 return self.get(request, tag_name, page, form)
68
75
69 def subscribe(self, request):
76 def subscribe(self, request):
70 tag = get_object_or_404(Tag, name=self.tag_name)
77 tag = get_object_or_404(Tag, name=self.tag_name)
71
78
72 settings_manager = get_settings_manager(request)
79 settings_manager = get_settings_manager(request)
73 settings_manager.add_fav_tag(tag)
80 settings_manager.add_fav_tag(tag)
74
81
75 def unsubscribe(self, request):
82 def unsubscribe(self, request):
76 tag = get_object_or_404(Tag, name=self.tag_name)
83 tag = get_object_or_404(Tag, name=self.tag_name)
77
84
78 settings_manager = get_settings_manager(request)
85 settings_manager = get_settings_manager(request)
79 settings_manager.del_fav_tag(tag)
86 settings_manager.del_fav_tag(tag)
80
87
81 def hide(self, request):
88 def hide(self, request):
82 """
89 """
83 Adds tag to user's hidden tags. Threads with this tag will not be
90 Adds tag to user's hidden tags. Threads with this tag will not be
84 shown.
91 shown.
85 """
92 """
86
93
87 tag = get_object_or_404(Tag, name=self.tag_name)
94 tag = get_object_or_404(Tag, name=self.tag_name)
88
95
89 settings_manager = get_settings_manager(request)
96 settings_manager = get_settings_manager(request)
90 settings_manager.add_hidden_tag(tag)
97 settings_manager.add_hidden_tag(tag)
91
98
92 def unhide(self, request):
99 def unhide(self, request):
93 """
100 """
94 Removed tag from user's hidden tags.
101 Removed tag from user's hidden tags.
95 """
102 """
96
103
97 tag = get_object_or_404(Tag, name=self.tag_name)
104 tag = get_object_or_404(Tag, name=self.tag_name)
98
105
99 settings_manager = get_settings_manager(request)
106 settings_manager = get_settings_manager(request)
100 settings_manager.del_hidden_tag(tag)
107 settings_manager.del_hidden_tag(tag)
General Comments 0
You need to be logged in to leave comments. Login now