예제 #1
0
    def test_toModel_widthIndentList_7(self):
        source = '''
        1
            id: 1
            model: SiteConfig
            name: na
        2
            value: vb
        aa
            3
                id: 2
                model: SiteConfig
                name: nc
        '''

        target = [
            ['1', sh.storage({
                'SiteConfigid': 1L,
                'value': 'v1',
                'name': 'na',
                'title': 't1',
                })
            ],
            ['2', sh.storage({'value': 'vb'})],
            ['aa', [
                '3', sh.storage({
                    'SiteConfigid': 2L,
                    'value': 'v2',
                    'name': 'nc',
                    'title': 't2',
                    })
                ]
            ]
        ]
예제 #2
0
    def test_indentsToDict_addIndex(self):
        source = '''
        aaa
            bb: BB
            cc: CC
        ddd
            ee
                ff
            gg
            hh:
        ll
        '''

        target = sh.storage({
            '__index' : 0,
            'aaa': sh.storage({
                    '__index' : 1, 
                    'cc': 'CC',
                    'bb': 'BB'}),
            'ddd': sh.storage({
                    '__index' : 2,
                    'ee': sh.storage({
                        '__index' : 3,
                        'ff': ''}),
                    'gg': '',
                    'hh': ''}), # toDict时,key后面的冒号可有可无
            'll' : '',
            })

        indents = t_ctrl.indent(source)
        results = t_ctrl.indentsToDict(indents, add_index=True)
        self.assertEqual(results, target)
예제 #3
0
    def test_toModel_widthIndentList_4(self):
        source = '''
        1

            name: na
        2
            value: vb
        aa
            bb
                cc: dd
            ee
            ff
                3

                    name: nc
        '''

        target = [
            ['1', sh.storage({'name': 'na'})],
            ['2', sh.storage({'value': 'vb'})],
            ['aa', [
                ['bb', sh.storage({'cc': 'dd'})],
                'ee',
                ['ff', 
                    ['3', sh.storage({'name': 'nc'})]]
                ]
            ]
        ]

        indents = t_ctrl.indent(source)
        list_results = t_ctrl.indentsToList(indents)
        self.assertEqual(t_ctrl.toModel(list_results), target )
        self.assertEqual(t_ctrl.getIndentsLevel(indents), 4)
예제 #4
0
    def test_indentsToDict(self):
        source = '''
        aaa
            bb: BB
            cc: CC
        ddd
            ee:
                ff
            gg
            hh:
        ll
        '''

        
        target = sh.storage({
            'aaa': sh.storage({
                    'cc': 'CC',
                    'bb': 'BB'}),
            'ddd': sh.storage({
                    'ee': sh.storage({'ff': ''}), # toDict时,冒号可写可不写
                    'gg': '',
                    'hh': ''}),
            'll' : '',
            })


        indents = t_ctrl.indent(source)
        results = t_ctrl.indentsToDict(indents)
        self.assertEqual(results, target)
        self.assertEqual(type(results.aaa), sh.storage_class)

        # 测试contentToDict集合了indent和indentsToDict
        self.assertEqual(t_ctrl.contentToDict(source), target)
예제 #5
0
    def test_toModel_widthIndentList_4(self):
        source = '''
        1

            name: na
        2
            value: vb
        aa
            bb
                cc: dd
            ee
            ff
                3

                    name: nc
        '''

        target = [['1', sh.storage({'name': 'na'})],
                  ['2', sh.storage({'value': 'vb'})],
                  [
                      'aa',
                      [['bb', sh.storage({'cc': 'dd'})], 'ee',
                       ['ff', ['3', sh.storage({'name': 'nc'})]]]
                  ]]

        indents = t_ctrl.indent(source)
        list_results = t_ctrl.indentsToList(indents)
        self.assertEqual(t_ctrl.toModel(list_results), target)
        self.assertEqual(t_ctrl.getIndentsLevel(indents), 4)
예제 #6
0
 def test_update(self):
     '''更新头像内容'''
     user_model = self.model
     data = test_helper.storage({'username':'******', 'email':'*****@*****.**', 'password':'******', 'birthday':'1985-10-17'})
     data.imagefile = site_helper.storage({'filename':'sdjl.jpg', 'value':'shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!'})
     new_id   = user_model.insert(data)
     data.imagefile = site_helper.storage({'filename':'sdjl.jpg', 'value':'chou!chou!chou!chou!chou!chou!chou!chou!chou!chou!'})
     user_model.update(new_id, data)
     self.assertEqual(open('%s%d.jpg' % (site_helper.config.USER_COVER_PATH, new_id)).read().strip(), 'chou!chou!chou!chou!chou!chou!chou!chou!chou!chou!')
예제 #7
0
 def test_toModel_widthIndentDict_4(self):
     source = '1'
     target = sh.storage({
         '1': sh.storage({
             'name': 'n1',
             'SiteConfigid': 1L,
             'value': 'v1',
             'title': 't1',
             }),
     })
예제 #8
0
 def test_update_saveimage(self):
     '''更新的时候要替换原来的图片文件'''
     makeup_model = self.model
     db_helper = getDBHelper()
     data = test_helper.storage({'name':'面膜', 'cover_url':'/img/makeupreserve/cover/1.jpg' })
     data.imagefile = site_helper.storage({'filename':'c://sdjl.jpg', 'value':'liuyonghui'})
     new_makeup_id  = makeup_model.insert(data)
     data.imagefile = site_helper.storage({'filename':'c://wx.jpg', 'value':'wangxuan'})
     makeup_model.update(new_makeup_id, data)
     self.assertEqual(open('%s%d.jpg' % (site_helper.config.MAKEUP_COVER_PATH, new_makeup_id)).read().strip(), 'wangxuan')
예제 #9
0
    def test_toModel_widthIndentDict_1(self):
        source = '''
        1
            name: na
        2
            value: vb
            title: append title
        aa
            bb
                cc: dd

            ee
            ff:
                gg
            hh

                3
                    name: nc
        '''

        target = sh.storage({
            '1':
            sh.storage({
                'name': 'na',
                'SiteConfigid': 1L,
                'value': 'v1',
                'title': 't1',
            }),
            '2':
            sh.storage({
                'name': 'n2',
                'SiteConfigid': 2L,
                'value': 'vb',
                'title': 'append title',  # 也可以添加model columns之外的值
            }),
            'aa':
            sh.storage({
                'bb':
                sh.storage({'cc': 'dd'}),
                'ee':
                '',
                'ff':
                sh.storage({'gg': ''}),
                'hh':
                sh.storage({
                    '3':
                    sh.storage({
                        'name': 'nc',
                        'SiteConfigid': 3L,
                        'value': 'v3',
                        'title': 't3',
                    })
                })
            }),
        })
