def set_deferred_uids(self):
        """ Set given `uid` on current context object """
        data = json.loads(self.request.BODY)
        catalog = plone.api.portal.get_tool("portal_catalog")
        intids = getUtility(IIntIds)

        for field, uid_or_uids in data.items():
            if not uid_or_uids:
                continue

            # Single RelationValue
            if not isinstance(uid_or_uids, (list, tuple)):
                brains = catalog(UID=uid_or_uids)
                if brains:
                    rv = RelationValue(intids.getId(brains[0].getObject()))
                    setattr(self.context, field, rv)
            else:
                # RelationList
                result = []
                for uid in uid_or_uids:
                    brains = catalog(UID=uid)
                    if brains:
                        rv = RelationValue(intids.getId(brains[0].getObject()))
                        result.append(rv)
                setattr(self.context, field, result)

        self.request.response.setStatus(204)
Пример #2
0
    def test_related_items_tiles(self):
        self.browser.open(self.pageURL +
                          '/@@plone.app.standardtiles.related_items')

        self.assertNotIn('relatedItems', self.browser.contents)

        root = fromstring(self.browser.contents)
        nodes = root.xpath('//body//*[@class="relatedItems"]')
        self.assertEqual(len(nodes), 0)

        self.portal.invokeFactory('Document', 'doc1', title='Document 1')
        self.portal.invokeFactory('Document', 'doc2', title='Document 2')
        int_ids = getUtility(IIntIds)
        self.page.relatedItems = [
            RelationValue(int_ids.getId(self.portal.doc1)),
            RelationValue(int_ids.getId(self.portal.doc2))
        ]

        transaction.commit()

        self.browser.open(self.pageURL +
                          '/@@plone.app.standardtiles.related_items')

        self.assertIn('relatedItems', self.browser.contents)
        self.assertIn('Document 1', self.browser.contents)
        self.assertIn('Document 2', self.browser.contents)

        root = fromstring(self.browser.contents)
        nodes = root.xpath('//body//*[@class="relatedItems"]')
        self.assertEqual(len(nodes), 1)

        nodes = root.xpath('//body//*[@class="relatedItems"]//ul/li')
        self.assertEqual(len(nodes), 2)
Пример #3
0
    def test_api_do_not_return_related_items_with_effective_date_in_future_for_anon(
        self,
    ):

        present = api.content.create(
            container=self.portal, type="Document", title="present"
        )
        future = api.content.create(
            container=self.portal, type="Document", title="future"
        )
        present.setEffectiveDate(DateTime())
        future.setEffectiveDate(DateTime() + 1)
        api.content.transition(obj=present, transition="publish")
        api.content.transition(obj=future, transition="publish")
        page = api.content.create(
            container=self.portal,
            type="Document",
            title="Page",
            relatedItems=[
                RelationValue(self.intids.getId(present)),
                RelationValue(self.intids.getId(future)),
            ],
        )
        api.content.transition(obj=page, transition="publish")
        commit()

        res = self.api_session.get(page.absolute_url()).json()

        relatedItems = res.get("relatedItems", [])
        self.assertEqual(len(relatedItems), 2)

        res_anon = self.api_session_anon.get(page.absolute_url()).json()
        self.assertEqual(len(res_anon["relatedItems"]), 1)
Пример #4
0
 def afterSetUp(self):
     """ create some sample content to test with """
     if not HAS_DEXTERITY:
         return
     self.setRoles(('Manager', ))
     fti = DexterityFTI('Dexterity Item with relatedItems behavior')
     self.portal.portal_types._setObject(
         'Dexterity Item with relatedItems behavior', fti)
     fti.klass = 'plone.dexterity.content.Item'
     test_module = 'plone.app.layout.viewlets.tests.test_content'
     fti.schema = test_module + '.IMyDexterityItem'
     fti.behaviors = ('plone.app.relationfield.behavior.IRelatedItems', )
     fti = DexterityFTI('Dexterity Item without relatedItems behavior')
     self.portal.portal_types._setObject(
         'Dexterity Item without relatedItems behavior', fti)
     fti.klass = 'plone.dexterity.content.Item'
     fti.schema = test_module + '.IMyDexterityItem'
     self.folder.invokeFactory('Document', 'doc1', title='Document 1')
     self.folder.invokeFactory('Document', 'doc2', title='Document 2')
     self.folder.invokeFactory('Dexterity Item with relatedItems behavior',
                               'dex1')
     self.folder.invokeFactory('Dexterity Item with relatedItems behavior',
                               'dex2')
     self.folder.invokeFactory(
         'Dexterity Item without relatedItems behavior', 'dex3')
     self.portal.portal_quickinstaller.installProduct('plone.app.intid')
     intids = getUtility(IIntIds)
     self.folder.dex1.relatedItems = [
         RelationValue(intids.getId(self.folder.doc1)),
         RelationValue(intids.getId(self.folder.doc2)),
     ]
