|
|
from django.shortcuts import get_object_or_404
|
|
|
from boards.models import Tag
|
|
|
|
|
|
__author__ = 'neko259'
|
|
|
|
|
|
SESSION_SETTING = 'setting'
|
|
|
|
|
|
# Remove this, it is not used any more cause there is a user's permission
|
|
|
PERMISSION_MODERATE = 'moderator'
|
|
|
|
|
|
SETTING_THEME = 'theme'
|
|
|
SETTING_FAVORITE_TAGS = 'favorite_tags'
|
|
|
SETTING_HIDDEN_TAGS = 'hidden_tags'
|
|
|
SETTING_PERMISSIONS = 'permissions'
|
|
|
SETTING_USERNAME = 'username'
|
|
|
SETTING_LAST_NOTIFICATION_ID = 'last_notification'
|
|
|
SETTING_IMAGE_VIEWER = 'image_viewer'
|
|
|
|
|
|
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 has_permission(self, permission):
|
|
|
permissions = self.get_setting(SETTING_PERMISSIONS)
|
|
|
if permissions:
|
|
|
return permission in permissions
|
|
|
else:
|
|
|
return False
|
|
|
|
|
|
def get_setting(self, setting, default=None):
|
|
|
pass
|
|
|
|
|
|
def set_setting(self, setting, value):
|
|
|
pass
|
|
|
|
|
|
def add_permission(self, permission):
|
|
|
permissions = self.get_setting(SETTING_PERMISSIONS)
|
|
|
if not permissions:
|
|
|
permissions = [permission]
|
|
|
else:
|
|
|
permissions.append(permission)
|
|
|
self.set_setting(SETTING_PERMISSIONS, permissions)
|
|
|
|
|
|
def del_permission(self, permission):
|
|
|
permissions = self.get_setting(SETTING_PERMISSIONS)
|
|
|
if not permissions:
|
|
|
permissions = []
|
|
|
else:
|
|
|
permissions.remove(permission)
|
|
|
self.set_setting(SETTING_PERMISSIONS, permissions)
|
|
|
|
|
|
def get_fav_tags(self) -> list:
|
|
|
tag_names = self.get_setting(SETTING_FAVORITE_TAGS)
|
|
|
tags = []
|
|
|
if tag_names:
|
|
|
tags = Tag.objects.filter(name__in=tag_names)
|
|
|
return tags
|
|
|
|
|
|
def add_fav_tag(self, tag):
|
|
|
tags = self.get_setting(SETTING_FAVORITE_TAGS)
|
|
|
if not tags:
|
|
|
tags = [tag.name]
|
|
|
else:
|
|
|
if not tag.name in tags:
|
|
|
tags.append(tag.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.name in tags:
|
|
|
tags.remove(tag.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:
|
|
|
for tag_name in tag_names:
|
|
|
tag = get_object_or_404(Tag, name=tag_name)
|
|
|
tags.append(tag)
|
|
|
|
|
|
return tags
|
|
|
|
|
|
def add_hidden_tag(self, tag):
|
|
|
tags = self.get_setting(SETTING_HIDDEN_TAGS)
|
|
|
if not tags:
|
|
|
tags = [tag.name]
|
|
|
else:
|
|
|
if not tag.name in tags:
|
|
|
tags.append(tag.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.name in tags:
|
|
|
tags.remove(tag.name)
|
|
|
self.set_setting(SETTING_HIDDEN_TAGS, tags)
|
|
|
|
|
|
|
|
|
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:
|
|
|
return default
|
|
|
|
|
|
def set_setting(self, setting, value):
|
|
|
self.session[setting] = value
|
|
|
|
|
|
|
|
|
def get_settings_manager(request) -> SettingsManager:
|
|
|
"""
|
|
|
Get settings manager based on the request object. Currently only
|
|
|
session-based manager is supported. In the future, cookie-based or
|
|
|
database-based managers could be implemented.
|
|
|
"""
|
|
|
return SessionSettingsManager(request.session)
|
|
|
|