예제 #10
0
    def test_all(self):
        # 测试where
        id1 = db.insert(
            'insert into Image (data_name, data_id) values (%s, %s)',
            ('test_image', 123))
        env = sh.storage()
        env.where = ['data_name=%s and data_id=%s', ('test_image', 123)]
        self.assertEqual(image_model.all(env)[0].id, id1)

        # 测试where + select
        env.select = 'data_name'
        items = image_model.all(env)
        self.assertEqual(items[0].data_name, 'test_image')
        self.assertTrue(not items[0].has_key('data_id'))

        # 测试orderby
        id2 = db.insert(
            'insert into Image (data_name, data_id) values (%s, %s)',
            ('image2', 456))
        assert id2 > id1
        env = sh.storage(dict(orderby='Imageid desc'))
        items = image_model.all(env)
        self.assertTrue(items[0].id > items[1].id)

        # 测试limit
        env = sh.storage(dict(limit=[0, 1]))
        items = image_model.all(env)
        self.assertTrue(len(items) == 1)

        # 测试distinct
        id3 = db.insert(
            'insert into Image (data_name, data_id) values (%s, %s)',
            ('image2', 789))
        env = sh.storage(
            dict(distinct=True, where=['data_name=%s', ['image2']]))
        items = image_model.all(env)
        self.assertTrue(len(items) == 2)

        # 测试from + select
        uid = user_model.insert(
            dict(email='*****@*****.**',
                 name='sdjl',
                 password='******',
                 register_ip='127.0.0.1',
                 Imageid=id3))
        env = sh.storage()
        env['from'] = 'User u join Image i on u.Imageid=i.Imageid'
        env.select = 'u.email email, i.data_id data_id'
        env.where = ['email=%s', ['*****@*****.**']]
        items = image_model.all(env)
        self.assertTrue(len(items) == 1)
        self.assertEqual(items[0].email, '*****@*****.**')
        self.assertEqual(items[0].data_id, 789)
예제 #11
0
    def test_toModel_widthIndentDict_3(self):
        c_model = sh.model('Category')
        new_id_1 = c_model.insert({'data_name': 'd', 'name': 'n'})
        new_id_2 = c_model.insert({'data_name': 'd2', 'name': 'n2'})

        source = '''
        a
            id: 1
            model: SiteConfig
            name: na
        %d
            name: over write name
        %d
            name: forget id
            model: SiteConfig
        aa
            3
                id: 2
                model: SiteConfig
                name: nc
        ''' % (new_id_1, new_id_2)

        target = sh.storage({
            'a': sh.storage({ # 因为%d可能为1,但dict中要求key唯一,所以用a代替
                'SiteConfigid': 1L,
                'value': 'v1',
                'name': 'na',
                'title': 't1',
                }),
            str(new_id_1): sh.storage({
                'Categoryid': new_id_1, # 不显示指定model时,用default_model
                'data_name': 'd',
                'name': 'over write name',
                }),
            str(new_id_2): sh.storage({
                'Categoryid': new_id_2, # 必须同时指定model与id才认为是SiteConfig
                'data_name': 'd2',
                'name': 'forget id',
                'model': 'SiteConfig',
                }),
            'aa': sh.storage({
                    '3': sh.storage({
                        'SiteConfigid': 2L,
                        'value': 'v2',
                        'name': 'nc',
                        'title': 't2',
                    }),
                }),
        })
예제 #12
0
    def assignUserInfo(self, data, access_token):
        new_data = sh.copy(data) if data else sh.storage()
        exists = sh.model(self.MODEL_NAME).getByAccessToken(access_token)
        if not exists: return new_data

        res = sh.requestHtmlContent(self.USER_INFO_URL, (
            'access_token',
            access_token,
            'oauth_consumer_key',
            self.getAppID(),
            'uid',
            exists.uid,
        ))

        if not res: return new_data

        res = sh.loadsJson(res)

        if res.get('error_code', None): return new_data

        if not new_data.has_key('name'):
            new_data['name'] = res.screen_name

        if res.gender == 'm':
            new_data['sex'] = '他'
        elif res.gender == 'f':
            new_data['sex'] = '她'
        else:
            new_data['sex'] = '保密'

        image_file = sh.requestImageFile(res.avatar_large)
        if image_file:
            new_data['image_file'] = image_file

        return new_data
예제 #13
0
파일: EmptyModel.py 프로젝트: ajiexw/zarkpy
 def getEmptyData(self):
     data = sh.storage([(k, '') for k in self.model.column_names])
     for name, ct in self.getColumnTypes().items():
         if isinstance(ct, dict) and ct.has_key('default'):
             data[name] = ct.default
     data['__is_empty'] = True
     return data
예제 #14
0
파일: QQ.py 프로젝트: ajiexw/zarkpy
    def assignUserInfo(self, data, access_token):
        new_data = sh.copy(data) if data else sh.storage()
        exists = sh.model(self.MODEL_NAME).getByAccessToken(access_token)
        if not exists: return new_data

        res =  sh.requestHtmlContent(self.USER_INFO_URL, (
            'access_token', access_token,
            'oauth_consumer_key', self.getAppID(),
            'openid', exists.uid,
            'format', 'json',
        ))

        if not res: return new_data
        res = sh.loadsJson(res)
        if res.ret != 0: return new_data

        if not new_data.has_key('name'):
            new_data['name'] = res.nickname

        if res.gender == '男':
            new_data['sex'] = '他'
        elif res.gender == '女':
            new_data['sex'] = '她'

        image_file = sh.requestImageFile(res.figureurl_2)
        if image_file:
            new_data['image_file'] = image_file

        return new_data