Пример #5
0
 def setUp(self):
     super(TestDexterityRelatedItemsViewlet, self).setUp()
     """ create some sample content to test with """
     from Products.CMFPlone.utils import get_installer
     setRoles(self.portal, TEST_USER_ID, ['Manager'])
     fti = DexterityFTI('Dexterity Item with relatedItems behavior')
     self.portal.portal_types._setObject(
         'Dexterity Item with relatedItems behavior', fti)
     fti.klass = 'plone.dexterity.content.Item'
     test_module = 'plone.app.layout.viewlets.tests.test_content'
     fti.schema = test_module + '.IMyDexterityItem'
     fti.behaviors = ('plone.app.relationfield.behavior.IRelatedItems', )
     fti = DexterityFTI('Dexterity Item without relatedItems behavior')
     self.portal.portal_types._setObject(
         'Dexterity Item without relatedItems behavior', fti)
     fti.klass = 'plone.dexterity.content.Item'
     fti.schema = test_module + '.IMyDexterityItem'
     self.folder.invokeFactory('Document', 'doc1', title='Document 1')
     self.folder.invokeFactory('Document', 'doc2', title='Document 2')
     self.folder.invokeFactory('Dexterity Item with relatedItems behavior',
                               'dex1')
     self.folder.invokeFactory('Dexterity Item with relatedItems behavior',
                               'dex2')
     self.folder.invokeFactory(
         'Dexterity Item without relatedItems behavior', 'dex3')
     qi = get_installer(self.portal)
     qi.install_product('plone.app.intid')
     intids = getUtility(IIntIds)
     self.folder.dex1.relatedItems = [
         RelationValue(intids.getId(self.folder.doc1)),
         RelationValue(intids.getId(self.folder.doc2)),
     ]
    def test_encode(self):

        values = [
            'hello'
            'hell\xc3\xb6', u'helllo',
            datetime(2012, 1, 1),
            DateTime(2012, 1, 1),
            RelationValue(1111), ['hello', u'hello', 'hell\xc3\xb6'],
            PersistentList(['hello', u'hello']),
            [RelationValue(1111),
             RelationValue(3333),
             RelationValue(5555)]
        ]

        task = self.providing_stub([ITask])

        self.replay()

        transporter = IResponseTransporter(task)
        transporter.intids_mapping = {1111: 2222, 3333: 5555, 5555: 3333}

        for value in values:
            encoded_value = json.dumps(transporter._encode(value))
            decoded_value = transporter._decode(json.loads(encoded_value))

            # compare the value with the de- and encoded value
            if isinstance(value, list):
                for i in range(len(value)):
                    self._compare(value[i], decoded_value[i],
                                  transporter.intids_mapping)
            else:
                self._compare(value, decoded_value, transporter.intids_mapping)
Пример #7
0
    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()
        setRoles(self.portal, TEST_USER_ID, ["Manager"])

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

        self.intids = getUtility(IIntIds)
        self.news = api.content.create(
            container=self.portal, type="News Item", title="TestNews"
        )
        self.luogo = api.content.create(
            container=self.portal,
            type="Venue",
            title="Luogo",
        )
        sede = RelationValue(self.intids.getId(self.luogo))

        self.uo = api.content.create(
            container=self.portal,
            type="UnitaOrganizzativa",
            title="TestUO",
            sede=[sede],
            city="Metropolis",
            zip_code="1234",
            street="whatever",
            contact_info={"blocks": {"xxx": {"foo": "bar"}}},
        )

        self.uo_child = api.content.create(
            container=self.uo,
            type="UnitaOrganizzativa",
            title="Child uo",
            city="Gotham City",
            zip_code="5678",
            street="somewhere",
            contact_info={"blocks": {"yyy": {"foo": "bar"}}},
        )

        self.service = api.content.create(
            container=self.portal,
            type="Servizio",
            title="TestService",
            ufficio_responsabile=[RelationValue(self.intids.getId(self.uo))],
        )

        self.bando = api.content.create(
            container=self.portal,
            type="Bando",
            title="TestBando",
            ufficio_responsabile=[RelationValue(self.intids.getId(self.uo))],
        )

        self.news.a_cura_di = [RelationValue(self.intids.getId(self.uo))]
        pcatalog = getToolByName(self.portal, "portal_catalog")
        pcatalog.manage_reindexIndex(ids=["ufficio_responsabile", "news_uo"])
        commit()
