##// END OF EJS Templates
Version bump
Version bump

File last commit:

r2065:770356bf default
r2085:7c9be4c6 4.9.2 default
Show More
settingsmanager.py
256 lines | 8.2 KiB | text/x-python | PythonLexer
import boards
from boards.models import Tag, TagAlias, Attachment
from boards.models.attachment import AttachmentSticker
from boards.models.user import UserSettings
MAX_TRIPCODE_COLLISIONS = 50
__author__ = 'neko259'
SESSION_SETTING = 'setting'
SETTING_THEME = 'theme'
SETTING_FAVORITE_TAGS = 'favorite_tags'
SETTING_FAVORITE_THREADS = 'favorite_threads'
SETTING_HIDDEN_TAGS = 'hidden_tags'
SETTING_USERNAME = 'username'
SETTING_LAST_NOTIFICATION_ID = 'last_notification'
SETTING_IMAGE_VIEWER = 'image_viewer'
SETTING_IMAGES = 'images_aliases'
SETTING_ONLY_FAVORITES = 'only_favorites'
SETTING_LAST_POSTS = 'last_posts'
SETTING_CONFIRMED_USER = 'confirmed_user'
DEFAULT_THEME = 'md'
class SettingsManager:
"""
Base settings manager class. get_setting and set_setting methods should
be overriden.
"""
def __init__(self):
pass
def get_theme(self) -> str:
theme = self.get_setting(SETTING_THEME)
if not theme:
theme = DEFAULT_THEME
self.set_setting(SETTING_THEME, theme)
return theme
def set_theme(self, theme):
self.set_setting(SETTING_THEME, theme)
def get_setting(self, setting, default=None):
pass
def set_setting(self, setting, value):
pass
def get_fav_tags(self) -> list:
tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
tags = []
if tag_names:
tags = list(Tag.objects.filter(aliases__in=TagAlias.objects
.filter_localized(parent__aliases__name__in=tag_names))
.order_by('aliases__name'))
return tags
def add_fav_tag(self, tag):
tags = self.get_setting(SETTING_FAVORITE_TAGS)
if not tags:
tags = [tag.get_name()]
else:
if not tag.get_name() in tags:
tags.append(tag.get_name())
tags.sort()
self.set_setting(SETTING_FAVORITE_TAGS, tags)
def del_fav_tag(self, tag):
tags = self.get_setting(SETTING_FAVORITE_TAGS)
if tag.get_name() in tags:
tags.remove(tag.get_name())
self.set_setting(SETTING_FAVORITE_TAGS, tags)
def get_hidden_tags(self) -> list:
tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
tags = []
if tag_names:
tags = list(Tag.objects.filter(aliases__in=TagAlias.objects
.filter_localized(parent__aliases__name__in=tag_names))
.order_by('aliases__name'))
return tags
def add_hidden_tag(self, tag):
tags = self.get_setting(SETTING_HIDDEN_TAGS)
if not tags:
tags = [tag.get_name()]
else:
if not tag.get_name() in tags:
tags.append(tag.get_name())
tags.sort()
self.set_setting(SETTING_HIDDEN_TAGS, tags)
def del_hidden_tag(self, tag):
tags = self.get_setting(SETTING_HIDDEN_TAGS)
if tag.get_name() in tags:
tags.remove(tag.get_name())
self.set_setting(SETTING_HIDDEN_TAGS, tags)
def add_or_read_fav_thread(self, opening_post):
last_post_ids = self.get_setting(SETTING_LAST_POSTS)
if not last_post_ids:
last_post_ids = []
self.del_fav_thread(opening_post)
last_post_id = opening_post.get_thread().get_replies().last().id
last_post_ids.append(last_post_id)
self.set_setting(SETTING_LAST_POSTS, last_post_ids)
def del_fav_thread(self, opening_post):
last_posts_ids = self.get_setting(SETTING_LAST_POSTS)
for post in self.get_last_posts():
if post.get_thread() == opening_post.get_thread():
last_posts_ids.remove(post.id)
self.set_setting(SETTING_LAST_POSTS, last_posts_ids)
def thread_is_fav(self, opening_post):
for post in self.get_last_posts():
if post.get_thread() == opening_post.get_thread():
return True
return False
def get_notification_usernames(self):
names = set()
name_list = self.get_setting(SETTING_USERNAME)
if name_list is not None:
name_list = name_list.strip()
if len(name_list) > 0:
names = name_list.lower().split(',')
names = set(name.strip() for name in names)
return names
def get_attachment_by_alias(self, alias):
images = self.get_setting(SETTING_IMAGES)
if images and alias in images:
try:
return Attachment.objects.get(id=images.get(alias))
except Attachment.DoesNotExist:
self.remove_attachment_alias(alias)
def add_attachment_alias(self, alias, attachment):
images = self.get_setting(SETTING_IMAGES)
if images is None:
images = dict()
images[alias] = attachment.id
self.set_setting(SETTING_IMAGES, images)
def remove_attachment_alias(self, alias):
images = self.get_setting(SETTING_IMAGES)
del images[alias]
self.set_setting(SETTING_IMAGES, images)
def get_stickers(self):
images = self.get_setting(SETTING_IMAGES)
stickers = []
if images:
for key, value in images.items():
try:
attachment = Attachment.objects.get(id=value)
stickers.append(AttachmentSticker(name=key, attachment=attachment))
except Attachment.DoesNotExist:
self.remove_attachment_alias(key)
return stickers
def tag_is_fav(self, tag):
fav_tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
return fav_tag_names is not None and tag.get_name() in fav_tag_names
def tag_is_hidden(self, tag):
hidden_tag_names = self.get_setting(SETTING_HIDDEN_TAGS)
return hidden_tag_names is not None and tag.get_name() in hidden_tag_names
def get_last_posts(self):
post_ids = self.get_setting(SETTING_LAST_POSTS) or []
return list(boards.models.Post.objects.filter(id__in=post_ids).order_by('thread__id'))
class SessionSettingsManager(SettingsManager):
"""
Session-based settings manager. All settings are saved to the user's
session.
"""
def __init__(self, session):
SettingsManager.__init__(self)
self.session = session
def get_setting(self, setting, default=None):
if setting in self.session:
return self.session[setting]
else:
self.set_setting(setting, default)
return default
def set_setting(self, setting, value):
self.session[setting] = value
class DatabaseSettingsManager(SessionSettingsManager):
def __init__(self, session):
super().__init__(session)
# First time a user accesses the server, his session is not saved
# and does not have the key yet. In order to create the settings object
# we need to save it manually
if not session.session_key:
session.save()
self.settings, created = UserSettings.objects.get_or_create(session_key=session.session_key)
def add_fav_tag(self, tag):
self.settings.fav_tags.add(tag)
def del_fav_tag(self, tag):
self.settings.fav_tags.remove(tag)
def get_fav_tags(self) -> list:
return self.settings.fav_tags.filter(
aliases__in=TagAlias.objects.filter_localized())\
.order_by('aliases__name')
def get_hidden_tags(self) -> list:
return self.settings.hidden_tags.all()
def add_hidden_tag(self, tag):
self.settings.hidden_tags.add(tag)
def del_hidden_tag(self, tag):
self.settings.hidden_tags.remove(tag)
def tag_is_fav(self, tag):
return self.settings.fav_tags.filter(id=tag.id).exists()
def tag_is_hidden(self, tag):
return self.settings.hidden_tags.filter(id=tag.id).exists()
def get_user_settings(self):
return self.settings
def get_settings_manager(request) -> SettingsManager:
"""
Get settings manager based on the request object. Currently database-based
settings manager is implemented over the session-based one (settings that
are not connected to the database in any way are stored in session). Pure
session-based manager is also supported but not used by default.
"""
return DatabaseSettingsManager(request.session)