예제 #15
0
 def test_update(self):
     image_modle = sh.model('Image')
     image_model.use_convert = False  # 不改变图片
     data = sh.storage({
         'data_name': 'User',
         'data_id': 1,
         image_model.image_key: test_image_data
     })
     id = image_model.insert(data)
     item = image_model.get(id)
     # 更新图片数据
     image_model.update(
         id, {
             'image_file': {
                 'filename': 'new',
                 'value': 'new',
                 'imagetype': 'png'
             },
             'data_id': 2
         })
     item2 = image_model.get(id)
     # 其它数据更新成功
     self.assertEqual(item2.data_id, 2)
     # url不变
     self.assertEqual(item.url, item2.url)
     # 图片数据不变
     image_path = image_modle.getFilePath(id)
     self.assertEqual(open(image_path).read(), test_image_data.value)
예제 #16
0
파일: Sina.py 프로젝트: ajiexw/zarkpy
    def assignUserInfo(self, data, access_token):
        new_data = sh.copy(data) if data else sh.storage()
        exists = sh.model(self.MODEL_NAME).getByAccessToken(access_token)
        if not exists: return new_data

        res =  sh.requestHtmlContent(self.USER_INFO_URL, (
            'access_token', access_token,
            'oauth_consumer_key', self.getAppID(),
            'uid', exists.uid,
        ))

        if not res: return new_data

        res = sh.loadsJson(res)

        if res.get('error_code', None): return new_data

        if not new_data.has_key('name'):
            new_data['name'] = res.screen_name

        if res.gender == 'm':
            new_data['sex'] = '他'
        elif res.gender == 'f':
            new_data['sex'] = '她'
        else:
            new_data['sex'] = '保密'

        image_file = sh.requestImageFile(res.avatar_large)
        if image_file:
            new_data['image_file'] = image_file

        return new_data
예제 #17
0
파일: QQ.py 프로젝트: lrbnew/zarkpy
    def assignUserInfo(self, data, access_token):
        new_data = sh.copy(data) if data else sh.storage()
        exists = sh.model(self.MODEL_NAME).getByAccessToken(access_token)
        if not exists: return new_data

        res = sh.requestHtmlContent(self.USER_INFO_URL, (
            'access_token',
            access_token,
            'oauth_consumer_key',
            self.getAppID(),
            'openid',
            exists.uid,
            'format',
            'json',
        ))

        if not res: return new_data
        res = sh.loadsJson(res)
        if res.ret != 0: return new_data

        if not new_data.has_key('name'):
            new_data['name'] = res.nickname

        if res.gender == '男':
            new_data['sex'] = '他'
        elif res.gender == '女':
            new_data['sex'] = '她'

        image_file = sh.requestImageFile(res.figureurl_2)
        if image_file:
            new_data['image_file'] = image_file

        return new_data
예제 #18
0
    def test_insert_convert(self):
        image_modle = sh.model('Image')
        image_model.use_convert = True # 改变图片
        image_model.convert_type = 'png'
        image_model.max_width = 50
        image_model.max_height = 60
        data = sh.storage({'data_name': 'User', 'data_id': 1, image_model.image_key: test_image_data})
        id = image_model.insert(data)
        item = image_model.get(id)
        image_path = sh.urlToPath(item.url)
        # 转换为png格式
        self.assertTrue(image_path.endswith('/%d.png' % (id)))
        self.assertEqual(imghdr.what(None, open(image_path).read()), 'png')
        # 压缩为50x50. 因为会保持原有比例,所以压缩后高度依然是50, 不是60
        self.assertEqual(Image.open(image_path).size, (50, 50))

        # 当max_height与max_width有其中之一为None时就不压缩
        image_model.max_height = None
        id2 = image_model.insert(data)
        item2 = image_model.get(id2)
        # 虽然不压缩尺寸,但是要转换格式
        image_path = sh.urlToPath(item2.url)
        self.assertTrue(image_path.endswith('/%d.png' % (id2)))
        # 依然是原来的尺寸
        self.assertEqual(Image.open(image_path).size, Image.open(test_image_data.filename).size)
예제 #19
0
 def getEmptyData(self):
     data = sh.storage([(k, '') for k in self.model.column_names])
     for name, ct in self.getColumnTypes().items():
         if isinstance(ct, dict) and ct.has_key('default'):
             data[name] = ct.default
     data['__is_empty'] = True
     return data
예제 #20
0
    def POST(self, inputs=None):
        if not inputs:
            inputs = sh.inputs()
        assert inputs.has_key("action")

        if inputs.action == "postImage":
            assert inputs.get("Userid", 0)
            assert sh.model("User").get(inputs.Userid)
            assert inputs.get("data_name", None)
            assert inputs.get("data_id", None)
            img_model = sh.model("UserImage")

            image_data = sh.getSwfUploadImageFile()

            new_id = img_model.insert(
                sh.storage(
                    dict(
                        image_file=image_data,
                        Userid=inputs.Userid,
                        file_name=image_data.filename,
                        data_name=inputs.data_name,
                        data_id=inputs.data_id,
                    )
                )
            )

            return "success;%d;%s;%s" % (new_id, img_model.getUrlByPrivate(inputs.Userid, new_id), image_data.filename)