Пример #8
0
    def test_uo_locations_vocabulary_populated(self):
        # create another uo and a venue
        luogo_bis = api.content.create(
            container=self.portal,
            type="Venue",
            title="Luogo bis",
        )
        api.content.create(
            container=self.portal,
            type="UnitaOrganizzativa",
            title="Second UO",
            sede=[RelationValue(self.intids.getId(self.luogo))],
            sedi_secondarie=[RelationValue(self.intids.getId(luogo_bis))],
        )

        factory = getUtility(
            IVocabularyFactory, "design.plone.vocabularies.uo_locations"
        )
        vocabulary = factory(self.portal)

        self.assertIn(self.luogo.UID(), vocabulary)
        self.assertIn(luogo_bis.UID(), vocabulary)
        self.assertEqual(len(vocabulary), 2)
        self.assertEqual(vocabulary.getTerm(self.luogo.UID()).title, self.luogo.Title())
        self.assertEqual(vocabulary.getTerm(luogo_bis.UID()).title, luogo_bis.Title())
Пример #9
0
    def test_related_items(self):
        from z3c.relationfield import RelationValue
        from zope.component import getUtility
        from zope.intid.interfaces import IIntIds
        with api.env.adopt_roles(['Manager']):
            r1 = api.content.create(container=self.portal,
                                    type='News Item',
                                    title='foo')
            r2 = api.content.create(container=self.portal,
                                    type='Image',
                                    title='bar')

        intids = getUtility(IIntIds)
        self.newsitem.relatedItems = [
            RelationValue(intids.getId(r1)),
            RelationValue(intids.getId(r2))
        ]

        amp = etree.HTML(self.view())
        relations = amp.findall('.//div[@class="amp-related"]//a')
        self.assertEqual(len(relations), 2)
        self.assertEqual(relations[0].text, 'foo')
        self.assertTrue(relations[0].attrib['href'].endswith('foo'))
        self.assertEqual(relations[1].text, 'bar')
        self.assertTrue(relations[1].attrib['href'].endswith('bar/view'))
Пример #10
0
 def copy_relation(self, relation_value, target_language):
     obj = relation_value.to_object
     intids = getUtility(IIntIds)
     translation = ITranslationManager(obj).get_translation(target_language)
     if translation:
         return RelationValue(intids.getId(translation))
     else:
         return RelationValue(intids.getId(obj))
    def test_relationvalue_encoding_decoding(self):
        with self.login(self.regular_user):
            transporter = IResponseTransporter(self.task)

        transporter.intids_mapping = {111: 222}
        value = RelationValue(111)
        self.assertEquals(
            RelationValue(222).to_id,
            transporter._decode(transporter._encode(value)).to_id)
    def setUp(self):
        self.app = self.layer["app"]
        self.portal = self.layer["portal"]
        self.portal_url = self.portal.absolute_url()

        self.api_session = RelativeSession(self.portal_url)
        self.api_session.headers.update({"Accept": "application/json"})
        self.anon_api_session = RelativeSession(self.portal_url)
        self.anon_api_session.headers.update({"Accept": "application/json"})

        self.api_session.auth = (SITE_OWNER_NAME, SITE_OWNER_PASSWORD)

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

        intids = getUtility(IIntIds)
        self.uo_public_1 = api.content.create(container=self.portal,
                                              type="UnitaOrganizzativa",
                                              title="UO 1")
        self.uo_public_2 = api.content.create(container=self.portal,
                                              type="UnitaOrganizzativa",
                                              title="UO 2")
        self.uo_private = api.content.create(container=self.portal,
                                             type="UnitaOrganizzativa",
                                             title="UO 3")
        self.bando_public_1 = api.content.create(
            container=self.portal,
            type="Bando",
            title="Bando 1",
            subjects=["foo"],
            ufficio_responsabile=[
                RelationValue(intids.getId(self.uo_public_1))
            ],
        )
        self.bando_public_2 = api.content.create(
            container=self.portal,
            type="Bando",
            title="Bando 2",
            subjects=["foo", "bar"],
            ufficio_responsabile=[
                RelationValue(intids.getId(self.uo_public_2)),
                RelationValue(intids.getId(self.uo_private)),
            ],
        )
        self.bando_private = api.content.create(
            container=self.portal,
            type="Bando",
            title="Bando 3",
            subjects=["foo", "baz"],
            ufficio_responsabile=RelationValue(intids.getId(self.uo_public_1)),
        )

        api.content.transition(obj=self.uo_public_1, transition="publish")
        api.content.transition(obj=self.uo_public_2, transition="publish")
        api.content.transition(obj=self.bando_public_1, transition="publish")
        api.content.transition(obj=self.bando_public_2, transition="publish")

        commit()
Пример #13
0
 def setUp(self):
     super(TestRelatedItemsViewlet, self).setUp()
     self.folder.invokeFactory('Document', 'doc1', title='Document 1')
     self.folder.invokeFactory('Document', 'doc2', title='Document 2')
     self.folder.invokeFactory('Document', 'doc3', title='Document 3')
     intids = getUtility(IIntIds)
     self.folder.doc1.relatedItems = [
         RelationValue(intids.getId(self.folder.doc2)),
         RelationValue(intids.getId(self.folder.doc3)),
     ]
