aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpzread <netfirewall@gmail.com>2013-06-29 01:51:58 +0800
committerpzread <netfirewall@gmail.com>2013-06-29 01:51:58 +0800
commit9542c558b71107e542e54d98ebdd8087f9446eb8 (patch)
tree2bd46fb90a1d35738c79ff27fccbc679c8706a0b
parentb2ac7286c8ed3267b257f7ec88aa739a134089d8 (diff)
downloadtaiwan-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.less3
-rw-r--r--src/css/manage_square.less12
-rw-r--r--src/css/square.less4
-rw-r--r--src/html/manage_index.html0
-rw-r--r--src/html/manage_square.html48
-rw-r--r--src/js/com.js135
-rw-r--r--src/js/mail.js4
-rw-r--r--src/js/manage.js333
-rw-r--r--src/js/mod.js18
-rw-r--r--src/js/square.js30
-rwxr-xr-xsrc/py/backend_server.py34
-rwxr-xr-xsrc/py/center_server.py58
-rwxr-xr-xsrc/py/imc/proxy.py14
-rw-r--r--src/py/mail.py18
-rwxr-xr-xsrc/py/netio.py25
-rw-r--r--src/py/square.py151
-rwxr-xr-xsrc/py/tojauth.py72
-rwxr-xr-xsrc/py/user.py24
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">&times;</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">&times;</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
-