Пример #1
0
    def test_accessibilityQuery(self):
        """
        Ensure that asAccessibleTo returns only items actually accessible to
        the given role.
        """
        for i in range(10):
            self.addSomeThings()

        query = self.store.query(PrivateThing)
        aliceQuery = self.assertWarns(
            PendingDeprecationWarning,
            "Use Role.asAccessibleTo() instead of sharing.asAccessibleTo().",
            __file__,
            lambda : list(sharing.asAccessibleTo(self.alice, query)))
        bobQuery = list(sharing.asAccessibleTo(self.bob, query))

        self.assertEqual(map(sharing.itemFromProxy, bobQuery),
                         map(lambda x: x.sharedItem, self.bobThings))
        self.assertEqual(map(sharing.itemFromProxy, aliceQuery),
                         map(lambda x: x.sharedItem, self.aliceThings))

        self.assertEqual([p.sharedInterfaces
                          for p in aliceQuery], [[IPrivateThing]] * 10)
        self.assertEqual([p.sharedInterfaces
                          for p in bobQuery], [[IReadOnly]] * 10)
Пример #2
0
 def test_twoInterfacesTwoGroupsQuery(self):
     """
     Verify that when an item is shared to two roles that a user is a member of,
     and then retrieved by an asAccessibleTo query, both interfaces will be
     accessible on each object in the query result, and the same number of
     items will be accessible in the query as were shared.
     """
     us = sharing.getPrimaryRole(self.store, u'us', True)
     them = sharing.getPrimaryRole(self.store, u'them', True)
     self.bob.becomeMemberOf(us)
     self.bob.becomeMemberOf(them)
     for x in range(3):
         it = PrivateThing(store=self.store, publicData=x)
         sharing.shareItem(it, toRole=us, shareID=u'q',
                           interfaces=[IPrivateThing])
         sharing.shareItem(it, toRole=them, shareID=u'q',
                           interfaces=[IReadOnly])
     # sanity check
     self.assertEquals(self.store.query(PrivateThing).count(), 3)
     aat = list(sharing.asAccessibleTo(self.bob, self.store.query(
                 PrivateThing, sort=PrivateThing.publicData.descending)))
     aat2 = list(sharing.asAccessibleTo(self.bob, self.store.query(
                 PrivateThing, sort=PrivateThing.publicData.ascending)))
     # sanity check x2
     for acc in aat:
         acc.mutateSomeState()
     expectedData = [x + 5 for x in reversed(range(3))]
     self.assertEquals([acc.retrieveSomeState() for acc in aat],
                       expectedData)
     self.assertEquals([acc.retrieveSomeState() for acc in aat2],
                       list(reversed(expectedData)))
Пример #3
0
 def test_twoInterfacesTwoGroupsUnsortedQuery(self):
     """
     Verify that when duplicate shares exist for the same item and an
     asAccessibleTo query is made with no specified sort, the roles are
     still deduplicated properly.
     """
     us = sharing.getPrimaryRole(self.store, u'us', True)
     them = sharing.getPrimaryRole(self.store, u'them', True)
     self.bob.becomeMemberOf(us)
     self.bob.becomeMemberOf(them)
     for x in range(3):
         it = PrivateThing(store=self.store, publicData=x)
         sharing.shareItem(it, toRole=us, shareID=u'q',
                           interfaces=[IPrivateThing])
         sharing.shareItem(it, toRole=them, shareID=u'q',
                           interfaces=[IReadOnly])
     # sanity check
     self.assertEquals(self.store.query(PrivateThing).count(), 3)
     aat = list(sharing.asAccessibleTo(self.bob, self.store.query(
                 PrivateThing)))
     # sanity check x2
     for acc in aat:
         acc.mutateSomeState()
     expectedData = [x + 5 for x in range(3)]
     aat.sort(key=lambda i: i.retrieveSomeState())
     self.assertEquals([acc.retrieveSomeState() for acc in aat],
                       expectedData)
