def setUp(self):
        self.portal = self.layer['portal']
        self.request = self.layer['request']

        # TYPE 1
        type1_fti = DexterityFTI('type1')
        type1_fti.klass = 'plone.dexterity.content.Container'
        type1_fti.filter_content_types = True
        type1_fti.allowed_content_types = []
        type1_fti.behaviors = ('plone.app.dexterity.behaviors.metadata.IBasic')
        self.portal.portal_types._setObject('type1', type1_fti)
        self.type1_fti = type1_fti

        # TYPE 2
        type2_fti = DexterityFTI('type1')
        type2_fti.klass = 'plone.dexterity.content.Item'
        type2_fti.filter_content_types = True
        type2_fti.allowed_content_types = []
        type2_fti.behaviors = ('plone.app.dexterity.behaviors.metadata.IBasic')
        self.portal.portal_types._setObject('type2', type2_fti)
        self.type2_fti = type2_fti

        login(self.portal, TEST_USER_NAME)
        setRoles(self.portal, TEST_USER_ID, ['Manager'])

        self.portal.invokeFactory('type1', id='it1', title='Item 1')
        self.portal.invokeFactory('type2', id='it2', title='Item 2')
    def setUp(self):
        self.portal = self.layer['portal']
        self.request = self.layer['request']

        # TYPE 1
        type1_fti = DexterityFTI('type1')
        type1_fti.klass = 'plone.dexterity.content.Container'
        type1_fti.filter_content_types = True
        type1_fti.allowed_content_types = []
        type1_fti.behaviors = (
            'plone.app.dexterity.behaviors.metadata.IBasic',
        )
        self.portal.portal_types._setObject('type1', type1_fti)
        self.type1_fti = type1_fti

        # TYPE 2
        type2_fti = DexterityFTI('type1')
        type2_fti.klass = 'plone.dexterity.content.Item'
        type2_fti.filter_content_types = True
        type2_fti.allowed_content_types = []
        type2_fti.behaviors = (
            'plone.app.dexterity.behaviors.metadata.IBasic',
        )
        self.portal.portal_types._setObject('type2', type2_fti)
        self.type2_fti = type2_fti

        login(self.portal, TEST_USER_NAME)
        setRoles(self.portal, TEST_USER_ID, ['Manager'])

        self.portal.invokeFactory('type1', id='it1', title='Item 1')
        self.portal.invokeFactory('type2', id='it2', title='Item 2')
def add_item_type(portal):
    fti = DexterityFTI('item')
    portal.portal_types._setObject('item', fti)
    fti.klass = 'plone.dexterity.content.Item'
    fti.filter_content_types = False
    fti.behaviors = ('plone.app.dexterity.behaviors.metadata.IBasic')
    return fti
def add_item_type(portal):
    fti = DexterityFTI('item')
    portal.portal_types._setObject('item', fti)
    fti.klass = 'plone.dexterity.content.Item'
    fti.filter_content_types = False
    fti.behaviors = (
        'plone.app.dexterity.behaviors.metadata.IBasic')
    return fti
Beispiel #5
0
def add_mock_fti(portal):
    # Fake DX Type
    fti = DexterityFTI('dx_mock')
    portal.portal_types._setObject('dx_mock', fti)
    fti.klass = 'plone.dexterity.content.Item'
    fti.schema = 'plone.app.widgets.tests.test_dx.IMockSchema'
    fti.filter_content_types = False
    fti.behaviors = ('plone.app.dexterity.behaviors.metadata.IBasic',)
Beispiel #6
0
def add_mock_fti(portal):
    # Fake DX Type
    fti = DexterityFTI('dx_mock')
    portal.portal_types._setObject('dx_mock', fti)
    fti.klass = 'plone.dexterity.content.Item'
    fti.schema = 'plone.app.dexterity.tests.test_permissions.IMockSchema'
    fti.filter_content_types = False
    fti.behaviors = ('plone.app.dexterity.behaviors.metadata.IBasic',)
Beispiel #7
0
 def _setup_test_content_type(self, name):
     from plone.dexterity.fti import DexterityFTI
     fti = DexterityFTI(name)
     fti.behaviors = ('plone.app.dexterity.behaviors.metadata.IDublinCore',
                      'adhocracy.plone.behavior.IAdhocracyStaticPagesRoot')
     fti.klass = 'plone.dexterity.content.Container'
     fti.filter_content_types = False
     self.portal.portal_types._setObject(name, fti)
     fti.lookupSchema()