def migrate(context):
    intids = component.getUtility(IIntIds)
    portal = api.portal.get()

    with open('acteurs.csv') as csv_file:
        csv_reader = csv.DictReader(csv_file, delimiter='|')
        for row in csv_reader:
            piece = row['piece']
            acteur = row['acteur']
            prenom = acteur.split(' ')[0]
            nom = ' '.join(acteur.split(' ')[1:])
            dbpiece = [
                i for i in api.content.find(portal_type='troupedu8.Piece')
                if i.Title == piece
            ]
            dbacteur = [
                i for i in api.content.find(portal_type='troupedu8.Acteur')
                if i.Title == acteur
            ]
            if not dbpiece:
                raise Exception("%s n'existe pas" % piece)
            elif len(dbpiece) > 1:
                raise Exception("%s existe plusieurs fois" % piece)
            else:
                dbpiece = dbpiece[0].getObject()
            if not dbacteur:
                dbacteur = api.content.create(
                    type='troupedu8.Acteur',
                    title=acteur.decode('utf8'),
                    firstname=prenom.decode('utf8'),
                    lastname=nom.decode('utf8'),
                    container=api.content.get('/acteurs'))
                api.content.transition(dbacteur, transition='publish')
            elif len(dbacteur) > 1:
                raise Exception("%s existe plusieurs fois" % acteur)
            else:
                dbacteur = dbacteur[0].getObject()
            if not dbpiece.acteurs:
                dbpiece.acteurs = [RelationValue(intids.getId(dbacteur))]
            else:
                if intids.getId(dbacteur) not in [
                        i.to_id for i in dbpiece.acteurs
                ]:
                    dbpiece.acteurs.append(
                        RelationValue(intids.getId(dbacteur)))
            updateRelations(dbpiece, None)
            updateRelations(dbacteur, None)
            dbpiece.reindexObject()

    brains = portal.portal_catalog(
        portal_type=['troupedu8.Acteur', 'troupedu8.Piece'])
    for brain in brains:
        collection = brain.getObject()
        updateRelations(collection, None)
        collection.reindexObject()
    def test_relations_export(self):
        image = api.content.create(self.portal, 'Image', 'image1',
                                   u'❤︎ly Pløne Image')
        image.description = "This is my image."
        image.image = dummy_image()
        file1 = api.content.create(self.portal, 'File', 'file1',
                                   u'❤︎ly Pløne File')
        file1.description = "This is my file."
        file1.file = dummy_image()
        file_without_blob = api.content.create(self.portal, 'File',
                                               'file-without-blob',
                                               u'Pløne File without a blob')
        # Add relations
        doc = self.portal['doc1']
        intids = getUtility(IIntIds)
        doc.relatedItems = PersistentList()
        doc.relatedItems.append(RelationValue(intids.getId(image)))
        doc.relatedItems.append(RelationValue(intids.getId(file1)))
        doc.relatedItems.append(RelationValue(intids.getId(file_without_blob)))
        modified(doc)
        view = api.content.get_view('collective_contentexport_view',
                                    self.portal, self.request)
        view(export_type='related', portal_type='Document')
        self.assertEqual(view.request.response.headers['content-disposition'],
                         'attachment; filename="related.zip"')
        size = int(view.request.response.headers['content-length'])
        self.assertTrue(2750 < size < 2800)

        view = api.content.get_view('collective_contentexport_view',
                                    self.portal, self.request)
        results = view(export_type='json', portal_type='Document')
        results = json.loads(results)
        related = results[0]['relatedItems']
        self.assertEquals(len(related.split(',')), 3)
        self.assertIn('http://nohost/plone/image1/@@download/image', related)
        self.assertIn('http://nohost/plone/file1/@@download/file', related)
        # TODO: Fix this
        self.assertIn('http://nohost/plone/file-without-blob/@@download/file',
                      related)

        # make sure blacklist and whitelist work for related
        results = view(export_type='related',
                       portal_type='Document',
                       blacklist=['relatedItems'])
        self.assertEqual('No related found', results)
        results = view(export_type='related',
                       portal_type='Document',
                       whitelist=['relatedItems'])
        self.assertIsNone(results)
        self.assertEqual(view.request.response.headers['content-disposition'],
                         'attachment; filename="related.zip"')
        size = int(view.request.response.headers['content-length'])
        self.assertTrue(2750 < size < 2800)
