From c375b29e9efae6bbfffc6b10f3ede01353436ff2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stefan=20K=C3=B6gl?= Date: Sun, 2 Dec 2012 11:15:09 +0100 Subject: [PATCH] refactoring well-known settings --- mygpo/api/backend.py | 3 ++- mygpo/db/couchdb/podcast_state.py | 3 ++- mygpo/db/couchdb/user.py | 5 +++-- mygpo/flattr.py | 9 +++++---- mygpo/users/models.py | 19 ++++++++----------- mygpo/users/settings.py | 40 +++++++++++++++++++++++++++++++++++++++ mygpo/web/views/__init__.py | 3 ++- mygpo/web/views/podcast.py | 5 +++-- mygpo/web/views/settings.py | 14 ++++++++------ 9 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 mygpo/users/settings.py diff --git a/mygpo/api/backend.py b/mygpo/api/backend.py index 7ac45ee3..e6333cbb 100644 --- a/mygpo/api/backend.py +++ b/mygpo/api/backend.py @@ -24,6 +24,7 @@ from mygpo.users.models import EpisodeUserState, Device, DeviceDoesNotExist, \ from mygpo.decorators import repeat_on_conflict from mygpo.couch import bulk_save_retry from mygpo.json import json +from mygpo.users.settings import STORE_UA from mygpo.db.couchdb.podcast import podcast_for_url, random_podcasts from mygpo.db.couchdb.podcast_state import podcast_state_for_user_podcast @@ -58,7 +59,7 @@ def get_device(user, uid, user_agent, undelete=True): If the device has been deleted and undelete=True, it is undeleted. """ - store_ua = user.settings.get('store_user_agent', True) + store_ua = user.get_wksetting(STORE_UA) @repeat_on_conflict(['user']) def _get(user, uid, undelete): diff --git a/mygpo/db/couchdb/podcast_state.py b/mygpo/db/couchdb/podcast_state.py index 971dc3f7..6e3b123c 100644 --- a/mygpo/db/couchdb/podcast_state.py +++ b/mygpo/db/couchdb/podcast_state.py @@ -1,4 +1,5 @@ from mygpo.users.models import PodcastUserState +from mygpo.users.settings import PUBLIC_SUB_PODCAST, PUBLIC_SUB_USER from mygpo.couch import get_main_database from mygpo.cache import cache_result from mygpo.db import QueryParameterMissing @@ -96,7 +97,7 @@ def podcast_state_for_user_podcast(user, podcast): p.podcast = podcast.get_id() p.user = user._id p.ref_url = podcast.url - p.settings['public_subscription'] = user.settings.get('public_subscriptions', True) + p.settings[PUBLIC_SUB_PODCAST.name]=user.get_wksetting(PUBLIC_SUB_USER) p.set_device_state(user.devices) diff --git a/mygpo/db/couchdb/user.py b/mygpo/db/couchdb/user.py index 17db51e6..7b467fd8 100644 --- a/mygpo/db/couchdb/user.py +++ b/mygpo/db/couchdb/user.py @@ -2,6 +2,7 @@ from mygpo.cache import cache_result from mygpo.counter import Counter from mygpo.decorators import repeat_on_conflict from mygpo.couch import get_main_database +from mygpo.users.settings import FLATTR_TOKEN, FLATTR_AUTO from mygpo.db import QueryParameterMissing from mygpo.db.couchdb.episode import episodes_by_id @@ -208,10 +209,10 @@ def update_flattr_settings(user, token, enabled=None): """ Updates the Flattr settings of a user """ if enabled is not None: - user.settings['auto_flattr'] = enabled + user.settings[FLATTR_AUTO.name] = enabled if token is not None: - user.settings['flattr_token'] = token + user.settings[FLATTR_TOKEN.name] = token user.save() diff --git a/mygpo/flattr.py b/mygpo/flattr.py index 9ed90f2d..f2fdf11e 100644 --- a/mygpo/flattr.py +++ b/mygpo/flattr.py @@ -12,6 +12,7 @@ from django.conf import settings from django.core.urlresolvers import reverse from mygpo.json import json +from mygpo.users.settings import FLATTR_TOKEN from mygpo import utils from django.utils.translation import ugettext as _ @@ -50,7 +51,7 @@ class Flattr(object): url = utils.url_add_authentication(url, settings.FLATTR_KEY, settings.FLATTR_SECRET) elif self.user.settings.get('flattr_token', ''): - headers['Authorization'] = 'Bearer ' + self.user.settings.get('flattr_token', '') + headers['Authorization'] = 'Bearer ' + self.user.get_wksetting(FLATTR_TOKEN) if data is not None: data = json.dumps(data) @@ -74,7 +75,7 @@ class Flattr(object): } def has_token(self): - return bool(self.user.settings.get('flattr_token', False)) + return bool(self.user.get_wksetting(FLATTR_TOKEN)) def process_retrieved_code(self, url): url_parsed = urlparse.urlparse(url) @@ -108,7 +109,7 @@ class Flattr(object): flattrs ... The number of Flattrs this thing received flattred ... True if this user already flattred this thing """ - if not self.user.settings.get('flattr_token', ''): + if not self.user.get_wksetting(FLATTR_TOKEN): return (0, False) quote_url = urllib.quote_plus(utils.sanitize_encoding(payment_url)) @@ -118,7 +119,7 @@ class Flattr(object): def get_auth_username(self): - if not self.user.settings.get('flattr_token', ''): + if not self.user.get_wksetting(FLATTR_TOKEN): return '' data = self.request(self.USER_INFO_URL) diff --git a/mygpo/users/models.py b/mygpo/users/models.py index 6183dcc1..1849d646 100644 --- a/mygpo/users/models.py +++ b/mygpo/users/models.py @@ -19,6 +19,7 @@ from mygpo.core.proxy import DocumentABCMeta, proxy_object from mygpo.decorators import repeat_on_conflict from mygpo.users.ratings import RatingMixin from mygpo.users.sync import SyncedDevicesMixin +from mygpo.users.settings import FAV_FLAG, PUBLIC_SUB_PODCAST, SettingsMixin from mygpo.db.couchdb.podcast import podcasts_by_id, podcasts_to_dict from mygpo.db.couchdb.user import user_history, device_history @@ -149,14 +150,13 @@ class Chapter(Document): self.start, self.end) -class EpisodeUserState(Document): +class EpisodeUserState(Document, SettingsMixin): """ Contains everything a user has done with an Episode """ episode = StringProperty(required=True) actions = SchemaListProperty(EpisodeAction) - settings = DictProperty() user_oldid = IntegerProperty() user = StringProperty(required=True) ref_url = StringProperty(required=True) @@ -182,11 +182,11 @@ class EpisodeUserState(Document): def is_favorite(self): - return self.settings.get('is_favorite', False) + return self.get_wksetting(FAV_FLAG) def set_favorite(self, set_to=True): - self.settings['is_favorite'] = set_to + self.settings[FAV_FLAG.name] = set_to def update_chapters(self, add=[], rem=[]): @@ -254,7 +254,7 @@ class SubscriptionAction(Document): self.action, self.device, self.timestamp) -class PodcastUserState(Document): +class PodcastUserState(Document, SettingsMixin): """ Contains everything that a user has done with a specific podcast and all its episodes @@ -263,7 +263,6 @@ class PodcastUserState(Document): podcast = StringProperty(required=True) user_oldid = IntegerProperty() user = StringProperty(required=True) - settings = DictProperty() actions = SchemaListProperty(SubscriptionAction) tags = StringListProperty() ref_url = StringProperty(required=True) @@ -357,7 +356,7 @@ class PodcastUserState(Document): def is_public(self): - return self.settings.get('public_subscription', True) + return self.get_wksetting(PUBLIC_SUB_PODCAST) def __eq__(self, other): @@ -372,13 +371,12 @@ class PodcastUserState(Document): (self.podcast, self.user, self._id) -class Device(Document): +class Device(Document, SettingsMixin): id = StringProperty(default=lambda: uuid.uuid4().hex) oldid = IntegerProperty(required=False) uid = StringProperty(required=True) name = StringProperty(required=True, default='New Device') type = StringProperty(required=True, default='other') - settings = DictProperty() deleted = BooleanProperty(default=False) user_agent = StringProperty() @@ -475,9 +473,8 @@ class TokenException(Exception): pass -class User(BaseUser, SyncedDevicesMixin): +class User(BaseUser, SyncedDevicesMixin, SettingsMixin): oldid = IntegerProperty() - settings = DictProperty() devices = SchemaListProperty(Device) published_objects = StringListProperty() deleted = BooleanProperty(default=False) diff --git a/mygpo/users/settings.py b/mygpo/users/settings.py new file mode 100644 index 00000000..0bde2244 --- /dev/null +++ b/mygpo/users/settings.py @@ -0,0 +1,40 @@ +from collections import namedtuple + +from couchdbkit.ext.django.schema import * + + +WellKnownSetting = namedtuple('WellKnownSetting', 'name default') + +## Well-known settings +# this should be documented at +# http://wiki.gpodder.org/wiki/Web_Services/API_2/Settings#Known_Settings + +# Flag to allow storing of user-agents +STORE_UA = WellKnownSetting('store_user_agent', True) + +# Flag to mark a subscription as public +PUBLIC_SUB_PODCAST = WellKnownSetting('public_subscription', True) + +# Default public-flag value (stored in the podcast) +PUBLIC_SUB_USER = WellKnownSetting('public_subscriptions', True) + +# Flattr authentication token, empty if not logged in +FLATTR_TOKEN = WellKnownSetting('flattr_token', '') + +# enable auto-flattring +FLATTR_AUTO = WellKnownSetting('auto_flattr', False) + +# Flag to mark an episode as favorite +FAV_FLAG = WellKnownSetting('is_favorite', False) + + + +class SettingsMixin(DocumentSchema): + """ Objects that have an Old-Id from the old MySQL backend """ + + settings = DictProperty() + + + def get_wksetting(self, setting): + """ returns the value of a well-known setting """ + return self.settings.get(setting.name, setting.default) diff --git a/mygpo/web/views/__init__.py b/mygpo/web/views/__init__.py index 5708214b..973606ee 100644 --- a/mygpo/web/views/__init__.py +++ b/mygpo/web/views/__init__.py @@ -40,6 +40,7 @@ from mygpo.users.models import Suggestions, History, HistoryEntry, \ from mygpo.web.utils import process_lang_params from mygpo.utils import parse_range from mygpo.web.views.podcast import slug_id_decorator +from mygpo.users.settings import FLATTR_AUTO from mygpo.db.couchdb.episode import favorite_episodes_for_user from mygpo.db.couchdb.podcast import podcast_by_id, random_podcasts from mygpo.db.couchdb.user import suggestions_for_user @@ -109,7 +110,7 @@ def dashboard(request, episode_count=10): if request.user.published_objects: checklist.append('publish') - if request.user.settings.get('auto_flattr', False): + if request.user.get_wksetting(FLATTR_AUTO): checklist.append('auto-flattr') tomorrow = datetime.today() + timedelta(days=1) diff --git a/mygpo/web/views/podcast.py b/mygpo/web/views/podcast.py index 7c17b2b7..e8eedf06 100644 --- a/mygpo/web/views/podcast.py +++ b/mygpo/web/views/podcast.py @@ -13,6 +13,7 @@ from django.views.decorators.cache import never_cache, cache_control from mygpo.core.models import PodcastGroup, SubscriptionException from mygpo.core.proxy import proxy_object from mygpo.api.sanitizing import sanitize_url +from mygpo.users.settings import PUBLIC_SUB_PODCAST from mygpo.users.models import HistoryEntry, DeviceDoesNotExist from mygpo.web.forms import SyncForm from mygpo.decorators import allowed_methods, repeat_on_conflict @@ -32,7 +33,7 @@ MAX_TAGS_ON_PAGE=50 @repeat_on_conflict(['state']) def update_podcast_settings(state, is_public): - state.settings['public_subscription'] = is_public + state.settings[PUBLIC_SUB_PODCAST.name] = is_public state.save() @@ -85,7 +86,7 @@ def show(request, podcast): return proxy_object(h, device=dev) history = map(_set_objects, history) - is_public = state.settings.get('public_subscription', True) + is_public = state.get_wksetting(PUBLIC_SUB_PODCAST) return render(request, 'podcast.html', { 'tags': tags, diff --git a/mygpo/web/views/settings.py b/mygpo/web/views/settings.py index 07e62e1b..e31ac665 100644 --- a/mygpo/web/views/settings.py +++ b/mygpo/web/views/settings.py @@ -37,6 +37,8 @@ from mygpo.decorators import allowed_methods, repeat_on_conflict from mygpo.web.forms import UserAccountForm, ProfileForm, FlattrForm from mygpo.web.utils import normalize_twitter from mygpo.flattr import Flattr +from mygpo.users.settings import PUBLIC_SUB_PODCAST, PUBLIC_SUB_USER, \ + FLATTR_TOKEN, FLATTR_AUTO from mygpo.db.couchdb.podcast import podcast_by_id, podcasts_to_dict from mygpo.db.couchdb.podcast_state import podcast_state_for_user_podcast, \ subscriptions_by_user @@ -62,12 +64,12 @@ def account(request): form = UserAccountForm({ 'email': request.user.email, - 'public': request.user.settings.get('public_subscriptions', True) + 'public': request.user.get_wksetting(PUBLIC_SUB_USER) }) flattr_form = FlattrForm({ - 'enable': request.user.settings.get('auto_flattr', False), - 'token': request.user.settings.get('flattr_token', '') + 'enable': request.user.get_wksetting(FLATTR_AUTO), + 'token': request.user.get_wksetting(FLATTR_TOKEN), }) return render(request, 'account.html', { @@ -202,7 +204,7 @@ class DefaultPrivacySettings(View): @repeat_on_conflict(['user']) def set_privacy_settings(self, user): - user.settings['public_subscriptions'] = self.public + user.settings[PUBLIC_SUB_USER.name] = self.public user.save() @@ -221,7 +223,7 @@ class PodcastPrivacySettings(View): @repeat_on_conflict(['state']) def set_privacy_settings(self, state): - state.settings['public_subscription'] = self.public + state.settings[PUBLIC_SUB_PODCAST.name] = self.public state.save() @@ -238,7 +240,7 @@ def privacy(request): excluded_subscriptions = set(filter(None, [podcasts.get(x[1], None) for x in subscriptions if x[0] == False])) return render(request, 'privacy.html', { - 'public_subscriptions': request.user.settings.get('public_subscriptions', True), + 'public_subscriptions': request.user.get_wksetting(PUBLIC_SUB_USER), 'included_subscriptions': included_subscriptions, 'excluded_subscriptions': excluded_subscriptions, 'domain': site.domain, -- 2.11.4.GIT