示例#1
0
    def test_migrate_constrain_types(self):
        self.grant('Manager')
        self.maxDiff = None

        folder = create(Builder('folder').titled('The Folder'))
        self.set_constraintypes_config(
            folder,
            {'mode': ENABLED,
             'locally allowed': ['Folder', 'Document', 'File'],
             'immediately addable': ['Folder', 'Document']})

        self.assertTrue(IBaseObject.providedBy(folder))
        self.assertFalse(IDexterityContent.providedBy(folder))
        self.assertDictEqual(
            {'mode': ENABLED,
             'locally allowed': {'Folder', 'Document', 'File'},
             'immediately addable': {'Folder', 'Document'}},
            self.get_constraintypes_config(folder))

        self.install_profile('plone.app.contenttypes:default')
        InplaceMigrator('Folder').migrate_object(folder)

        folder = self.portal.get('the-folder')
        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertDictEqual(
            {'mode': ENABLED,
             'locally allowed': {'Folder', 'Document', 'File'},
             'immediately addable': {'Folder', 'Document'}},
            self.get_constraintypes_config(folder))
示例#2
0
    def test_migrate_constrain_types(self):
        self.grant('Manager')
        self.maxDiff = None

        folder = create(Builder('folder').titled(u'The Folder'))
        self.set_constraintypes_config(
            folder, {
                'mode': ENABLED,
                'locally allowed': ['Folder', 'Document', 'File'],
                'immediately addable': ['Folder', 'Document']
            })

        self.assertTrue(IBaseObject.providedBy(folder))
        self.assertFalse(IDexterityContent.providedBy(folder))
        self.assertDictEqual(
            {
                'mode': ENABLED,
                'locally allowed': {'Folder', 'Document', 'File'},
                'immediately addable': {'Folder', 'Document'}
            }, self.get_constraintypes_config(folder))

        self.install_profile('plone.app.contenttypes:default')
        InplaceMigrator('Folder').migrate_object(folder)

        folder = self.portal.get('the-folder')
        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertDictEqual(
            {
                'mode': ENABLED,
                'locally allowed': {'Folder', 'Document', 'File'},
                'immediately addable': {'Folder', 'Document'}
            }, self.get_constraintypes_config(folder))
示例#3
0
    def test_migrate_archetypes_page_to_dexterity(self):
        self.grant('Manager')

        page = create(Builder('page')
                      .titled('The Page')
                      .having(text='<p>Some Text</p>')
                      .in_state('published'))

        self.assertTrue(IBaseObject.providedBy(page))
        self.assertFalse(IDexterityContent.providedBy(page))
        self.assertEqual('The Page', page.Title())
        self.assertEqual('<p>Some Text</p>', page.getText())
        self.assertEqual('published', self.review_state(page))

        self.install_profile('plone.app.contenttypes:default')
        InplaceMigrator('Document').migrate_object(page)

        page = self.portal.get('the-page')
        self.assertFalse(IBaseObject.providedBy(page))
        self.assertTrue(IDexterityContent.providedBy(page))
        self.assertEqual(('', 'plone', 'the-page'), page.getPhysicalPath())
        self.assertEqual('The Page', page.Title())
        self.assertIsInstance(page.text, RichTextValue)
        self.assertEqual('<p>Some Text</p>', page.text.output)
        self.assertEqual('published', self.review_state(page))
示例#4
0
    def test_migrate_dexterity_folder_to_dexterity(self):
        self.grant('Manager')
        self.install_profile('plone.app.contenttypes:default')

        creation_date = datetime(2015, 11, 29, 10, 45)
        modification_date = datetime(2016, 1, 2, 9, 30)
        effective_date = datetime(2016, 2, 2, 2, 30)
        expires_date = datetime(2016, 3, 3, 3, 30)

        with dx_content_builders_registered():
            with freeze(creation_date):
                folder = create(Builder('folder')
                                .titled(u'The Folder')
                                .having(description=u'The Description',
                                        exclude_from_nav=True,
                                        subjects=(u'One', u'Two'),
                                        effective=effective_date,
                                        expires=expires_date)
                                .in_state('pending'))

        with freeze(modification_date):
            folder.reindexObject()  # update modification date

        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEqual(('', 'plone', 'the-folder'), folder.getPhysicalPath())
        self.assertEqual('The Folder', folder.Title())
        self.assertEqual('The Description', folder.Description())
        self.assertEqual(True, folder.exclude_from_nav)
        self.assertEqual(('One', 'Two'), folder.Subject())
        self.assertEqual(todt(creation_date), todt(folder.created()))
        self.assertEqual(todt(modification_date), todt(folder.modified()))
        self.assertEqual(todt(effective_date), todt(folder.effective()))
        self.assertEqual(todt(expires_date), todt(folder.expires()))
        self.assertEqual('pending', self.review_state(folder))

        old_catalog_indexdata = self.get_catalog_indexdata_for(folder)

        InplaceMigrator('Folder').migrate_object(folder)

        folder = self.portal.get('the-folder')
        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEqual(('', 'plone', 'the-folder'), folder.getPhysicalPath())
        self.assertEqual('The Folder', folder.Title())
        self.assertEqual('The Description', folder.Description())
        self.assertEqual(True, folder.exclude_from_nav)
        self.assertEqual(('One', 'Two'), folder.Subject())
        self.assertEqual(todt(creation_date), todt(folder.created()))
        self.assertEqual(todt(modification_date), todt(folder.modified()))
        self.assertEqual(todt(effective_date), todt(folder.effective()))
        self.assertEqual(todt(expires_date), todt(folder.expires()))
        self.assertEqual('pending', self.review_state(folder))

        self.maxDiff = None
        self.assertDictEqual(old_catalog_indexdata,
                             self.get_catalog_indexdata_for(folder))