Пример #16
0
    def create(name=None, email=None, church=None, message=None,
               video=None, sound=None, doc_data=None, doc_name=None,
               step=None):
        folder = utils.get_folder_unrestricted('resources/user-resources-uploads')
        id = utils.create_id('resource_upload')
        item = _createObjectByType('resource_upload', folder, id)

        intids = component.getUtility(IIntIds)
        item.title = u'{name} uploaded {count} resource(s) on {date}'.format(
            name=name,
            count=len(filter(lambda x: x, [bool(video), bool(sound), bool(doc_data) and bool(doc_name)])),
            date=datetime.datetime.now().strftime('%A %d. %B %Y, %H:%M')
        )
        item.name = name
        item.email = email
        item.church = church
        item.message = message
        if video is not None:
            video_obj = scheme.video.Video.create(
                title='Video uploaded by {user}'.format(user=name),
                description='',
                url_youtube=video,
                step=step
            )
            video_id = intids.getId(video_obj)
            item.video = [RelationValue(video_id)]
            notify(ObjectModifiedEvent(item))

        if sound is not None:
            sound_obj = scheme.sound.Sound.create(
                title='Sound uploaded by {user}'.format(user=name),
                description='',
                soundcloud_id=sound,
                step=step
            )
            sound_id = intids.getId(sound_obj)
            item.sound = [RelationValue(sound_id)]
            notify(ObjectModifiedEvent(item))

        if doc_data is not None and doc_name is not None:
            doc_obj = scheme.staticdocument.StaticDocument.create(
                title='Document uploaded by {user}'.format(user=name),
                description='',
                doc_data=doc_data,
                doc_name=doc_name,
                step=step
            )
            doc_id = intids.getId(doc_obj)
            item.document = [RelationValue(doc_id)]
            notify(ObjectModifiedEvent(item))

        return item
Пример #17
0
 def test_find_ids_multiple(self):
     relation = RelationValue(self.intids.getId(self.folder['d1']))
     self.folder.invokeFactory('collective.alias', 'a1', _aliasTarget=relation)
     
     relation = RelationValue(self.intids.getId(self.folder['d1']))
     self.folder.invokeFactory('collective.alias', 'a2', _aliasTarget=relation)
     
     info = IAliasInformation(self.folder['d1'])
     
     aliases = list(info.findAliasIds())
     self.assertEquals(2, len(aliases))
     self.assertEquals(self.intids.getId(self.folder['a1']), aliases[0])
     self.assertEquals(self.intids.getId(self.folder['a2']), aliases[1])
Пример #18
0
def add_simple_response(task,
                        text='',
                        field_changes=None,
                        added_object=None,
                        successor_oguid=None,
                        **kwargs):
    """Add a simple response which does (not change the task itself).
    `task`: task context
    `text`: fulltext
    `added_object`: an object which was added to the task
    `successor_oguid`: an OGUID to a (remote) object which was referenced.
    """

    response = opengever.task.adapters.Response(text)
    response.type = 'additional'

    for key, value in kwargs.items():
        setattr(response, key, value)

    if field_changes:
        for field, new_value in field_changes:
            old_value = field.get(field.interface(task))
            if old_value != new_value:
                response.add_change(field.__name__, field.title, old_value,
                                    new_value)

    if added_object:
        intids = getUtility(IIntIds)

        if isinstance(added_object, types.ListType) or \
                isinstance(added_object, types.TupleType) or \
                isinstance(added_object, types.GeneratorType):
            response.added_object = PersistentList()
            for obj in added_object:
                iid = intids.getId(obj)
                response.added_object.append(RelationValue(iid))

        else:
            iid = intids.getId(added_object)
            response.added_object = RelationValue(iid)

    if successor_oguid:
        response.successor_oguid = successor_oguid

    container = opengever.task.adapters.IResponseContainer(task)
    container.add(response)

    notify(ObjectModifiedEvent(task))

    TaskTransitionActivity(task, task.REQUEST, response).record()
    return response
Пример #19
0
    def test_broken_relation(self):
        folder = create(Builder('folder').titled(u'The Folder'))
        intids = getUtility(IIntIds)
        folder_intid = intids.getId(folder)

        input_relation_value = RelationValue(folder_intid)
        input_relation_value.from_attribute = 'bar'

        input = [{
            'foo': input_relation_value,
        }]
        api.content.delete(folder)
        output = self.transport(input)
        self.assertEqual([{'foo': None}], output)
Пример #20
0
def update_references(object, event=None):
    """Get list of Related Issues set here, and relate them back
       Then check the getBRefs to remove references that have been removed
       Sort the issues in descending id order
    """
    catalog = getUtility(ICatalog)
    intids = getUtility(IIntIds)
    objintid = intids.getId(aq_inner(object))

    if object.related_issue is None:
        return
    # sort the relationvalues on this object by id
    relatedIssues = sorted(object.related_issue,
                           key=lambda issue: int(issue.to_object.id),
                           reverse=True)
    object.related_issue = relatedIssues

    # add this issue to its related issues where needed
    for issue in relatedIssues:
        others_related = issue.to_object.related_issue
        if not others_related:
            others_related = []
        for other in others_related:
            if objintid == other.to_id:
                break
        else:
            rv = RelationValue(objintid)
            others_related.append(rv)
            issue.to_object.related_issue = sorted(
                others_related,
                key=lambda issue: int(issue.to_id),
                reverse=True)

    # find other issues related to this one
    issuesRelated = []
    for rel in catalog.findRelations(
            dict(to_id=objintid, from_attribute='related_issue')):
        issuesRelated.append(RelationValue(rel.from_id))

    # remove relations from those issues to this one if neeeded
    for issue in issuesRelated:
        if issue.to_id in [r.to_id for r in object.related_issue]:
            continue
        issue_object = intids.queryObject(issue.to_id)
        others_related = issue_object.related_issue
        if objintid not in [r.to_id for r in others_related]:
            continue
        others_related = [x for x in others_related if x.to_id != objintid]
        issue_object.related_issue = others_related
