Skip to content

Commit

Permalink
feat: add settings for users
Browse files Browse the repository at this point in the history
  • Loading branch information
Gagaro committed Aug 20, 2013
1 parent f113fba commit 5d8d0ce
Show file tree
Hide file tree
Showing 11 changed files with 105 additions and 46 deletions.
1 change: 1 addition & 0 deletions collective/rcse/configure.zcml
Expand Up @@ -15,6 +15,7 @@
<include file="permissions.zcml"/>
<include package="plone.app.contentmenu" />
<include package=".action" />
<include package=".behavior" />
<include package=".content" />
<include package=".page" />
<include package=".portlets" />
Expand Down
2 changes: 2 additions & 0 deletions collective/rcse/content/configure.zcml
Expand Up @@ -18,4 +18,6 @@
for="collective.rcse.content.member.IMember
Products.DCWorkflow.interfaces.IAfterTransitionEvent" />

<adapter factory=".settings.SettingsFactory" />

</configure>
2 changes: 2 additions & 0 deletions collective/rcse/content/member.py
Expand Up @@ -3,6 +3,8 @@
from plone.namedfile import field
from plone.supermodel import model
from z3c.form.browser.select import SelectFieldWidget
from zope.annotation import IAttributeAnnotatable
from zope import interface
from zope import schema

from collective.rcse.i18n import _
Expand Down
26 changes: 26 additions & 0 deletions collective/rcse/content/settings.py
@@ -0,0 +1,26 @@
from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations
from zope.annotation import factory
from zope import component
from zope import interface
from zope import schema

from collective.rcse.settings import getDefaultSettings


class ISettings(interface.Interface):
settings = schema.Dict(
title=u"Settings",
key_type=schema.ASCIILine(),
value_type=schema.ASCIILine()
)


class Settings(object):
interface.implements(ISettings)
component.adapts(IAttributeAnnotatable)

def __init__(self):
self.settings = getDefaultSettings()


SettingsFactory = factory(Settings)
8 changes: 8 additions & 0 deletions collective/rcse/page/controller/configure.zcml
Expand Up @@ -80,6 +80,14 @@
permission="zope2.View"
/>

<browser:page
for="collective.rcse.content.member.IMember"
name="get_settings"
class=".settings.GetSettings"
layer="collective.rcse.layer.CommonLayer"
permission="zope2.View"
/>

<adapter factory=".modify_company.ModifyCompanyFormAdapter" />

<browser:page
Expand Down
4 changes: 2 additions & 2 deletions collective/rcse/page/controller/person_view.py
Expand Up @@ -69,8 +69,8 @@ def update_member(self):
self.memberid = self.member.getId()

def update_memberinfo(self):
if self.member is None:
raise ValueError("member can t be none")
if self.memberid is None:
raise ValueError("memberid can't be none")
if self.url is None:
self.url = self.portal_url() + '/author/' + self.memberid
if self.fullname is None:
Expand Down
25 changes: 22 additions & 3 deletions collective/rcse/page/controller/personal-preferences.py
Expand Up @@ -6,7 +6,6 @@
from zope import interface

from collective.rcse.settings import IPersonalPreferences
from collective.rcse.settings import getUserSettings
from collective.rcse.i18n import _


Expand All @@ -27,10 +26,30 @@ class PersonalPreferencesForm(AutoExtensibleForm, form.Form):
enableCSRFProtection = True
label = _("Personal preferences")

def update(self):
super(PersonalPreferencesForm, self).update()
self.member = self.context.restrictedTraverse('auth_memberinfo')
self.member.update()
self.member_context = self.member.get_membrane()
self.settings = self.member_context.restrictedTraverse('get_settings')
for field in self.fields:
try:
value = self.settings.get(field)
self.fields[field].field.default = value
except KeyError:
pass

@button.buttonAndHandler(_(u"Save"), name="save")
def handleApply(self, action):
settings = getUserSettings(self.context)
#@TODO
data, errors = self.extractData()
if errors:
return
self.member = self.context.restrictedTraverse('auth_memberinfo')
self.member.update()
self.member_context = self.member.get_membrane()
self.settings = self.member_context.restrictedTraverse('get_settings')
for key, value in data.items():
self.settings.set(key, value)