예제 #21
0
파일: Login.py 프로젝트: lrbnew/zarkpy
    def GET(self):
        inputs = sh.inputs()
        assert (inputs.has_key('code'))
        assert (inputs.has_key('state'))

        site_name = inputs.state.partition('_')[0]
        authorization_code = inputs.code.strip()
        oauth_ctrl = sh.ctrl('oauth.%s' % site_name)
        oauth_model = sh.model('oauth.%sOAuth2' % site_name)
        user_ctrl = sh.ctrl('User')
        user_model = sh.model('User')

        token_url = oauth_ctrl.createAccessTokenUrl(authorization_code)
        content = sh.requestHtmlContent(token_url, None,
                                        oauth_ctrl.ACCESS_TOKEN_METHOD)
        assert content, u'第三方返回的数据有误'

        access_token, access_expires = oauth_ctrl.pickAccessTokenAndExpires(
            content)
        requested_uid = oauth_ctrl.requestUidWithAccessToken(access_token)
        assert requested_uid, u'第三方返回的数据有误'
        if self.TEST_API_LOGIN:
            login_url = '%s/api/oauth/login?access_token=%s&access_expires=%s&uid=%s&state=%s' % (
                sh.config.HOST_NAME, access_token, access_expires,
                requested_uid, inputs.state)
            return '<a href="%s" >%s</a>' % (login_url, login_url)

        # 因为access_token是动态变化的,所以要用requested_uid来判断是否登录过
        # 这也避免了access_token变化时插入重复的uid
        exists = oauth_model.getByUid(requested_uid)

        # 如果当前uid还没有插入数据库,则先插入再考虑绑定Userid
        if not exists:
            new_oauth_id = oauth_model.insert(
                dict(uid=requested_uid,
                     access_token=access_token,
                     access_expires=access_expires))
            exists = oauth_model.get(new_oauth_id)

        # 如果已绑定Userid则登录
        if exists.Userid:
            return self.login(exists.Userid)

        # 如果希望自动注册,则注册并绑定后登录
        if self.NO_REGISTER_ACTION == 'auto_register':
            data = oauth_ctrl.assignUserInfo(sh.storage(), access_token)
            self.assignRandomPassword(data)
            self.assignRegisterIP(data)
            conflict = user_ctrl.checkNewUser(data)
            if conflict:
                return self.redirectToRegister(access_token,
                                               inputs.state,
                                               error=conflict)

            new_user_id = user_model.insert(data)
            oauth_model.update(exists.id, dict(Userid=new_user_id))
            return self.login(new_user_id)
        # 否则希望用户自己注册
        elif self.NO_REGISTER_ACTION == 'to_register':
            return self.redirectToRegister(access_token, inputs.state)
예제 #22
0
    def test_toModel_widthIndentList_3(self):
        source = '''
        1
            name: na
        2
            value: vb

        aa
            bb
                cc: dd

            ee
            ff
                3
                    name: nc
        '''

        last_target = [
            'aa',
            [['bb', sh.storage({'cc': 'dd'})], 'ee',
             [
                 'ff',
                 sh.storage({
                     'name': 'nc',
                     'SiteConfigid': 3L,
                     'value': 'v3',
                     'title': 't3'
                 })
             ]]
        ]
예제 #23
0
    def test_indentsToList(self):
        source = '''
        aaa
            bb: BB
            cc: CC
        ddd
            ee
                ff
            gg
            hh:
                ii
                    jj: kk
        ll
        '''

        target = [
            ['aaa', sh.storage({
                'bb': 'BB',
                'cc': 'CC'
            })],
            [
                'ddd',
                [
                    ['ee', ['ff']],
                    'gg',
                    [
                        'hh:',  # toList时冒号不是可选的
                        [[
                            'ii',
                            sh.storage({  # dict(storage)仅会出现在叶子节点上
                                'jj': 'kk'
                            })
                        ]  # 出现key value对时转为dict
                         ]
                    ]
                ]
            ],
            'll'
        ]

        indents = t_ctrl.indent(source)
        results = t_ctrl.indentsToList(indents)
        self.assertEqual(results, target)
        self.assertEqual(type(results[0][1]), sh.storage_class)

        # 测试contentToList集合了indent和indentsToList
        self.assertEqual(t_ctrl.contentToList(source), target)
예제 #24
0
파일: Login.py 프로젝트: kevinhao/zarkpy
    def GET(self):
        inputs = sh.inputs()
        assert inputs.has_key("code")
        assert inputs.has_key("state")

        site_name = inputs.state.partition("_")[0]
        authorization_code = inputs.code.strip()
        oauth_ctrl = sh.ctrl("oauth.%s" % site_name)
        oauth_model = sh.model("oauth.%sOAuth2" % site_name)
        user_ctrl = sh.ctrl("User")
        user_model = sh.model("User")

        token_url = oauth_ctrl.createAccessTokenUrl(authorization_code)
        content = sh.requestHtmlContent(token_url, None, oauth_ctrl.ACCESS_TOKEN_METHOD)
        assert content, u"第三方返回的数据有误"

        access_token, access_expires = oauth_ctrl.pickAccessTokenAndExpires(content)
        requested_uid = oauth_ctrl.requestUidWithAccessToken(access_token)
        assert requested_uid, u"第三方返回的数据有误"
        if self.TEST_API_LOGIN:
            login_url = "%s/api/oauth/login?access_token=%s&access_expires=%s&uid=%s&state=%s" % (
                sh.config.HOST_NAME,
                access_token,
                access_expires,
                requested_uid,
                inputs.state,
            )
            return '<a href="%s" >%s</a>' % (login_url, login_url)

        # 因为access_token是动态变化的,所以要用requested_uid来判断是否登录过
        # 这也避免了access_token变化时插入重复的uid
        exists = oauth_model.getByUid(requested_uid)

        # 如果当前uid还没有插入数据库,则先插入再考虑绑定Userid
        if not exists:
            new_oauth_id = oauth_model.insert(
                dict(uid=requested_uid, access_token=access_token, access_expires=access_expires)
            )
            exists = oauth_model.get(new_oauth_id)

        # 如果已绑定Userid则登录
        if exists.Userid:
            return self.login(exists.Userid)

        # 如果希望自动注册,则注册并绑定后登录
        if self.NO_REGISTER_ACTION == "auto_register":
            data = oauth_ctrl.assignUserInfo(sh.storage(), access_token)
            self.assignRandomPassword(data)
            self.assignRegisterIP(data)
            conflict = user_ctrl.checkNewUser(data)
            if conflict:
                return self.redirectToRegister(access_token, inputs.state, error=conflict)

            new_user_id = user_model.insert(data)
            oauth_model.update(exists.id, dict(Userid=new_user_id))
            return self.login(new_user_id)
        # 否则希望用户自己注册
        elif self.NO_REGISTER_ACTION == "to_register":
            return self.redirectToRegister(access_token, inputs.state)
예제 #25
0
 def test_getUrl_getFilePath(self):
     image_modle = sh.model('Image')
     image_model.use_convert = False
     data = sh.storage({'data_name': 'User', 'data_id': 1, image_model.image_key: test_image_data})
     id = image_model.insert(data)
     item = image_model.get(id)
     self.assertEqual(item.url, image_model.getUrl(id))
     self.assertEqual(sh.urlToPath(item.url), image_model.getFilePath(id))
예제 #26
0
파일: OAuth2.py 프로젝트: ajiexw/old-zarkpy
 def requestImageFile(self, url):
     response, content =  self.getHtmlContent(url)
     if response.status == 200:
         ret_image_file = site_helper.storage()
         ret_image_file.filename = url + '.jpeg'
         ret_image_file.value = content
         return ret_image_file
     else:
         return None