Пример #21
0
    def test_relation_value(self):
        folder = create(Builder('folder').titled(u'The Folder'))
        intids = getUtility(IIntIds)
        folder_intid = intids.getId(folder)

        input_relation_value = RelationValue(folder_intid)
        input_relation_value.from_attribute = 'bar'

        input = [{
            'foo': input_relation_value,
        }]
        output = self.transport(input)
        self.assertEqual(RelationValue, type(output[0]['foo']))
        self.assertEqual(folder_intid, output[0]['foo'].to_id)
        self.assertEqual('bar', output[0]['foo'].from_attribute)
Пример #22
0
    def test_api_do_not_return_related_items_with_effective_date_in_future_for_users_that_cant_edit_context(
        self,
    ):
        api.user.create(
            email="*****@*****.**",
            username="******",
            password="******",
        )

        api_session = RelativeSession(self.portal_url)
        api_session.headers.update({"Accept": "application/json"})
        api_session.auth = ("foo", "secret")

        present = api.content.create(
            container=self.portal, type="Document", title="present"
        )
        future = api.content.create(
            container=self.portal, type="Document", title="future"
        )
        present.setEffectiveDate(DateTime())
        future.setEffectiveDate(DateTime() + 1)
        api.content.transition(obj=present, transition="publish")
        api.content.transition(obj=future, transition="publish")
        page = api.content.create(
            container=self.portal,
            type="Document",
            title="Page",
            relatedItems=[
                RelationValue(self.intids.getId(present)),
                RelationValue(self.intids.getId(future)),
            ],
        )
        api.content.transition(obj=page, transition="publish")
        commit()

        setRoles(self.portal, "foo", ["Reader"])
        commit()
        res = api_session.get(page.absolute_url()).json()

        relatedItems = res.get("relatedItems", [])
        self.assertEqual(len(relatedItems), 1)

        setRoles(self.portal, "foo", ["Editor"])
        commit()
        res = api_session.get(page.absolute_url()).json()

        relatedItems = res.get("relatedItems", [])
        self.assertEqual(len(relatedItems), 2)
Пример #23
0
    class RelationFieldMarshaler(BaseFieldMarshaler):

        ascii = True

        def encode(self, value, charset='utf-8', primary=False):
            if value is None:
                return None
            if value.to_object is None:
                return None
            return IUUID(value.to_object)

        def decode(self,
                   value,
                   message=None,
                   charset='utf-8',
                   contentType=None,
                   primary=False):
            try:
                uuid = value.decode(charset)
            except TypeError, e:
                raise ValueError(e)

            intids = getUtility(IIntIds)
            portal_catalog = api.portal.get_tool('portal_catalog')
            for brain in portal_catalog.unrestrictedSearchResults(UID=uuid):
                # noinspection PyProtectedMember
                ob = brain._unrestrictedGetObject()
                intid = intids.queryId(ob)
                if intid is None:
                    intid = intids.register(ob)
                return RelationValue(intid)
            return None
Пример #24
0
    def test_get_file(self):  # pragma: no cover
        self.portal.invokeFactory('File', id='file1')
        self.portal.file1.title = 'File'
        self.portal.file1.description = u'A file'
        pdf_file = os.path.join(
            os.path.dirname(__file__), u'file.pdf'
        )
        self.portal.file1.file = NamedBlobFile(
            data=open(pdf_file, 'r').read(),
            contentType='application/pdf',
            filename=u'file.pdf'
        )
        intids = getUtility(IIntIds)
        file_id = intids.getId(self.portal.file1)
        self.portal.file1.file = RelationValue(file_id)
        transaction.commit()

        response = self.api_session.get(self.portal.file1.absolute_url())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            response.headers.get('Content-Type'),
            'application/json',
            'When sending a GET request with Content-Type: application/json ' +
            'the server should respond with sending back application/json.'
        )
        self.assertEqual(
            response.json()['@id'],
            self.portal.file1.absolute_url()
        )
def updateRelatedItems(wfStateInfo):
    logger.info("updateRelatedItems")
    print "update related items for original file"
    originalfile = wfStateInfo.object
    epublication = aq_parent(aq_inner(originalfile))
    intids = getUtility(IIntIds)
    originalfile.relatedItems = [RelationValue(intids.getId(epublication))]