class PersonalPreferencesFormWrapper(FormWrapper):
Expand Down
26 changes: 26 additions & 0 deletions collective/rcse/page/controller/settings.py
@@ -0,0 +1,26 @@
from Products.Five.browser import BrowserView

from collective.rcse.content.settings import ISettings
from collective.rcse.content.settings import getDefaultSettings


class GetSettings(BrowserView):
def __init__(self, context, request):
self.context = context
self.request = request
self.settings = ISettings(self.context).settings
self.default_settings = getDefaultSettings()

def __call__(self):
return self

def get(self, key):
if key in self.settings.keys():
return self.settings[key]
if key in default_settings.keys():
return default_settings.keys()
raise KeyError

def set(self, key, value):
self.settings[key] = value

1 change: 0 additions & 1 deletion collective/rcse/page/controller/timeline_item_view.py
Expand Up @@ -6,7 +6,6 @@
from zope.component import getUtility
from plone.registry.interfaces import IRegistry

from collective.rcse.settings import IDocumentActionsIcons
from cioppino.twothumbs import rate
from collective.favoriting.browser.favoriting_view import VIEW_NAME

Expand Down
17 changes: 0 additions & 17 deletions collective/rcse/profiles/default/registry.xml
@@ -1,23 +1,6 @@
<registry>
<records interface="collective.rcse.security.ISecuritySettings"/>

<!-- collective.rcse -->

<record name="collective.rcse.settings.IPersonalPreferences.subscribe_when_favorited">
<field type="plone.registry.field.Bool">
<title>Subscribe when favorited</title>
<description>You will automatically subscribed to contents you add to your favorites.</description>
</field>
<value>True</value>
</record>
<record name="collective.rcse.settings.IPersonalPreferences.watch_when_favorited">
<field type="plone.registry.field.Bool">
<title>Watch when favorited</title>
<description>You will automatically watch groups you add to your favorites.</description>
</field>
<value>True</value>
</record>

<!-- collective.readitlater -->
<records interface="collective.readitlater.registry.IReaditlaterSettings">
<value key="folder_query">{"portal_type": {"query": "collective.rcse.group"},"path": {"query": "/"}}</value>
Expand Down
39 changes: 16 additions & 23 deletions collective/rcse/settings.py
@@ -1,20 +1,17 @@
from plone.registry.interfaces import IRegistry
from Products.CMFCore.utils import getToolByName
from zope.component import getUtility
from zope import component
from zope import interface
from zope import schema

from collective.rcse.i18n import _


class IDocumentActionsIcons(interface.Interface):
"""Interface for icon/actions mapping setting"""
class ISettings(interface.Interface):
"""Marker interface to get utilities giving
interfaces with default settings."""

mapping = schema.Dict(
title=_(u"Action to icon"),
key_type=schema.ASCIILine(),
value_type=schema.ASCIILine(),
)
def getInterface():
"""Return an interface with default settings."""


class IPersonalPreferences(interface.Interface):
Expand All @@ -24,27 +21,23 @@ class IPersonalPreferences(interface.Interface):
title=_(u"Subscribe when favorited"),
description=_(u"You will automatically subscribed to contents "
u"you add to your favorites."),
default=True
)
watch_when_favorited = schema.Bool(
title=_(u"Watch when favorited"),
description=_(u"You will automatically watch groups you add "
u"to your favorites."),
default=True
)


def getUserSettings(context):
"""Return a dict with the authenticated user settings."""
registry = getUtility(IRegistry)
default_settings = registry.forInterface(IPersonalPreferences)
def getDefaultSettings():
settings = {}
for s in IPersonalPreferences.names():
try:
settings[s] = default_settings.__getattr__(s)
except AttributeError:
settings[s] = None
mtool = getToolByName(context, 'portal_membership')
user = mtool.getAuthenticatedMember()
if user is None:
return settings
#@TODO Think about a good way to get user settings (From Member content ?)
for name, description in IPersonalPreferences.namesAndDescriptions():
settings[name] = description.default
utilities = component.getUtilitiesFor(ISettings)
for name, utility in utilities:
interface = utility.getInterface()
for name, description in interface.namesAndDescriptions():
settings[name] = description.default
return settings

0 comments on commit 5d8d0ce

Please sign in to comment.