示例#5
0
    def test_migrate_dexterity_folder_to_dexterity(self):
        self.grant('Manager')
        self.install_profile('plone.app.contenttypes:default')

        creation_date = datetime(2015, 11, 29, 10, 45)
        modification_date = datetime(2016, 1, 2, 9, 30)
        effective_date = datetime(2016, 2, 2, 2, 30)
        expires_date = datetime(2016, 3, 3, 3, 30)

        with dx_content_builders_registered():
            with freeze(creation_date):
                folder = create(
                    Builder('folder').titled(u'The Folder').having(
                        description=u'The Description',
                        exclude_from_nav=True,
                        subjects=(u'One', u'Two'),
                        effective=effective_date,
                        expires=expires_date).in_state('pending'))

        with freeze(modification_date):
            folder.reindexObject()  # update modification date

        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEqual(('', 'plone', 'the-folder'), folder.getPhysicalPath())
        self.assertEqual('The Folder', folder.Title())
        self.assertEqual('The Description', folder.Description())
        self.assertEqual(True, folder.exclude_from_nav)
        self.assertEqual(('One', 'Two'), folder.Subject())
        self.assertEqual(todt(creation_date), todt(folder.created()))
        self.assertEqual(todt(modification_date), todt(folder.modified()))
        self.assertEqual(todt(effective_date), todt(folder.effective()))
        self.assertEqual(todt(expires_date), todt(folder.expires()))
        self.assertEqual('pending', self.review_state(folder))

        old_catalog_indexdata = self.get_catalog_indexdata_for(folder)

        InplaceMigrator('Folder').migrate_object(folder)

        folder = self.portal.get('the-folder')
        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEqual(('', 'plone', 'the-folder'), folder.getPhysicalPath())
        self.assertEqual('The Folder', folder.Title())
        self.assertEqual('The Description', folder.Description())
        self.assertEqual(True, folder.exclude_from_nav)
        self.assertEqual(('One', 'Two'), folder.Subject())
        self.assertEqual(todt(creation_date), todt(folder.created()))
        self.assertEqual(todt(modification_date), todt(folder.modified()))
        self.assertEqual(todt(effective_date), todt(folder.effective()))
        self.assertEqual(todt(expires_date), todt(folder.expires()))
        self.assertEqual('pending', self.review_state(folder))

        self.maxDiff = None
        self.assertDictEqual(old_catalog_indexdata,
                             self.get_catalog_indexdata_for(folder))
    def test_remove_interface(self):
        obj = self.create_dummy(UID=lambda: 'testing-uid')
        alsoProvides(obj, IBaseObject, IDummy1)

        self.assertTrue(IBaseObject.providedBy(obj))
        self.assertTrue(IDummy1.providedBy(obj))

        component = getAdapter(obj, IDataCollector,
                               name='interface_data_adapter')
        component.setData([dotted(IBaseObject)], {})

        self.assertTrue(IBaseObject.providedBy(obj))
        self.assertFalse(IDummy1.providedBy(obj))
    def test_remove_interface(self):
        obj = self.create_dummy(UID=lambda: 'testing-uid')
        alsoProvides(obj, IBaseObject, IDummy1)

        self.assertTrue(IBaseObject.providedBy(obj))
        self.assertTrue(IDummy1.providedBy(obj))

        component = getAdapter(obj,
                               IDataCollector,
                               name='interface_data_adapter')
        component.setData([dotted(IBaseObject)], {})

        self.assertTrue(IBaseObject.providedBy(obj))
        self.assertFalse(IDummy1.providedBy(obj))
示例#8
0
 def get_field_values(self, old_object):
     if IBaseObject.providedBy(old_object):
         return self.get_at_field_values(old_object)
     elif IDexterityContent.providedBy(old_object):
         return self.get_dx_field_values(old_object)
     else:
         raise NotImplementedError('Only AT and DX is supported.')
示例#9
0
    def dump_and_remove_references(self, old_object):
        """We can only remove the relations from the reference_catalog
        as long as we did not replace the object (clone_object()),
        because otherwise the catalog cannot lookup the object anymore.
        We need to remove references from the reference_catalog,
        because otherwise the references will stay forever.
        Usually, when having DX=>DX relations at the end, we should no
        longer have references in the (AT) reference_catalog but only
        in the zc.catalog (intid).
        """
        self.removed_field_values = {}

        if not IBaseObject.providedBy(old_object):
            return  # not AT

        for field in old_object.Schema().values():
            if not IATReferenceField.providedBy(field):
                continue

            value = field.getRaw(old_object)
            if not value:
                continue

            self.removed_field_values[field.__name__] = value
            field.set(old_object, ())  # removes references.
示例#10
0
    def canExecute(self, rule=None, req=None):
        if rule is not None or req is not None:
            msg = ('In the next releases the rule and req parameters '
                   'will not be supported anymore. '
                   'In case you want to customize this product '
                   'use the request and rule properties')
            warnings.warn(msg, DeprecationWarning)

        if req is None:
            req = self.request

        if req.environ.get('disable.auditlog', False):
            return False

        event = self.event
        obj = event.object
        event_iface = next(event.__implemented__.interfaces())

        # for archetypes we need to make sure we're getting the right moved
        # event here so we do not duplicate
        if not IObjectEditedEvent.providedBy(event):
            if rule is None:
                rule = self.rule
            if event_iface != rule.rule.event:
                return False
        # if archetypes, initialization also does move events
        if (IObjectMovedEvent.providedBy(event) and IBaseObject.providedBy(obj)
                and obj.checkCreationFlag()):
            return False

        return True
 def getATTypesWithoutFTI(self):
     """Returns a list of the id's of archetypes-types that are
        not registered in portal_types but still have instances.
     """
     results = []
     all_registered_types = [i['id'] for i in self.getATFTIs()]
     catalog = getToolByName(self.context, 'portal_catalog')
     for meta_type in catalog.uniqueValuesFor('meta_type'):
         # querying for meta_type will only return at-types
         brain = catalog(meta_type=meta_type, sort_limit=1)[0]
         try:
             obj = brain.getObject()
         except (KeyError, NotFound):
             continue
         if IDexterityContent.providedBy(obj):
             continue
         if not IBaseObject.providedBy(obj):
             # Discussion items are neither AT not DX
             continue
         typename = brain.portal_type
         if typename not in all_registered_types:
             results.append({
                 'id': typename,
                 'title': typename,
                 'removed': True
             })
     return results
示例#12
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]

            if HAS_PAM:
                if not pathkey:
                    # not enough info
                    yield item; continue

                obj = self.context.unrestrictedTraverse(str(item[pathkey]).lstrip('/'), None)

                if obj is None:
                    # path doesn't exist
                    yield item; continue

                if item.get('_translations', False):
                    lang_info = []
                    for lang in item['_translations']:
                        target_obj = self.context.unrestrictedTraverse(str('{}{}'.format(lang, item['_translations'][lang])).lstrip('/'), None)
                        if target_obj and (IBaseObject.providedBy(target_obj) or IDexterityContent.providedBy(target_obj)):
                            lang_info.append((target_obj, lang),)
                    try:
                        self.link_translations(lang_info)
                    except IndexError:
                        continue

            yield item
 def getATTypesWithoutFTI(self):
     """Returns a list of the id's of archetypes-types that are
        not registered in portal_types but still have instances.
     """
     results = []
     all_registered_types = [i['id'] for i in self.getATFTIs()]
     catalog = getToolByName(self.context, 'portal_catalog')
     for meta_type in catalog.uniqueValuesFor('meta_type'):
         # querying for meta_type will only return at-types
         brain = catalog(meta_type=meta_type, sort_limit=1)[0]
         try:
             obj = brain.getObject()
         except (KeyError, NotFound):
             continue
         if IDexterityContent.providedBy(obj):
             continue
         if not IBaseObject.providedBy(obj):
             # Discussion items are neither AT not DX
             continue
         typename = brain.portal_type
         if typename not in all_registered_types:
             results.append({'id': typename,
                             'title': typename,
                             'removed': True})
     return results
示例#14
0
    def dump_and_remove_references(self, old_object):
        """We can only remove the relations from the reference_catalog
        as long as we did not replace the object (clone_object()),
        because otherwise the catalog cannot lookup the object anymore.
        We need to remove references from the reference_catalog,
        because otherwise the references will stay forever.
        Usually, when having DX=>DX relations at the end, we should no
        longer have references in the (AT) reference_catalog but only
        in the zc.catalog (intid).
        """
        self.removed_field_values = {}

        if not IBaseObject.providedBy(old_object):
            return  # not AT

        for field in old_object.Schema().values():
            if not IATReferenceField.providedBy(field):
                continue

            value = field.getRaw(old_object)
            if not value:
                continue

            self.removed_field_values[field.__name__] = value
            field.set(old_object, ())  # removes references.
