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', }) ] ] ]
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)
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)
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)
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)
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!')
def test_toModel_widthIndentDict_4(self): source = '1' target = sh.storage({ '1': sh.storage({ 'name': 'n1', 'SiteConfigid': 1L, 'value': 'v1', 'title': 't1', }), })
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')
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', }) }) }), })
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)
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', }), }), })
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
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
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
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)
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)
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)
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)
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' }) ]] ]
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)
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)
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))
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
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)))
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)
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) )
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')
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))
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)
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)
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)
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
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()
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)
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)
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)
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)
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()
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)
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
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'})] ] ]
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()
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', })}) }), })
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)
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)
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)
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'未知的情况'
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]
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
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
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
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)
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)