示例#1
0
def _update_entity_rel_cache_add(cnx,
                                 entity,
                                 rtype,
                                 role,
                                 targetentity,
                                 otherside=False):
    rcache = entity.cw_relation_cached(rtype, role)
    if rcache is None:
        rset = ResultSet([[targetentity.eid]],
                         'Any X WHERE X eid %s' % targetentity.eid,
                         description=[[targetentity.cw_etype]])
        rset.req = cnx
        entities = []
    else:
        rset, entities = rcache
        rset = rset.copy()
        entities = list(entities)
        rset.rows.append([targetentity.eid])
        if not isinstance(rset.description, list):  # else description not set
            rset.description = list(rset.description)
        rset.description.append([targetentity.cw_etype])
    if targetentity.cw_rset is None:
        targetentity.cw_rset = rset
        targetentity.cw_row = rset.rowcount
        targetentity.cw_col = 0
    rset.rowcount += 1
    entities.append(targetentity)
    entity._cw_related_cache['%s_%s' % (rtype, role)] = (rset, tuple(entities))
    if not otherside:
        _update_entity_rel_cache_add(cnx, targetentity, rtype, neg_role(role),
                                     entity, True)
示例#2
0
    def test_sort(self):
        rs = ResultSet([[12000, 'adim'], [13000, 'syt'], [14000, 'nico']],
                       'Any U,L where U is CWUser, U login L',
                       description=[['CWUser', 'String']] * 3)
        with self.admin_access.web_request() as req:
            rs.req = req
            rs.vreg = self.vreg

            rs2 = rs.sorted_rset(lambda e: e.cw_attr_cache['login'])
            self.assertEqual(len(rs2), 3)
            self.assertEqual([login for _, login in rs2], ['adim', 'nico', 'syt'])
            # make sure rs is unchanged
            self.assertEqual([login for _, login in rs], ['adim', 'syt', 'nico'])

            rs2 = rs.sorted_rset(lambda e: e.cw_attr_cache['login'], reverse=True)
            self.assertEqual(len(rs2), 3)
            self.assertEqual([login for _, login in rs2], ['syt', 'nico', 'adim'])
            # make sure rs is unchanged
            self.assertEqual([login for _, login in rs], ['adim', 'syt', 'nico'])

            rs3 = rs.sorted_rset(lambda row: row[1], col=-1)
            self.assertEqual(len(rs3), 3)
            self.assertEqual([login for _, login in rs3], ['adim', 'nico', 'syt'])
            # make sure rs is unchanged
            self.assertEqual([login for _, login in rs], ['adim', 'syt', 'nico'])
示例#3
0
 def eid_rset(self, eid, etype=None):
     """return a result set for the given eid without doing actual query
     (we have the eid, we can suppose it exists and user has access to the
     entity)
     """
     eid = int(eid)
     if etype is None:
         etype = self.entity_type(eid)
     rset = ResultSet([(eid, )], 'Any X WHERE X eid %(x)s', {'x': eid},
                      [(etype, )])
     rset.req = self
     return rset
示例#4
0
    def etype_rset(self, etype, size=1):
        """return a fake result set for a particular entity type"""
        rset = ResultSet([('A', )] * size,
                         '%s X' % etype,
                         description=[(etype, )] * size)

        def get_entity(row, col=0, etype=etype, req=self, rset=rset):
            return req.vreg['etypes'].etype_class(etype)(req, rset, row, col)

        rset.get_entity = get_entity
        rset.req = self
        return rset
示例#5
0
    def test_transform(self):
        rs = ResultSet([[12, 'adim'], [13, 'syt'], [14, 'nico']],
                       'Any U,L where U is CWUser, U login L',
                       description=[['CWUser', 'String']] * 3)
        with self.admin_access.web_request() as req:
            rs.req = req

            def test_transform(row, desc):
                return row[1:], desc[1:]
            rs2 = rs.transformed_rset(test_transform)

            self.assertEqual(len(rs2), 3)
            self.assertEqual(list(rs2), [['adim'], ['syt'], ['nico']])
