##// END OF EJS Templates
Some comments to the settings manager
neko259 -
r2046:173b39cd default
parent child Browse files
Show More
@@ -1,246 +1,252 b''
1 1 import boards
2 2 from boards.models import Tag, TagAlias, Attachment
3 3 from boards.models.attachment import AttachmentSticker
4 4 from boards.models.user import UserSettings
5 5
6 6 MAX_TRIPCODE_COLLISIONS = 50
7 7
8 8 __author__ = 'neko259'
9 9
10 10 SESSION_SETTING = 'setting'
11 11
12 12 SETTING_THEME = 'theme'
13 13 SETTING_FAVORITE_TAGS = 'favorite_tags'
14 14 SETTING_FAVORITE_THREADS = 'favorite_threads'
15 15 SETTING_HIDDEN_TAGS = 'hidden_tags'
16 16 SETTING_USERNAME = 'username'
17 17 SETTING_LAST_NOTIFICATION_ID = 'last_notification'
18 18 SETTING_IMAGE_VIEWER = 'image_viewer'
19 19 SETTING_IMAGES = 'images_aliases'
20 20 SETTING_ONLY_FAVORITES = 'only_favorites'
21 21 SETTING_LAST_POSTS = 'last_posts'
22 22
23 23 DEFAULT_THEME = 'md'
24 24
25 25
26 26 class SettingsManager:
27 27 """
28 28 Base settings manager class. get_setting and set_setting methods should
29 29 be overriden.
30 30 """
31 31 def __init__(self):
32 32 pass
33 33
34 34 def get_theme(self) -> str:
35 35 theme = self.get_setting(SETTING_THEME)
36 36 if not theme:
37 37 theme = DEFAULT_THEME
38 38 self.set_setting(SETTING_THEME, theme)
39 39
40 40 return theme
41 41
42 42 def set_theme(self, theme):
43 43 self.set_setting(SETTING_THEME, theme)
44 44
45 45 def get_setting(self, setting, default=None):
46 46 pass
47 47
48 48 def set_setting(self, setting, value):
49 49 pass
50 50
51 51 def get_fav_tags(self) -> list:
52 52 tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
53 53 tags = []
54 54 if tag_names:
55 55 tags = list(Tag.objects.filter(aliases__in=TagAlias.objects
56 56 .filter_localized(parent__aliases__name__in=tag_names))
57 57 .order_by('aliases__name'))
58 58 return tags
59 59
60 60 def add_fav_tag(self, tag):
61 61 tags = self.get_setting(SETTING_FAVORITE_TAGS)
62 62 if not tags:
63 63 tags = [tag.get_name()]
64 64 else:
65 65 if not tag.get_name() in tags:
66 66 tags.append(tag.get_name())
67 67
68 68 tags.sort()
69 69 self.set_setting(SETTING_FAVORITE_TAGS, tags)
70 70
71 71 def del_fav_tag(self, tag):
72 72 tags = self.get_setting(SETTING_FAVORITE_TAGS)
73 73 if tag.get_name() in tags:
74 74 tags.remove(tag.get_name())
75 75 self.set_setting(SETTING_FAVORITE_TAGS, tags)
76 76
77 77 def get_hidden_tags(self) -> list:
78 78 tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
79 79 tags = []
80 80 if tag_names:
81 81 tags = list(Tag.objects.filter(aliases__in=TagAlias.objects
82 82 .filter_localized(parent__aliases__name__in=tag_names))
83 83 .order_by('aliases__name'))
84 84
85 85 return tags
86 86
87 87 def add_hidden_tag(self, tag):
88 88 tags = self.get_setting(SETTING_HIDDEN_TAGS)
89 89 if not tags:
90 90 tags = [tag.get_name()]
91 91 else:
92 92 if not tag.get_name() in tags:
93 93 tags.append(tag.get_name())
94 94
95 95 tags.sort()
96 96 self.set_setting(SETTING_HIDDEN_TAGS, tags)
97 97
98 98 def del_hidden_tag(self, tag):
99 99 tags = self.get_setting(SETTING_HIDDEN_TAGS)
100 100 if tag.get_name() in tags:
101 101 tags.remove(tag.get_name())
102 102 self.set_setting(SETTING_HIDDEN_TAGS, tags)
103 103
104 104 def add_or_read_fav_thread(self, opening_post):
105 105 last_post_ids = self.get_setting(SETTING_LAST_POSTS)
106 106 if not last_post_ids:
107 107 last_post_ids = []
108 108
109 109 self.del_fav_thread(opening_post)
110 110
111 111 last_post_id = opening_post.get_thread().get_replies().last().id
112 112 last_post_ids.append(last_post_id)
113 113
114 114 self.set_setting(SETTING_LAST_POSTS, last_post_ids)
115 115
116 116 def del_fav_thread(self, opening_post):
117 117 last_posts_ids = self.get_setting(SETTING_LAST_POSTS)
118 118
119 119 for post in self.get_last_posts():
120 120 if post.get_thread() == opening_post.get_thread():
121 121 last_posts_ids.remove(post.id)
122 122
123 123 self.set_setting(SETTING_LAST_POSTS, last_posts_ids)
124 124
125 125 def thread_is_fav(self, opening_post):
126 126 for post in self.get_last_posts():
127 127 if post.get_thread() == opening_post.get_thread():
128 128 return True
129 129 return False
130 130
131 131 def get_notification_usernames(self):
132 132 names = set()
133 133 name_list = self.get_setting(SETTING_USERNAME)
134 134 if name_list is not None:
135 135 name_list = name_list.strip()
136 136 if len(name_list) > 0:
137 137 names = name_list.lower().split(',')
138 138 names = set(name.strip() for name in names)
139 139 return names
140 140
141 141 def get_attachment_by_alias(self, alias):
142 142 images = self.get_setting(SETTING_IMAGES)
143 143 if images and alias in images:
144 144 try:
145 145 return Attachment.objects.get(id=images.get(alias))
146 146 except Attachment.DoesNotExist:
147 147 self.remove_attachment_alias(alias)
148 148
149 149 def add_attachment_alias(self, alias, attachment):
150 150 images = self.get_setting(SETTING_IMAGES)
151 151 if images is None:
152 152 images = dict()
153 153 images[alias] = attachment.id
154 154 self.set_setting(SETTING_IMAGES, images)
155 155
156 156 def remove_attachment_alias(self, alias):
157 157 images = self.get_setting(SETTING_IMAGES)
158 158 del images[alias]
159 159 self.set_setting(SETTING_IMAGES, images)
160 160
161 161 def get_stickers(self):
162 162 images = self.get_setting(SETTING_IMAGES)
163 163 stickers = []
164 164 if images:
165 165 for key, value in images.items():
166 166 try:
167 167 attachment = Attachment.objects.get(id=value)
168 168 stickers.append(AttachmentSticker(name=key, attachment=attachment))
169 169 except Attachment.DoesNotExist:
170 170 self.remove_attachment_alias(key)
171 171 return stickers
172 172
173 173 def tag_is_fav(self, tag):
174 174 fav_tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
175 175 return fav_tag_names is not None and tag.get_name() in fav_tag_names
176 176
177 177 def tag_is_hidden(self, tag):
178 178 hidden_tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
179 179 return hidden_tag_names is not None and tag.get_name() in hidden_tag_names
180 180
181 181 def get_last_posts(self):
182 182 post_ids = self.get_setting(SETTING_LAST_POSTS) or []
183 183 return list(boards.models.Post.objects.filter(id__in=post_ids))
184 184
185 185
186 186 class SessionSettingsManager(SettingsManager):
187 187 """
188 188 Session-based settings manager. All settings are saved to the user's
189 189 session.
190 190 """
191 191 def __init__(self, session):
192 192 SettingsManager.__init__(self)
193 193 self.session = session
194 194
195 195 def get_setting(self, setting, default=None):
196 196 if setting in self.session:
197 197 return self.session[setting]
198 198 else:
199 199 self.set_setting(setting, default)
200 200 return default
201 201
202 202 def set_setting(self, setting, value):
203 203 self.session[setting] = value
204 204
205 205
206 206 class DatabaseSettingsManager(SessionSettingsManager):
207 207 def __init__(self, session):
208 208 super().__init__(session)
209
210 # First time a user accesses the server, his session is not saved
211 # and does not have the key yet. In order to create the settings object
212 # we need to save it manually
209 213 if not session.session_key:
210 214 session.save()
215
211 216 self.settings, created = UserSettings.objects.get_or_create(session_key=session.session_key)
212 217
213 218 def add_fav_tag(self, tag):
214 219 self.settings.fav_tags.add(tag)
215 220
216 221 def del_fav_tag(self, tag):
217 222 self.settings.fav_tags.remove(tag)
218 223
219 224 def get_fav_tags(self) -> list:
220 225 return self.settings.fav_tags.filter(
221 226 aliases__in=TagAlias.objects.filter_localized())\
222 227 .order_by('aliases__name')
223 228
224 229 def get_hidden_tags(self) -> list:
225 230 return self.settings.hidden_tags.all()
226 231
227 232 def add_hidden_tag(self, tag):
228 233 self.settings.hidden_tags.add(tag)
229 234
230 235 def del_hidden_tag(self, tag):
231 236 self.settings.hidden_tags.remove(tag)
232 237
233 238 def tag_is_fav(self, tag):
234 239 return self.settings.fav_tags.filter(id=tag.id).exists()
235 240
236 241 def tag_is_hidden(self, tag):
237 242 return self.settings.hidden_tags.filter(id=tag.id).exists()
238 243
239 244
240 245 def get_settings_manager(request) -> SettingsManager:
241 246 """
242 Get settings manager based on the request object. Currently only
243 session-based manager is supported. In the future, cookie-based or
244 database-based managers could be implemented.
247 Get settings manager based on the request object. Currently database-based
248 settings manager is implemented over the session-based one (settings that
249 are not connected to the database in any way are stored in session). Pure
250 session-based manager is also supported but not used by default.
245 251 """
246 252 return DatabaseSettingsManager(request.session)
General Comments 0
You need to be logged in to leave comments. Login now