예제 #27
0
 def test_getCount(self):
     db.insert('insert into Image (data_name, data_id) values (%s, %s)',
               ('test_image', 123))
     db.insert('insert into Image (data_name, data_id) values (%s, %s)',
               ('test_image', 123))
     db.insert('insert into Image (data_name, data_id) values (%s, %s)',
               ('test_image', 456))
     env = sh.storage(dict(where=['data_id=%s', 123]))
     self.assertEqual(image_model.getCount(env), len(image_model.all(env)))
예제 #28
0
 def test_noneToEmpty(self):
     item = user_model.noneToEmpty(None)
     # 所有出现在column_names中的字段都为''
     self.assertTrue(all([item.get(k) == '' for k in user_model.column_names]))
     # 可以通过__is_empty来判断是否为空数据
     self.assertTrue(item.get('__is_empty') is True)
     # noneToEmpty也可以传入data列表, 只有is None时才返回Empty
     items = user_model.noneToEmpty([{}, None, sh.storage()])
     self.assertTrue(items[0].get('__is_empty', False) is False)
     self.assertTrue(items[1].get('__is_empty', False) is True)
     self.assertTrue(items[2].get('__is_empty', False) is False)
예제 #29
0
 def test_insert(self):
     '''保存图片, 验证加密方式, 生日格式'''
     user_model = self.model
     data = test_helper.storage({'username':'******', 'email':'*****@*****.**', 'password':'******', 'birthday':'1985-10-17'})
     data.imagefile = site_helper.storage({'filename':'sdjl.jpg', 'value':'shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!'})
     new_id   = user_model.insert(data)
     new_user = getDBHelper().fetchOne('select * from '+user_model.table_name+' where '+user_model.primary_key+'=%s',new_id)
     self.assertEqual(new_user.password, 'dab61a7c59b7d5f2e9fd22c85f6aa03c') # 不允许改变加密方式
     self.assertEqual(new_user.cover_url, '%s%d.jpg' % (site_helper.config.USER_COVER_URL, new_id)) # 保存图片
     self.assertEqual(open('%s%d.jpg' % (site_helper.config.USER_COVER_PATH, new_id)).read().strip(), 'shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!shuai!')
     self.assertEqual(new_user.birthday, date(1985,10,17) )
예제 #30
0
    def test_insert_saveimage(self):
        '''插入makeup时, 如果有imagefile,就把文件保存在config.MAKEUP_COVER_PATH中, 并且以Makeupid命名, 修改cover_url指向图片文件'''
        makeup_model = self.model
        db_helper = getDBHelper()
        data = test_helper.storage({'name':'面膜', 'cover_url':'/img/makeupreserve/cover/1.jpg' })
        data.imagefile = site_helper.storage({'filename':'c://sdjl.jpg', 'value':'liuyonghui'})
        new_makeup_id = makeup_model.insert(data)

        self.assertTrue(os.path.exists('%s%d.jpg' % (site_helper.config.MAKEUP_COVER_PATH, new_makeup_id)))
        self.assertEqual(db_helper.fetchFirst('select cover_url from Makeup where Makeupid=%s', new_makeup_id), site_helper.config.MAKEUP_COVER_URL+str(new_makeup_id)+'.jpg')
        self.assertEqual(open('%s%d.jpg' % (site_helper.config.MAKEUP_COVER_PATH, new_makeup_id)).read().strip(), 'liuyonghui')
예제 #31
0
 def test_delete(self):
     my_id = self.register()
     # 插入图片并得到UserImageid
     data = sh.storage(dict(action = 'postImage', Userid = my_id, data_name='None', data_id=2))
     data.Filedata = open(test_image_path).read()
     data.Filename = 'good_image.jpg'
     new_img_id = int(self.post(api_url, data).split(';')[1])
     self.assertEqual(self.proxyDo(ui_model.get, new_img_id).deleted, 'no')
     # 使用delete删除图片
     self.get(api_url, dict(action='delete', UserImageid=new_img_id))
     self.assertIsNone(self.proxyDo(ui_model.get, new_img_id))
예제 #32
0
파일: TestModel.py 프로젝트: ajiexw/note
    def test_all(self):
        # 测试where
        id1 = db.insert('insert into Image (data_name, data_id) values (%s, %s)', ('test_image', 123))
        env = sh.storage()
        env.where = ['data_name=%s and data_id=%s', ('test_image', 123)]
        self.assertEqual(image_model.all(env)[0].id, id1)

        # 测试where + select
        env.select = 'data_name'
        items = image_model.all(env)
        self.assertEqual(items[0].data_name, 'test_image')
        self.assertTrue(not items[0].has_key('data_id'))

        # 测试orderby
        id2 = db.insert('insert into Image (data_name, data_id) values (%s, %s)', ('image2', 456))
        assert id2 > id1
        env = sh.storage(dict(orderby='Imageid desc'))
        items = image_model.all(env)
        self.assertTrue(items[0].id > items[1].id)

        # 测试limit
        env = sh.storage(dict(limit=[0, 1]))
        items = image_model.all(env)
        self.assertTrue(len(items) == 1)

        # 测试distinct
        id3 = db.insert('insert into Image (data_name, data_id) values (%s, %s)', ('image2', 789))
        env = sh.storage(dict(distinct=True, where=['data_name=%s', ['image2']]))
        items = image_model.all(env)
        self.assertTrue(len(items) == 2)

        # 测试from + select
        uid = user_model.insert(dict(email='*****@*****.**', name='sdjl', password='******', register_ip='127.0.0.1', Imageid=id3))
        env = sh.storage()
        env['from'] = 'User u join Image i on u.Imageid=i.Imageid'
        env.select = 'u.email email, i.data_id data_id'
        env.where = ['email=%s', ['*****@*****.**']]
        items = image_model.all(env)
        self.assertTrue(len(items) == 1)
        self.assertEqual(items[0].email, '*****@*****.**')
        self.assertEqual(items[0].data_id, 789)