示例#15
0
    def test_migrate_ownership_no_IOwner(self):
        john = create(
            Builder('user').named('John', 'Doe').with_roles('Manager'))
        peter = create(
            Builder('user').named('Peter', 'Pan').with_roles('Manager'))

        login(self.portal, john.getId())
        folder = create(Builder('folder').titled(u'The Folder'))
        folder.changeOwnership(peter.getUser())

        self.assertTrue(IBaseObject.providedBy(folder))
        self.assertEquals('john.doe', folder.Creator())
        self.assertEquals('peter.pan', folder.getOwner().getId())

        self.grant('Manager')
        self.install_profile('plone.app.contenttypes:default')

        # The creators list behaves differently when the dublin core
        # behavior is used.
        self.portal.portal_types['Folder'].behaviors = tuple(
            name for name in self.portal.portal_types['Folder'].behaviors
            if not (name == 'plone.dublincore' or 'IDublinCore' in name
                    or name == 'plone.ownership' or 'IOwnership' in name))
        with self.login(SITE_OWNER_NAME):
            InplaceMigrator(
                'Folder',
                options=IGNORE_UNMAPPED_FIELDS).migrate_object(folder)

        folder = self.portal.get('the-folder')
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEquals('john.doe', folder.Creator())
        self.assertEquals('peter.pan', folder.getOwner().getId())
示例#16
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            workflowhistorykey = self.workflowhistorykey(*item.keys())[0]

            if not pathkey or not workflowhistorykey or \
               workflowhistorykey not in item:  # not enough info
                yield item; continue

            obj = self.context.unrestrictedTraverse(item[pathkey].lstrip('/'), None)
            if obj is None or not getattr(obj, 'workflow_history', False):
                yield item; continue

            if IBaseObject.providedBy(obj):
                item_tmp = item

                # get back datetime stamp and set the workflow history
                for workflow in item_tmp[workflowhistorykey]:
                    for k, workflow2 in enumerate(item_tmp[workflowhistorykey][workflow]):
                        if 'time' in item_tmp[workflowhistorykey][workflow][k]:
                            item_tmp[workflowhistorykey][workflow][k]['time'] = DateTime(
                                    item_tmp[workflowhistorykey][workflow][k]['time'])
                obj.workflow_history.data = item_tmp[workflowhistorykey]

                # update security
                workflows = self.wftool.getWorkflowsFor(obj)
                if workflows:
                    workflows[0].updateRoleMappingsFor(obj)

            yield item
示例#17
0
    def subsite_logo_behaviour(self):
        # Copy of ftw.subsite.viewlets.subsitelogoviewlet
        nav_root = api.portal.get_navigation_root(self.context)
        nav_root_title = nav_root.Title()
        self.navigation_root_url = nav_root.absolute_url()

        if IBaseObject.providedBy(nav_root):
            subsite_logo = nav_root.getLogo()
            subsite_logo_alt_text = nav_root_title

        else:
            subsite_logo = getattr(self.context, 'logo', None)
            subsite_logo_alt_text = getattr(self.context,
                                            'logo_alt_text',
                                            None)

        if subsite_logo and subsite_logo.data:
            # we are in a subsite
            context = self.context
            if not IContentish.providedBy(context):
                context = context.aq_parent
            scale = nav_root.restrictedTraverse('@@images')

            self.logo_tag = scale.scale('logo', scale="logo").tag(
                alt=subsite_logo_alt_text, title=None)
            self.title = nav_root_title
        else:
            # onegov default
            self.onegov_logo_behaviour()
示例#18
0
 def get_field_values(self, old_object):
     if IBaseObject.providedBy(old_object):
         return self.get_at_field_values(old_object)
     elif IDexterityContent.providedBy(old_object):
         return self.get_dx_field_values(old_object)
     else:
         raise NotImplementedError('Only AT and DX is supported.')
示例#19
0
    def subsite_logo_behaviour(self):
        # Copy of ftw.subsite.viewlets.subsitelogoviewlet
        nav_root = api.portal.get_navigation_root(self.context)
        nav_root_title = nav_root.Title()
        self.navigation_root_url = nav_root.absolute_url()

        if IBaseObject.providedBy(nav_root):
            subsite_logo = nav_root.getLogo()
            subsite_logo_alt_text = nav_root_title

        else:
            subsite_logo = getattr(self.context, 'logo', None)
            subsite_logo_alt_text = getattr(self.context, 'logo_alt_text',
                                            None)

        if subsite_logo and subsite_logo.data:
            # we are in a subsite
            context = self.context
            if not IContentish.providedBy(context):
                context = context.aq_parent
            scale = nav_root.restrictedTraverse('@@images')

            self.logo_tag = scale.scale('logo', scale="logo").tag(
                alt=subsite_logo_alt_text, title=None)
            self.title = nav_root_title
        else:
            # onegov default
            self.onegov_logo_behaviour()
示例#20
0
    def __iter__(self):
        for item in self.previous:

            if not self.condition(item):
                yield item
                continue

            file_obj = self.context.unrestrictedTraverse(
                str(item['_path']).lstrip('/'), None)

            if not file_obj and not IBaseObject.providedBy(file_obj):
                self.logger.warn("Context does not exist at %s" %
                                 item['_path'])

                yield item
                continue

            field = file_obj.Schema().get(self.schema_field)

            if not field:
                yield item
                continue

            value = item.get(self.data_field, {})

            self._update_data_field(file_obj, field, value)

            yield item
示例#21
0
    def referer(self, path=None):
        """ Extract referer from request or return self.context
        """
        default = self.context.aq_inner
        if path is None:
            path = getattr(self.request, 'HTTP_REFERER', None)

        if not path:
            return default

        portal_url = getToolByName(self.context, 'portal_url')
        path = path.replace(portal_url(), '', 1)
        site = portal_url.getPortalObject().absolute_url(1)
        if site and (not path.startswith(site)):
            path = site + path

        try:
            referer = self.context.restrictedTraverse(path)
        except Exception:
            return default

        if path == self.context.absolute_url(1):
            return default

        if IBaseObject.providedBy(referer):
            return referer

        path = '/'.join(path.split('/')[:-1])
        return self.referer(path)
示例#22
0
    def getContentType(self, object=None, field=None, fieldname=None):
        context = aq_base(object)
        if context is not None and IBaseObject.providedBy(context):
            # support Archetypes fields
            if field is not None:
                pass
            elif fieldname is not None:
                field = context.getField(fieldname) or getattr(context, fieldname, None)
            else:
                field = context.getPrimaryField()
            if field and hasattr(aq_base(field), 'getContentType'):
                return field.getContentType(context)
        elif IRichText.providedBy(field):
            # support plone.app.textfield RichTextValues

            # First try to get a stored value and check its mimetype.
            mimetype = None
            if context is not None:
                value = getattr(context, fieldname, None)
                mimetype = getattr(value, 'mimeType', None)

            # Fall back to the field's default mimetype
            if mimetype is None:
                mimetype = field.default_mime_type
            return mimetype
        elif context is not None and fieldname is not None and '.widgets.' in fieldname:
            # We don't have the field object but we can at least try
            # to get the mimetype from an attribute on the object
            fieldname = fieldname.split('.widgets.')[-1]
            field = getattr(context, fieldname, None)
            mimetype = getattr(field, 'mimeType', None)
            if mimetype is not None:
                return mimetype
        return 'text/html'