def add_folder_type(portal):
    fti = DexterityFTI('folder')
    portal.portal_types._setObject('folder', fti)
    fti.klass = 'plone.dexterity.content.Container'
    fti.filter_content_types = False
    fti.behaviors = ('Products.CMFPlone.interfaces.constrains.'
                     'ISelectableConstrainTypes',
                     'plone.app.dexterity.behaviors.metadata.IBasic')
    return fti
Beispiel #9
0
def add_folder_type(portal):
    fti = DexterityFTI('folder')
    portal.portal_types._setObject('folder', fti)
    fti.klass = 'plone.dexterity.content.Container'
    fti.filter_content_types = False
    fti.behaviors = (
        'plone.app.dexterity.behaviors.metadata.IBasic',
        'brasil.gov.vcge.dx.behaviors.IVCGE')
    return fti
def add_folder_type(portal):
    fti = DexterityFTI('folder')
    portal.portal_types._setObject('folder', fti)
    fti.klass = 'plone.dexterity.content.Container'
    fti.filter_content_types = False
    fti.behaviors = (
        'Products.CMFPlone.interfaces.constrains.'
        'ISelectableConstrainTypes',
        'plone.app.dexterity.behaviors.metadata.IBasic')
    return fti
def add_folder_type(portal):
    from plone.dexterity.fti import DexterityFTI

    fti = DexterityFTI(DEXTERITY_FTI_FOLDER)
    portal.portal_types._setObject(DEXTERITY_FTI_FOLDER, fti)
    fti.klass = 'plone.dexterity.content.Container'
    fti.filter_content_types = False
    fti.behaviors = ('plone.app.dexterity.behaviors.metadata.IBasic',
                     'brasil.gov.vcge.dx.behaviors.IVCGE')
    return fti
Beispiel #12
0
def add_folder_type(portal):
    from plone.dexterity.fti import DexterityFTI

    fti = DexterityFTI(DEXTERITY_FTI_FOLDER)
    portal.portal_types._setObject(DEXTERITY_FTI_FOLDER, fti)
    fti.klass = 'plone.dexterity.content.Container'
    fti.filter_content_types = False
    fti.behaviors = (
        'plone.app.dexterity.behaviors.metadata.IBasic',
        'brasil.gov.vcge.dx.behaviors.IVCGE')
    return fti
 def _add_folder_type(self, portal):
     # Register a dexterity folder type.
     fti = DexterityFTI('Folder')
     portal.portal_types._delObject('Folder')
     portal.portal_types._setObject('Folder', fti)
     fti.klass = 'plone.dexterity.content.Container'
     fti.filter_content_types = False
     fti.behaviors = (
         'Products.CMFPlone.interfaces.constrains.'
         'ISelectableConstrainTypes',
         'plone.app.dexterity.behaviors.metadata.IBasic',
         'plone.app.content.interfaces.INameFromTitle')
     return fti
    def setUp(self):
        self.portal = self.layer['portal']
        self.request = self.layer['request']

        # TYPE 1
        type1_fti = DexterityFTI('type1')
        type1_fti.klass = 'plone.dexterity.content.Container'
        type1_fti.filter_content_types = True
        type1_fti.allowed_content_types = ['type1']
        type1_fti.behaviors = (
            'Products.CMFPlone.interfaces.constrains.ISelectableConstrainTypes',  # noqa
            'plone.app.dexterity.behaviors.metadata.IBasic')
        self.portal.portal_types._setObject('type1', type1_fti)
        self.type1_fti = type1_fti

        login(self.portal, TEST_USER_NAME)
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
    def setUp(self):
        self.portal = self.layer['portal']
        self.request = self.layer['request']

        # TYPE 1
        type1_fti = DexterityFTI('type1')
        type1_fti.klass = 'plone.dexterity.content.Container'
        type1_fti.filter_content_types = True
        type1_fti.allowed_content_types = ['type1']
        type1_fti.behaviors = (
            'Products.CMFPlone.interfaces.constrains.ISelectableConstrainTypes',  # noqa
            'plone.app.dexterity.behaviors.metadata.IBasic'
        )
        self.portal.portal_types._setObject('type1', type1_fti)
        self.type1_fti = type1_fti

        login(self.portal, TEST_USER_NAME)
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
Beispiel #16
0
    def setUpPloneSite(self, portal):
        self.applyProfile(portal, 'plone.app.dexterity:default')
        self.applyProfile(portal, 'plone.app.drafts:default')

        if 'Folder' not in portal.portal_types.objectIds():
            fti = DexterityFTI('Folder')
            fti.behaviors = (
                'plone.app.dexterity.behaviors.metadata.IDublinCore', )
            fti.klass = 'plone.dexterity.content.Container'
            fti.filter_content_types = False
            fti.global_allow = True
            portal.portal_types._setObject('Folder', fti)

        fti = DexterityFTI('MyDocument')
        fti.behaviors = (
            'plone.app.dexterity.behaviors.metadata.IDublinCore',
            'plone.app.drafts.interfaces.IDraftable',
        )
        fti.global_allow = True
        portal.portal_types._setObject('MyDocument', fti)