Пример #26
0
    def test_get_content_related_items_without_workflow(self):
        intids = getUtility(IIntIds)

        self.portal.invokeFactory("Image", id="imagewf")
        self.portal.imagewf.title = "Image without workflow"
        self.portal.imagewf.description = "This is an image"
        image_file = os.path.join(os.path.dirname(__file__), "image.png")
        with open(image_file, "rb") as f:
            image_data = f.read()
        self.portal.imagewf.image = NamedBlobImage(data=image_data,
                                                   contentType="image/png",
                                                   filename="image.png")
        transaction.commit()

        self.portal.folder1.doc1.relatedItems = [
            RelationValue(intids.getId(self.portal.imagewf))
        ]
        transaction.commit()
        response = requests.get(
            self.portal.folder1.doc1.absolute_url(),
            headers={"Accept": "application/json"},
            auth=(SITE_OWNER_NAME, SITE_OWNER_PASSWORD),
        )
        self.assertEqual(response.status_code, 200)
        self.assertEqual(1, len(response.json()["relatedItems"]))
        self.assertEqual(
            [{
                "@id": self.portal_url + "/imagewf",
                "@type": "Image",
                "description": "This is an image",
                "review_state": None,
                "title": "Image without workflow",
            }],
            response.json()["relatedItems"],
        )
Пример #27
0
def get_content_links(obj):
    refs = set()
    if ILayoutAware.providedBy(obj):
        behavior_data = ILayoutAware(obj)
        # get data from tile data
        annotations = IAnnotations(obj)
        for key in annotations.keys():
            if key.startswith(ANNOTATIONS_KEY_PREFIX):
                data = annotations[key]
                refs |= get_tile_data_links(obj, data)
        if not behavior_data.contentLayout and behavior_data.content:
            dom = fromstring(behavior_data.content)
            for el in dom.cssselect('.mosaic-text-tile .mosaic-tile-content'):
                links = extractLinks(tostring(el))
                refs |= li.getObjectsFromLinks(obj, links)
    try:
        # scan more than just this we probably should...
        value = obj.text.raw
        links = extractLinks(value)
        refs |= li.getObjectsFromLinks(obj, links)
    except AttributeError:
        pass

    if getattr(obj, 'image'):
        if IReferenceNamedImage.providedBy(obj.image):
            sub_obj = uuidToObject(obj.image.reference)
            if sub_obj:
                objid = get_ref(obj)
                if objid:
                    refs.add(RelationValue(objid))
    return refs
Пример #28
0
def restore_backrefs(portal, obj):
    """Restore backreferences stored in the attribute _backrefs.
    """
    intids = getUtility(IIntIds)
    uid_catalog = getToolByName(portal, 'uid_catalog')
    try:
        backrefobjs = [uuidToObject(uuid) for uuid in obj._backrefs]
        for backrefobj in backrefobjs:
            # Dexterity and
            if IDexterityContent.providedBy(backrefobj):
                relitems = getattr(backrefobj, 'relatedItems', None)
                if not relitems:
                    backrefobj.relatedItems = PersistentList()
                elif not isinstance(obj.relatedItems, PersistentList):
                    backrefobj.relatedItems = PersistentList(obj.relatedItems)
                to_id = intids.getId(obj)
                backrefobj.relatedItems.append(RelationValue(to_id))

            # Archetypes
            elif IATContentType.providedBy(backrefobj):
                # reindex UID so we are able to set the reference
                path = '/'.join(obj.getPhysicalPath())
                uid_catalog.catalog_object(obj, path)
                backrefobj.setRelatedItems(obj)
            logger.info('Restored BackRelation from %s to %s' %
                        (backrefobj, obj))
    except AttributeError:
        pass
Пример #29
0
    def get_learner(self, classlist, code, name, gender_code, language_code):
        """ Look if the learner exists in the system.
            If we can't find them there, we create a new one and set its
            properties to those specified in the import data.

            Note: At this stage the code will not overwrite existing learners.
                  It just skips them.
            IMPORTANT - This assumes that a learner can only be in one classlist
                        at a time.
        """

        learner = None
        # Now try to find the learner in the system
        # better make sure we search with 'None' or we get false positives
        if code == '': code = None
        query = {'portal_type': 'upfront.classlist.content.learner',
                 'id': code}
        pc = getToolByName(self, 'portal_catalog')
        brains = pc(**query)

        # For the moment we assume there can be only one... 
        learner = len(brains) > 0 and brains[0].getObject() or None
        # We found her, no need to recreate.
        if learner is not None:
            message = _("Skipping existing learner") + ': %s' % name
            return message, learner
        
        # We could not find the learner, so we will create one, but first
        # get our data ducks in a row.

        if gender_code not in self.genders():
            msgid = _(u"learners_gender_not_recognized",
                default=u"Learner: ${name} gender: ${gender} not recognized",
                mapping={ u"name" : name, u"gender" : gender_code})
            msg = self.context.translate(msgid)
            return msg, None
    
        if language_code not in self.languages()[0]:
            msgid = _(u"learners_language_not_recognized",
                default=u"Learner: ${name} language: ${language} not recognized",
                mapping={ u"name" : name, u"language" : language_code})
            msg = self.context.translate(msgid)
            return msg, None

        # create learner
        classlist.invokeFactory('upfront.classlist.content.learner',
                                code,
                                title=name)
        new_learner = classlist._getOb(code)
        new_learner.code = code
        new_learner.name = name
        new_learner.gender = gender_code       
        # get position of language in language vocab, using index get its 
        # corresponding intid from initid list
        index = self.languages()[0].index(language_code)
        lang_intid = self.languages()[1][index]        
        new_learner.home_language = RelationValue(lang_intid)
        notify(ObjectModifiedEvent(new_learner))

        return None, new_learner