示例#23
0
    def getContentType(self, object=None, field=None, fieldname=None):
        context = aq_base(object)
        if context is not None and IBaseObject.providedBy(context):
            # support Archetypes fields
            if field is not None:
                pass
            elif fieldname is not None:
                field = context.getField(fieldname) or getattr(
                    context, fieldname, None)
            else:
                field = context.getPrimaryField()
            if field and hasattr(aq_base(field), 'getContentType'):
                return field.getContentType(context)
        elif IRichText.providedBy(field):
            # support plone.app.textfield RichTextValues

            # First try to get a stored value and check its mimetype.
            mimetype = None
            if context is not None:
                value = getattr(context, fieldname, None)
                mimetype = getattr(value, 'mimeType', None)

            # Fall back to the field's default mimetype
            if mimetype is None:
                mimetype = field.default_mime_type
            return mimetype
        elif context is not None and fieldname is not None and '.widgets.' in fieldname:
            # We don't have the field object but we can at least try
            # to get the mimetype from an attribute on the object
            fieldname = fieldname.split('.widgets.')[-1]
            field = getattr(context, fieldname, None)
            mimetype = getattr(field, 'mimeType', None)
            if mimetype is not None:
                return mimetype
        return 'text/html'
示例#24
0
    def referer(self, path=None):
        """ Extract referer from request or return self.context
        """
        default = self.context.aq_inner
        if path is None:
            path = getattr(self.request, 'HTTP_REFERER', None)

        if not path:
            return default

        portal_url = getToolByName(self.context, 'portal_url')
        path = path.replace(portal_url(), '', 1)
        site = portal_url.getPortalObject().absolute_url(1)
        if site and (not path.startswith(site)):
            path = site + path

        try:
            referer = self.context.restrictedTraverse(path)
        except Exception:
            return default

        if path == self.context.absolute_url(1):
            return default

        if IBaseObject.providedBy(referer):
            return referer

        path = '/'.join(path.split('/')[:-1])
        return self.referer(path)
示例#25
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            ownerkey = self.ownerkey(*item.keys())[0]

            if not pathkey or not ownerkey or \
               ownerkey not in item:    # not enough info
                yield item; continue

            obj = self.context.unrestrictedTraverse(item[pathkey].lstrip('/'), None)
            if obj is None:             # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):

                if item[ownerkey][0] and item[ownerkey][1]:
                    try:
                        obj.changeOwnership(self.memtool.getMemberById(item[ownerkey][1]))
                    except Exception, e:
                        raise Exception('ERROR: %s SETTING OWNERSHIP TO %s' % (str(e), item[pathkey]))

                    try:
                        obj.manage_setLocalRoles(item[ownerkey][1], ['Owner'])
                    except Exception, e:
                        raise Exception('ERROR: %s SETTING OWNERSHIP2 TO %s' % (str(e), item[pathkey]))

                elif not item[ownerkey][0] and item[ownerkey][1]:
                    try:
                        obj._owner = item[ownerkey][1]
                    except Exception, e:
                        raise Exception('ERROR: %s SETTING __OWNERSHIP TO %s' % (str(e), item[pathkey]))
示例#26
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            fileskey = self.fileskey(*item.keys())[0]

            if not (pathkey and fileskey):
                yield item; continue
            if 'marshall' not in item[fileskey]:
                yield item; continue

            path = item[pathkey]
            obj = self.context.unrestrictedTraverse(str(path), None)
            if obj is None:         # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):
                try:
                    data = item[fileskey]['marshall']['data']
                    try:
                        self.atxml.demarshall(obj, data)
                    except SyntaxError:
                        yield item; continue

                    # When we change workflow state of content through Plone interface,
                    # effective date field will be updated to current date (the same
                    # as modification date) if it was empty, so after demarshalling
                    # (workflow history was updated) we need to do it manually.
                    effective_field = obj.getField('effectiveDate')
                    if effective_field is not None and effective_field.getAccessor(obj)() is None:
                        date = obj.getField('modification_date').getAccessor(obj)()
                        effective_field.getMutator(obj)(date)

                    # we don't want to call reindexObject because modification_date
                    # will be updated, so we call only indexObject (reindexObject does
                    # some things with uid catalog too)
                    is_new_object = obj.checkCreationFlag()
                    obj.indexObject()
                    # firing of events
                    obj.unmarkCreationFlag()
                    if is_new_object:
                        event.notify(ObjectInitializedEvent(obj))
                        obj.at_post_create_script()
                    else:
                        event.notify(ObjectEditedEvent(obj))
                        obj.at_post_edit_script()
                except ConflictError:
                    raise
                except Exception:
                    print 'Exception in demarshaller section:'
                    print '-'*60
                    traceback.print_exc()
                    print '-'*60

            yield item

        # updating security settings on demarshalled content
        wtool = utils.getToolByName(self.context, 'portal_workflow')
        wtool.updateRoleMappings()
        catalog = utils.getToolByName(self.context, 'portal_catalog')
        catalog.reindexIndex('allowedRolesAndUsers', None)
示例#27
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            propertieskey = self.propertieskey(*item.keys())[0]

            if not pathkey or not propertieskey or \
               propertieskey not in item:   # not enough info
                yield item; continue

            obj = self.context.unrestrictedTraverse(item[pathkey].lstrip('/'), None)
            if obj is None:                 # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):
                if getattr(aq_base(obj), '_delProperty', False):
                    for prop in item[propertieskey]:
                        if getattr(aq_base(obj), prop[0], None) is not None:
                            # if object have a attribute equal to property, do nothing
                            continue
                        try:
                            if obj.hasProperty(prop[0]):
                                obj._updateProperty(prop[0], prop[1])
                            else:
                                obj._setProperty(prop[0], prop[1], prop[2])
                        except ConflictError:
                            raise
                        except Exception, e:
                            raise Exception('Failed to set property %s type %s to %s at object %s. ERROR: %s' % \
                                                        (prop[0], prop[1], prop[2], str(obj), str(e)))

            yield item
    def __call__(self):
        data = []
        for x in self._getItemsRecursive(self.context):
            for k, v in x.items():
                # converto gli oggetti tipo
                # image e file in semplici url
                # e le date in formato ISO
                if v and k in config.FILE_FIELDNAMES:
                    x[k] = urlparse(v.absolute_url()).path
                    x[k + '.mimetype'] = v.getContentType()
                    x[k + '.filename'] = v.getFilename()
                if isinstance(v, DateTime):
                    x[k] = v.ISO()

                if isinstance(v, list):
                    vals = []
                    for i in v:
                        if IBaseObject.providedBy(i):
                            vals.append(urlparse(i.absolute_url()).path)
                            continue
                        vals.append(i)
                    x[k] = vals

            data.append(x)
        n_items = len(data)
        exit_mess = 'exportati %d oggetti' % n_items
        fh = open(config.CONTENTS_FILE, 'w')
        try:
            json.dump(data, fh, indent = 2)
        except:
            exit_mess = 'errore nella serializzazione json'
        fh.close()
        return exit_mess