예제 #33
0
 def test_noneToEmpty(self):
     item = user_model.noneToEmpty(None)
     # 所有出现在column_names中的字段都为''
     self.assertTrue(
         all([item.get(k) == '' for k in user_model.column_names]))
     # 可以通过__is_empty来判断是否为空数据
     self.assertTrue(item.get('__is_empty') is True)
     # noneToEmpty也可以传入data列表, 只有is None时才返回Empty
     items = user_model.noneToEmpty([{}, None, sh.storage()])
     self.assertTrue(items[0].get('__is_empty', False) is False)
     self.assertTrue(items[1].get('__is_empty', False) is True)
     self.assertTrue(items[2].get('__is_empty', False) is False)
예제 #34
0
파일: AppTest.py 프로젝트: shaqhuang/zarkpy
 def post(self, url, params={}, extra_environ = None):
     assert(isinstance(params, (dict, web.Storage)))
     # 为webpy添加REQUEST_URI环境变量
     environ = {'REQUEST_URI': url, 'CONTENT_TYPE': 'text/plain; charset=utf-8', }
     if extra_environ:
         environ.update(extra_environ)
     if not isinstance(params, web.Storage):
         params = sh.storage(params)
     # hack for use paste.fixture module test app.py
     environ['wsgi.input.zarkpy.post.hack'] = params
     res = app.post(url, params, extra_environ=environ, expect_errors=True)
     return self._processResponse(res)
예제 #35
0
파일: Share.py 프로젝트: ajiexw/old-zarkpy
 def _getOAuthStatus(self, user_id):
     oauth_status = site_helper.storage({})
     for site, model_name in [('qq', 'oauth.QQOAuth2'), ('sina', 'oauth.SinaOAuth2'), ('renren', 'oauth.RenRenOAuth2'),]:
         model = getModel(model_name)
         item = model.getsByUserid(user_id)
         if not item:
             oauth_status[site] = 'no binding'
         elif self._isOverdue(item[0].updated, item[0].access_expires):
             oauth_status[site] = 'expires'
         else:
             oauth_status[site] = 'enable'
     return oauth_status
예제 #36
0
    def POST(self,i=None):
        if i is None: i= web.input(imagefile={})
        assert(i.has_key('imagefile'))
        if '.' in i.imagefile.filename and len(i.imagefile.value)>10:
            i.imagefile = site_helper.storage({'filename':i.imagefile.filename, 'value':i.imagefile.value})
            upload_filetype = i.imagefile.filename.rpartition('.')[2]
            assert(upload_filetype.lower() in ['jpg','png','gif','jpeg'])
            new_id = site_helper.getModel('Image').insert(i)

            return site_helper.editor_render_nobase.tinymce.imagemanager_insertcallback('<img src="%s%d.%s" />' % (site_helper.config.UPLOAD_IMAGE_URL, new_id, upload_filetype))
        else:
            return page_helper.close()
예제 #37
0
파일: AppTest.py 프로젝트: ajiexw/note
 def post(self, url, params={}, extra_environ = None):
     assert(isinstance(params, (dict, web.Storage)))
     # 为webpy添加REQUEST_URI环境变量
     environ = {'REQUEST_URI': url, 'CONTENT_TYPE': 'text/plain; charset=utf-8', }
     if extra_environ:
         environ.update(extra_environ)
     if not isinstance(params, web.Storage):
         params = sh.storage(params)
     # hack for use paste.fixture module test app.py
     environ['wsgi.input.note.post.hack'] = params
     res = app.post(url, params, extra_environ=environ, expect_errors=True)
     return self._processResponse(res)
예제 #38
0
 def test_ignore_convert_image(self):
     image_modle = sh.model('Image')
     image_model.use_convert = True
     image_model.convert_type = 'png'
     image_model.max_width  = 50
     image_model.max_height = 60
     data = sh.storage({'data_name': 'User', 'data_id': 1, image_model.image_key: test_image_data})
     data['__ignore_convert_image'] = True
     id = image_model.insert(data)
     item = image_model.get(id)
     image_path = sh.urlToPath(item.url)
     # 保存的文件数据与测试数据一致, 文件没有被convert
     self.assertEqual(open(image_path).read(), test_image_data.value)
예제 #39
0
    def test_indentsToDict_addIndex(self):
        source = '''
        aaa
            bb: BB
            cc: CC
        ddd
            ee
                ff
            gg
            hh:
        ll
        '''

        target = sh.storage({
            '__index':
            0,
            'aaa':
            sh.storage({
                '__index': 1,
                'cc': 'CC',
                'bb': 'BB'
            }),
            'ddd':
            sh.storage({
                '__index': 2,
                'ee': sh.storage({
                    '__index': 3,
                    'ff': ''
                }),
                'gg': '',
                'hh': ''
            }),  # toDict时,key后面的冒号可有可无
            'll':
            '',
        })

        indents = t_ctrl.indent(source)
        results = t_ctrl.indentsToDict(indents, add_index=True)
        self.assertEqual(results, target)
예제 #40
0
    def test_indentsToList(self):
        source = '''
        aaa
            bb: BB
            cc: CC
        ddd
            ee
                ff
            gg
            hh:
                ii
                    jj: kk
        ll
        '''

        target = [
            ['aaa', sh.storage({
                'bb': 'BB',
                'cc': 'CC'})],
            ['ddd', [
                ['ee', 
                    ['ff']],
                'gg',
                ['hh:', # toList时冒号不是可选的
                    [['ii', sh.storage({ # dict(storage)仅会出现在叶子节点上
                        'jj': 'kk'})] # 出现key value对时转为dict
                    ]
                ]]
            ],
            'll'
        ]

        indents = t_ctrl.indent(source)
        results = t_ctrl.indentsToList(indents)
        self.assertEqual(results, target)
        self.assertEqual(type(results[0][1]), sh.storage_class)

        # 测试contentToList集合了indent和indentsToList
        self.assertEqual(t_ctrl.contentToList(source), target)
예제 #41
0
파일: Update.py 프로젝트: ajiexw/old-zarkpy
    def POST(self,i=None):
        if i is None: i = web.input(imagefile={})
        if i.has_key('imagefile'):
            if i.imagefile=={}:
                del i.imagefile
            else:
                i.imagefile = site_helper.storage({'filename':i.imagefile.filename, 'value':i.imagefile.value})

        assert(i.has_key('model_name'))
        assert(i.has_key('model_id'))
        model = site_helper.getModel(i.model_name)
        model.update(int(i.model_id),i)

        page_helper.refresh()