Пример #4
0
    def test_limitWithPrivateStuff(self):
        """
        Verify that a limited query with some un-shared items will return up to
        the provided limit number of shared items.
        """
        L = []

        def makeThing(shared):
            t = PrivateThing(store=self.store, publicData=self.i)
            self.i += 1
            if shared:
                sharing.shareItem(
                    t, toRole=self.bob, interfaces=[IPrivateThing],
                    shareID=unicode(self.i))
            L.append(t)
        # 0, 1, 2: shared
        for x in range(3):
            makeThing(True)
        # 3, 4, 5: private
        for x in range(3):
            makeThing(False)
        # 6, 7, 8: shared again
        for x in range(3):
            makeThing(True)

        self.assertEquals(
            map(sharing.itemFromProxy,
                sharing.asAccessibleTo(
                    self.bob, self.store.query(
                        PrivateThing, limit=5))),
            [L[0], L[1], L[2], L[6], L[7]])
Пример #5
0
    def getTopLevelFor(self, role):
        """
        Return an iterator of all top-level Blurbs in this store.

        @param role: a L{xmantissa.sharing.Role}.
        """
        blogs = self.store.query(Blurb, Blurb.parent == None)
        return sharing.asAccessibleTo(role, blogs)
Пример #6
0
    def view(self, role):
        """
        Collect the children of this blurb that are visible to this role.

        @param role: a L{Role} which can observe some children of this blurb.

        @return: an iterable of L{xmantissa.sharing.SharedProxy} instances.
        """
        children = self.store.query(Blurb, Blurb.parent == self, sort=Blurb.dateCreated.descending)
        return asAccessibleTo(role, children)
Пример #7
0
    def test_limit(self):
        """
        Ensure that asAccessibleTo respects query limits.
        """
        for i in range(10):
            self.addSomeThings()

        query = self.store.query(PrivateThing, limit=3)
        bobQuery = list(sharing.asAccessibleTo(self.bob, query))
        self.assertEquals(len(bobQuery), 3)
Пример #8
0
    def test_sortOrdering(self):
        """
        Ensure that asAccessibleTo respects query sort order.
        """
        for i in range(10):
            self.addSomeThings()

        query = self.store.query(PrivateThing,
                                 sort=PrivateThing.publicData.ascending)
        # Sanity check.
        self.assertEquals([x.publicData for x in query], range(-9, 1, 1))
        bobQuery = list(sharing.asAccessibleTo(self.bob, query))
        self.assertEquals([x.retrieveSomeState() for x in bobQuery],
                          range(-9, 1, 1))
        query2 = self.store.query(PrivateThing,
                                  sort=PrivateThing.publicData.descending)
        # Sanity check #2
        self.assertEquals([x.publicData for x in query2], range(-9, 1, 1)[::-1])
        bobQuery2 = list(sharing.asAccessibleTo(self.bob, query2))
        self.assertEquals([x.retrieveSomeState() for x in bobQuery2], range(-9, 1, 1)[::-1])
Пример #9
0
    def view(self, role):
        """
        Collect the children of this blurb that are visible to this role.

        @param role: a L{Role} which can observe some children of this blurb.

        @return: an iterable of L{xmantissa.sharing.SharedProxy} instances.
        """
        children = self.store.query(Blurb,
                                    Blurb.parent == self,
                                    sort=Blurb.dateCreated.descending)
        return asAccessibleTo(role, children)
Пример #10
0
    def _charactersForViewer(self, store, role):
        """
        Find the characters the given role is allowed to play.

        This will load any L{Thing}s from C{store} which are shared to C{role}.
        It then unwraps them from their sharing wrapper and returns them (XXX
        there should really be a way for this to work without the unwrapping,
        no?  See #2909. -exarkun).
        """
        characters = []
        things = store.query(Thing)
        actors = asAccessibleTo(role, things)
        characters.extend(map(itemFromProxy, actors))
        return characters
Пример #11
0
    def _charactersForViewer(self, store, role):
        """
        Find the characters the given role is allowed to play.

        This will load any L{Thing}s from C{store} which are shared to C{role}.
        It then unwraps them from their sharing wrapper and returns them (XXX
        there should really be a way for this to work without the unwrapping,
        no?  See #2909. -exarkun).
        """
        characters = []
        things = store.query(Thing)
        actors = asAccessibleTo(role, things)
        characters.extend(map(itemFromProxy, actors))
        return characters