示例#29
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]

            if not pathkey:
                yield item; continue

            path = item[pathkey]
            obj = self.context.unrestrictedTraverse(path, None)
            if obj is None:         # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):
                # get list of excluded fields given in options and in item
                excludekey = self.excludekey(*item.keys())[0]
                atns_exclude = tuple(self.exclude)
                if excludekey:
                    atns_exclude = tuple(set(item[excludekey]) | set(atns_exclude))

                try:
                    content_type, length, data = self.atxml.marshall(obj, atns_exclude=atns_exclude)
                except ConflictError:
                    raise
                except:
                    data = None

                if data or data is None:
                    # None value has special meaning for IExportDataCorrector adapter for topic criterias
                    files = item.setdefault(self.fileskey, {})
                    item[self.fileskey]['marshall'] = {
                        'name': '.marshall.xml',
                        'data': data,
                    }

            yield item
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]

            if not pathkey:         # not enough info
                yield item; continue

            path = item[pathkey]

            obj = self.context.unrestrictedTraverse(str(path).lstrip('/'), None)
            if obj is None:         # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):
                changed = False
                is_new_object = obj.checkCreationFlag()
                for k,v in item.iteritems():
                    if k.startswith('_'):
                        continue
                    field = obj.getField(k)
                    if field is None:
                        continue
                    if not _compare(get(field, obj), v):
                        set(field, obj, v)
                        changed = True
                obj.unmarkCreationFlag()

                if is_new_object:
                    event.notify(ObjectInitializedEvent(obj))
                    obj.at_post_create_script()
                elif changed:
                    event.notify(ObjectEditedEvent(obj))
                    obj.at_post_edit_script()

            yield item
示例#31
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            ownerkey = self.ownerkey(*item.keys())[0]

            if not pathkey or not ownerkey or \
               ownerkey not in item:    # not enough info
                yield item; continue

            if item[ownerkey] is None or len(item[ownerkey]) != 2:
                #owner is None or something else went wrong
                yield item; continue

            obj = self.context.unrestrictedTraverse(
                    item[pathkey].lstrip('/'), None)
            if obj is None:             # path doesn't exist
                yield item; continue

            if not (IBaseObject.providedBy(obj) or (DEXTERITY_INSTALLED and form.Schema.providedBy(obj))):
                yield item; continue

            if item[ownerkey][0] and item[ownerkey][1]:
                try:
                    obj.changeOwnership(
                            self.memtool.getMemberById(item[ownerkey][1]))
                    logging.getLogger("jsonmigrator.owner").info("Changed ownership to: " + item[ownerkey][1])
                except Exception, e:
                    raise Exception('ERROR: %s SETTING OWNERSHIP TO %s' % \
                            (str(e), item[pathkey]))

                try:
                    obj.manage_setLocalRoles(item[ownerkey][1], ['Owner'])
                except Exception, e:
                    raise Exception('ERROR: %s SETTING OWNERSHIP2 TO %s' % \
                            (str(e), item[pathkey]))
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            workflowhistorykey = self.workflowhistorykey(*item.keys())[0]

            if not pathkey or not workflowhistorykey or \
               workflowhistorykey not in item:  # not enough info
                yield item
                continue

            # traverse() available in version 1.5+ of collective.transmogrifier
            obj = traverse(self.context, item[pathkey].lstrip('/'), None)
            if obj is None or not getattr(obj, 'workflow_history', False):
                yield item
                continue

            if (IBaseObject.providedBy(obj) or 
                (dexterity_available and IDexterityContent.providedBy(obj))):
                item_tmp = item

                # get back datetime stamp and set the workflow history
                for workflow in item_tmp[workflowhistorykey]:
                    for k, workflow2 in enumerate(item_tmp[workflowhistorykey][workflow]):  # noqa
                        if 'time' in item_tmp[workflowhistorykey][workflow][k]:
                            item_tmp[workflowhistorykey][workflow][k]['time'] = DateTime(  # noqa
                                item_tmp[workflowhistorykey][workflow][k]['time'])  # noqa
                obj.workflow_history.data = item_tmp[workflowhistorykey]

                # update security
                workflows = self.wftool.getWorkflowsFor(obj)
                if workflows:
                    workflows[0].updateRoleMappingsFor(obj)

            yield item
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]

            if not pathkey:                     # not enough info
                yield item; continue

            obj = self.context.unrestrictedTraverse(item[pathkey].lstrip('/'), None)
            if obj is None:                     # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):
                for key in item.keys():
                    if not key.startswith(self.datafield_prefix):
                        continue
                    if not os.path.exists(item[key]):
                        continue

                    fieldname = key[len(self.datafield_prefix):]
                    field = obj.getField(fieldname)
                    f = open(item[key])
                    value = f.read()
                    f.close()
                    if len(value) != len(field.get(obj)):
                        field.set(obj, value)

            yield item
示例#34
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]

            if not pathkey:                     # not enough info
                yield item; continue

            obj = self.context.unrestrictedTraverse(item[pathkey].lstrip('/'), None)
            if obj is None:                     # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):
                for key in item.keys():
                    if not key.startswith(self.datafield_prefix):
                        continue
                    if not os.path.exists(item[key]):
                        continue

                    fieldname = key[len(self.datafield_prefix):]
                    field = obj.getField(fieldname)
                    f = open(item[key])
                    value = f.read()
                    f.close()
                    if len(value) != len(field.get(obj)):
                        field.set(obj, value)

            yield item
示例#35
0
def setupGenericImage(site):
    """ Add generic image within portal_depiction if it doesn't exists
    """
    tool = queryUtility(IDepictionTool, context=site)
    tool = tool.__of__(site)

    if 'generic' in tool.objectIds():
        return

    img = site.restrictedTraverse(
        '++resource++eea.depiction.images/generic.jpg')
    data = img.GET()

    # needed for tests
    storage = queryUtility(IStorage, name="__builtin__.str")

    if storage is None:
        from plone.namedfile.storages import StringStorable
        provideUtility(StringStorable(), IStorage, name="__builtin__.str")

    image = NamedBlobImage(data=data, contentType="image/jpeg",
                           filename=u"generic.jpg")

    id = tool.invokeFactory('Image', id='generic', title='Generic')
    obj = tool._getOb(id)

    if IBaseObject.providedBy(obj):
        obj.edit(image=image)
    else:
        obj.image = image
def find_content_with_wrong_language(content):
    """log non-default content with different languages than their parents
    Used to make sure we cleaned up everything.
    In part stolen and adapted from
    plone.app.multilingual.browser.migrator.moveContentToProperRLF.findContent
    """
    # only handle portal content
    from plone.dexterity.interfaces import IDexterityContent
    from Products.Archetypes.interfaces import IBaseObject
    from Acquisition import aq_base
    from Acquisition import aq_parent
    try:
        from Products.LinguaPlone.interfaces import ITranslatable
    except ImportError:
        from plone.app.multilingual.interfaces import ITranslatable

    if not IDexterityContent.providedBy(content)\
            and not IBaseObject.providedBy(content)\
            and not IPloneSiteRoot.providedBy(content):
        return
    if hasattr(aq_base(content), 'objectIds'):
        for id in content.objectIds():
            find_content_with_wrong_language(getattr(content, id))
    if ITranslatable.providedBy(content):
        # The content parent has the same language?
        if not IPloneSiteRoot.providedBy(aq_parent(content)) \
           and aq_parent(content).Language() != content.Language():
            log.info('Obj %s (%s) not same language as parent (%s)' %
                     (content.absolute_url_path(), content.Language(),
                      aq_parent(content).Language()))  # noqa: E501