예제 #42
0
    def test_indentsToDict(self):
        source = '''
        aaa
            bb: BB
            cc: CC
        ddd
            ee:
                ff
            gg
            hh:
        ll
        '''

        target = sh.storage({
            'aaa':
            sh.storage({
                'cc': 'CC',
                'bb': 'BB'
            }),
            'ddd':
            sh.storage({
                'ee': sh.storage({'ff': ''}),  # toDict时,冒号可写可不写
                'gg': '',
                'hh': ''
            }),
            'll':
            '',
        })

        indents = t_ctrl.indent(source)
        results = t_ctrl.indentsToDict(indents)
        self.assertEqual(results, target)
        self.assertEqual(type(results.aaa), sh.storage_class)

        # 测试contentToDict集合了indent和indentsToDict
        self.assertEqual(t_ctrl.contentToDict(source), target)
예제 #43
0
파일: List.py 프로젝트: saturnisbig/zarkpy
    def _getEnv(self, model, menu_config):
        inputs = sh.inputs()
        env = sh.storage(dict(paging=True))
        env.orderby = model.replaceAttr(menu_config.orderby  \
                if menu_config.orderby else '{$primary_key} desc')

        if inputs.get('action', '') == 'search':
            where = []
            argvs = []
            for query in sh.splitAndStrip(inputs.query):
                where.append('('+ ' or '.join([c+' like %s' for c in menu_config.search]) +')')
                argvs += ['%'+query+'%'] * len(menu_config.search)
            env.where = [' and '.join(where)] + argvs

        return env
예제 #44
0
    def test_toModel_widthIndentList_3(self):
        source = '''
        1
            name: na
        2
            value: vb

        aa
            bb
                cc: dd

            ee
            ff
                3
                    name: nc
        '''

        last_target = [
            'aa',
                [['bb', sh.storage({'cc': 'dd'})],
                  'ee',
                  ['ff', sh.storage({'name': 'nc',  'SiteConfigid': 3L,  'value': 'v3', 'title': 't3'})]
                ]
        ]
예제 #45
0
파일: Insert.py 프로젝트: ajiexw/old-zarkpy
    def POST(self,i=None):
        if i is None: i = web.input(imagefile={}) #记得在form中添加 enctype="multipart/form-data" 

        if i.has_key('imagefile'):
            if (not hasattr(i.imagefile, 'filename')) or len(i.imagefile.filename)==0 or len(i.imagefile.value) < 10:
                del i.imagefile
            else:
                i.imagefile = site_helper.storage({'filename':i.imagefile.filename, 'value':i.imagefile.value})

        assert(i.has_key('model_name'))
        model = site_helper.getModel(i.model_name)

        new_id = model.insert(i)

        return page_helper.refresh()
예제 #46
0
    def test_toModel_widthIndentDict_1(self):
        source = '''
        1
            name: na
        2
            value: vb
            title: append title
        aa
            bb
                cc: dd

            ee
            ff:
                gg
            hh

                3
                    name: nc
        '''

        target = sh.storage({
            '1': sh.storage({
                'name': 'na',
                'SiteConfigid': 1L,
                'value': 'v1',
                'title': 't1',
                }),
            '2': sh.storage({
                'name': 'n2',
                'SiteConfigid': 2L,
                'value': 'vb',
                'title': 'append title', # 也可以添加model columns之外的值
                }),
            'aa': sh.storage({
                'bb': sh.storage({'cc': 'dd'}),
                'ee': '',
                'ff': sh.storage({'gg': ''}),
                'hh': sh.storage({
                    '3': sh.storage({
                        'name': 'nc',
                        'SiteConfigid': 3L,
                        'value': 'v3',
                        'title': 't3',
                    })})
                }),
        })
예제 #47
0
 def test_insert_savesuccess(self):
     image_modle = sh.model('Image')
     image_model.use_convert = False # 不改变图片
     data = sh.storage({'data_name': 'User', 'data_id': 1,
         image_model.image_key: test_image_data})
     id = image_model.insert(data)
     item = image_model.get(id)
     # 访问路径以sh.config.UPLOAD_IMAGE_URL开头
     self.assertTrue(item.url.startswith(sh.config.UPLOAD_IMAGE_URL))
     image_path = sh.urlToPath(item.url)
     self.assertEqual(item.url, sh.pathToUrl(image_path)) # urlToPath和pathToUrl可互转
     # 用数据id命名, 并保持相同后缀
     self.assertTrue(image_path.endswith('/%d.%s' % (id, test_image_data.imagetype)))
     # 保存的文件数据与测试数据一致
     self.assertTrue(os.path.exists(image_path))
     self.assertEqual(open(image_path).read(), test_image_data.value)
예제 #48
0
 def test_noneToEmpty(self):
     item = user_model.noneToEmpty(None)
     # 所有出现在column_names中的字段都为''
     for name, ct in user_model.getColumnTypes().items():
         if name[0] != '_':
             if ct.has_key('default'):
                 self.assertEqual(item.get(name), ct.default)
             else:
                 self.assertEqual(item.get(name), '')
     # 可以通过__is_empty来判断是否为空数据
     self.assertTrue(item.get('__is_empty') is True)
     # noneToEmpty也可以传入data列表, 只有is None时才返回Empty
     items = user_model.noneToEmpty([{}, None, sh.storage()])
     self.assertTrue(items[0].get('__is_empty', False) is False)
     self.assertTrue(items[1].get('__is_empty', False) is True)
     self.assertTrue(items[2].get('__is_empty', False) is False)
예제 #49
0
 def test_postImage(self):
     my_id = self.register()
     # 因为flash不能传webpy_session_id,所以这里自己指定Userid,这是一个安全隐患!
     data = sh.storage(dict(action = 'postImage', Userid = my_id, data_name='None', data_id=1))
     data.Filedata = open(test_image_path).read()
     data.Filename = 'good_image.jpg'
     # 返回结果分别表示: 成功、UserImageid、url、文件名
     res = self.post(api_url, data).split(';')
     self.assertEqual(res[0], 'success') # 验证插入成功
     self.assertEqual(res[3], 'good_image') # 验证图片文件名
     new_img_id = int(res[1]) # 得到UserImage的private_id
     # 验证图片url, 图片url中的id不是private_id
     UserImageid = self.proxyDo(ui_model.get, new_img_id).UserImageid
     url = '%s%d/%d.jpeg' % (sh.config.USER_IMAGE_URL, my_id, UserImageid)
     self.assertEqual(res[2], url)
     img = self.proxyDo(ui_model.get, new_img_id)
     self.assertEqual(img.url, url)