示例#6
0
 def test_limit(self):
     rs = ResultSet([[12000, 'adim'], [13000, 'syt'], [14000, 'nico']],
                    'Any U,L where U is CWUser, U login L',
                    description=[['CWUser', 'String']] * 3)
     with self.admin_access.web_request() as req:
         rs.req = req
         rs.vreg = self.vreg
         self.assertEqual(rs.limit(2).rows, [[12000, 'adim'], [13000, 'syt']])
         rs2 = rs.limit(2, offset=1)
         self.assertEqual(rs2.rows, [[13000, 'syt'], [14000, 'nico']])
         self.assertEqual(rs2.get_entity(0, 0).cw_row, 0)
         self.assertEqual(rs.limit(2, offset=2).rows, [[14000, 'nico']])
         self.assertEqual(rs.limit(2, offset=3).rows, [])
示例#7
0
    def test_filter(self):
        rs = ResultSet([[12000, 'adim'], [13000, 'syt'], [14000, 'nico']],
                       'Any U,L where U is CWUser, U login L',
                       description=[['CWUser', 'String']] * 3)
        with self.admin_access.web_request() as req:
            rs.req = req
            rs.vreg = self.vreg

            def test_filter(entity):
                return entity.login != 'nico'

            rs2 = rs.filtered_rset(test_filter)
            self.assertEqual(len(rs2), 2)
            self.assertEqual([login for _, login in rs2], ['adim', 'syt'])
            self.assertEqual(rs2.description, rs.description[1:])
示例#8
0
    def test_split(self):
        rs = ResultSet([[12000, 'adim', u'Adim chez les pinguins'],
                        [12000, 'adim', u'Jardiner facile'],
                        [13000, 'syt', u'Le carrelage en 42 leçons'],
                        [14000, 'nico', u'La tarte tatin en 15 minutes'],
                        [14000, 'nico', u"L'épluchage du castor commun"]],
                       ('Any U, L, T WHERE U is CWUser, U login L,'
                        'D created_by U, D title T'),
                       description=[['CWUser', 'String', 'String']] * 5)
        with self.admin_access.web_request() as req:
            rs.req = req
            rs.vreg = self.vreg
            rsets = rs.split_rset(lambda e: e.cw_attr_cache['login'])
            self.assertEqual(len(rsets), 3)
            self.assertEqual([login for _, login, _ in rsets[0]], ['adim', 'adim'])
            self.assertEqual([login for _, login, _ in rsets[1]], ['syt'])
            self.assertEqual([login for _, login, _ in rsets[2]], ['nico', 'nico'])
            # make sure rs is unchanged
            self.assertEqual([login for _, login, _ in rs], ['adim', 'adim', 'syt', 'nico', 'nico'])

            rsets = rs.split_rset(lambda e: e.cw_attr_cache['login'], return_dict=True)
            self.assertEqual(len(rsets), 3)
            self.assertEqual([login for _, login, _ in rsets['nico']], ['nico', 'nico'])
            self.assertEqual([login for _, login, _ in rsets['adim']], ['adim', 'adim'])
            self.assertEqual([login for _, login, _ in rsets['syt']], ['syt'])
            # make sure rs is unchanged
            self.assertEqual([login for _, login, _ in rs], ['adim', 'adim', 'syt', 'nico', 'nico'])

            rsets = rs.split_rset(lambda s: s.count('d'), col=2)
            self.assertEqual(len(rsets), 2)
            self.assertEqual([title for _, _, title in rsets[0]],
                             [u"Adim chez les pinguins",
                              u"Jardiner facile",
                              u"L'épluchage du castor commun"])
            self.assertEqual([title for _, _, title in rsets[1]],
                             [u"Le carrelage en 42 leçons",
                              u"La tarte tatin en 15 minutes"])
            # make sure rs is unchanged
            self.assertEqual([title for _, _, title in rs],
                             [u'Adim chez les pinguins',
                              u'Jardiner facile',
                              u'Le carrelage en 42 leçons',
                              u'La tarte tatin en 15 minutes',
                              u"L'épluchage du castor commun"])
示例#9
0
 def empty_rset(self):
     """ return a guaranteed empty result """
     rset = ResultSet([], 'Any X WHERE X eid -1')
     rset.req = self
     return rset