def test_migrate_extended_document(self): from plone.app.contenttypes.migration.migration import migrateCustomAT from plone.app.contenttypes.interfaces import INewsItem at_document = self.createCustomATDocument('foo-document') qi = self.portal.portal_quickinstaller # install pac but only install News Items qi.installProduct( 'plone.app.contenttypes', profile='plone.app.contenttypes:default', blacklistedSteps=['typeinfo']) installTypeIfNeeded("News Item") fields_mapping = ( {'AT_field_name': 'textExtended', 'AT_field_type': 'Products.Archetypes.Field.TextField', 'DX_field_name': 'text', 'DX_field_type': 'RichText', }, {'AT_field_name': 'stringExtended', 'AT_field_type': 'StringField', 'DX_field_name': 'title', 'DX_field_type': 'StringField', }, ) # migrate extended AT Document to default DX News Item migrateCustomAT( fields_mapping, src_type='Document', dst_type='News Item') dx_newsitem = self.portal['foo-document'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(dx_newsitem is not at_document) self.assertEquals(at_document.textExtended(), dx_newsitem.text.raw) self.assertEquals(at_document.stringExtended, dx_newsitem.title)
def test_migration_with_custom_fieldmigrator(self): """Migrate a ATDocument to a DXNewsItem using a custom modifier""" from plone.app.contenttypes.interfaces import INewsItem from plone.app.contenttypes.migration.migration import migrateCustomAT at_document = self.createCustomATDocument('foo-document') at_text = (u'Some | field is | pipe-delimited | in the field\n') at_document.setText(at_text) qi = self.portal.portal_quickinstaller # install pac but only install News Items qi.installProduct('plone.app.contenttypes', profile='plone.app.contenttypes:default', blacklistedSteps=['typeinfo']) installTypeIfNeeded('News Item') fields_mapping = ({ 'AT_field_name': 'text', 'DX_field_name': 'creators', 'field_migrator': some_field_migrator }, ) migrateCustomAT(fields_mapping, src_type='Document', dst_type='News Item') dx_newsitem = self.portal['foo-document'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(dx_newsitem is not at_document) self.assertEqual(4, len(dx_newsitem.creators)) self.assertEqual(at_document.Title(), dx_newsitem.title)
def test_fix_interface_for_news_item(self): self.obj.portal_type = 'News Item' self.catalog.reindexObject(self.obj) self.portal.restrictedTraverse('fix_base_classes')() self.assertTrue(INewsItem.providedBy(self.obj))
def test_migrate_extended_document(self): from plone.app.contenttypes.migration.migration import migrateCustomAT from plone.app.contenttypes.interfaces import INewsItem at_document = self.createCustomATDocument('foo-document') qi = self.portal.portal_quickinstaller # install pac but only install News Items qi.installProduct('plone.app.contenttypes', profile='plone.app.contenttypes:default', blacklistedSteps=['typeinfo']) installTypeIfNeeded('News Item') fields_mapping = ( { 'AT_field_name': 'textExtended', 'AT_field_type': 'Products.Archetypes.Field.TextField', 'DX_field_name': 'text', 'DX_field_type': 'RichText', }, { 'AT_field_name': 'stringExtended', 'AT_field_type': 'StringField', 'DX_field_name': 'title', 'DX_field_type': 'StringField', }, ) # migrate extended AT Document to default DX News Item migrateCustomAT(fields_mapping, src_type='Document', dst_type='News Item') dx_newsitem = self.portal['foo-document'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(dx_newsitem is not at_document) self.assertEqual(at_document.textExtended(), dx_newsitem.text.raw) self.assertEqual(at_document.stringExtended, dx_newsitem.title)
def test_migration_with_custom_fieldmigrator(self): """Migrate a ATDocument to a DXNewsItem using a custom modifier""" from plone.app.contenttypes.interfaces import INewsItem from plone.app.contenttypes.migration.migration import migrateCustomAT at_document = self.createCustomATDocument('foo-document') at_text = ( u'Some | field is | pipe-delimited | in the field\n' ) at_document.setText(at_text) # install pac but only install News Items portal_setup = getToolByName(self.portal, 'portal_setup') portal_setup.runAllImportStepsFromProfile( 'profile-plone.app.contenttypes:default', blacklisted_steps=['typeinfo'], ) installTypeIfNeeded('News Item') fields_mapping = ( {'AT_field_name': 'text', 'DX_field_name': 'creators', 'field_migrator': some_field_migrator}, ) migrateCustomAT( fields_mapping, src_type='Document', dst_type='News Item') dx_newsitem = self.portal['foo-document'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(dx_newsitem is not at_document) self.assertEqual(4, len(dx_newsitem.creators)) self.assertEqual(at_document.Title(), dx_newsitem.title)
def test_migrate_extended_document(self): from plone.app.contenttypes.migration.migration import migrateCustomAT from plone.app.contenttypes.interfaces import INewsItem at_document = self.createCustomATDocument('foo-document') # install pac but only install News Items portal_setup = getToolByName(self.portal, 'portal_setup') portal_setup.runAllImportStepsFromProfile( 'profile-plone.app.contenttypes:default', blacklisted_steps=['typeinfo'], ) installTypeIfNeeded('News Item') fields_mapping = ( {'AT_field_name': 'textExtended', 'AT_field_type': 'Products.Archetypes.Field.TextField', 'DX_field_name': 'text', 'DX_field_type': 'RichText', }, {'AT_field_name': 'stringExtended', 'AT_field_type': 'StringField', 'DX_field_name': 'title', 'DX_field_type': 'StringField', }, ) # migrate extended AT Document to default DX News Item migrateCustomAT( fields_mapping, src_type='Document', dst_type='News Item') dx_newsitem = self.portal['foo-document'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(dx_newsitem is not at_document) self.assertEqual(at_document.textExtended(), dx_newsitem.text.raw) self.assertEqual(at_document.stringExtended, dx_newsitem.title)
def test_factory(self): fti = queryUtility( IDexterityFTI, name='News Item' ) factory = fti.factory new_object = createObject(factory) self.failUnless(INewsItem.providedBy(new_object))
def test_newsitem_is_migrated(self): from Products.ATContentTypes.content.newsitem import ATNewsItem from plone.app.contenttypes.migration.migration import NewsItemMigrator from plone.app.contenttypes.interfaces import INewsItem at_newsitem = self.createATCTobject(ATNewsItem, 'newsitem') migrator = self.get_migrator(at_newsitem, NewsItemMigrator) migrator.migrate() new_newsitem = self.portal['newsitem'] self.assertTrue(INewsItem.providedBy(new_newsitem)) self.assertTrue(at_newsitem is not new_newsitem)
def test_blob_newsitem_is_migrated(self): from plone.app.contenttypes.migration.migration import\ BlobNewsItemMigrator from plone.app.contenttypes.interfaces import INewsItem at_newsitem = self.createATCTBlobNewsItem('newsitem') applyProfile(self.portal, 'plone.app.contenttypes:default') migrator = self.get_migrator(at_newsitem, BlobNewsItemMigrator) migrator.migrate() dx_newsitem = self.portal['newsitem'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(at_newsitem is not dx_newsitem)
def test_newsitem_is_migrated(self): from plone.app.contenttypes.migration.migration import NewsItemMigrator from plone.app.contenttypes.interfaces import INewsItem self.portal.invokeFactory('News Item', 'newsitem') at_newsitem = self.portal['newsitem'] applyProfile(self.portal, 'plone.app.contenttypes:default') migrator = self.get_migrator(at_newsitem, NewsItemMigrator) migrator.migrate() dx_newsitem = self.portal['newsitem'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(at_newsitem is not dx_newsitem)
def test_adding(self): self.portal.invokeFactory( 'News Item', 'doc1' ) self.assertTrue(INewsItem.providedBy(self.portal['doc1']))
def update(self): self.context = ILeadImage(self.context) self.available = True if self.context.image else False if INewsItem.providedBy(self.context): self.available = False
def test_adding(self): self.portal.invokeFactory('News Item', 'doc1') self.assertTrue(INewsItem.providedBy(self.portal['doc1']))
def test_factory(self): fti = queryUtility(IDexterityFTI, name='News Item') factory = fti.factory new_object = createObject(factory) self.assertTrue(INewsItem.providedBy(new_object))
def test_migrate_atevent_to_dxnewsitem(self): """Tests the custom migration by migrating a default type. It is not meant to be used this way but is a nice way to test the migrations. During this migration the old event fti is still present. """ from DateTime import DateTime from plone.app.contenttypes.migration.migration import migrateCustomAT from plone.app.contenttypes.interfaces import INewsItem # create an ATEvent self.portal.invokeFactory('Event', 'event') at_event = self.portal['event'] # Date at_event.getField('startDate') \ .set(at_event, DateTime('2013-02-03 12:00')) at_event.getField('endDate') \ .set(at_event, DateTime('2013-04-05 13:00')) # Contact at_event.getField('contactPhone').set(at_event, '123456789') at_event.getField('contactEmail').set(at_event, '*****@*****.**') at_event.getField('contactName').set(at_event, u'Näme') # URL at_event.getField('eventUrl').set(at_event, 'http://www.plone.org') # Attendees at_event.getField('attendees').set(at_event, ('You', 'Me')) # Text at_event.setText('Tütensuppe') at_event.setContentType('text/plain') oldTZ = os.environ.get('TZ', None) os.environ['TZ'] = 'Asia/Tbilisi' qi = self.portal.portal_quickinstaller # install pac but only install News Items qi.installProduct('plone.app.contenttypes', profile='plone.app.contenttypes:default', blacklistedSteps=['typeinfo']) installTypeIfNeeded('News Item') fields_mapping = ( { 'AT_field_name': 'text', 'AT_field_type': 'Products.Archetypes.Field.TextField', 'DX_field_name': 'text', 'DX_field_type': 'RichText', }, { 'AT_field_name': 'contactName', 'AT_field_type': 'StringField', 'DX_field_name': 'image_caption', 'DX_field_type': 'StringField', }, ) # migrate ATCTEvent to default DX News Item migrateCustomAT(fields_mapping, src_type='Event', dst_type='News Item') if oldTZ: os.environ['TZ'] = oldTZ else: del os.environ['TZ'] dx_newsitem = self.portal['event'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(dx_newsitem is not at_event) self.assertEqual(safe_unicode(at_event.getText()), dx_newsitem.text.output) self.assertEqual(at_event.contactName, dx_newsitem.image_caption)
def data(self): context = self.context data = {} if ICollegeHomepage.providedBy(self.context): data = { '@context': 'http://schema.org', '@type': 'EducationalOrganization', 'address': { '@type': 'PostalAddress', 'addressLocality': 'University Park', 'addressRegion': 'PA', 'postalCode': '16802', 'streetAddress': 'Penn State University'}, 'logo': 'https://agsci.psu.edu/psu-agsciences-logo.png', 'name': 'Penn State College of Agricultural Sciences', 'sameAs': [ 'https://www.facebook.com/agsciences', 'https://www.twitter.com/agsciences', 'https://plus.google.com/+PennStateAgSciences', 'https://instagram.com/agsciences', 'https://www.linkedin.com/company/penn-state-college-of-agricultural-sciences', 'https://www.youtube.com/psuagsciences', 'https://en.wikipedia.org/wiki/Penn_State_College_of_Agricultural_Sciences'], 'telephone': '+1-814-865-7521', 'url': 'https://agsci.psu.edu' } elif IEvent.providedBy(context): data = { '@context': 'http://schema.org', '@type': 'Event', 'name': context.Title(), 'description' : context.Description(), 'startDate' : localize(context.start).isoformat(), 'endDate' : localize(context.end).isoformat(), 'url' : context.absolute_url(), 'location' : { "@type" : "Place", "address" : getattr(context, 'location', ''), "name" : getattr(context, 'location', ''), } } elif INewsItem.providedBy(context): data = { '@context': 'http://schema.org', '@type': 'Article', 'headline': context.Title(), 'description' : context.Description(), 'datePublished' : localize(context.effective()).isoformat(), 'url' : context.absolute_url(), } elif IPerson.providedBy(context): # Job Title job_titles = getattr(context, 'job_titles', []) if job_titles: job_title = job_titles[0] else: job_title = "" # Email email = getattr(context, 'email', '') # Name (first_name, middle_name, last_name) = [getattr(context, x, '') for x in ('first_name', 'middle_name', 'last_name')] # Address street_address = getattr(context, 'street_address', []) if street_address: street_address = [x for x in street_address if x] street_address = ', '.join(street_address) city = getattr(context, 'city', '') state = getattr(context, 'state', '') zip_code = getattr(context, 'zip_code', '') # Phone phone_number = getattr(context, 'phone_number', '') data = { '@context': 'http://schema.org', '@type': 'Person', 'url' : context.absolute_url(), 'email' : email, 'givenName' : first_name, 'additionalName' : middle_name, 'familyName' : last_name, 'telephone' : phone_number, 'jobTitle' : job_title, 'workLocation' : { '@type' : 'PostalAddress', 'addressCountry' : 'US', 'addressLocality' : city, 'addressRegion' : state, 'postalCode' : zip_code, 'streetAddress' : street_address, } } data['image'] = self.image if data: return json.dumps(data, indent=4)
def test_migrate_atevent_to_dxnewsitem(self): """Tests the custom migration by migrating a default type. It is not meant to be used this way but is a nice way to test the migrations. During this migration the old event fti is still present. """ from DateTime import DateTime from plone.app.contenttypes.migration.migration import migrateCustomAT from plone.app.contenttypes.interfaces import INewsItem # create an ATEvent self.portal.invokeFactory('Event', 'event') at_event = self.portal['event'] # Date at_event.getField('startDate') \ .set(at_event, DateTime('2013-02-03 12:00')) at_event.getField('endDate') \ .set(at_event, DateTime('2013-04-05 13:00')) # Contact at_event.getField('contactPhone').set(at_event, '123456789') at_event.getField('contactEmail').set(at_event, '*****@*****.**') at_event.getField('contactName').set(at_event, u'Näme') # URL at_event.getField('eventUrl').set(at_event, 'http://www.plone.org') # Attendees at_event.getField('attendees').set(at_event, ('You', 'Me')) # Text at_event.setText('Tütensuppe') at_event.setContentType('text/plain') oldTZ = os.environ.get('TZ', None) os.environ['TZ'] = 'Asia/Tbilisi' qi = self.portal.portal_quickinstaller # install pac but only install News Items qi.installProduct( 'plone.app.contenttypes', profile='plone.app.contenttypes:default', blacklistedSteps=['typeinfo']) installTypeIfNeeded("News Item") fields_mapping = ( {'AT_field_name': 'text', 'AT_field_type': 'Products.Archetypes.Field.TextField', 'DX_field_name': 'text', 'DX_field_type': 'RichText', }, {'AT_field_name': 'contactName', 'AT_field_type': 'StringField', 'DX_field_name': 'image_caption', 'DX_field_type': 'StringField', }, ) # migrate ATCTEvent to default DX News Item migrateCustomAT(fields_mapping, src_type='Event', dst_type='News Item') if oldTZ: os.environ['TZ'] = oldTZ else: del os.environ['TZ'] dx_newsitem = self.portal['event'] self.assertTrue(INewsItem.providedBy(dx_newsitem)) self.assertTrue(dx_newsitem is not at_event) self.assertEquals( safe_unicode(at_event.getText()), dx_newsitem.text.output) self.assertEquals( at_event.contactName, dx_newsitem.image_caption)