示例#37
0
    def update(self):
        catalog = getToolByName(self.context, 'portal_catalog')
        count = 0
        query = {}
        if HAS_MULTILINGUAL and 'Language' in catalog.indexes():
            query['Language'] = 'all'

        for brain in catalog(query):
            try:
                obj = brain.getObject()
            except (AttributeError, NotFound, KeyError):
                msg = "Catalog inconsistency: {} not found!"
                logger.error(msg.format(brain.getPath()), exc_info=1)
                continue
            method = None
            if IBaseObject.providedBy(obj):
                method = modifiedArchetype
            elif IDexterityContent.providedBy(obj):
                method = modifiedDexterity
            if method:
                try:
                    method(obj, 'dummy event parameter')
                    count += 1
                except Exception:
                    msg = "Error updating linkintegrity-info for {}."
                    logger.error(msg.format(obj.absolute_url()), exc_info=1)
        return count
示例#38
0
    def __iter__(self):
        for item in self.previous:

            if not self.condition(item):
                yield item
                continue

            file_obj = self.context.unrestrictedTraverse(
                            str(item['_path']).lstrip('/'), None)

            if not file_obj and not IBaseObject.providedBy(file_obj):
                self.logger.warn(
                    "Context does not exist at %s" % item['_path'])

                yield item
                continue

            field = file_obj.Schema().get(self.schema_field)

            if not field:
                yield item
                continue

            value = item.get(self.data_field, {})

            self._update_data_field(file_obj, field, value)

            yield item
示例#39
0
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]

            if HAS_PAM:
                if not pathkey:
                    # not enough info
                    yield item; continue

                obj = self.context.unrestrictedTraverse(str(item[pathkey]).lstrip('/'), None)

                if obj is None:
                    # path doesn't exist
                    yield item; continue

                if item.get('_translations', False):
                    lang_info = []
                    for lang in item['_translations']:
                        target_obj = self.context.unrestrictedTraverse(str('{}{}'.format(lang, item['_translations'][lang])).lstrip('/'), None)
                        if target_obj and (IBaseObject.providedBy(target_obj) or IDexterityContent.providedBy(target_obj)):
                            lang_info.append((target_obj, lang),)
                    try:
                        self.link_translations(lang_info)
                    except IndexError:
                        continue

            yield item
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            propertieskey = self.propertieskey(*item.keys())[0]

            if not pathkey or not propertieskey or \
               propertieskey not in item:   # not enough info
                yield item; continue

            obj = self.context.unrestrictedTraverse(item[pathkey].lstrip('/'), None)
            if obj is None:                 # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):
                if getattr(aq_base(obj), '_delProperty', False):
                    for prop in item[propertieskey]:
                        if getattr(aq_base(obj), prop[0], None) is not None:
                            # if object have a attribute equal to property, do nothing
                            continue
                        try:
                            if obj.hasProperty(prop[0]):
                                obj._updateProperty(prop[0], prop[1])
                            else:
                                obj._setProperty(prop[0], prop[1], prop[2])
                        except ConflictError:
                            raise
                        except Exception, e:
                            raise Exception('Failed to set property %s type %s to %s at object %s. ERROR: %s' % \
                                                        (prop[0], prop[1], prop[2], str(obj), str(e)))

            yield item
示例#41
0
    def update(self):
        catalog = getToolByName(self.context, 'portal_catalog')
        count = 0
        query = {}
        if HAS_MULTILINGUAL and 'Language' in catalog.indexes():
            query['Language'] = 'all'

        for brain in catalog(query):
            try:
                obj = brain.getObject()
            except (AttributeError, NotFound, KeyError):
                msg = "Catalog inconsistency: {} not found!"
                logger.error(msg.format(brain.getPath()), exc_info=1)
                continue
            method = None
            if IBaseObject.providedBy(obj):
                method = modifiedArchetype
            elif IDexterityContent.providedBy(obj):
                method = modifiedDexterity
            if method:
                try:
                    method(obj, 'dummy event parameter')
                    count += 1
                except Exception:
                    msg = "Error updating linkintegrity-info for {}."
                    logger.error(msg.format(obj.absolute_url()), exc_info=1)
        return count
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            ownerkey = self.ownerkey(*item.keys())[0]

            if not pathkey or not ownerkey or \
               ownerkey not in item:    # not enough info
                yield item; continue

            obj = self.context.unrestrictedTraverse(item[pathkey].lstrip('/'), None)
            if obj is None:             # path doesn't exist
                yield item; continue

            if IBaseObject.providedBy(obj):

                if item[ownerkey][0] and item[ownerkey][1]:
                    try:
                        obj.changeOwnership(self.memtool.getMemberById(item[ownerkey][1]))
                    except Exception, e:
                        raise Exception('ERROR: %s SETTING OWNERSHIP TO %s' % (str(e), item[pathkey]))

                    try:
                        obj.manage_setLocalRoles(item[ownerkey][1], ['Owner'])
                    except Exception, e:
                        raise Exception('ERROR: %s SETTING OWNERSHIP2 TO %s' % (str(e), item[pathkey]))

                elif not item[ownerkey][0] and item[ownerkey][1]:
                    try:
                        obj._owner = item[ownerkey][1]
                    except Exception, e:
                        raise Exception('ERROR: %s SETTING __OWNERSHIP TO %s' % (str(e), item[pathkey]))
