##// END OF EJS Templates
Handle local stickers which attachments were deleted
neko259 -
r1941:8ea46883 default
parent child Browse files
Show More
@@ -1,219 +1,227 b''
1 from boards import settings
1 from boards import settings
2 from boards.models import Tag, TagAlias, Attachment
2 from boards.models import Tag, TagAlias, Attachment
3 from boards.models.attachment import AttachmentSticker
3 from boards.models.attachment import AttachmentSticker
4 from boards.models.thread import FAV_THREAD_NO_UPDATES
4 from boards.models.thread import FAV_THREAD_NO_UPDATES
5 from boards.models.tag import DEFAULT_LOCALE
5 from boards.models.tag import DEFAULT_LOCALE
6
6
7 MAX_TRIPCODE_COLLISIONS = 50
7 MAX_TRIPCODE_COLLISIONS = 50
8
8
9 __author__ = 'neko259'
9 __author__ = 'neko259'
10
10
11 SESSION_SETTING = 'setting'
11 SESSION_SETTING = 'setting'
12
12
13 # Remove this, it is not used any more cause there is a user's permission
13 # Remove this, it is not used any more cause there is a user's permission
14 PERMISSION_MODERATE = 'moderator'
14 PERMISSION_MODERATE = 'moderator'
15
15
16 SETTING_THEME = 'theme'
16 SETTING_THEME = 'theme'
17 SETTING_FAVORITE_TAGS = 'favorite_tags'
17 SETTING_FAVORITE_TAGS = 'favorite_tags'
18 SETTING_FAVORITE_THREADS = 'favorite_threads'
18 SETTING_FAVORITE_THREADS = 'favorite_threads'
19 SETTING_HIDDEN_TAGS = 'hidden_tags'
19 SETTING_HIDDEN_TAGS = 'hidden_tags'
20 SETTING_PERMISSIONS = 'permissions'
20 SETTING_PERMISSIONS = 'permissions'
21 SETTING_USERNAME = 'username'
21 SETTING_USERNAME = 'username'
22 SETTING_LAST_NOTIFICATION_ID = 'last_notification'
22 SETTING_LAST_NOTIFICATION_ID = 'last_notification'
23 SETTING_IMAGE_VIEWER = 'image_viewer'
23 SETTING_IMAGE_VIEWER = 'image_viewer'
24 SETTING_TRIPCODE = 'tripcode'
24 SETTING_TRIPCODE = 'tripcode'
25 SETTING_IMAGES = 'images_aliases'
25 SETTING_IMAGES = 'images_aliases'
26 SETTING_ONLY_FAVORITES = 'only_favorites'
26 SETTING_ONLY_FAVORITES = 'only_favorites'
27
27
28 DEFAULT_THEME = 'md'
28 DEFAULT_THEME = 'md'
29
29
30
30
31 class SettingsManager:
31 class SettingsManager:
32 """
32 """
33 Base settings manager class. get_setting and set_setting methods should
33 Base settings manager class. get_setting and set_setting methods should
34 be overriden.
34 be overriden.
35 """
35 """
36 def __init__(self):
36 def __init__(self):
37 pass
37 pass
38
38
39 def get_theme(self) -> str:
39 def get_theme(self) -> str:
40 theme = self.get_setting(SETTING_THEME)
40 theme = self.get_setting(SETTING_THEME)
41 if not theme:
41 if not theme:
42 theme = DEFAULT_THEME
42 theme = DEFAULT_THEME
43 self.set_setting(SETTING_THEME, theme)
43 self.set_setting(SETTING_THEME, theme)
44
44
45 return theme
45 return theme
46
46
47 def set_theme(self, theme):
47 def set_theme(self, theme):
48 self.set_setting(SETTING_THEME, theme)
48 self.set_setting(SETTING_THEME, theme)
49
49
50 def has_permission(self, permission):
50 def has_permission(self, permission):
51 permissions = self.get_setting(SETTING_PERMISSIONS)
51 permissions = self.get_setting(SETTING_PERMISSIONS)
52 if permissions:
52 if permissions:
53 return permission in permissions
53 return permission in permissions
54 else:
54 else:
55 return False
55 return False
56
56
57 def get_setting(self, setting, default=None):
57 def get_setting(self, setting, default=None):
58 pass
58 pass
59
59
60 def set_setting(self, setting, value):
60 def set_setting(self, setting, value):
61 pass
61 pass
62
62
63 def add_permission(self, permission):
63 def add_permission(self, permission):
64 permissions = self.get_setting(SETTING_PERMISSIONS)
64 permissions = self.get_setting(SETTING_PERMISSIONS)
65 if not permissions:
65 if not permissions:
66 permissions = [permission]
66 permissions = [permission]
67 else:
67 else:
68 permissions.append(permission)
68 permissions.append(permission)
69 self.set_setting(SETTING_PERMISSIONS, permissions)
69 self.set_setting(SETTING_PERMISSIONS, permissions)
70
70
71 def del_permission(self, permission):
71 def del_permission(self, permission):
72 permissions = self.get_setting(SETTING_PERMISSIONS)
72 permissions = self.get_setting(SETTING_PERMISSIONS)
73 if not permissions:
73 if not permissions:
74 permissions = []
74 permissions = []
75 else:
75 else:
76 permissions.remove(permission)
76 permissions.remove(permission)
77 self.set_setting(SETTING_PERMISSIONS, permissions)
77 self.set_setting(SETTING_PERMISSIONS, permissions)
78
78
79 def get_fav_tags(self) -> list:
79 def get_fav_tags(self) -> list:
80 tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
80 tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
81 tags = []
81 tags = []
82 if tag_names:
82 if tag_names:
83 tags = list(Tag.objects.filter(aliases__in=TagAlias.objects
83 tags = list(Tag.objects.filter(aliases__in=TagAlias.objects
84 .filter_localized(parent__aliases__name__in=tag_names))
84 .filter_localized(parent__aliases__name__in=tag_names))
85 .order_by('aliases__name'))
85 .order_by('aliases__name'))
86 return tags
86 return tags
87
87
88 def add_fav_tag(self, tag):
88 def add_fav_tag(self, tag):
89 tags = self.get_setting(SETTING_FAVORITE_TAGS)
89 tags = self.get_setting(SETTING_FAVORITE_TAGS)
90 if not tags:
90 if not tags:
91 tags = [tag.get_name()]
91 tags = [tag.get_name()]
92 else:
92 else:
93 if not tag.get_name() in tags:
93 if not tag.get_name() in tags:
94 tags.append(tag.get_name())
94 tags.append(tag.get_name())
95
95
96 tags.sort()
96 tags.sort()
97 self.set_setting(SETTING_FAVORITE_TAGS, tags)
97 self.set_setting(SETTING_FAVORITE_TAGS, tags)
98
98
99 def del_fav_tag(self, tag):
99 def del_fav_tag(self, tag):
100 tags = self.get_setting(SETTING_FAVORITE_TAGS)
100 tags = self.get_setting(SETTING_FAVORITE_TAGS)
101 if tag.get_name() in tags:
101 if tag.get_name() in tags:
102 tags.remove(tag.get_name())
102 tags.remove(tag.get_name())
103 self.set_setting(SETTING_FAVORITE_TAGS, tags)
103 self.set_setting(SETTING_FAVORITE_TAGS, tags)
104
104
105 def get_hidden_tags(self) -> list:
105 def get_hidden_tags(self) -> list:
106 tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
106 tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
107 tags = []
107 tags = []
108 if tag_names:
108 if tag_names:
109 tags = list(Tag.objects.filter(aliases__in=TagAlias.objects
109 tags = list(Tag.objects.filter(aliases__in=TagAlias.objects
110 .filter_localized(parent__aliases__name__in=tag_names))
110 .filter_localized(parent__aliases__name__in=tag_names))
111 .order_by('aliases__name'))
111 .order_by('aliases__name'))
112
112
113 return tags
113 return tags
114
114
115 def add_hidden_tag(self, tag):
115 def add_hidden_tag(self, tag):
116 tags = self.get_setting(SETTING_HIDDEN_TAGS)
116 tags = self.get_setting(SETTING_HIDDEN_TAGS)
117 if not tags:
117 if not tags:
118 tags = [tag.get_name()]
118 tags = [tag.get_name()]
119 else:
119 else:
120 if not tag.get_name() in tags:
120 if not tag.get_name() in tags:
121 tags.append(tag.get_name())
121 tags.append(tag.get_name())
122
122
123 tags.sort()
123 tags.sort()
124 self.set_setting(SETTING_HIDDEN_TAGS, tags)
124 self.set_setting(SETTING_HIDDEN_TAGS, tags)
125
125
126 def del_hidden_tag(self, tag):
126 def del_hidden_tag(self, tag):
127 tags = self.get_setting(SETTING_HIDDEN_TAGS)
127 tags = self.get_setting(SETTING_HIDDEN_TAGS)
128 if tag.get_name() in tags:
128 if tag.get_name() in tags:
129 tags.remove(tag.get_name())
129 tags.remove(tag.get_name())
130 self.set_setting(SETTING_HIDDEN_TAGS, tags)
130 self.set_setting(SETTING_HIDDEN_TAGS, tags)
131
131
132 def get_fav_threads(self) -> dict:
132 def get_fav_threads(self) -> dict:
133 return self.get_setting(SETTING_FAVORITE_THREADS, default=dict())
133 return self.get_setting(SETTING_FAVORITE_THREADS, default=dict())
134
134
135 def add_or_read_fav_thread(self, opening_post):
135 def add_or_read_fav_thread(self, opening_post):
136 threads = self.get_fav_threads()
136 threads = self.get_fav_threads()
137
137
138 max_fav_threads = settings.get_int('View', 'MaxFavoriteThreads')
138 max_fav_threads = settings.get_int('View', 'MaxFavoriteThreads')
139 if (str(opening_post.id) in threads) or (len(threads) < max_fav_threads):
139 if (str(opening_post.id) in threads) or (len(threads) < max_fav_threads):
140 thread = opening_post.get_thread()
140 thread = opening_post.get_thread()
141 # Don't check for new posts if the thread is archived already
141 # Don't check for new posts if the thread is archived already
142 if thread.is_archived():
142 if thread.is_archived():
143 last_id = FAV_THREAD_NO_UPDATES
143 last_id = FAV_THREAD_NO_UPDATES
144 else:
144 else:
145 last_id = thread.get_replies().last().id
145 last_id = thread.get_replies().last().id
146 threads[str(opening_post.id)] = last_id
146 threads[str(opening_post.id)] = last_id
147 self.set_setting(SETTING_FAVORITE_THREADS, threads)
147 self.set_setting(SETTING_FAVORITE_THREADS, threads)
148
148
149 def del_fav_thread(self, opening_post):
149 def del_fav_thread(self, opening_post):
150 threads = self.get_fav_threads()
150 threads = self.get_fav_threads()
151 if self.thread_is_fav(opening_post):
151 if self.thread_is_fav(opening_post):
152 del threads[str(opening_post.id)]
152 del threads[str(opening_post.id)]
153 self.set_setting(SETTING_FAVORITE_THREADS, threads)
153 self.set_setting(SETTING_FAVORITE_THREADS, threads)
154
154
155 def thread_is_fav(self, opening_post):
155 def thread_is_fav(self, opening_post):
156 return str(opening_post.id) in self.get_fav_threads()
156 return str(opening_post.id) in self.get_fav_threads()
157
157
158 def get_notification_usernames(self):
158 def get_notification_usernames(self):
159 names = set()
159 names = set()
160 name_list = self.get_setting(SETTING_USERNAME)
160 name_list = self.get_setting(SETTING_USERNAME)
161 if name_list is not None:
161 if name_list is not None:
162 name_list = name_list.strip()
162 name_list = name_list.strip()
163 if len(name_list) > 0:
163 if len(name_list) > 0:
164 names = name_list.lower().split(',')
164 names = name_list.lower().split(',')
165 names = set(name.strip() for name in names)
165 names = set(name.strip() for name in names)
166 return names
166 return names
167
167
168 def get_attachment_by_alias(self, alias):
168 def get_attachment_by_alias(self, alias):
169 images = self.get_setting(SETTING_IMAGES)
169 images = self.get_setting(SETTING_IMAGES)
170 if images and alias in images:
170 if images and alias in images:
171 return Attachment.objects.get(id=images.get(alias))
171 try:
172 return Attachment.objects.get(id=images.get(alias))
173 except Attachment.DoesNotExist:
174 self.remove_attachment_alias(alias)
172
175
173 def add_attachment_alias(self, alias, attachment):
176 def add_attachment_alias(self, alias, attachment):
174 images = self.get_setting(SETTING_IMAGES)
177 images = self.get_setting(SETTING_IMAGES)
175 if images is None:
178 if images is None:
176 images = dict()
179 images = dict()
177 images[alias] = attachment.id
180 images[alias] = attachment.id
178 self.set_setting(SETTING_IMAGES, images)
181 self.set_setting(SETTING_IMAGES, images)
179
182
180 def remove_attachment_alias(self, alias):
183 def remove_attachment_alias(self, alias):
181 images = self.get_setting(SETTING_IMAGES)
184 images = self.get_setting(SETTING_IMAGES)
182 del images[alias]
185 del images[alias]
183 self.set_setting(SETTING_IMAGES, images)
186 self.set_setting(SETTING_IMAGES, images)
184
187
185 def get_stickers(self):
188 def get_stickers(self):
186 images = self.get_setting(SETTING_IMAGES)
189 images = self.get_setting(SETTING_IMAGES)
190 stickers = []
187 if images:
191 if images:
188 return [AttachmentSticker(name=key,
192 for key, value in images.items():
189 attachment=Attachment.objects.get(id=value))
193 try:
190 for key, value in images.items()]
194 attachment = Attachment.objects.get(id=value)
195 stickers.append(AttachmentSticker(name=key, attachment=attachment))
196 except Attachment.DoesNotExist:
197 self.remove_attachment_alias(key)
198 return stickers
191
199
192
200
193 class SessionSettingsManager(SettingsManager):
201 class SessionSettingsManager(SettingsManager):
194 """
202 """
195 Session-based settings manager. All settings are saved to the user's
203 Session-based settings manager. All settings are saved to the user's
196 session.
204 session.
197 """
205 """
198 def __init__(self, session):
206 def __init__(self, session):
199 SettingsManager.__init__(self)
207 SettingsManager.__init__(self)
200 self.session = session
208 self.session = session
201
209
202 def get_setting(self, setting, default=None):
210 def get_setting(self, setting, default=None):
203 if setting in self.session:
211 if setting in self.session:
204 return self.session[setting]
212 return self.session[setting]
205 else:
213 else:
206 self.set_setting(setting, default)
214 self.set_setting(setting, default)
207 return default
215 return default
208
216
209 def set_setting(self, setting, value):
217 def set_setting(self, setting, value):
210 self.session[setting] = value
218 self.session[setting] = value
211
219
212
220
213 def get_settings_manager(request) -> SettingsManager:
221 def get_settings_manager(request) -> SettingsManager:
214 """
222 """
215 Get settings manager based on the request object. Currently only
223 Get settings manager based on the request object. Currently only
216 session-based manager is supported. In the future, cookie-based or
224 session-based manager is supported. In the future, cookie-based or
217 database-based managers could be implemented.
225 database-based managers could be implemented.
218 """
226 """
219 return SessionSettingsManager(request.session)
227 return SessionSettingsManager(request.session)
General Comments 0
You need to be logged in to leave comments. Login now