Пример #30
0
    def test_get_file(self):  # pragma: no cover
        self.portal.invokeFactory("File", id="file1")
        self.portal.file1.title = "File"
        self.portal.file1.description = "A file"
        pdf_file = os.path.join(os.path.dirname(__file__), "file.pdf")
        with open(pdf_file, "rb") as f:
            pdf_data = f.read()
        self.portal.file1.file = NamedBlobFile(data=pdf_data,
                                               contentType="application/pdf",
                                               filename="file.pdf")
        intids = getUtility(IIntIds)
        file_id = intids.getId(self.portal.file1)
        self.portal.file1.file = RelationValue(file_id)
        transaction.commit()

        response = self.api_session.get(self.portal.file1.absolute_url())

        self.assertEqual(response.status_code, 200)
        self.assertEqual(
            response.headers.get("Content-Type"),
            "application/json",
            "When sending a GET request with Content-Type: application/json " +
            "the server should respond with sending back application/json.",
        )
        self.assertEqual(response.json()["@id"],
                         self.portal.file1.absolute_url())
Пример #31
0
        def set_field_value(self, uid, field, value, field_type):
            """Set field value with a specific type

            XXX: Only dexterity fields are supported
            """
            pc = getToolByName(self, 'portal_catalog')
            results = pc.unrestrictedSearchResults(UID=uid)
            obj = results[0]._unrestrictedGetObject()
            if field_type == 'float':
                value = float(value)
            if field_type == 'int':
                value = int(value)
            if field_type == 'list':
                value = eval(value)
            if field_type.startswith('datetime'):
                # field_type must begin with 'datetime'
                # followed by optional format 'datetime%Y%m%d%H%M'
                # without format: %Y%m%d%H%M is used
                field_type = field_type[8:]
                fmt = field_type and field_type or '%Y%m%d%H%M'
                value = datetime.strptime(value, fmt)
            if field_type.startswith('date'):
                # field_type must begin with 'date'
                # followed by optional format 'date%Y%m%d'
                # without format: %Y%m%d is used
                field_type = field_type[4:]
                fmt = field_type and field_type or '%Y%m%d'
                value = datetime.strptime(value, fmt).date()
            if field_type == 'reference' and HAS_DEXTERITY_RELATIONS:
                results_referenced = pc.unrestrictedSearchResults(UID=value)
                referenced_obj = results_referenced[0]._unrestrictedGetObject()
                intids = getUtility(IIntIds)
                referenced_obj_intid = intids.getId(referenced_obj)
                value = RelationValue(referenced_obj_intid)
            if field_type == 'references' and HAS_DEXTERITY_RELATIONS:
                values = eval(value)
                intids = getUtility(IIntIds)
                value = []
                for uid in values:
                    results_referenced = pc.unrestrictedSearchResults(UID=uid)
                    referenced_obj = results_referenced[0]._unrestrictedGetObject()
                    referenced_obj_intid = intids.getId(referenced_obj)
                    value.append(RelationValue(referenced_obj_intid))
            if field_type == 'text/html':
                value = RichTextValue(
                    value,
                    'text/html',
                    'text/html'
                )
                obj.text = value
            if field_type == 'file':
                pdf_file = os.path.join(
                    os.path.dirname(__file__), 'content', u'file.pdf')
                with open(pdf_file, 'rb') as f:
                    file_data = f.read()
                value = NamedBlobFile(
                    data=file_data,
                    contentType='application/pdf',
                    filename=u'file.pdf'
                )
            if field_type == 'image':
                image_file = os.path.join(
                    os.path.dirname(__file__), u'image.jpg')
                with open(image_file, 'rb') as f:
                    image_data = f.read()
                value = NamedBlobImage(
                    data=image_data,
                    contentType='image/jpg',
                    filename=u'image.jpg'
                )

            setattr(obj, field, value)
            obj.reindexObject()
            notify(ObjectModifiedEvent(obj))