示例#43
0
    def get_archetypes_fields(self):
        """ If Archetypes is used then dump schema
        """

        try:
            from Products.Archetypes.interfaces import IBaseObject
            if not IBaseObject.providedBy(self.context):
                return
        except:
            return

        import base64
        #fields = self.context.schema.fields()
        ## Getting fields like this, additionally picks up 'image' in ATBlobs
        fields = self.context.Schema().fields() 
        for field in fields:
            fieldname = unicode(field.__name__)
            type_ = field.__class__.__name__

            if type_ in ['StringField', 'BooleanField', 'LinesField',
                    'IntegerField', 'TextField', 'SimpleDataGridField',
                    'FloatField', 'FixedPointField', 'TALESString',
                    'TALESLines', 'ZPTField', 'DataGridField', 'EmailField']:

                try:
                    value = field.getRaw(self.context)
                except AttributeError:
                    value = field.get(self.context)

                if callable(value) is True:
                    value = value()

                if value and type_ in ['StringField', 'TextField']:
                    try:
                        value = self.decode(value)
                    except AttributeError:
                        # maybe an int?
                        value = unicode(value)
                    except Exception, e:
                        raise Exception('problems with %s: %s' %
                                (self.context.absolute_url(), str(e)))
                elif value and type_ == 'DataGridField':
                     for i, row in enumerate(value):
                         for col_key in row.keys():
                             col_value = row[col_key]
                             if type(col_value) in (unicode, str):
                                 value[i][col_key] = self.decode(col_value)

                try:
                    ct = field.getContentType(self.context)
                except AttributeError:
                    ct = ''
                self[unicode(fieldname)] = value
                self[unicode('_content_type_')+fieldname] = ct

            elif type_ in ['DateTimeField']:
                value = str(field.get(self.context))
                if value:
                    self[unicode(fieldname)] = value
    def __iter__(self):
        for item in self.previous:

            if not item['_type']=='PloneArticle':
                yield item
                continue

            self.pa_keys = []
            for i in self.fieldnames:
                key = self.datafield_prefix + i
                if key in item.keys():
                    self.pa_keys.append(key)

            if not self.pa_keys:
                yield item
                continue

            obj = self.context.unrestrictedTraverse(
                        item['_path'].lstrip('/'), None)

            # path doesn't exist
            if obj is None:
                yield item
                continue

            if IBaseObject.providedBy(obj):
                for key in self.pa_keys:
                    value = item[key]
                    if not value:
                        continue
                    fieldname = key[len(self.datafield_prefix):]
                    field = obj.getField(fieldname)
                    if field is None:
                        continue
                    field_value = []
                    for i in value:
                        fname = 'attached'+fieldname.title()[:-1] # say attachedImage
                        file_path = i[fname]
                        path = os.path.join(self.path,file_path)
                        if os.path.isfile(path):
                            f = open(path,'rb')
                            content = f.read()
                            f.close()
                            i[fname] = content
                            field_value.append(i)
                    field.set(obj,field_value)

            yield item


        def get_images(self, value):
            import ipdb;ipdb.set_trace()


        def get_files(self, value):
            pass

        def get_links(self, value):
            pass
 def _fixupCatalogData(self, obj):
     """ Reindex the object, otherwise the catalog will certainly
     be out of sync."""
     portal_catalog = getToolByName(self, 'portal_catalog')
     portal_catalog.indexObject(obj)
     notify(ObjectModifiedEvent(obj))
     if IBaseObject.providedBy(obj):
         notify(ObjectEditedEvent(obj))
    def _getItemsRecursive(self, item):
        if IBaseObject.providedBy(item):
            yield self._getObjectData(item)

        if isinstance(item, ObjectManager):
            for each in item.objectValues():
                for x in self._getItemsRecursive(each):
                    yield x
示例#47
0
def _get_imagepath(imgob, fieldname, scale):
    portal_path_length = len(imgob.portal_url.getPortalObject().getPhysicalPath())
    relativepath = list(imgob.getPhysicalPath()[portal_path_length:])
    if IATBaseObject.providedBy(imgob):
        relativepath += ['%s_%s' % (fieldname, scale)]
    else:
        relativepath += ['@@images/%s/%s' % (fieldname, scale)]
    return '/'.join(relativepath)
示例#48
0
def categories(obj, **kw):
    if IBaseObject.providedBy(obj):
        return obj.Schema()['content_categories'].get(obj)
    elif IDexterityContent.providedBy(obj) and HAS_CONTENT_LISTING_BEHAVIOR:
        return [item.encode('utf-8') for item in
                IContentCategories(obj).content_categories]
    else:
        return ()
示例#49
0
 def _fixupCatalogData(self, obj):
     """ Reindex the object, otherwise the catalog will certainly
     be out of sync."""
     portal_catalog = getToolByName(self, 'portal_catalog')
     portal_catalog.indexObject(obj)
     notify(ObjectModifiedEvent(obj))
     if IBaseObject.providedBy(obj):
         notify(ObjectEditedEvent(obj))
    def __iter__(self):
        for item in self.previous:

            # not enough info
            if '_path' not in item:
                logging.getLogger("jsonmigrator.datafields").info("Path not in item")
                yield item
                continue

            obj = self.context.unrestrictedTraverse(
                        item['_path'].lstrip('/'), None)

            # path doesn't exist
            if obj is None:
                logging.getLogger("jsonmigrator.datafields").info("Path doesn't exist in %s %s" %
                                                                  (self.context, item['_path']))
                yield item
                continue

            # do nothing if we got a wrong object through acquisition
            path = item['_path']
            if path.startswith('/'):
                path = path[1:]
            if '/'.join(obj.getPhysicalPath()[self.root_path_length:]) != path:
                logging.getLogger("jsonmigrator.datafields").info("Wrong object got thru acquisition \nobject: %s, \nitem path: %s" %
                                                                  ('/'.join(obj.getPhysicalPath()[self.root_path_length:]),
                                                                   path))
                yield item
                continue

            if IBaseObject.providedBy(obj):
                for key in item.keys():

                    if not key.startswith(self.datafield_prefix):
                        continue

                    fieldname = key[len(self.datafield_prefix):]
                    logging.getLogger("jsonmigrator.datafields").info("Decoding field %s" % (fieldname))
                    field = obj.getField(fieldname)
                    if field is None:
                        continue
                    value = base64.b64decode(item[key]['data'])

                    # XXX: handle other data field implementations
                    old_value = None
                    try:
                        old_value = field.get(obj).data
                    except:
                        pass
                    if old_value is None or value != old_value:
                        field.set(obj, value)
                        filename = item[key]['filename']
                        if isinstance( filename, unicode):
                            filename = filename.encode('utf-8')
                        obj.setFilename(filename)
                        obj.setContentType(item[key]['content_type'])

            yield item
示例#51
0
    def test_migrate_empty_richtextfield_to_dexterity(self):
        self.grant('Manager')

        no_text_page = create(
            Builder('page').titled(u'No Text Page').having(
                text=u'').in_state('published'))

        self.assertFalse(IDexterityContent.providedBy(no_text_page))
        self.assertTrue(IBaseObject.providedBy(no_text_page))
        self.assertEqual(u'', no_text_page.getText())

        self.install_profile('plone.app.contenttypes:default')
        InplaceMigrator('Document').migrate_object(no_text_page)

        no_text_page = self.portal.get('no-text-page')
        self.assertFalse(IBaseObject.providedBy(no_text_page))
        self.assertTrue(IDexterityContent.providedBy(no_text_page))
        self.assertNotIsInstance(no_text_page.text, RichTextValue)
示例#52
0
    def show(self):
        context = aq_inner(self.context)
        tinymce = queryUtility(ITinyMCE, context=context)

        if tinymce is None:
            return False

        if HAS_DX:
            form = self.__parent__
            if IFormWrapper.providedBy(form):
                form = form.form_instance

        # Case 1: Dexterity and z3c.form
        if HAS_DX and z3cform.IForm.providedBy(form):
            rtfields = [
                widget.field.__name__ for widget
                in form.widgets.values() if IRichTextWidget.providedBy(
                    widget)
                ]

            if not rtfields:
                return False

            prefix = (form.prefix + form.widgets.prefix).replace(
                '.', '\\\\.'
                )

        # Case 2: Archetypes
        elif HAS_AT and IBaseObject.providedBy(context):
            rtfields = self.getATRichTextFieldNames()
            prefix = ''

        # Case 3: Formlib
        elif formlib.IForm.providedBy(self.view):
            rtfields = [field.__name__ for field in self.view.form_fields
                        if field.custom_widget == WYSIWYGWidget]
            prefix = 'form\\\\.'

        # Case 4: Everything else!
        else:
            return False

        self.suffix = self.buildsuffix(rtfields, prefix)

        # Handle Archetypes factory pages.
        if not prefix:
            factory = getToolByName(context, 'portal_factory', None)
            if factory is not None and factory.isTemporary(context):
                # Always include TinyMCE on temporary pages These are
                # meant for editing and get false positives with
                # the `showEditableBorder` method.
                return True

            plone_view = getMultiAdapter((context, self.request), name="plone")
            return plone_view.showEditableBorder() and rtfields

        return rtfields