Пример #12
0
 def test_limitGetsAllInterfaces(self):
     """
     asAccessibleTo should always collate interfaces together, regardless of
     its limit parameter.
     """
     t = PrivateThing(store=self.store, publicData=self.i)
     sharing.shareItem(t, toName=u'*****@*****.**',
                       interfaces=[IPrivateThing], shareID=u'test')
     sharing.shareItem(t, toName=u'Everyone',
                       interfaces=[IReadOnly], shareID=u'test')
     L = list(sharing.asAccessibleTo(
             self.bob, self.store.query(PrivateThing, limit=1)))
     self.assertEquals(len(L), 1)
     self.assertEquals(set(L[0].sharedInterfaces),
                       set([IReadOnly, IPrivateThing]))
Пример #13
0
    def viewByTag(self, role, tag):
        """
        Collect the children of this blurb that are visible to this role, and
        have been tagged with C{tag}

        @param role: a L{Role} which can observe some children of this blurb.
        @param tag: the tag name
        @type tag: C{unicode}

        @return: an iterable of L{xmantissa.sharing.SharedProxy} instances.
        """
        children = self.store.query(
            Blurb,
            AND(Blurb.parent == self, Tag.object == Blurb.storeID, Tag.name == tag),
            sort=Blurb.dateCreated.descending,
        )
        return asAccessibleTo(role, children)
Пример #14
0
    def viewByTag(self, role, tag):
        """
        Collect the children of this blurb that are visible to this role, and
        have been tagged with C{tag}

        @param role: a L{Role} which can observe some children of this blurb.
        @param tag: the tag name
        @type tag: C{unicode}

        @return: an iterable of L{xmantissa.sharing.SharedProxy} instances.
        """
        children = self.store.query(Blurb,
                                    AND(Blurb.parent == self,
                                        Tag.object == Blurb.storeID,
                                        Tag.name == tag),
                                    sort=Blurb.dateCreated.descending)
        return asAccessibleTo(role, children)
Пример #15
0
    def test_limitEfficiency(self):
        """
        Verify that querying a limited number of shared items does not become
        slower as more items are shared.
        """
        zomg = QueryCounter(self.store)

        for i in range(10):
            self.addSomeThings()

        query = self.store.query(
            PrivateThing, limit=3, sort=PrivateThing.publicData.ascending)
        checkit = lambda : list(sharing.asAccessibleTo(self.bob, query))
        before = zomg.measure(checkit)

        for i in range(10):
            self.addSomeThings()

        after = zomg.measure(checkit)
        self.assertEquals(before, after)
Пример #16
0
 def test_limitMultiShare(self):
     """
     asAccessibleTo should stop after yielding the limit number of results,
     even if there are more shares examined than results.
     """
     L = []
     for x in range(10):
         t = PrivateThing(store=self.store, publicData=self.i)
         L.append(t)
         self.i += 1
         sharing.shareItem(t, toName=u'*****@*****.**',
                           interfaces=[IPrivateThing],
                           shareID=unicode(x))
         sharing.shareItem(t, toName=u'Everyone', interfaces=[IReadOnly],
                           shareID=unicode(x))
     proxies = list(sharing.asAccessibleTo(
             self.bob,
             self.store.query(PrivateThing, limit=5,
                              sort=PrivateThing.publicData.ascending)))
     self.assertEquals(map(sharing.itemFromProxy, proxies), L[:5])
     for proxy in proxies:
         self.assertEquals(set(proxy.sharedInterfaces),
                           set([IPrivateThing, IReadOnly]))
Пример #17
0
    def inequalityQuery(self, constraint, count, isAscending):
        """
        Perform the query in L{ScrollingElement} in a slightly different way: wrap
        it in L{asAccessibleTo} for this L{ShareScrollingElement}'s role.

        @param constraint: an additional constraint to apply to the
        query.
        @type constraint: L{axiom.iaxiom.IComparison}.

        @param count: the maximum number of rows to return.
        @type count: C{int}

        @param isAscending: a boolean describing whether the query
        should be yielding ascending or descending results.
        @type isAscending: C{bool}

        @return: an query which will yield some results from this
        model.
        @rtype: L{axiom.iaxiom.IQuery}
        """
        theQuery = super(ShareScrollingElement, self).inequalityQuery(
            constraint, count, isAscending)
        return sharing.asAccessibleTo(self.role, theQuery.query)