diff options
author | pzread <netfirewall@gmail.com> | 2013-06-29 01:51:58 +0800 |
---|---|---|
committer | pzread <netfirewall@gmail.com> | 2013-06-29 01:51:58 +0800 |
commit | 9542c558b71107e542e54d98ebdd8087f9446eb8 (patch) | |
tree | 2bd46fb90a1d35738c79ff27fccbc679c8706a0b | |
parent | b2ac7286c8ed3267b257f7ec88aa739a134089d8 (diff) | |
download | taiwan-online-judge-9542c558b71107e542e54d98ebdd8087f9446eb8.tar.gz taiwan-online-judge-9542c558b71107e542e54d98ebdd8087f9446eb8.tar.zst taiwan-online-judge-9542c558b71107e542e54d98ebdd8087f9446eb8.zip |
Fix several bugs
-rw-r--r-- | src/css/index.less | 3 | ||||
-rw-r--r-- | src/css/manage_square.less | 12 | ||||
-rw-r--r-- | src/css/square.less | 4 | ||||
-rw-r--r-- | src/html/manage_index.html | 0 | ||||
-rw-r--r-- | src/html/manage_square.html | 48 | ||||
-rw-r--r-- | src/js/com.js | 135 | ||||
-rw-r--r-- | src/js/mail.js | 4 | ||||
-rw-r--r-- | src/js/manage.js | 333 | ||||
-rw-r--r-- | src/js/mod.js | 18 | ||||
-rw-r--r-- | src/js/square.js | 30 | ||||
-rwxr-xr-x | src/py/backend_server.py | 34 | ||||
-rwxr-xr-x | src/py/center_server.py | 58 | ||||
-rwxr-xr-x | src/py/imc/proxy.py | 14 | ||||
-rw-r--r-- | src/py/mail.py | 18 | ||||
-rwxr-xr-x | src/py/netio.py | 25 | ||||
-rw-r--r-- | src/py/square.py | 151 | ||||
-rwxr-xr-x | src/py/tojauth.py | 72 | ||||
-rwxr-xr-x | src/py/user.py | 24 |
18 files changed, 722 insertions, 261 deletions
diff --git a/src/css/index.less b/src/css/index.less index 83885ba..8d268ac 100644 --- a/src/css/index.less +++ b/src/css/index.less @@ -14,9 +14,10 @@ body{ left:0px; opacity:0; transition:opacity @fast; + overflow-y:hidden; &.active{ - height:40px; + height:41px; opacity:1; display:block; } diff --git a/src/css/manage_square.less b/src/css/manage_square.less index 5e06355..b4f5921 100644 --- a/src/css/manage_square.less +++ b/src/css/manage_square.less @@ -2,17 +2,25 @@ @import 'mixin.less'; #index_page{ - div.set{ + div.create,div.set{ div.modal-body{ - min-height:384px; + min-height:320px; img.logo{ width:96px; } } } + div.oper{ + text-align:center; + } table.list{ tr.item{ + td.time{ + div.time{ + height:12px; + } + } td.cate{ span.label{ margin-right:@SmallPad; diff --git a/src/css/square.less b/src/css/square.less index 022f9e4..ccd2e6a 100644 --- a/src/css/square.less +++ b/src/css/square.less @@ -23,9 +23,11 @@ box-shadow:0px 0px 6px 0px fade(@black,30%); position:relative; - img.logo{ + div.logo{ + width:108px; height:108px; margin-right:@SmallPad; + background-size:cover; float:left; } div.time{ diff --git a/src/html/manage_index.html b/src/html/manage_index.html new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/html/manage_index.html diff --git a/src/html/manage_square.html b/src/html/manage_square.html index b457b34..1f83dbc 100644 --- a/src/html/manage_square.html +++ b/src/html/manage_square.html @@ -1,5 +1,37 @@ <link href="/toj/css/manage_square.css" rel="stylesheet"> +<div class="modal hide fade small_modal create"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h3>建立方塊</h3> + </div> + <div class="modal-body container-fluid"> + <div class="row-fluid"> + <div class="span6"> + <label>方塊名稱</label> + <input name="title" type="text"> + <label>方塊介紹</label> + <input name="intro" type="text"> + <label>方塊圖片</label> + <input name="logo" type="text"> + <img class="img-polaroid hide logo"></img> + </div> + <div class="span7"> + <label>公開狀態</label> + <select name="hidden"> + <option value=0>顯示</option> + <option value=1>隱藏</option> + </select> + <label>分類</label> + <div class="catebox"></div> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-primary submit">確定</button> + <button class="btn cancel">取消</button> + </div> +</div> <div class="modal hide fade small_modal set"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> @@ -22,31 +54,27 @@ <option value=0>顯示</option> <option value=1>隱藏</option> </select> - <label>開始時間</label> - <div class="start"></div> - <label>結束時間</label> - <div class="end"></div> <label>分類</label> <div class="catebox"></div> </div> </div> </div> <div class="modal-footer"> - <button class="btn btn-primary">確定</button> - <button class="btn">取消</button> + <button class="btn btn-primary submit">確定</button> + <button class="btn cancel">取消</button> </div> </div> <div class="row clearfix"> - <div class="span2 offset1"> - sdf + <div class="span2 offset1 oper"> + <button class="btn create">建立方塊</button> </div> - <table class="span8 table table-hover list"> + <table class="span9 table table-hover list"> <thead> <tr> <th class="span1">#</th> <th class="span3">名稱</th> - <th class="span1">狀態</th> + <th class="span2">時間</th> <th class="span2">分類</th> <th class="span1"></th> </tr> diff --git a/src/js/com.js b/src/js/com.js index cab3928..f4f9612 100644 --- a/src/js/com.js +++ b/src/js/com.js @@ -188,6 +188,15 @@ var com = new function(){ return false; } } + $.fn.tagbox = function(option){ + var tagbox = this.data('tagbox'); + + if(option != undefined){ + tagbox = that.create_tagbox(this,option.words,option.restrict,option.duplicate); + } + + return tagbox; + } }; that.url_push = function(url){ @@ -606,14 +615,14 @@ var com = new function(){ off = (curr - 1) * step; } offs.push(off); - j_li.attr('off',off); + j_li.data('off',off); j_ul.append(j_li); for(i = start;i <= end;i++){ j_li = $('<li><a href=""></a></li>'); off = i * step; offs.push(off); - j_li.attr('off',off); + j_li.data('off',off); j_li.find('a').text(i + 1); if(i == curr){ @@ -639,7 +648,7 @@ var com = new function(){ off = (curr + 1) * step; } offs.push(off); - j_li.attr('off',off); + j_li.data('off',off); j_ul.append(j_li); return offs; @@ -660,7 +669,9 @@ var com = new function(){ var j_input; var j_menu; var last_text = ''; + var hide = true; var show = false; + var tagboxo; function _resize(){ var j_tag; @@ -714,7 +725,7 @@ var com = new function(){ dup = new Object(); spans = j_box.find('span.tag'); for(i = 0;i < spans.length;i++){ - dup[$(spans[i]).attr('text')] = true; + dup[$(spans[i]).data('text')] = true; } } @@ -728,7 +739,7 @@ var com = new function(){ flag = true; j_li = $('<li><a href=""></a></li>'); - j_li.attr('word',word); + j_li.data('word',word); j_li.on('mouseover',function(e){ j_menu.find('li.active').removeClass('active'); $(this).addClass('active'); @@ -768,6 +779,27 @@ var com = new function(){ } } } + function _init(){ + j_input.css('width',''); + width = j_input.width() + 14; + inwidth = width - 14; + + j_div.width(width); + j_input.width(inwidth); + j_menu.width(width - 2); + } + function _set_words(new_words){ + words = new_words; + + if(words == undefined){ + words = []; + }else{ + words = words.sort(); + } + + _match(''); + _resize(); + } function _add_tag(text,force){ var j_li; @@ -779,7 +811,7 @@ var com = new function(){ if((j_li = j_menu.find('li.active')).length == 0){ return; } - text = j_li.attr('word'); + text = j_li.data('word'); }else if(duplicate != true){ if(j_box.find('[text="' + text + '"]').length > 0){ return; @@ -812,12 +844,8 @@ var com = new function(){ j_input = j_div.find('input'); j_menu = j_div.find('ul'); - width = j_input.width() + 14; - inwidth = width - 14; - - j_div.width(width); - - j_input.width(inwidth); + _init(); + j_input.on('keydown',function(e){ if(e.keyCode == 8 && j_input.val() == ''){ j_box.find('span.tag:last').remove(); @@ -840,49 +868,72 @@ var com = new function(){ }); j_input.on('focusin',function(e){ - show = true; - _match(''); - _resize(); - - return false; + if(hide == true){ + show = true; + _match(''); + _resize(); + } + hide = true; }); - $(window).on('click',function(e){ - if($(e.target).parents('div.tagbox').is(j_div)){ - return; + j_input.on('focusout',function(e){ + if(hide == true){ + show = false; + j_input.val(''); + j_menu.hide(); } - - show = false; - j_input.val(''); - j_menu.hide(); - return false; + }); + j_menu.on('mousedown',function(e){ + hide = false; + }); + j_menu.on('mouseup',function(e){ + j_input.focus(); }); - if(words == undefined){ - words = []; - }else{ - words = words.sort(); - } - j_menu.width(width - 2); - - j_div.add_tag = function(text){ - _add_tag(text,true); - } - j_div.refresh = function(){ - _match(''); - _resize(); - } + _set_words(words); _match(''); _resize(); - return j_div; + tagboxo = { + 'add_tag':function(text){ + _add_tag(text,true); + }, + 'get_tag':function(){ + var i; + var tags = j_box.find('span.tag'); + var taglist = new Array(); + + for(i = 0;i < tags.length;i++){ + taglist.push($(tags[i]).data('text')); + } + + return taglist; + }, + 'set_words':function(new_words){ + _set_words(new_words); + }, + 'refresh':function(){ + _init(); + _match(''); + _resize(); + }, + 'clear':function(){ + j_box.empty(); + _match(''); + _resize(); + } + }; + + j_div.data('tagbox',tagboxo); + + return tagboxo; }; that.create_tag = function(text,style){ var j_span; var j_i; j_span = $('<span class="label tag"></span>'); - j_span.attr('text',text); + j_span.data('text',text); if(style != undefined){ j_span.addClass(style); } @@ -897,7 +948,7 @@ var com = new function(){ return j_span; }; that.is_callerr = function(result){ - if(result.stat == false || typeof(result.data) == 'string'){ + if(result.stat == false || (typeof(result.data) == 'string' && result.data[0] == 'E')){ return true; } diff --git a/src/js/mail.js b/src/js/mail.js index a3a357a..d1dbb83 100644 --- a/src/js/mail.js +++ b/src/js/mail.js @@ -20,7 +20,7 @@ var mail = new function(){ j_span = j_item.find('span.check'); j_span.check(false); - j_span.attr('mailid',mailid); + j_span.data('mailid',mailid); if(unread == true){ j_item.addClass('warning'); @@ -174,7 +174,7 @@ var mail = new function(){ update_maillist(); } - },parseInt($(mails[i]).attr('mailid'))); + },parseInt($(mails[i]).data('mailid'))); } }); diff --git a/src/js/manage.js b/src/js/manage.js index 1961f6d..cab6bcb 100644 --- a/src/js/manage.js +++ b/src/js/manage.js @@ -29,13 +29,16 @@ var manage = new function(){ com.vus_root.child_set(manage_node); square_node.url_chg = function(direct,url_upart,url_dpart,param){ + var j_create; var j_set; var j_list; - var set_timepicker_start; - var set_timepicker_end; - var catemap; + var cate_idmap; + var id_catemap; + var create_tagbox_cate; + var set_tagbox_cate; + var set_data; - function _item_set(j_item,id,title,status,cateid,intro,logo,hidden,start_time,end_time){ + function _item_set(j_item,id,title,start_time,end_time,cateid,intro,logo,hidden){ var i; var j_cate; var j_label; @@ -43,73 +46,50 @@ var manage = new function(){ j_item.find('td.id').text(id); j_item.find('td.title').text(title); - if(status == 1){ - j_item.find('td.status').append($('<span class="label label-warning">等待中</span>')); - }else if(status == 2){ - j_item.find('td.status').append($('<span class="label label-success">進行中</span>')); - }else if(status == 3){ - j_item.find('td.status').append($('<span class="label">已結束</span>')); + if(start_time != null){ + j_item.find('td.time > div.start').text('┌─' + com.get_timestring(start_time)); + } + if(end_time != null){ + j_item.find('td.time > div.end').text('└→' + com.get_timestring(end_time)); } j_cate = j_item.find('td.cate'); + j_cate.empty(); for(i = 0;i < cateid.length;i++){ - j_label = $('<span class="label label-info"></span>'); - j_label.text(catemap[cateid[i]]); + j_label = $('<span class="label"></span>'); + j_label.text(cate_idmap[cateid[i]]); j_cate.append(j_label); } - j_item.find('button.set').on('click',function(e){ - var i; - var j_catebox; - var j_tag; - var catelist; - var key; - - j_set.find('[name="title"]').val(title); - j_set.find('[name="intro"]').val(intro); - j_set.find('[name="logo"]').val(logo); - - if(logo == ''){ - logo = com.get_defaultimg(id); - } - j_set.find('img.logo').attr('src',logo); - - if(start_time != null){ - set_timepicker_start.setDate(new Date(start_time)); - }else{ - set_timepicker_start.setDate(null); - } - if(end_time != null){ - set_timepicker_end.setDate(new Date(end_time)); - }else{ - set_timepicker_end.setDate(null); - } - - catelist = new Array(); - for(key in catemap){ - if(key == 0){ - continue; - } - catelist.push(catemap[key]); - } - - j_catebox = com.create_tagbox(j_set.find('div.catebox'),catelist,true,false); - j_catebox.find('input').attr('placeholder','+加入分類'); - for(i = 0;i < cateid.length;i++){ - j_catebox.add_tag(catemap[cateid[i]]); - } - - j_set.on('shown',function(e){ - j_catebox.refresh(); - }); + j_item.find('button.set').off('click').on('click',function(e){ + set_data = { + 'id':id, + 'title':title, + 'start_time':start_time, + 'end_time':end_time, + 'cateid':cateid, + 'intro':intro, + 'logo':logo, + 'hidden':hidden + }; j_set.modal('show'); }); + j_item.find('button.del').off('click').on('click',function(e){ + com.call_backend('core/square/','delete_square',function(result){ + console.log(result); + if(com.is_callerr(result)){ + index.add_alert('alert-error','錯誤','刪除方塊發生錯誤'); + }else{ + _update(); + } + },id); + }); } - function _item_create(id,title,status,cateid,intro,logo,hidden,start_time,end_time){ - var j_item = $('<tr class="item"><td class="id"></td><td class="title"><td class="status"></td></td><td class="cate"></td><td class="oper"><button class="btn btn-small set"><i class="icon-cog"></i></button></td></tr>'); + function _item_create(id,title,start_time,end_time,cateid,intro,logo,hidden){ + var j_item = $('<tr class="item"><td class="id"></td><td class="title"><td class="time"><div class="time start"></div><div class="time end"></div</td></td><td class="cate"></td><td class="oper"><div class="btn-group"><button class="btn btn-small set"><i class="icon-cog"></i></button><button class="btn btn-small del"><i class="icon-trash"></i></button></div></td></tr>'); - _item_set(j_item,id,title,status,cateid,intro,logo,hidden,start_time,end_time); + _item_set(j_item,id,title,start_time,end_time,cateid,intro,logo,hidden); return j_item; } @@ -117,15 +97,25 @@ var manage = new function(){ com.call_backend('core/square/','list_category',function(result){ var i; var data = result.data; + var catelist; + var cateo; if(com.is_callerr(result)){ index.add_alert('','警告','管理發生錯誤'); }else{ - catemap = new Object(); - for(i = 0;i < data.length;i++){ - catemap[data[i].cateid] = data[i].catename; + cate_idmap = new Object(); + id_catemap = new Object(); + catelist = new Array(); + for(i = data.length - 2;i >= 0;i--){ + cateo = data[i]; + cate_idmap[cateo.cateid] = cateo.catename; + id_catemap[cateo.catename] = cateo.cateid; + catelist.push(cateo.catename); } + create_tagbox_cate.set_words(catelist); + set_tagbox_cate.set_words(catelist); + com.call_backend('core/square/','list_square',function(result){ var i; var data = result.data; @@ -140,29 +130,34 @@ var manage = new function(){ for(i = 0;i < Math.min(items.length,data.length);i++){ sqo = data[i]; + + if(sqo.start_time != null){ + sqo.start_time = new Date(sqo.start_time); + } + if(sqo.end_time != null){ + sqo.end_time = new Date(sqo.end_time); + } _item_set($(items[i]),sqo.sqid, sqo.title, - sqo.status, + sqo.start_time, + sqo.end_time, sqo.cateid, sqo.intro, sqo.logo, - sqo.hidden, - sqo.start_time, - sqo.end_time); + sqo.hidden); } for(;i < data.length;i++){ sqo = data[i]; - + j_item = _item_create(sqo.sqid, sqo.title, - sqo.status, + sqo.start_time, + sqo.end_time, sqo.cateid, sqo.intro, sqo.logo, - sqo.hidden, - sqo.start_time, - sqo.end_time); + sqo.hidden); j_list.append(j_item); } for(;i < items.length;i++){ @@ -176,19 +171,199 @@ var manage = new function(){ if(direct == 'in'){ com.loadpage('/toj/html/manage_square.html').done(function(){ - var j_start; - var j_end; + var j_catebox; j_list = j_index_page.find('table.list'); + j_create = j_index_page.find('div.create'); j_set = j_index_page.find('div.set'); j_tabnav_square.active(); - j_start = j_set.find('div.start'); - set_timepicker_start = com.create_datetimepicker(j_start); - j_start.find('input').attr('placeholder','留空表示不限制'); - j_end = j_set.find('div.end'); - set_timepicker_end = com.create_datetimepicker(j_end); - j_end.find('input').attr('placeholder','留空表示不限制'); + j_catebox = j_create.find('div.catebox'); + create_tagbox_cate = j_catebox.tagbox({'words':[],'restrict':true,'duplicate':false}); + j_catebox.find('input').attr('placeholder','+加入分類'); + + j_create.find('[name="logo"]').on('change',function(e){ + var url; + var j_logo = j_create.find('img.logo'); + + if((url = $(this).val()) == ''){ + j_logo.hide(); + }else{ + j_logo.attr('src',url); + j_logo.show(); + } + }); + j_create.find('button.submit').on('click',function(e){ + var i; + var title = j_create.find('[name="title"]').val(); + var intro = j_create.find('[name="intro"]').val(); + var logo = j_create.find('[name="logo"]').val(); + var hidden = j_create.find('[name="hidden"]').val(); + var tags = create_tagbox_cate.get_tag(); + var cateid_list; + + if(hidden == '0'){ + hidden = false; + }else{ + hidden = true; + } + + cateid_list = new Array(); + for(i = 0;i < tags.length;i++){ + cateid_list.push(id_catemap[tags[i]]); + } + + com.call_backend('core/square/','create_square',function(result){ + var data = result.data; + var err = null; + + if(com.is_callerr(result)){ + if(data == 'Etitle_too_short'){ + err = '方塊名稱過短'; + }else if(data == 'Etitle_too_long'){ + err = '方塊名稱過長'; + }else if(data == 'Eintro_too_short'){ + err = '方塊介紹過短'; + }else if(data == 'Eintro_too_long'){ + err = '方塊介紹過長'; + }else if(data == 'Elogo_too_short'){ + err = '方塊圖片網址過短'; + }else if(data == 'Elogo_too_long'){ + err = '方塊圖片網址過長'; + }else if(data == 'Etoo_many_category'){ + err = '方塊分類過多'; + } + + if(err != null){ + index.add_alert('alert-error','錯誤',err); + }else{ + index.add_alert('','警告','管理發生錯誤'); + } + }else{ + index.add_alert('alert-success','成功','方塊已建立'); + j_create.modal('hide'); + _update(); + } + },title,hidden,1,intro,logo,cateid_list); + + }); + j_create.find('button.cancel').on('click',function(e){ + j_create.modal('hide'); + }); + j_create.on('hide',function(e){ + j_create.find('input').val(''); + j_create.find('img.logo').attr('src',null); + create_tagbox_cate.clear(); + }); + + j_catebox = j_set.find('div.catebox'); + set_tagbox_cate = j_catebox.tagbox({'words':[],'restrict':true,'duplicate':false}); + j_catebox.find('input').attr('placeholder','+加入分類'); + + j_set.find('[name="logo"]').on('change',function(e){ + var url; + var j_logo = j_set.find('img.logo'); + + if((url = $(this).val()) == ''){ + j_logo.attr('src',com.get_defaultimg(set_data.id)); + }else{ + j_logo.attr('src',url); + } + }); + j_set.on('show',function(e){ + var i; + var url; + + j_set.find('[name="title"]').val(set_data.title); + j_set.find('[name="intro"]').val(set_data.intro); + j_set.find('[name="logo"]').val(set_data.logo); + + if((url = set_data.logo) == ''){ + url = com.get_defaultimg(set_data.id); + } + j_set.find('img.logo').attr('src',url); + + if(set_data.hidden == false){ + j_set.find('[name="hidden"]').val(0); + }else{ + j_set.find('[name="hidden"]').val(1); + } + + set_tagbox_cate.clear(); + for(i = 0;i < set_data.cateid.length;i++){ + set_tagbox_cate.add_tag(cate_idmap[set_data.cateid[i]]); + } + + j_set.on('shown',function(e){ + set_tagbox_cate.refresh(); + }); + }); + j_set.find('button.submit').on('click',function(e){ + var i; + var title = j_set.find('[name="title"]').val(); + var intro = j_set.find('[name="intro"]').val(); + var logo = j_set.find('[name="logo"]').val(); + var hidden = j_set.find('[name="hidden"]').val(); + var tags = set_tagbox_cate.get_tag(); + var cateid_list; + + if(hidden == '0'){ + hidden = false; + }else{ + hidden = true; + } + + cateid_list = new Array(); + for(i = 0;i < tags.length;i++){ + cateid_list.push(id_catemap[tags[i]]); + } + + com.call_backend('core/square/','set_square',function(result){ + var data = result.data; + var err = null; + + if(com.is_callerr(result)){ + if(data == 'Etitle_too_short'){ + err = '方塊名稱過短'; + }else if(data == 'Etitle_too_long'){ + err = '方塊名稱過長'; + }else if(data == 'Eintro_too_short'){ + err = '方塊介紹過短'; + }else if(data == 'Eintro_too_long'){ + err = '方塊介紹過長'; + }else if(data == 'Elogo_too_short'){ + err = '方塊圖片網址過短'; + }else if(data == 'Elogo_too_long'){ + err = '方塊圖片網址過長'; + }else if(data == 'Etoo_many_category'){ + err = '方塊分類過多'; + } + + if(err != null){ + index.add_alert('alert-error','錯誤',err); + }else{ + console.log(data); + index.add_alert('','警告','管理發生錯誤'); + } + }else{ + index.add_alert('alert-success','成功','方塊已設定'); + j_set.modal('hide'); + _update(); + } + },set_data.id,title,set_data.start_time,set_data.end_time,hidden,intro,logo,cateid_list); + }); + j_set.find('button.cancel').on('click',function(e){ + j_set.modal('hide'); + }); + j_set.on('hide',function(e){ + j_set.find('input').val(''); + j_set.find('img.logo').attr('src',null); + set_tagbox_cate.clear(); + }); + + j_index_page.find('div.oper > button.create').on('click',function(e){ + j_create.modal('show'); + }); _update(); }); diff --git a/src/js/mod.js b/src/js/mod.js new file mode 100644 index 0000000..b8cae5f --- /dev/null +++ b/src/js/mod.js @@ -0,0 +1,18 @@ +var mod = new function(){ + var that = this; + + that.ready = function(){ + var sq_node = new vus.node('sq'); + + sq_node.url_chg = function(direct,url_upart,url_dpart,param){ + if(direct == 'in'){ + + }else if(direct == 'out'){ + + } + + return 'stop'; + }; + com.vus_root.child_set(sq_node); + }; +} diff --git a/src/js/square.js b/src/js/square.js index fead61d..b6ee4fa 100644 --- a/src/js/square.js +++ b/src/js/square.js @@ -16,17 +16,15 @@ var square = new function(){ j_box.attr('boxid',id); - j_box.find('img.logo').attr('src',logo); + j_box.find('div.logo').css('background-image','url(\'' + logo + '\')'); j_box.find('h5.title').text(title); j_box.find('p.intro').text(intro); - if(start_time != null || end_time != null){ - if(start_time != null){ - j_box.find('div.start').text('┌─' + start_time); - } - if(end_time != null){ - j_box.find('div.end').text('└→' + end_time); - } + if(start_time != null){ + j_box.find('div.start').text('┌─' + com.get_timestring(start_time)); + } + if(end_time != null){ + j_box.find('div.end').text('└→' + com.get_timestring(end_time)); } j_oper = j_box.find('div.oper'); @@ -88,14 +86,14 @@ var square = new function(){ } } function box_create(id,logo,title,start_time,end_time,intro,active){ - var j_box = $('<div class="span5 box"><img class="logo"></img><h5 class="title"></h5><div class="time start"></div><div class="time end"></div><p class="intro"></p><div class="btn-group oper"></div></div>'); + var j_box = $('<div class="span5 box"><div class="logo"></div><h5 class="title"></h5><div class="time start"></div><div class="time end"></div><p class="intro"></p><div class="btn-group oper"></div></div>'); box_set(j_box,id,logo,title,start_time,end_time,intro,active); return j_box; } function catebox_set(j_box,cateid,catename){ - j_box.attr('cateid',cateid); + j_box.data('cateid',cateid); j_box.find('h3.catename').text(catename); } function catebox_create(cateid,catename){ @@ -178,18 +176,8 @@ var square = new function(){ if((logo = sqo.logo) == ''){ logo = com.get_defaultimg(sqo.sqid); } - if(sqo.start_time == null){ - start_time = null; - }else{ - start_time = com.get_timestring(sqo.start_time); - } - if(sqo.end_time == null){ - end_time = null; - }else{ - end_time = com.get_timestring(sqo.end_time); - } - j_box = box_create(sqo.sqid,logo,sqo.title,start_time,end_time,sqo.intro,sqo.active); + j_box = box_create(sqo.sqid,logo,sqo.title,sqo.start_time,sqo.end_time,sqo.intro,sqo.active); if(sqo.status == 1){ j_pend.append(j_box); diff --git a/src/py/backend_server.py b/src/py/backend_server.py index 71c3b1e..e0faf38 100755 --- a/src/py/backend_server.py +++ b/src/py/backend_server.py @@ -20,6 +20,9 @@ import netio from netio import SocketStream,SocketConnection,WebSocketConnection from tojauth import TOJAuth +from test_blob import TOJBlobTable,TOJBlobHandle +from imc.blobclient import BlobClient + class BackendWorker(tornado.tcpserver.TCPServer): def __init__(self,center_addr,ws_port): super().__init__() @@ -104,10 +107,12 @@ class BackendWorker(tornado.tcpserver.TCPServer): self._link = info['worker_link'] Proxy(self._link,TOJAuth.instance,self._idendesc,self._conn_link) - self.center_conn = SocketConnection(info['center_link'],stream,self.center_addr) + self.center_conn = SocketConnection(info['center_link'],stream,self.center_addr,self._add_pend_filestream) self.center_conn.add_close_callback(__retry) Proxy.instance.add_conn(self.center_conn) + self._init_blobclient() + #Proxy.instance.register_call('test/','get_client_list',self._test_get_client_list) #Proxy.instance.register_call('test/','test_dst',self._test_dst) #Proxy.instance.register_filter('test/',self._test_filter) @@ -126,6 +131,7 @@ class BackendWorker(tornado.tcpserver.TCPServer): sock_ip,sock_port = self.sock_addr netio.send_pack(stream,bytes(json.dumps({ + 'conntype':'main', 'linkclass':'backend', 'sock_ip':sock_ip, 'sock_port':sock_port, @@ -138,6 +144,25 @@ class BackendWorker(tornado.tcpserver.TCPServer): stream.set_close_callback(__retry) stream.connect(self.center_addr,__send_worker_info) + @imc.async.caller + def _init_blobclient(self): + '''blobclient = BlobClient(Proxy.instance, + TOJAuth.instance, + self._idendesc, + self._link, + self.center_conn.link, + 'blobtmp/2', + TOJBlobTable(2), + TOJBlobHandle) + + blobclient.open_container('test','ACTIVE') + handle = blobclient.open('test','testblob',TOJBlobHandle.WRITE | + TOJBlobHandle.CREATE) + print(handle._fileno) + handle.write(bytes('Hello Data','utf-8'),0) + handle.commit(False);''' + pass + def _conn_link(self,link): def __handle_pend(conn): try: @@ -272,7 +297,7 @@ class BackendWorker(tornado.tcpserver.TCPServer): continue fileres = Proxy.instance.sendfile(dst,'Fedora-18-x86_64-DVD.iso') - ret = Proxy.instance.call_async(dst + 'test/','test_dst',lambda result: print('ok'),fileres.filekey) + ret = Proxy.instance.call_async(dst + 'test/','test_dst',1000,lambda result: print(result),fileres.filekey) print(fileres.wait()) @@ -303,9 +328,10 @@ class BackendWorker(tornado.tcpserver.TCPServer): print(filekey) self._ioloop.add_timeout(datetime.timedelta(milliseconds = 2000),lambda : Proxy.instance.abortfile(filekey)) - Proxy.instance.abortfile(filekey) - #fileres = Proxy.instance.recvfile(filekey,'data') + #Proxy.instance.abortfile(filekey) + fileres = Proxy.instance.recvfile(filekey,'data') #print('recv ' + fileres.wait()) + print(fileres.wait()) return 'ok' diff --git a/src/py/center_server.py b/src/py/center_server.py index b4273ef..3254196 100755 --- a/src/py/center_server.py +++ b/src/py/center_server.py @@ -17,8 +17,13 @@ import netio from netio import SocketStream,SocketConnection from tojauth import TOJAuth +from test_blob import TOJBlobTable,TOJBlobHandle +from imc.blobserver import BlobServer + class Worker: def __init__(self,main_stream,link,idendesc,worker_info,center_link): + global center_serv + self.main_stream = main_stream self.link = link self.idendesc = idendesc @@ -30,7 +35,7 @@ class Worker: 'center_link':center_link }),'utf-8')) - conn = SocketConnection(self.link,self.main_stream,self.sock_addr) + conn = SocketConnection(self.link,self.main_stream,self.sock_addr,center_serv.add_pend_filestream) conn.add_close_callback(lambda conn : self.close()) Proxy.instance.add_conn(conn) @@ -57,6 +62,7 @@ class CenterServer(tornado.tcpserver.TCPServer): super().__init__() self._ioloop = tornado.ioloop.IOLoop.instance() + self._pend_filestream_filekeymap = {} self._linkid_usemap = {} self._worker_linkmap = {} self._client_linkmap = {} @@ -73,29 +79,30 @@ class CenterServer(tornado.tcpserver.TCPServer): self._idendesc = TOJAuth.instance.create_iden(self._link,1,TOJAuth.ROLETYPE_TOJ) Proxy(self._link,TOJAuth.instance,self._idendesc) + self._init_blobserver() + Proxy.instance.register_call('core/','lookup_link',self._lookup_link) Proxy.instance.register_call('core/','create_iden',self._create_iden) Proxy.instance.register_call('core/','add_client',self._add_client) Proxy.instance.register_call('core/','del_client',self._del_client) Proxy.instance.register_call('core/','get_uid_clientlink',self._get_uid_clientlink) - #Proxy.instance.register_call('test/','get_client_list',self._test_get_client_list) - def handle_stream(self,stream,addr): - def _recv_worker_info(data): - worker_info = json.loads(data.decode('utf-8')) + def _recv_conn_info(data): + info = json.loads(data.decode('utf-8')) + conntype = info['conntype'] + + if conntype == 'main': + self._handle_mainconn(sock_stream,addr,info) - linkclass = worker_info['linkclass'] - if linkclass == 'backend': - link = self._create_link('backend') - idendesc = TOJAuth.instance.create_iden(link,1,TOJAuth.ROLETYPE_TOJ) - BackendWorker(main_stream,link,idendesc,worker_info,self._link) + elif conntype == 'file': + self._handle_fileconn(sock_stream,addr,info) fd = stream.fileno() self._ioloop.remove_handler(fd) - main_stream = SocketStream(socket.fromfd(fd,socket.AF_INET,socket.SOCK_STREAM | socket.SOCK_NONBLOCK,0)) + sock_stream = SocketStream(socket.fromfd(fd,socket.AF_INET,socket.SOCK_STREAM | socket.SOCK_NONBLOCK,0)) - netio.recv_pack(main_stream,_recv_worker_info) + netio.recv_pack(sock_stream,_recv_conn_info) def add_backend_worker(self,backend): backend_link = backend.link @@ -130,6 +137,19 @@ class CenterServer(tornado.tcpserver.TCPServer): return (link,idendesc,backend.link,ws_ip,ws_port) + def add_pend_filestream(self,filekey,callback): + self._pend_filestream_filekeymap[filekey] = tornado.stack_context.wrap(callback) + + @imc.async.caller + def _init_blobserver(self): + BlobServer(Proxy.instance, + TOJAuth.instance, + self._idendesc, + self._link, + 'blobtmp/1', + TOJBlobTable(1), + TOJBlobHandle) + def _create_link(self,linkclass): linkid = uuid.uuid1() while linkid in self._linkid_usemap: @@ -181,6 +201,20 @@ class CenterServer(tornado.tcpserver.TCPServer): except KeyError: return None + def _handle_mainconn(self,main_stream,addr,info): + linkclass = info['linkclass'] + if linkclass == 'backend': + link = self._create_link('backend') + idendesc = TOJAuth.instance.create_iden(link,1,TOJAuth.ROLETYPE_TOJ) + BackendWorker(main_stream,link,idendesc,info,self._link) + + def _handle_fileconn(self,file_stream,addr,info): + try: + self._pend_filestream_filekeymap.pop(info['filekey'])(file_stream) + + except KeyError: + pass + @imc.async.caller @TOJAuth.check_access(1,TOJAuth.ACCESS_EXECUTE) def _create_iden(self,link,idenid,roletype,payload): diff --git a/src/py/imc/proxy.py b/src/py/imc/proxy.py index da4bfd4..ecc08da 100755 --- a/src/py/imc/proxy.py +++ b/src/py/imc/proxy.py @@ -265,13 +265,13 @@ class Proxy: return (child,name,filt) - def _json_handler(self,o): + def _json_dump_handler(self,o): if isinstance(o,datetime.datetime): return o.isoformat(); else: return None - + def _route_call(self,in_conn,caller_link,caller_retid,idendesc,dst,func_name,timeout,param): def __add_wait_caller(conn_link): callback = tornado.stack_context.wrap(lambda result : self._ret_call(caller_link,caller_retid,result)) @@ -493,7 +493,7 @@ class Proxy: try: msg = json.loads(data.decode('utf-8')) - except: + except Exception: return msg_type = msg['type'] @@ -522,7 +522,7 @@ class Proxy: 'param':param } - conn.send_msg(bytes(json.dumps(msg,default = self._json_handler),'utf-8')) + conn.send_msg(bytes(json.dumps(msg,default = self._json_dump_handler),'utf-8')) def _recv_msg_call(self,conn,msg): @async.caller @@ -548,7 +548,7 @@ class Proxy: 'result':{'stat':stat,'data':data} } - conn.send_msg(bytes(json.dumps(msg,default = self._json_handler),'utf-8')) + conn.send_msg(bytes(json.dumps(msg,default = self._json_dump_handler),'utf-8')) def _recv_msg_ret(self,conn,msg): caller_link = msg['caller_link'] @@ -566,7 +566,7 @@ class Proxy: 'filesize':filesize } - conn.send_msg(bytes(json.dumps(msg,default = self._json_handler),'utf-8')) + conn.send_msg(bytes(json.dumps(msg,default = self._json_dump_handler),'utf-8')) def _recv_msg_sendfile(self,conn,msg): @async.caller @@ -586,7 +586,7 @@ class Proxy: 'error':err } - conn.send_msg(bytes(json.dumps(msg,default = self._json_handler),'utf-8')) + conn.send_msg(bytes(json.dumps(msg,default = self._json_dump_handler),'utf-8')) def _recv_msg_abortfile(self,conn,msg): @async.caller diff --git a/src/py/mail.py b/src/py/mail.py index 7bfa53c..37f66aa 100644 --- a/src/py/mail.py +++ b/src/py/mail.py @@ -36,6 +36,18 @@ class Mail: Proxy.instance.register_call( 'core/mail/', 'get_mail_count', self.get_mail_count) + def unload(self): + Proxy.instance.unregister_call( + 'core/mail/', 'send_mail') + Proxy.instance.unregister_call( + 'core/mail/', 'recv_mail') + Proxy.instance.unregister_call( + 'core/mail/', 'list_mail') + Proxy.instance.unregister_call( + 'core/mail/', 'del_mail') + Proxy.instance.unregister_call( + 'core/mail/', 'get_mail_count') + @imc.async.caller def send_mail(self, to_username, title, content): if( @@ -76,6 +88,8 @@ class Mail: self.notify_client(uid) self.notify_client(to_uid) + return 'Success' + @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_EXECUTE) def _add_mail(self, uid, from_uid, mail_type, unread, title, content): cur = self.db.cursor() @@ -216,6 +230,8 @@ class Mail: with TOJAuth.change_current_iden(self._idendesc): self._del_mail(mailid) + return 'Success' + @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_EXECUTE) def _del_mail(self, mailid): cur = self.db.cursor() @@ -266,5 +282,3 @@ class Mail: link + 'core/mail/', 'update_mail', 10000, None ) - def unload(): - pass diff --git a/src/py/netio.py b/src/py/netio.py index 045b94c..b896452 100755 --- a/src/py/netio.py +++ b/src/py/netio.py @@ -188,10 +188,7 @@ class SocketStream: try: while True: buf = self._sock.recv(min(size,65536)) - if len(buf) == 0: - self.close() - return - + os.write(iocb[2],buf) size -= len(buf) @@ -201,6 +198,10 @@ class SocketStream: self._read_queue.popleft() break + + if len(buf) == 0: + self.close() + return except BlockingIOError: iocb[1] = size @@ -228,10 +229,6 @@ class SocketStream: try: while True: ret = self._sock.send(buf[off:]) - if ret == 0: - self.close() - return - off += ret if off == len(buf): @@ -240,6 +237,10 @@ class SocketStream: self._write_queue.popleft() break + + if ret == 0: + self.close() + return except BlockingIOError: iocb[1] = off @@ -257,10 +258,6 @@ class SocketStream: try: while True: ret = os.sendfile(sockfd,filefd,None,min(size,65536)) - if ret == 0: - self.close() - return - size -= ret if size == 0: @@ -269,6 +266,10 @@ class SocketStream: self._write_queue.popleft() break + + if ret == 0: + self.close() + return except BlockingIOError: iocb[1] = size diff --git a/src/py/square.py b/src/py/square.py index 8091448..e00c12b 100644 --- a/src/py/square.py +++ b/src/py/square.py @@ -3,6 +3,7 @@ import datetime from tojauth import TOJAuth from asyncdb import AsyncDB import mod +import com import imc.async from imc.proxy import Proxy import config @@ -42,6 +43,28 @@ class SquareMg: 'core/square/', 'join_square', self.join_square) Proxy.instance.register_call( 'core/square/', 'quit_square', self.quit_square) + Proxy.instance.register_call( + 'core/square/', 'create_square', self.create_square) + Proxy.instance.register_call( + 'core/square/', 'delete_square', self.delete_square) + Proxy.instance.register_call( + 'core/square/', 'set_square', self.imc_set_square) + + def unload(self): + Proxy.instance.unregister_call( + 'core/square/', 'list_category') + Proxy.instance.unregister_call( + 'core/square/', 'list_square') + Proxy.instance.unregister_call( + 'core/square/', 'join_square') + Proxy.instance.unregister_call( + 'core/square/', 'quit_square') + Proxy.instance.unregister_call( + 'core/square/', 'create_square') + Proxy.instance.unregister_call( + 'core/square/', 'delete_square') + Proxy.instance.unregister_call( + 'core/square/', 'set_square') @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_EXECUTE) def load_square(self, sqid): @@ -132,11 +155,10 @@ class SquareMg: sqlarr = (accessid, sqid) cur.execute(sqlstr, sqlarr) - with TOJAuth.change_current_iden(self._idendesc): - TOJAuth.instance.set_access_list( - accessid, TOJAuth.ROLEID_SQUARE_ADMIN_GROUP, - TOJAuth.ACCESS_ALL - ) + TOJAuth.instance.set_access_list( + accessid, TOJAuth.ROLEID_SQUARE_ADMIN_GROUP, + TOJAuth.ACCESS_ALL + ) sqmodname = self.get_sqmodname_by_sqmodid(sqmodid) sqmod = mod.load_sqmod(sqmodname) @@ -155,7 +177,9 @@ class SquareMg: if not self.does_sqid_exist(sqid): return 'Eno_such_sqid' - self._delete_square(self, sqid) + self._delete_square(sqid) + + return 'Success' def _delete_square(self, sqid): accessid = self.get_accessid_by_sqid(sqid) @@ -176,11 +200,84 @@ class SquareMg: cur = self.db.cursor() sqlstr = ('DELETE FROM "SQUARE" WHERE "sqid" = %s;') sqlarr = (sqid, ) - cur.execute() + cur.execute(sqlstr, sqlarr) sqlstr = ('DELETE FROM "SQUARE_USER" WHERE "sqid" = %s;') sqlarr = (sqid, ) - cur.execute() + cur.execute(sqlstr, sqlarr) + + @imc.async.caller + def imc_set_square(self, sqid, title, start_time, end_time, hidden, intro, + logo, category): + + if start_time != None: + start_time = com.isoptime(start_time) + if start_time == None: + return 'Eparameter' + + if end_time != None: + end_time = com.isoptime(end_time) + if end_time == None: + return 'Eparameter' + + if( + type(sqid) != int or + type(title) != str or + (start_time != None and type(start_time) != datetime.datetime) or + (end_time != None and type(end_time) != datetime.datetime) or + type(hidden) != bool or + type(intro) != str or + type(logo) != str or + type(category) != list + ): + return 'Eparameter' + + for cateid in category: + if( + type(cateid) != int + ): + return 'Eparameter' + + if len(title) < self.TITLE_LEN_MIN: + return 'Etitle_too_short' + elif len(title) > self.TITLE_LEN_MAX: + return 'Etitle_too_long' + elif len(intro) < self.INTRO_LEN_MIN: + return 'Eintro_too_short' + elif len(intro) > self.INTRO_LEN_MAX: + return 'Eintro_too_long' + elif len(logo) < self.INTRO_LEN_MIN: + return 'Elogo_too_short' + elif len(logo) > self.INTRO_LEN_MAX: + return 'Elogo_too_long' + elif len(category) > self.SQUARE_CATE_NUM_MAX: + return 'Etoo_many_category' + + if not self.does_sqid_exist(sqid): + return 'Esqid' + + category = list(set(category)) + + for cateid in category: + if not self.does_cateid_exist(cateid): + return 'Eno_such_cateid' + + self.set_square(sqid, title, start_time, end_time, hidden, intro, logo) + self._set_square_category(sqid, category) + + return 'Success' + + def set_square(self, sqid, title, start_time, end_time, hidden, intro, + logo): + accessid = self.get_accessid_by_sqid(sqid) + TOJAuth.check_access_func(accessid, TOJAuth.ACCESS_WRITE) + + cur = self.db.cursor() + sqlstr = ('UPDATE "SQUARE" SET "title" = %s, "start_time" = %s, ' + '"end_time" = %s, "hidden" = %s, "intro" = %s, "logo" = %s ' + 'WHERE "sqid" = %s;') + sqlarr = (title, start_time, end_time, hidden, intro, logo, sqid) + cur.execute(sqlstr, sqlarr) @imc.async.caller def list_square(self, cateid = None): @@ -241,7 +338,7 @@ class SquareMg: if uid != None: obj['active'] = data[9] - nowtime = datetime.datetime.now(datetime.timezone.utc) + nowtime = datetime.datetime.now() if obj['start_time'] == None: obj['status'] = self.STATUS_RUNNING @@ -255,7 +352,7 @@ class SquareMg: obj['status'] = self.STATUS_RUNNING ret.append(obj) - + return ret @imc.async.caller @@ -306,34 +403,6 @@ class SquareMg: return cateid - @imc.async.caller - def set_square_category(self, sqid, category): - if( - type(sqid) != int or - type(category) != list - ): - return 'Eparameter' - - for cateid in category: - if( - type(cateid) != int - ): - return 'Eparameter' - - if len(category) > self.SQUARE_CATE_NUM_MAX: - return 'Etoo_many_category' - - category = list(set(category)) - - if not self.does_sqid_exist(sqid): - return 'Eno_such_sqid' - - for cateid in category: - if not self.does_cateid_exist(cateid): - return 'Eno_such_cateid' - - self._set_square_category(sqid, category) - def _set_square_category(self, sqid, category): sq_accessid = self.get_accessid_by_sqid(sqid) TOJAuth.check_access_func(sq_accessid, TOJAuth.ACCESS_WRITE) @@ -397,6 +466,7 @@ class SquareMg: elif result == self.JOIN_ACCEPT: with TOJAuth.change_current_iden(self._idendesc): self._set_user_square_relation(uid, sqid, True) + return {'active': True} else: return 'Ejoin_sq_error' @@ -424,6 +494,8 @@ class SquareMg: with TOJAuth.change_current_iden(self._idendesc): self._del_user_square_relation(uid, sqid) + return 'Success' + @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_WRITE) def _set_user_square_relation(self, uid, sqid, active): cur = self.db.cursor() @@ -518,9 +590,6 @@ class SquareMg: sqmodname = self.get_sqmodname_by_sqmodid(sqmodid) return sqmodname != None - def unload(): - pass - class Square: def unload(self): pass diff --git a/src/py/tojauth.py b/src/py/tojauth.py index 2e44ad5..3446efb 100755 --- a/src/py/tojauth.py +++ b/src/py/tojauth.py @@ -78,18 +78,20 @@ class TOJAuth(Auth): ok = True if not ok: - sqlstr = ('SELECT "ACCESS_ROLE"."permission" FROM "ACCESS_ROLE"' - ' INNER JOIN "IDEN_ROLE" ON "ACCESS_ROLE"."roleid" = ' - '"IDEN_ROLE"."roleid" WHERE "ACCESS_ROLE"."accessid"=%s' - ' AND "IDEN_ROLE"."idenid"=%s;') + sqlstr = ('SELECT "ACCESS_ROLE"."permission" FROM ' + '"ACCESS_ROLE" INNER JOIN "IDEN_ROLE" ON ' + '"ACCESS_ROLE"."roleid" = "IDEN_ROLE"."roleid" ' + 'WHERE "ACCESS_ROLE"."accessid"= %s AND ' + '"IDEN_ROLE"."idenid" = %s;') sqlarr = (accessid, idenid) cur.execute(sqlstr, sqlarr) + permission = 0 for data in cur: - permission = data[0] - if (permission & access_mask) == access_mask: - ok = True - break + permission = permission | data[0] + + if (permission & access_mask) == access_mask: + ok = True if ok: return f(*args); @@ -105,8 +107,7 @@ class TOJAuth(Auth): TOJAuth.check_access(accessid, access_mask)(lambda x:x)(0) def create_access(self, owner_idenid): - self.check_access( - self._accessid, self.ACCESS_EXECUTE)(lambda x:x)(0) + self.check_access_func(self._accessid, self.ACCESS_EXECUTE) cur = self.db.cursor() sqlstr = ('INSERT INTO "ACCESS" ("owner_idenid") VALUES (%s) ' @@ -119,19 +120,19 @@ class TOJAuth(Auth): return accessid def del_access(self, accessid): - self.check_access(accessid, self.ACCESS_SETPER)(lambda x:x)(0) + self.check_access_func(accessid, self.ACCESS_SETPER) cur = self.db.cursor() sqlstr = ('DELETE FROM "ACCESS_ROLE" WHERE "accessid" = %s;') sqlarr = (accessid, ) - cur.execute() + cur.execute(sqlstr, sqlarr) sqlstr = ('DELETE FROM "ACCESS" WHERE "accessid" = %s;') sqlarr = (accessid, ) - cur.execute() + cur.execute(sqlstr, sqlarr) def set_access_list(self, accessid, roleid, permission): - self.check_access(accessid, self.ACCESS_SETPER)(lambda x:x)(0) + self.check_access_func(accessid, self.ACCESS_SETPER) cur = self.db.cursor() table = 'ACCESS_ROLE' @@ -145,7 +146,7 @@ class TOJAuth(Auth): cur.upsert(table, cond, value) def del_access_list(self, accessid, roleid): - self.check_access(accessid, self.ACCESS_SETPER)(lambda x:x)(0) + self.check_access_func(accessid, self.ACCESS_SETPER) cur = self.db.cursor() sqlstr = ('DELETE FROM "ACCESS_ROLE" WHERE "accessid" = %s ' @@ -154,8 +155,7 @@ class TOJAuth(Auth): cur.execute(sqlstr, sqlarr) def create_role(self, rolename, roletype): - self.check_access( - self._accessid, self.ACCESS_EXECUTE)(lambda x:x)(0) + self.check_access_func(self._accessid, self.ACCESS_EXECUTE) cur = self.db.cursor() sqlstr = ('INSERT INTO "ROLE" ("rolename", "roletype") VALUES (%s, %s)' @@ -171,8 +171,7 @@ class TOJAuth(Auth): return roleid def set_role_relation(self, idenid, roleid): - self.check_access( - self._accessid, self.ACCESS_EXECUTE)(lambda x:x)(0) + self.check_access_func(self._accessid, self.ACCESS_EXECUTE) cur = self.db.cursor() table = 'IDEN_ROLE' @@ -183,8 +182,7 @@ class TOJAuth(Auth): cur.upsert(table, cond) def del_role_relation(self, idenid, roleid): - self.check_access( - self._accessid, self.ACCESS_EXECUTE)(lambda x:x)(0) + self.check_access_func(self._accessid, self.ACCESS_EXECUTE) cur = self.db.cursor() sqlstr = ('DELETE FROM "IDEN_ROLE" WHERE "idenid"=%s ' @@ -193,10 +191,40 @@ class TOJAuth(Auth): cur.execute(sqlstr, sqlarr) def set_owner(self, idenid, accessid): - self.check_access(accessid, self.ACCESS_SETPER)(lambda x:x)(0) + self.check_access_func(accessid, self.ACCESS_SETPER) cur = self.db.cursor() sqlstr = ('UPDATE "ACCESS" SET "owner_idenid"=%s WHERE "accessid"=%s;') sqlarr = (idenid, accessid) cur.execute(sqlstr, sqlarr) + def get_user_auth_list(self, idenid): + self.check_access_func(self._accessid, self.ACCESS_SETPER) + + cur = self.db.cursor() + sqlstr = ('SELECT "ACCESS_ROLE"."accessid", "ACCESS_ROLE"."permission" ' + 'FROM "ACCESS_ROLE" INNER JOIN "IDEN_ROLE" ON "ACCESS_ROLE"' + '."roleid" = "IDEN_ROLE"."roleid" WHERE "IDEN_ROLE"' + '."idenid" = %s;') + sqlarr = (idenid, ) + cur.execute(sqlstr, sqlarr) + + ret_set = {} + for data in cur: + accessid = data[0] + permission = data[1] + + if not accessid in ret_set: + ret_set[accessid] = 0 + + ret_set[accessid] = ret_set[accessid] | permission + + ret = [] + for accessid in ret_set: + obj = {} + obj['accessid'] = accessid + obj['permission'] = ret_set[accessid] + ret.append(obj) + + return ret + diff --git a/src/py/user.py b/src/py/user.py index 865233b..ba6b4d9 100755 --- a/src/py/user.py +++ b/src/py/user.py @@ -48,6 +48,23 @@ class UserMg: Proxy.instance.register_call( 'core/user/', 'list_auth', self.list_auth) + def unload(self): + Proxy.instance.unregister_call( + 'core/user/', 'register') + Proxy.instance.unregister_call( + 'core/user/', 'login') + Proxy.instance.unregister_call( + 'core/user/', 'cookie_login') + Proxy.instance.unregister_call( + 'core/user/', 'get_user_info') + Proxy.instance.unregister_call( + 'core/user/', 'set_user_info') + Proxy.instance.unregister_call( + 'core/user/', 'change_user_password') + Proxy.instance.unregister_call( + 'core/user/', 'list_auth') + + @imc.async.caller def register( self, username, password, nickname, email, avatar, aboutme, cover @@ -283,6 +300,8 @@ class UserMg: sqlarr = (nickname, email, avatar, aboutme, cover, uid) cur.execute(sqlstr, sqlarr) + return 'Success' + @imc.async.caller def change_user_password(self, uid, old_password, new_password): if( @@ -326,6 +345,8 @@ class UserMg: sqlarr = (new_passhash, uid) cur.execute(sqlstr, sqlarr) + return 'Success' + @imc.async.caller def oauth_login(self): raise NotImplementedError @@ -422,6 +443,3 @@ class UserMg: return None return uid - def unload(): - pass - |