示例#53
0
    def __iter__(self):
        for item in self.previous:
            # not enough info
            if '_path' not in item:
                yield item
                continue

            obj = self.context.unrestrictedTraverse(str(item['_path'].lstrip('/')), None)

            # path doesn't exist
            if obj is None:
                yield item
                continue

            # do nothing if we got a wrong object through acquisition
            path = item['_path']
            if path.startswith('/'):
                path = path[1:]
            if '/'.join(obj.getPhysicalPath()[self.root_path_length:]) != path:
                yield item
                continue

            for key in item.keys():

                if not key.startswith(self.datafield_prefix):
                    continue

                fieldname = key[len(self.datafield_prefix):]

                if IBaseObject.providedBy(obj):

                    field = obj.getField(fieldname)
                    if field is None:
                        continue
                    if item[key].has_key('data'):
                        value = base64.b64decode(item[key]['data'])
                    else:
                        value = ''
                    # XXX: handle other data field implementations
                    old_value = field.get(obj).data
                    if value != old_value:
                        field.set(obj, value)
                        obj.setFilename(item[key]['filename'])
                        obj.setContentType(item[key]['content_type'])
                else:
                    # We have a destination DX type
                    field = None
                    for schemata in iterSchemata(obj):
                        for name, s_field in getFieldsInOrder(schemata):
                            if name == fieldname:
                                field = s_field
                                deserializer = IDeserializer(field)
                                value = deserializer(item[key], None, item)
                                field.set(field.interface(obj), value)
                    if not field:
                        print('Can\'t find a suitable destination field '.format(fieldname))
            yield item
示例#54
0
    def __iter__(self):
        for item in self.previous:

            # not enough info
            if '_path' not in item:
                yield item
                continue

            obj = self.context.unrestrictedTraverse(item['_path'].lstrip('/'),
                                                    None)

            # path doesn't exist
            if obj is None:
                yield item
                continue

            # do nothing if we got a wrong object through acquisition
            path = item['_path']
            if path.startswith('/'):
                path = path[1:]
            if '/'.join(obj.getPhysicalPath()[self.root_path_length:]) != path:
                yield item
                continue

            if IBaseObject.providedBy(obj):
                for key in item.keys():

                    if not key.startswith(self.datafield_prefix):
                        continue

                    fieldname = key[len(self.datafield_prefix):]
                    field = obj.getField(fieldname)
                    if field is None:
                        continue
                    value = base64.b64decode(item[key]['data'])

                    # XXX: handle other data field implementations

                    try:
                        old_value = field.get(obj).data
                    except AttributeError:
                        old_value = ''

                    if value != old_value:
                        field.set(obj, value)
                        try:
                            field.setFilename(obj, item[key]['filename'])
                            field.setContentType(obj,
                                                 item[key]['content_type'])
                        except:
                            obj.setFilename(item[key]['filename'])
                            obj.setContentType(item[key]['content_type'])
            yield item
示例#55
0
def referenceRemoved(obj, event):
    """ store information about the removed link integrity reference """
    assert IReference.providedBy(obj)
    assert obj is event.object  # just making sure...
    if not obj.relationship == referencedRelationship:
        return  # skip for other removed references
    # if the object the event was fired on doesn't have a `REQUEST` attribute
    # we can safely assume no direct user action was involved and therefore
    # never raise a link integrity exception...
    request = aq_get(obj, 'REQUEST', None)
    if not request:
        return
    storage = ILinkIntegrityInfo(request)
    source = obj.getSourceObject()
    if not IBaseObject.providedBy(source) and hasattr(source, 'context'):
        source = source.context
    target = obj.getTargetObject()
    if not IBaseObject.providedBy(target) and hasattr(target, 'context'):
        target = target.context
    if source is not None and target is not None:
        storage.addBreach(source, target)
示例#56
0
    def test_migrate_archetypes_file_to_dexterity(self):
        self.grant('Manager')

        thefile = create(
            Builder('file').titled(u'The File').attach_file_containing(
                '<doc>Content</doc>', name='data.xml'))

        self.assertTrue(IBaseObject.providedBy(thefile))
        self.assertFalse(IDexterityContent.providedBy(thefile))
        self.assertEqual('The File', thefile.Title())

        self.install_profile('plone.app.contenttypes:default')
        InplaceMigrator('File').migrate_object(thefile)

        thefile = self.portal.get('the-file')
        self.assertFalse(IBaseObject.providedBy(thefile))
        self.assertTrue(IDexterityContent.providedBy(thefile))
        self.assertEqual(('', 'plone', 'the-file'), thefile.getPhysicalPath())
        self.assertEqual('The File', thefile.Title())
        self.assertEqual('data.xml', thefile.file.filename)
        self.assertEqual('<doc>Content</doc>', thefile.file.data)
示例#57
0
def create(container, type_name, **kwargs):
    """A easy helper method to create some content since we do not have
       plone.api in core.
    """

    new_id = container.invokeFactory(type_name, **kwargs)
    content = container[new_id]

    # Archetypes specific code was taken from ``plone.api``
    # Switch when api has been merged into core.
    if IBaseObject.providedBy(content):
        content.processForm()

    return content
    def __iter__(self):
        for item in self.previous:
            pathkey = self.pathkey(*item.keys())[0]
            fileskey = self.fileskey(*item.keys())[0]
            contextkey = self.contextkey(*item.keys())[0]

            if not (pathkey and fileskey):
                yield item
                continue
            if 'file-fields' not in item[fileskey]:
                yield item
                continue

            path = item[pathkey]
            obj = self.context.unrestrictedTraverse(path, None)
            if obj is None:  # path doesn't exist
                yield item
                continue

            if IBaseObject.providedBy(obj):
                try:
                    manifest = item[fileskey]['file-fields']['data']
                    for field, info in self.parseManifest(manifest).items():
                        fname = info['filename']
                        ct = info['mimetype']
                        if fname in item[fileskey]:
                            data = item[fileskey][fname]['data']
                        elif contextkey:
                            data = self.context.readDataFile("%s/%s" %
                                                             (path, fname))
                            if data is None:
                                continue
                        if not self.condition(item,
                                              context=obj,
                                              fname=field,
                                              filename=fname,
                                              data=data,
                                              mimetype=ct):
                            continue
                        mutator = obj.getField(field).getMutator(obj)
                        mutator(data, filename=fname, mimetype=ct)
                except ConflictError:
                    raise
                except Exception:
                    print "Exception in fileimporter section:"
                    print '-' * 60
                    traceback.print_exc()
                    print '-' * 60

            yield item