Beispiel #17
0
    def setUpPloneSite(self, portal):
        self.applyProfile(portal, 'plone.app.dexterity:default')
        self.applyProfile(portal, 'plone.app.drafts:default')

        if 'Folder' not in portal.portal_types.objectIds():
            fti = DexterityFTI('Folder')
            fti.behaviors = (
                'plone.app.dexterity.behaviors.metadata.IDublinCore',
            )
            fti.klass = 'plone.dexterity.content.Container'
            fti.filter_content_types = False
            fti.global_allow = True
            portal.portal_types._setObject('Folder', fti)

        fti = DexterityFTI('MyDocument')
        fti.behaviors = (
            'plone.app.dexterity.behaviors.metadata.IDublinCore',
            'plone.app.drafts.interfaces.IDraftable'
        )
        fti.global_allow = True
        portal.portal_types._setObject('MyDocument', fti)
 def _setupFTI(self):
     fti = DexterityFTI(self._portal_type)
     self.portal.portal_types._setObject(self._portal_type, fti)
     fti.klass = 'plone.dexterity.content.Container'
     fti.filter_content_types = False
     fti.behaviors = self._behaviors
Beispiel #19
0
def create1_0EventType(portal):
    """Recreate the old event type used in the 1.0 branch"""
    fti = DexterityFTI('Event')
    fti.title = 'Event'
    fti.description = 'Events can be shown in calendars.'
    fti.factory = 'Event'
    fti.add_view_expr = 'string:${folder_url}/++add++Event'
    fti.link_target = ''
    fti.link_target = ''
    fti.immediate_view = 'view'
    fti.global_allow = True
    fti.filter_content_types = True
    fti.allowed_content_types = []
    fti.allow_discussion = False
    fti.default_view = 'event_view'
    fti.view_methods = ('event_view', )
    fti.default_view_fallback = False
    fti.add_permission = 'plone.app.contenttypes.addEvent'
    fti.klass = 'plone.app.contenttypes.tests.oldtypes.Event'
    fti.behaviors = (
        'plone.app.contenttypes.interfaces.IEvent',
        'plone.app.dexterity.behaviors.metadata.IDublinCore',
        'plone.app.content.interfaces.INameFromTitle',
        'plone.app.dexterity.behaviors.discussion.IAllowDiscussion',
        'plone.app.dexterity.behaviors.exclfromnav.IExcludeFromNavigation',
        'plone.app.relationfield.behavior.IRelatedItems',
        'plone.app.versioningbehavior.behaviors.IVersionable',
    )
    fti.schema = None
    fti.model_source = """
<model xmlns="http://namespaces.plone.org/supermodel/schema"
       xmlns:indexer="http://namespaces.plone.org/supermodel/indexer"
       xmlns:i18n="http://xml.zope.org/namespaces/i18n"
       i18n:domain="plone">
    <schema>
      <field name="location" type="zope.schema.TextLine"
             indexer:searchable="true">
        <description />
        <required>False</required>
        <title i18n:translate="label_event_location">Event Location</title>
      </field>
      <field name="start_date" type="zope.schema.Datetime">
        <description />
        <title i18n:translate="label_event_start">Event Starts</title>
      </field>
      <field name="end_date" type="zope.schema.Datetime">
        <description />
        <title i18n:translate="label_event_end">Event Ends</title>
      </field>
      <field name="text" type="plone.app.textfield.RichText"
             indexer:searchable="true">
        <description />
        <required>False</required>
        <title i18n:translate="">Text</title>
      </field>
      <field name="attendees" type="zope.schema.Text"
             indexer:searchable="true">
        <description />
        <required>False</required>
        <title i18n:translate="label_event_attendees">Attendees</title>
      </field>
      <field name="event_url" type="zope.schema.TextLine">
        <description i18n:translate="help_url">
          Web address with more info about the event. Add http:// for external
          links.
        </description>
        <required>False</required>
        <title i18n:translate="event_more_information">Event URL</title>
      </field>
      <field name="contact_name" type="zope.schema.TextLine"
             indexer:searchable="true">
        <description />
        <required>False</required>
        <title i18n:translate="label_contact_name">Contact Name</title>
      </field>
      <field name="contact_email" type="zope.schema.TextLine">
        <description />
        <required>False</required>
        <title i18n:translate="label_contact_email">Contact E-mail</title>
      </field>
      <field name="contact_phone" type="zope.schema.TextLine">
        <description />
        <required>False</required>
        <title i18n:translate="label_contact_phone">Contact Phone</title>
      </field>
    </schema>
</model>"""
    fti.model_file = None  # Was plone.app.contenttypes.schema:event.xml

    if 'Event' in portal.portal_types:
        del portal.portal_types['Event']
    portal.portal_types._setObject('Event', fti)
    return fti
    def setUp(self):
        self.app = self.layer['app']
        self.portal = self.layer['portal']
        self.request = self.layer['request']
        from plone.dexterity.fti import DexterityFTI

        ### Single behavior types

        # Make organization type providing organization behavior
        fti = DexterityFTI('organization')
        self.portal.portal_types._setObject('organization', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingOrganization',)

        # Make campaign type providing campaign behavior
        fti = DexterityFTI('campaign')
        self.portal.portal_types._setObject('campaign', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',)

        # Make fundraising_page type providing page behavior
        fti = DexterityFTI('fundraising_page')
        self.portal.portal_types._setObject('fundraising_page', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingPage',)

        # Make personal type providing personal fundraiser behavior
        fti = DexterityFTI('personal')
        self.portal.portal_types._setObject('personal', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser',)

        ### Combination behavior types

        # Make organization_campaign type providing organization and campaign behaviors
        fti = DexterityFTI('organization_campaign')
        self.portal.portal_types._setObject('organization_campaign', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingOrganization',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign')

        # Make organization_campaign_page type providing organization, campaign, and page behaviors
        fti = DexterityFTI('organization_campaign_page')
        self.portal.portal_types._setObject('organization_campaign_page', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingOrganization',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingPage')

        # Make organization_campaign_page type providing organization, campaign, and personal fundraiser behaviors
        fti = DexterityFTI('organization_campaign_personal')
        self.portal.portal_types._setObject('organization_campaign_personal', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingOrganization',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',
                         'collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser')

        # Make organization_campaign_page_personal type providing organization, campaign, page, and personal fundraiser behaviors
        fti = DexterityFTI('organization_campaign_page_personal')
        self.portal.portal_types._setObject('organization_campaign_page_personal', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingOrganization',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingPage',
                         'collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser')

        # Make organization_campaign_personal_page type providing organization, campaign, personal fundraiser, and page behaviors
        fti = DexterityFTI('organization_campaign_personal_page')
        self.portal.portal_types._setObject('organization_campaign_personal_page', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingOrganization',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',
                         'collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingPage')

        # Make campaign_page type providing campaign and page behaviors
        fti = DexterityFTI('campaign_page')
        self.portal.portal_types._setObject('campaign_page', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingPage')

        # Make campaign_personal type providing campaign and personal fundraiser behaviors
        fti = DexterityFTI('campaign_personal')
        self.portal.portal_types._setObject('campaign_personal', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',
                         'collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser')

        # Make campaign_page_personal type providing campaign, page, and personal fundraiser behaviors
        fti = DexterityFTI('campaign_page_personal')
        self.portal.portal_types._setObject('campaign_page_personal', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingPage',
                         'collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser')

        # Make campaign_personal_page type providing campaign, personal fundraiser, and page behaviors
        fti = DexterityFTI('campaign_personal_page')
        self.portal.portal_types._setObject('campaign_personal_page', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign',
                         'collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingPage')

        # Make page_personal type providing page and personal fundraiser behaviors
        fti = DexterityFTI('page_personal')
        self.portal.portal_types._setObject('page_personal', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IFundraisingPage',
                         'collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser')

        # Make personal_page type providing personal fundraiser and page behaviors
        fti = DexterityFTI('personal_page')
        self.portal.portal_types._setObject('personal_page', fti)
        fti.klass = 'plone.dexterity.content.Container'
        fti.filter_content_types = False
        fti.behaviors = ('collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser',
                         'collective.fundraising.core.behaviors.interfaces.IFundraisingPage')

        # Get Manager role
        from plone.app.testing import setRoles
        from plone.app.testing import TEST_USER_ID
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
 def _setupFTI(self):
     fti = DexterityFTI(self._portal_type)
     self.portal.portal_types._setObject(self._portal_type, fti)
     fti.klass = 'plone.dexterity.content.Container'
     fti.filter_content_types = False
     fti.behaviors = self._behaviors
Beispiel #22
0
def create1_0EventType(portal):
    """Recreate the old event type used in the 1.0 branch"""
    fti = DexterityFTI("Event")
    fti.title = "Event"
    fti.description = "Events can be shown in calendars."
    fti.factory = "Event"
    fti.add_view_expr = "string:${folder_url}/++add++Event"
    fti.link_target = ""
    fti.link_target = ""
    fti.immediate_view = "view"
    fti.global_allow = True
    fti.filter_content_types = True
    fti.allowed_content_types = []
    fti.allow_discussion = False
    fti.default_view = "event_view"
    fti.view_methods = ("event_view",)
    fti.default_view_fallback = False
    fti.add_permission = "plone.app.contenttypes.addEvent"
    fti.klass = "plone.app.contenttypes.content.Event"
    fti.behaviors = (
        "plone.app.contenttypes.interfaces.IEvent",
        "plone.app.dexterity.behaviors.metadata.IDublinCore",
        "plone.app.content.interfaces.INameFromTitle",
        "plone.app.dexterity.behaviors.discussion.IAllowDiscussion",
        "plone.app.dexterity.behaviors.exclfromnav.IExcludeFromNavigation",
        "plone.app.relationfield.behavior.IRelatedItems",
        "plone.app.versioningbehavior.behaviors.IVersionable",
    )
    fti.schema = None
    fti.model_source = """
<model xmlns="http://namespaces.plone.org/supermodel/schema"
       xmlns:indexer="http://namespaces.plone.org/supermodel/indexer"
       xmlns:i18n="http://xml.zope.org/namespaces/i18n"
       i18n:domain="plone">
    <schema>
      <field name="location" type="zope.schema.TextLine"
             indexer:searchable="true">
        <description />
        <required>False</required>
        <title i18n:translate="label_event_location">Event Location</title>
      </field>
      <field name="start_date" type="zope.schema.Datetime">
        <description />
        <title i18n:translate="label_event_start">Event Starts</title>
      </field>
      <field name="end_date" type="zope.schema.Datetime">
        <description />
        <title i18n:translate="label_event_end">Event Ends</title>
      </field>
      <field name="text" type="plone.app.textfield.RichText"
             indexer:searchable="true">
        <description />
        <required>False</required>
        <title i18n:translate="">Text</title>
      </field>
      <field name="attendees" type="zope.schema.Text"
             indexer:searchable="true">
        <description />
        <required>False</required>
        <title i18n:translate="label_event_attendees">Attendees</title>
      </field>
      <field name="event_url" type="zope.schema.TextLine">
        <description i18n:translate="help_url">
          Web address with more info about the event. Add http:// for external
          links.
        </description>
        <required>False</required>
        <title i18n:translate="event_more_information">Event URL</title>
      </field>
      <field name="contact_name" type="zope.schema.TextLine"
             indexer:searchable="true">
        <description />
        <required>False</required>
        <title i18n:translate="label_contact_name">Contact Name</title>
      </field>
      <field name="contact_email" type="zope.schema.TextLine">
        <description />
        <required>False</required>
        <title i18n:translate="label_contact_email">Contact E-mail</title>
      </field>
      <field name="contact_phone" type="zope.schema.TextLine">
        <description />
        <required>False</required>
        <title i18n:translate="label_contact_phone">Contact Phone</title>
      </field>
    </schema>
</model>"""
    fti.model_file = None  # Was plone.app.contenttypes.schema:event.xml

    if "Event" in portal.portal_types:
        del portal.portal_types["Event"]
    portal.portal_types._setObject("Event", fti)
    return fti
    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.request = self.layer["request"]
        from plone.dexterity.fti import DexterityFTI

        # Make fundraising_campaign type providing campaign and organization behavior
        fti = DexterityFTI("campaign")
        self.portal.portal_types._setObject("campaign", fti)
        fti.klass = "plone.dexterity.content.Container"
        fti.filter_content_types = False
        fti.behaviors = (
            "collective.fundraising.core.behaviors.interfaces.IFundraisingOrganization",
            "collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign",
        )

        # Make personal_page type providing the page and personal fundraiser behaviors
        fti = DexterityFTI("personal_page")
        self.portal.portal_types._setObject("personal_page", fti)
        fti.klass = "plone.dexterity.content.Container"
        fti.filter_content_types = False
        fti.behaviors = (
            "collective.fundraising.core.behaviors.interfaces.IFundraisingPage",
            "collective.fundraising.core.behaviors.interfaces.IPersonalFundraiser",
        )

        # Make fundraising_campaign type combining campaign and page behaviors
        fti = DexterityFTI("combo_page")
        self.portal.portal_types._setObject("combo_page", fti)
        fti.klass = "plone.dexterity.content.Container"
        fti.filter_content_types = False
        fti.behaviors = (
            "collective.fundraising.core.behaviors.interfaces.IFundraisingCampaign",
            "collective.fundraising.core.behaviors.interfaces.IFundraisingPage",
        )

        # Make donation type combining honorary/memorial, donor and donation behaviors
        fti = DexterityFTI("combo_donation")
        self.portal.portal_types._setObject("combo_donation", fti)
        fti.klass = "plone.dexterity.content.Container"
        fti.filter_content_types = False
        fti.behaviors = (
            "collective.fundraising.core.behaviors.interfaces.IDedication",
            "collective.fundraising.core.behaviors.interfaces.IDonor",
            "collective.fundraising.core.behaviors.interfaces.IDonation",
        )

        # Get Manager role
        from plone.app.testing import setRoles
        from plone.app.testing import TEST_USER_ID

        setRoles(self.portal, TEST_USER_ID, ["Manager"])

        # Create a single campaign
        from collective.fundraising.core.behaviors.interfaces import IFundraisingCampaign

        self.portal.invokeFactory("campaign", "test_campaign", title=u"Test Fundraising Campaign")
        self.campaign = IFundraisingCampaign(self.portal["test_campaign"])

        # Create a page inside the campaign
        from collective.fundraising.core.behaviors.interfaces import IFundraisingPage
        from collective.fundraising.core.behaviors.interfaces import IPersonalFundraiser

        self.campaign.context.invokeFactory("personal_page", "test_page", title=u"Test Personal Page")
        self.page = IFundraisingPage(self.campaign.context["test_page"])
        self.personal_fundraiser = IPersonalFundraiser(self.campaign.context["test_page"])

        # Set test campaign values
        self.campaign.goal = 1000
        self.campaign.total = 150.0

        # Set test page values
        self.page.goal = 200
        self.page.total = 50.0

        # Create a combo donation providing donor, donation, and dedication
        self.page.context.invokeFactory("combo_donation", "test_combo_donation", title=u"Test Combo Donation")

        # Get an instance of each behavior of the combo donation
        donation = self.page.context["test_combo_donation"]
        from collective.fundraising.core.behaviors.interfaces import IDonor

        self.donor = IDonor(donation)
        from collective.fundraising.core.behaviors.interfaces import IDonation

        self.donation = IDonation(donation)
        from collective.fundraising.core.behaviors.interfaces import IDedication

        self.dedication = IDedication(donation)

        # Set donor values
        self.donor.first_name = u"John"
        self.donor.last_name = u"Doe"
        self.donor.email = u"*****@*****.**"

        # Set donation values
        self.donation.amount = 10.0

        # Set dedication values
        self.dedication.dedication_type = u"memorial"
        self.dedication.first_name = u"George"
        self.dedication.last_name = u"Washington"
        self.dedication.recipient_first_name = u"John"
        self.dedication.recipient_last_name = u"Adams"