Add ISendingType behavior (with vocabulary)
This commit is contained in:
parent
a1d6f4ed58
commit
8f2ae6dcf0
|
@ -0,0 +1,26 @@
|
|||
from z3c.form.browser.radio import RadioFieldWidget
|
||||
from zope.interface import alsoProvides
|
||||
from zope.schema import Choice
|
||||
|
||||
from plone.autoform.interfaces import IFormFieldProvider
|
||||
from plone.autoform import directives as form
|
||||
from plone.directives.form import default_value
|
||||
from plone.supermodel import model
|
||||
|
||||
from collective.dms.mailcontent import _
|
||||
|
||||
|
||||
class ISendingType(model.Schema):
|
||||
"""Sending type behavior"""
|
||||
sending_type = Choice(title=_(u"Sending type"),
|
||||
vocabulary='SendingTypes',
|
||||
required=False)
|
||||
form.widget(sending_type=RadioFieldWidget)
|
||||
|
||||
|
||||
@default_value(field=ISendingType['sending_type'])
|
||||
def sending_type_default_value(data):
|
||||
return "normal"
|
||||
|
||||
|
||||
alsoProvides(ISendingType, IFormFieldProvider)
|
|
@ -0,0 +1,18 @@
|
|||
<configure
|
||||
xmlns="http://namespaces.zope.org/zope"
|
||||
xmlns:plone="http://namespaces.plone.org/plone"
|
||||
xmlns:i18n="http://namespaces.zope.org/i18n"
|
||||
xmlns:grok="http://namespaces.zope.org/grok"
|
||||
i18n_domain="collective.dms.mailcontent">
|
||||
|
||||
<include package="plone.behavior" file="meta.zcml" />
|
||||
|
||||
<grok:grok package=".behaviors" />
|
||||
|
||||
<plone:behavior
|
||||
title="SendingType"
|
||||
description="Sending type behavior"
|
||||
provides=".behaviors.ISendingType"
|
||||
/>
|
||||
|
||||
</configure>
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
<include package="five.grok" />
|
||||
<include package=".upgrades" />
|
||||
<include file="behaviors.zcml" />
|
||||
|
||||
<grok:grok package="." />
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0"?>
|
||||
<object name="portal_types" meta_type="Plone Types Tool">
|
||||
<property name="title">Controls the available content types in your portal</property>
|
||||
<object name="testtype" meta_type="Dexterity FTI"/>
|
||||
</object>
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0"?>
|
||||
<object name="testtype" meta_type="Dexterity FTI" i18n:domain="plone"
|
||||
xmlns:i18n="http://xml.zope.org/namespaces/i18n">
|
||||
<property name="title" i18n:translate="">Test type</property>
|
||||
<property name="description" i18n:translate="">None</property>
|
||||
<property name="icon_expr">string:${portal_url}/folder_icon.png</property>
|
||||
<property name="factory">testtype</property>
|
||||
<property name="add_view_expr">string:${folder_url}/++add++testtype</property>
|
||||
<property name="link_target"></property>
|
||||
<property name="immediate_view">view</property>
|
||||
<property name="global_allow">True</property>
|
||||
<property name="filter_content_types">True</property>
|
||||
<property name="allowed_content_types" />
|
||||
<property name="allow_discussion">False</property>
|
||||
<property name="default_view">view</property>
|
||||
<property name="view_methods">
|
||||
<element value="view"/>
|
||||
</property>
|
||||
<property name="default_view_fallback">False</property>
|
||||
<property name="add_permission">cmf.AddPortalContent</property>
|
||||
<property name="behaviors">
|
||||
<element value="collective.dms.mailcontent.behaviors.ISendingType" />
|
||||
</property>
|
||||
<property name="schema" />
|
||||
<!-- DO NOT use a model_source or it removes manually added fields while reapplying the profile -->
|
||||
<!--property name="model_source" /-->
|
||||
<alias from="(Default)" to="(dynamic view)"/>
|
||||
<alias from="edit" to="@@edit"/>
|
||||
<alias from="sharing" to="@@sharing"/>
|
||||
<alias from="view" to="(selected layout)"/>
|
||||
<action title="View" action_id="view" category="object" condition_expr=""
|
||||
description="" icon_expr="" link_target="" url_expr="string:${object_url}"
|
||||
visible="True">
|
||||
<permission value="View"/>
|
||||
</action>
|
||||
<action title="Edit" action_id="edit" category="object" condition_expr=""
|
||||
description="" icon_expr="" link_target=""
|
||||
url_expr="string:${object_url}/edit" visible="True">
|
||||
<permission value="Modify portal content"/>
|
||||
</action>
|
||||
</object>
|
|
@ -0,0 +1,44 @@
|
|||
# -*- coding: utf8 -*-
|
||||
import unittest2 as unittest
|
||||
|
||||
from zope.component import getUtility
|
||||
|
||||
from plone.behavior.interfaces import IBehavior
|
||||
from plone.autoform.interfaces import IFormFieldProvider
|
||||
from plone.app.testing.helpers import setRoles
|
||||
from plone.app.testing.interfaces import TEST_USER_NAME, TEST_USER_ID
|
||||
|
||||
from ecreall.helpers.testing.base import BaseTest
|
||||
|
||||
from collective.dms.mailcontent.testing import INTEGRATION
|
||||
from collective.dms.mailcontent.behaviors import ISendingType, sending_type_default_value
|
||||
|
||||
|
||||
class TestBehaviors(unittest.TestCase, BaseTest):
|
||||
"""Tests behaviors"""
|
||||
|
||||
layer = INTEGRATION
|
||||
|
||||
def setUp(self):
|
||||
super(TestBehaviors, self).setUp()
|
||||
self.portal = self.layer['portal']
|
||||
setRoles(self.portal, TEST_USER_ID, ['Manager'])
|
||||
self.login(TEST_USER_NAME)
|
||||
self.portal.invokeFactory('testtype', 'testitem')
|
||||
self.testitem = self.portal['testitem']
|
||||
|
||||
def test_behaviors_installation(self):
|
||||
sending_type_behavior = getUtility(IBehavior,
|
||||
name='collective.dms.mailcontent.behaviors.ISendingType')
|
||||
self.assertEqual(sending_type_behavior.interface, ISendingType)
|
||||
IFormFieldProvider.providedBy(sending_type_behavior.interface)
|
||||
|
||||
def test_sending_type_fields(self):
|
||||
item = self.testitem
|
||||
self.assertIsNone(item.getAttributes())
|
||||
self.assertTrue(hasattr(item, 'sending_type'))
|
||||
item.sending_type = 'registered'
|
||||
self.assertEqual(item.sending_type, 'registered')
|
||||
|
||||
def test_sending_type_default_value(self):
|
||||
self.assertEqual(sending_type_default_value(''), 'normal')
|
|
@ -0,0 +1,20 @@
|
|||
from five import grok
|
||||
|
||||
from zope.schema.vocabulary import SimpleVocabulary
|
||||
from zope.schema.interfaces import IVocabularyFactory
|
||||
|
||||
from . import _
|
||||
|
||||
|
||||
class SendingTypes(grok.GlobalUtility):
|
||||
grok.name("SendingTypes")
|
||||
grok.implements(IVocabularyFactory)
|
||||
|
||||
def __call__(self, context):
|
||||
terms = []
|
||||
types = [('normal', _("Normal")),
|
||||
('registered', _("Registered"))]
|
||||
for (token, value) in types:
|
||||
term = SimpleVocabulary.createTerm(token, token, value)
|
||||
terms.append(term)
|
||||
return SimpleVocabulary(terms)
|
Reference in New Issue