##// END OF EJS Templates
Limit favorite threads count
neko259 -
r1626:a034f64b default
parent child Browse files
Show More
@@ -1,195 +1,199 b''
1 from boards import settings
1 from boards.models import Tag
2 from boards.models import Tag
2 from boards.models.thread import FAV_THREAD_NO_UPDATES
3 from boards.models.thread import FAV_THREAD_NO_UPDATES
3
4
4 MAX_TRIPCODE_COLLISIONS = 50
5 MAX_TRIPCODE_COLLISIONS = 50
5
6
6 __author__ = 'neko259'
7 __author__ = 'neko259'
7
8
8 SESSION_SETTING = 'setting'
9 SESSION_SETTING = 'setting'
9
10
10 # Remove this, it is not used any more cause there is a user's permission
11 # Remove this, it is not used any more cause there is a user's permission
11 PERMISSION_MODERATE = 'moderator'
12 PERMISSION_MODERATE = 'moderator'
12
13
13 SETTING_THEME = 'theme'
14 SETTING_THEME = 'theme'
14 SETTING_FAVORITE_TAGS = 'favorite_tags'
15 SETTING_FAVORITE_TAGS = 'favorite_tags'
15 SETTING_FAVORITE_THREADS = 'favorite_threads'
16 SETTING_FAVORITE_THREADS = 'favorite_threads'
16 SETTING_HIDDEN_TAGS = 'hidden_tags'
17 SETTING_HIDDEN_TAGS = 'hidden_tags'
17 SETTING_PERMISSIONS = 'permissions'
18 SETTING_PERMISSIONS = 'permissions'
18 SETTING_USERNAME = 'username'
19 SETTING_USERNAME = 'username'
19 SETTING_LAST_NOTIFICATION_ID = 'last_notification'
20 SETTING_LAST_NOTIFICATION_ID = 'last_notification'
20 SETTING_IMAGE_VIEWER = 'image_viewer'
21 SETTING_IMAGE_VIEWER = 'image_viewer'
21 SETTING_TRIPCODE = 'tripcode'
22 SETTING_TRIPCODE = 'tripcode'
22 SETTING_IMAGES = 'images_aliases'
23 SETTING_IMAGES = 'images_aliases'
23
24
24 DEFAULT_THEME = 'md'
25 DEFAULT_THEME = 'md'
25
26
26
27
27 class SettingsManager:
28 class SettingsManager:
28 """
29 """
29 Base settings manager class. get_setting and set_setting methods should
30 Base settings manager class. get_setting and set_setting methods should
30 be overriden.
31 be overriden.
31 """
32 """
32 def __init__(self):
33 def __init__(self):
33 pass
34 pass
34
35
35 def get_theme(self) -> str:
36 def get_theme(self) -> str:
36 theme = self.get_setting(SETTING_THEME)
37 theme = self.get_setting(SETTING_THEME)
37 if not theme:
38 if not theme:
38 theme = DEFAULT_THEME
39 theme = DEFAULT_THEME
39 self.set_setting(SETTING_THEME, theme)
40 self.set_setting(SETTING_THEME, theme)
40
41
41 return theme
42 return theme
42
43
43 def set_theme(self, theme):
44 def set_theme(self, theme):
44 self.set_setting(SETTING_THEME, theme)
45 self.set_setting(SETTING_THEME, theme)
45
46
46 def has_permission(self, permission):
47 def has_permission(self, permission):
47 permissions = self.get_setting(SETTING_PERMISSIONS)
48 permissions = self.get_setting(SETTING_PERMISSIONS)
48 if permissions:
49 if permissions:
49 return permission in permissions
50 return permission in permissions
50 else:
51 else:
51 return False
52 return False
52
53
53 def get_setting(self, setting, default=None):
54 def get_setting(self, setting, default=None):
54 pass
55 pass
55
56
56 def set_setting(self, setting, value):
57 def set_setting(self, setting, value):
57 pass
58 pass
58
59
59 def add_permission(self, permission):
60 def add_permission(self, permission):
60 permissions = self.get_setting(SETTING_PERMISSIONS)
61 permissions = self.get_setting(SETTING_PERMISSIONS)
61 if not permissions:
62 if not permissions:
62 permissions = [permission]
63 permissions = [permission]
63 else:
64 else:
64 permissions.append(permission)
65 permissions.append(permission)
65 self.set_setting(SETTING_PERMISSIONS, permissions)
66 self.set_setting(SETTING_PERMISSIONS, permissions)
66
67
67 def del_permission(self, permission):
68 def del_permission(self, permission):
68 permissions = self.get_setting(SETTING_PERMISSIONS)
69 permissions = self.get_setting(SETTING_PERMISSIONS)
69 if not permissions:
70 if not permissions:
70 permissions = []
71 permissions = []
71 else:
72 else:
72 permissions.remove(permission)
73 permissions.remove(permission)
73 self.set_setting(SETTING_PERMISSIONS, permissions)
74 self.set_setting(SETTING_PERMISSIONS, permissions)
74
75
75 def get_fav_tags(self) -> list:
76 def get_fav_tags(self) -> list:
76 tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
77 tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
77 tags = []
78 tags = []
78 if tag_names:
79 if tag_names:
79 tags = list(Tag.objects.filter(name__in=tag_names))
80 tags = list(Tag.objects.filter(name__in=tag_names))
80 return tags
81 return tags
81
82
82 def add_fav_tag(self, tag):
83 def add_fav_tag(self, tag):
83 tags = self.get_setting(SETTING_FAVORITE_TAGS)
84 tags = self.get_setting(SETTING_FAVORITE_TAGS)
84 if not tags:
85 if not tags:
85 tags = [tag.name]
86 tags = [tag.name]
86 else:
87 else:
87 if not tag.name in tags:
88 if not tag.name in tags:
88 tags.append(tag.name)
89 tags.append(tag.name)
89
90
90 tags.sort()
91 tags.sort()
91 self.set_setting(SETTING_FAVORITE_TAGS, tags)
92 self.set_setting(SETTING_FAVORITE_TAGS, tags)
92
93
93 def del_fav_tag(self, tag):
94 def del_fav_tag(self, tag):
94 tags = self.get_setting(SETTING_FAVORITE_TAGS)
95 tags = self.get_setting(SETTING_FAVORITE_TAGS)
95 if tag.name in tags:
96 if tag.name in tags:
96 tags.remove(tag.name)
97 tags.remove(tag.name)
97 self.set_setting(SETTING_FAVORITE_TAGS, tags)
98 self.set_setting(SETTING_FAVORITE_TAGS, tags)
98
99
99 def get_hidden_tags(self) -> list:
100 def get_hidden_tags(self) -> list:
100 tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
101 tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
101 tags = []
102 tags = []
102 if tag_names:
103 if tag_names:
103 tags = list(Tag.objects.filter(name__in=tag_names))
104 tags = list(Tag.objects.filter(name__in=tag_names))
104
105
105 return tags
106 return tags
106
107
107 def add_hidden_tag(self, tag):
108 def add_hidden_tag(self, tag):
108 tags = self.get_setting(SETTING_HIDDEN_TAGS)
109 tags = self.get_setting(SETTING_HIDDEN_TAGS)
109 if not tags:
110 if not tags:
110 tags = [tag.name]
111 tags = [tag.name]
111 else:
112 else:
112 if not tag.name in tags:
113 if not tag.name in tags:
113 tags.append(tag.name)
114 tags.append(tag.name)
114
115
115 tags.sort()
116 tags.sort()
116 self.set_setting(SETTING_HIDDEN_TAGS, tags)
117 self.set_setting(SETTING_HIDDEN_TAGS, tags)
117
118
118 def del_hidden_tag(self, tag):
119 def del_hidden_tag(self, tag):
119 tags = self.get_setting(SETTING_HIDDEN_TAGS)
120 tags = self.get_setting(SETTING_HIDDEN_TAGS)
120 if tag.name in tags:
121 if tag.name in tags:
121 tags.remove(tag.name)
122 tags.remove(tag.name)
122 self.set_setting(SETTING_HIDDEN_TAGS, tags)
123 self.set_setting(SETTING_HIDDEN_TAGS, tags)
123
124
124 def get_fav_threads(self) -> dict:
125 def get_fav_threads(self) -> dict:
125 return self.get_setting(SETTING_FAVORITE_THREADS, default=dict())
126 return self.get_setting(SETTING_FAVORITE_THREADS, default=dict())
126
127
127 def add_or_read_fav_thread(self, opening_post):
128 def add_or_read_fav_thread(self, opening_post):
128 threads = self.get_fav_threads()
129 threads = self.get_fav_threads()
129 thread = opening_post.get_thread()
130
130 # Don't check for new posts if the thread is archived already
131 max_fav_threads = settings.get_int('View', 'MaxFavoriteThreads')
131 if thread.is_archived():
132 if (str(opening_post.id) in threads) or (len(threads) < max_fav_threads):
132 last_id = FAV_THREAD_NO_UPDATES
133 thread = opening_post.get_thread()
133 else:
134 # Don't check for new posts if the thread is archived already
134 last_id = thread.get_replies().last().id
135 if thread.is_archived():
135 threads[str(opening_post.id)] = last_id
136 last_id = FAV_THREAD_NO_UPDATES
136 self.set_setting(SETTING_FAVORITE_THREADS, threads)
137 else:
138 last_id = thread.get_replies().last().id
139 threads[str(opening_post.id)] = last_id
140 self.set_setting(SETTING_FAVORITE_THREADS, threads)
137
141
138 def del_fav_thread(self, opening_post):
142 def del_fav_thread(self, opening_post):
139 threads = self.get_fav_threads()
143 threads = self.get_fav_threads()
140 if self.thread_is_fav(opening_post):
144 if self.thread_is_fav(opening_post):
141 del threads[str(opening_post.id)]
145 del threads[str(opening_post.id)]
142 self.set_setting(SETTING_FAVORITE_THREADS, threads)
146 self.set_setting(SETTING_FAVORITE_THREADS, threads)
143
147
144 def thread_is_fav(self, opening_post):
148 def thread_is_fav(self, opening_post):
145 return str(opening_post.id) in self.get_fav_threads()
149 return str(opening_post.id) in self.get_fav_threads()
146
150
147 def get_notification_usernames(self):
151 def get_notification_usernames(self):
148 names = set()
152 names = set()
149 name_list = self.get_setting(SETTING_USERNAME)
153 name_list = self.get_setting(SETTING_USERNAME)
150 if name_list is not None:
154 if name_list is not None:
151 name_list = name_list.strip()
155 name_list = name_list.strip()
152 if len(name_list) > 0:
156 if len(name_list) > 0:
153 names = name_list.lower().split(',')
157 names = name_list.lower().split(',')
154 names = set(name.strip() for name in names)
158 names = set(name.strip() for name in names)
155 return names
159 return names
156
160
157 def get_image_by_alias(self, alias):
161 def get_image_by_alias(self, alias):
158 images = self.get_setting(SETTING_IMAGES)
162 images = self.get_setting(SETTING_IMAGES)
159 if images is not None and len(images) > 0:
163 if images is not None and len(images) > 0:
160 return images.get(alias)
164 return images.get(alias)
161
165
162 def add_image_alias(self, alias, image):
166 def add_image_alias(self, alias, image):
163 images = self.get_setting(SETTING_IMAGES)
167 images = self.get_setting(SETTING_IMAGES)
164 if images is None:
168 if images is None:
165 images = dict()
169 images = dict()
166 images.put(alias, image)
170 images.put(alias, image)
167
171
168
172
169 class SessionSettingsManager(SettingsManager):
173 class SessionSettingsManager(SettingsManager):
170 """
174 """
171 Session-based settings manager. All settings are saved to the user's
175 Session-based settings manager. All settings are saved to the user's
172 session.
176 session.
173 """
177 """
174 def __init__(self, session):
178 def __init__(self, session):
175 SettingsManager.__init__(self)
179 SettingsManager.__init__(self)
176 self.session = session
180 self.session = session
177
181
178 def get_setting(self, setting, default=None):
182 def get_setting(self, setting, default=None):
179 if setting in self.session:
183 if setting in self.session:
180 return self.session[setting]
184 return self.session[setting]
181 else:
185 else:
182 self.set_setting(setting, default)
186 self.set_setting(setting, default)
183 return default
187 return default
184
188
185 def set_setting(self, setting, value):
189 def set_setting(self, setting, value):
186 self.session[setting] = value
190 self.session[setting] = value
187
191
188
192
189 def get_settings_manager(request) -> SettingsManager:
193 def get_settings_manager(request) -> SettingsManager:
190 """
194 """
191 Get settings manager based on the request object. Currently only
195 Get settings manager based on the request object. Currently only
192 session-based manager is supported. In the future, cookie-based or
196 session-based manager is supported. In the future, cookie-based or
193 database-based managers could be implemented.
197 database-based managers could be implemented.
194 """
198 """
195 return SessionSettingsManager(request.session)
199 return SessionSettingsManager(request.session)
@@ -1,41 +1,42 b''
1 [Version]
1 [Version]
2 Version = 3.1.0 Mitsumune
2 Version = 3.1.0 Mitsumune
3 SiteName = Neboard DEV
3 SiteName = Neboard DEV
4
4
5 [Cache]
5 [Cache]
6 # Timeout for caching, if cache is used
6 # Timeout for caching, if cache is used
7 CacheTimeout = 600
7 CacheTimeout = 600
8
8
9 [Forms]
9 [Forms]
10 # Max post length in characters
10 # Max post length in characters
11 MaxTextLength = 30000
11 MaxTextLength = 30000
12 MaxFileSize = 8000000
12 MaxFileSize = 8000000
13 LimitFirstPosting = true
13 LimitFirstPosting = true
14 LimitPostingSpeed = false
14 LimitPostingSpeed = false
15 PowDifficulty = 0
15 PowDifficulty = 0
16 # Delay in seconds
16 # Delay in seconds
17 PostingDelay = 30
17 PostingDelay = 30
18
18
19 [Messages]
19 [Messages]
20 # Thread bumplimit
20 # Thread bumplimit
21 MaxPostsPerThread = 10
21 MaxPostsPerThread = 10
22 ThreadArchiveDays = 300
22 ThreadArchiveDays = 300
23 AnonymousMode = false
23 AnonymousMode = false
24
24
25 [View]
25 [View]
26 DefaultTheme = md
26 DefaultTheme = md
27 DefaultImageViewer = simple
27 DefaultImageViewer = simple
28 LastRepliesCount = 3
28 LastRepliesCount = 3
29 ThreadsPerPage = 3
29 ThreadsPerPage = 3
30 ImagesPerPageGallery = 20
30 ImagesPerPageGallery = 20
31 MaxFavoriteThreads = 20
31
32
32 [Storage]
33 [Storage]
33 # Enable archiving threads instead of deletion when the thread limit is reached
34 # Enable archiving threads instead of deletion when the thread limit is reached
34 ArchiveThreads = true
35 ArchiveThreads = true
35
36
36 [External]
37 [External]
37 # Thread update
38 # Thread update
38 WebsocketsEnabled = false
39 WebsocketsEnabled = false
39
40
40 [RSS]
41 [RSS]
41 MaxItems = 20
42 MaxItems = 20
General Comments 0
You need to be logged in to leave comments. Login now