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))
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))
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))
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_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 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.')
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.
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
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
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())
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
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()
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
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)
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'
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'
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]))
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)
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
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
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
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
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: 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
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
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)
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 ()
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
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)
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
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
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
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)
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)
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