예제 #50
0
        def _toModel(ld):

            if isinstance(ld, str):
                ld = ld.strip()
                if ld.isdigit() and default_model:
                    return default_model.get(ld)
                else:
                    return ld
            elif isinstance(ld, (dict, sh.storage_class)) \
                    and ld.has_key('model') and ld.has_key('id') and ld.id.isdigit():
                 item = sh.model(ld.model).get(ld.id)
                 del ld['model'], ld['id']
                 if item: item.update(ld)
                 return item
            elif isinstance(ld, (list, tuple)) and len(ld) == 2 \
                    and isinstance(ld[0], str) \
                    and ld[0].isdigit() and default_model \
                    and isinstance(ld[1], (dict, sh.storage_class)):
                item = default_model.get(ld[0])
                if item: item.update(ld[1])
                return item
            elif isinstance(ld, list):
                items = map(_toModel, ld)
                return items if len(items) > 1 else items[0]
            elif hasattr(ld, 'items'):
                ret_dict = sh.storage()
                for k, v in ld.items():
                    k = k.strip()
                    if k.isdigit() and hasattr(v, 'items') \
                            and (default_model
                                or (v.has_key('model') and v.has_key('id')) 
                            ):
                        if v.has_key('model') and v.has_key('id'):
                            item = sh.model(v.model).get(v.id)
                            del v['model'], v['id']
                        else:
                            item = default_model.get(k)
                        if item: item.update(v)
                        ret_dict[k] = item
                    elif k.isdigit() and v == '' and default_model:
                        ret_dict[k] = default_model.get(k)
                    else:
                        ret_dict[k] = _toModel(v)
                return ret_dict
            else:
                raise u'未知的情况'
예제 #51
0
 def _indentsToList(key, values):
     if not values:
         if ':' not in key:
             return str(key)
         else:
             a,b,c = key.partition(':')
             return [a.strip(), c.strip()]
     else:
         ret_list = []
         ret_dict = sh.storage()
         for a,b in values:
             sub = _indentsToList(a, b)
             if not b and isinstance(sub, list) and len(sub) == 2:
                 ret_dict[sub[0]] = sub[1]
             else:
                 ret_list.append(sub)
         return [key, ret_dict] if ret_dict else [key, ret_list]
예제 #52
0
 def fetchOne(self, query_string, argv=(), ignore_assert=False):
     '''return a dict'''
     if not ignore_assert:
         assert ('select' in query_string.lower())
         assert (' limit ' not in query_string.lower())
     query_string += ' limit 1'
     cursor = self.db_dict.cursor()
     try:
         cursor.execute(query_string, argv)
     except:
         print 'query string is:', query_string
         print 'argv are:', argv
         raise
     one = cursor.fetchone()
     if one is not None:
         one = sh.storage(self._toUtf8(one))
     return one
예제 #53
0
 def _indentsToDict(key, values):
     if len(values) == 0:
         if ':' not in key:
             return str(key.strip())
         else:
             a,b,c = key.partition(':')
             return [a, c.strip()]
     else:
         ret_dict = {} if not add_index else {'__index': _indentsToDict._index}
         ret_dict = sh.storage(ret_dict)
         _indentsToDict._index += 1
         for a,b in values:
             sub = _indentsToDict(a, b)
             if isinstance(sub, str):
                 ret_dict[sub] = ''
             elif isinstance(sub, list):
                 ret_dict[sub[0]] = sub[1]
             else:
                 ret_dict[a.rstrip(':')] = sub
         return ret_dict
예제 #54
0
파일: List.py 프로젝트: lrbnew/zarkpy
    def _getEnv(self, model, menu_config):
        inputs = sh.inputs()
        env = sh.storage(dict(paging=True))
        env.orderby = model.replaceAttr(menu_config.orderby  \
                if menu_config.orderby else '{$primary_key} desc')

        if inputs.get('where', ''):
            env.where = [sh.unquote(inputs.where)]

        if inputs.get('action', '') == 'search':
            where = []
            argvs = []
            for query in sh.splitAndStrip(inputs.query):
                where.append(
                    '(' +
                    ' or '.join([c + ' like %s'
                                 for c in menu_config.search]) + ')')
                argvs += ['%' + query + '%'] * len(menu_config.search)
            env.where = [' and '.join(where)] + argvs

        return env
예제 #55
0
    def test_toModel_widthIndentDict_2(self):
        source = '''
        1
            name: na
        2
            value: vb
        aa
            bb
                cc: dd

            ee
            ff:
                gg
            hh

                3
                    name: nc
        '''

        target = sh.storage({
            '1': sh.storage({'name': 'na'}),
            '2': sh.storage({'value': 'vb'}),
            'aa': sh.storage({ # dict(storage)可以出现在非叶子节点
                'bb': sh.storage({'cc': 'dd'}),
                'ee': '',
                'ff': sh.storage({'gg': ''}),
                'hh': sh.storage({
                    '3': sh.storage({
                        'name': 'nc'})
                }),
            }),
        })

        indents = t_ctrl.indent(source)
        dict_results = t_ctrl.indentsToDict(indents)
        items = t_ctrl.toModel(dict_results)
        self.assertEqual(items, target)
        self.assertEqual(t_ctrl.getIndentsLevel(indents), 4)
예제 #56
0
    def GET(self, name):
        inputs = sh.inputs()
        menu_config = sh.ctrl('Editor').getMenuConfig()
        # 禁止访问未公开的路径
        if not menu_config: return sh.redirectTo404()

        model = sh.model('SiteConfig')
        env = sh.storage()

        if menu_config.get('filter', None):
            env['where'] = ['name like %s', menu_config['filter']]

        if menu_config.get('orderby', None):
            env.orderby = model.replaceAttr(menu_config.orderby)

        if inputs.get('where', ''):
            env.where = [inputs.where]

        items = model.all(env)
        pagination_html = model.getPaginationHtml(env)

        return sh.editor.SiteConfig(items, pagination_html, menu_config)