aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/css/stat.less9
-rw-r--r--src/html/index.html4
-rw-r--r--src/html/stat.html6
-rw-r--r--src/js/imc.js2
-rw-r--r--src/js/mail.js1
-rw-r--r--src/js/manage.js312
-rw-r--r--src/js/stat.js41
-rwxr-xr-xsrc/py/backend_server.py34
-rwxr-xr-xsrc/py/imc/blobclient.py16
-rwxr-xr-xsrc/py/imc/blobhandle.py17
-rwxr-xr-xsrc/py/imc/blobtable.py65
-rw-r--r--src/py/problem.py282
-rw-r--r--src/py/square.py10
-rwxr-xr-xsrc/py/user.py3
14 files changed, 691 insertions, 111 deletions
diff --git a/src/css/stat.less b/src/css/stat.less
new file mode 100644
index 0000000..6ba0b8c
--- /dev/null
+++ b/src/css/stat.less
@@ -0,0 +1,9 @@
+@import "mixin.less";
+@import "color.less";
+
+#index_page{
+ div.log{
+ font-size:@SmallFontSize;
+ overflow-x:auto;
+ }
+}
diff --git a/src/html/index.html b/src/html/index.html
index 27efe74..cbf096e 100644
--- a/src/html/index.html
+++ b/src/html/index.html
@@ -31,6 +31,7 @@
<script src="/toj/js/square.js" type="text/javascript"></script>
<script src="/toj/js/mail.js" type="text/javascript"></script>
<script src="/toj/js/manage.js" type="text/javascript"></script>
+<script src="/toj/js/stat.js" type="text/javascript"></script>
<script type="text/javascript">
@@ -49,6 +50,7 @@ $(document).ready(function(){
square.ready();
mail.ready();
manage.ready();
+ stat.ready();
j_win.on('resize',com.exheight);
$(window).on('popstate',function(e){
@@ -96,7 +98,7 @@ $(document).ready(function(){
<li class="square" style="display:none;"><a href="/toj/square/user/">方塊</a></li>
<li class="mail" style="display:none;"><a href="/toj/mail/inbox/">信箱</a></li>
<li class="manage" style="display:none;"><a href="/toj/manage/square/">管理</a></li>
- <li><a href="#">狀態</a></li>
+ <li class="stat"><a href="/toj/stat/">狀態</a></li>
<li><a href="#">關於</a></li>
</ul>
</div>
diff --git a/src/html/stat.html b/src/html/stat.html
new file mode 100644
index 0000000..a0f2581
--- /dev/null
+++ b/src/html/stat.html
@@ -0,0 +1,6 @@
+<link href="/toj/css/stat.css" rel="stylesheet">
+
+<div class="row">
+ <div class="span4 offset2 log backend"></div>
+ <div class="span4 offset1"></div>
+</div>
diff --git a/src/js/imc.js b/src/js/imc.js
index aea4a03..8970ccf 100644
--- a/src/js/imc.js
+++ b/src/js/imc.js
@@ -87,8 +87,6 @@ var imc = new function(){
}
};
- console.log(func_name);
-
part = dst.split('/');
dst_link = part.slice(0,3).join('/') + '/'
dst_path = part.slice(3,-1);
diff --git a/src/js/mail.js b/src/js/mail.js
index d1dbb83..5af97c1 100644
--- a/src/js/mail.js
+++ b/src/js/mail.js
@@ -64,6 +64,7 @@ var mail = new function(){
var as;
var pfix;
+ console.log(result);
if(com.is_callerr(result)){
index.add_alert('','警告','信箱發生錯誤');
}else{
diff --git a/src/js/manage.js b/src/js/manage.js
index 9767a38..d631d0e 100644
--- a/src/js/manage.js
+++ b/src/js/manage.js
@@ -80,11 +80,10 @@ var manage = new function(){
});
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','錯誤','刪除方塊發生錯誤');
+ index.add_alert('alert-error','失敗','刪除方塊發生錯誤');
}else{
- _update();
+ _update_list();
}
},id);
});
@@ -96,10 +95,22 @@ var manage = new function(){
return j_item;
}
- function _update(){
- var cate_defer = $.Deferred();
- var sqmod_defer = $.Deferred();
+ function _update_sqmod(){
+ var defer = $.Deferred();
+ com.call_backend('core/square/','list_sqmod',function(result){
+ var data = result.data;
+
+ if(com.is_callerr(result)){
+ index.add_alert('','警告','管理發生錯誤');
+ }else{
+ defer.resolve(data);
+ }
+ });
+
+ return defer.promise();
+ }
+ function _update_list(){
com.call_backend('core/square/','list_category',function(result){
var i;
var data = result.data;
@@ -122,84 +133,57 @@ var manage = new function(){
create_tagbox_cate.set_words(catelist);
set_tagbox_cate.set_words(catelist);
- cate_defer.resolve();
- }
- });
- com.call_backend('core/square/','list_sqmod',function(result){
- var i;
- var data = result.data;
- var j_sqmod;
- var j_option;
-
- if(com.is_callerr(result)){
- index.add_alert('','警告','管理發生錯誤');
- }else{
- j_sqmod = j_create.find('[name="sqmod"]');
- console.log(j_sqmod.length);
- j_sqmod.empty();
- for(i = 0;i < data.length;i++){
- j_option = $('<option></option>');
- j_option.attr('value',data[i].sqmodid);
- j_option.text(data[i].sqmodname);
-
- j_sqmod.append(j_option);
- }
-
- sqmod_defer.resolve();
- }
- });
-
- $.when(cate_defer,sqmod_defer).done(function(cate){
- com.call_backend('core/square/','list_square',function(result){
- var i;
- var data = result.data;
- var items;
- var j_item;
- var sqo;
-
- if(com.is_callerr(result)){
- index.add_alert('','警告','管理發生錯誤');
- }else{
- items = j_list.find('tr.item');
-
- for(i = 0;i < Math.min(items.length,data.length);i++){
- sqo = data[i];
+ com.call_backend('core/square/','list_square',function(result){
+ var i;
+ var data = result.data;
+ var items;
+ var j_item;
+ var sqo;
- if(sqo.start_time != null){
- sqo.start_time = new Date(sqo.start_time);
+ if(com.is_callerr(result)){
+ index.add_alert('','警告','管理發生錯誤');
+ }else{
+ items = j_list.find('tr.item');
+
+ 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.start_time,
+ sqo.end_time,
+ sqo.cateid,
+ sqo.intro,
+ sqo.logo,
+ sqo.hidden);
}
- if(sqo.end_time != null){
- sqo.end_time = new Date(sqo.end_time);
+ for(;i < data.length;i++){
+ sqo = data[i];
+
+ j_item = _item_create(sqo.sqid,
+ sqo.title,
+ sqo.start_time,
+ sqo.end_time,
+ sqo.cateid,
+ sqo.intro,
+ sqo.logo,
+ sqo.hidden);
+ j_list.append(j_item);
+ }
+ for(;i < items.length;i++){
+ $(items[i]).remove();
}
-
- _item_set($(items[i]),sqo.sqid,
- sqo.title,
- sqo.start_time,
- sqo.end_time,
- sqo.cateid,
- sqo.intro,
- sqo.logo,
- sqo.hidden);
- }
- for(;i < data.length;i++){
- sqo = data[i];
-
- j_item = _item_create(sqo.sqid,
- sqo.title,
- sqo.start_time,
- sqo.end_time,
- sqo.cateid,
- sqo.intro,
- sqo.logo,
- sqo.hidden);
- j_list.append(j_item);
- }
- for(;i < items.length;i++){
- $(items[i]).remove();
}
- }
- });
- });
+ });
+ }
+ });
}
if(direct == 'in'){
@@ -270,14 +254,14 @@ var manage = new function(){
}
if(err != null){
- index.add_alert('alert-error','錯誤',err);
+ index.add_alert('alert-error','失敗',err);
}else{
index.add_alert('','警告','管理發生錯誤');
}
}else{
index.add_alert('alert-success','成功','方塊已建立');
j_create.modal('hide');
- _update();
+ _update_list();
}
},title,hidden,sqmodid,intro,logo,cateid_list);
@@ -285,6 +269,26 @@ var manage = new function(){
j_create.find('button.cancel').on('click',function(e){
j_create.modal('hide');
});
+ j_create.on('show',function(e){
+ _update_sqmod().done(function(sqmod_list){
+ var i;
+ var j_sqmod;
+ var j_option;
+ var sqmodo;
+
+ j_sqmod = j_create.find('[name="sqmod"]');
+ j_sqmod.empty();
+ for(i = 0;i < sqmod_list.length;i++){
+ sqmodo = sqmod_list[i];
+
+ j_option = $('<option></option>');
+ j_option.attr('value',sqmodo.sqmodid);
+ j_option.text(sqmodo.sqmodname);
+
+ j_sqmod.append(j_option);
+ }
+ });
+ });
j_create.on('hide',function(e){
j_create.find('input').val('');
j_create.find('img.logo').attr('src',null);
@@ -375,15 +379,14 @@ var manage = new function(){
}
if(err != null){
- index.add_alert('alert-error','錯誤',err);
+ index.add_alert('alert-error','失敗',err);
}else{
- console.log(data);
index.add_alert('','警告','管理發生錯誤');
}
}else{
index.add_alert('alert-success','成功','方塊已設定');
j_set.modal('hide');
- _update();
+ _update_list();
}
},set_data.id,title,set_data.start_time,set_data.end_time,hidden,intro,logo,cateid_list);
});
@@ -400,7 +403,7 @@ var manage = new function(){
j_create.modal('show');
});
- _update();
+ _update_list();
});
}
@@ -410,6 +413,7 @@ var manage = new function(){
problem_node.url_chg = function(direct,url_upart,url_dpart,param){
var j_create;
+ var j_set;
var j_list;
var set_data;
@@ -421,11 +425,18 @@ var manage = new function(){
set_data = {
'proid':proid,
'title':title,
- 'pmodid':pmodid
};
+
+ j_set.modal('show');
});
j_item.find('button.del').on('click',function(e){
-
+ com.call_backend('core/problem/','delete_problem',function(result){
+ if(com.is_callerr(result)){
+ index.add_alert('alert-error','失敗','刪除題目發生錯誤');
+ }else{
+ _update_list();
+ }
+ },proid);
});
}
function _item_create(proid,title,pmodid){
@@ -435,8 +446,42 @@ var manage = new function(){
return j_item;
}
- function _update(){
-
+ function _update_pmod(){
+ var defer = $.Deferred();
+
+ com.call_backend('core/problem/','list_pmod',function(result){
+ var i;
+ var data = result.data;
+ var j_pmod;
+ var j_option;
+
+ if(com.is_callerr(result)){
+ index.add_alert('','警告','管理發生錯誤');
+ }else{
+ defer.resolve(data);
+ }
+ });
+
+ return defer.promise();
+ }
+ function _update_list(){
+ com.call_backend('core/problem/','list_problem',function(result){
+ var i;
+ var data = result.data;
+ var proo;
+ var j_item;
+
+ if(com.is_callerr(result)){
+ index.add_alert('','警告','管理發生錯誤');
+ }else{
+ j_list.empty();
+ for(i = 0;i < data.length;i++){
+ proo = data[i];
+ j_item = _item_create(proo.proid,proo.title,proo.pmodid);
+ j_list.append(j_item);
+ }
+ }
+ });
}
if(direct == 'in'){
@@ -444,6 +489,7 @@ var manage = new function(){
com.loadpage('/toj/html/manage_problem.html').done(function(){
j_create = j_index_page.find('div.create');
+ j_set = j_index_page.find('div.set');
j_list = j_index_page.find('table.list > tbody');
j_index_page.find('button.create').on('click',function(e){
@@ -451,14 +497,94 @@ var manage = new function(){
});
j_create.on('show',function(e){
-
+ _update_pmod().done(function(pmod_list){
+ var i;
+ var j_pmod;
+ var j_option;
+
+ j_pmod = j_create.find('[name="pmod"]');
+ j_pmod.empty();
+ for(i = 0;i < pmod_list.length;i++){
+ j_option = $('<option></option>');
+ j_option.attr('value',pmod_list[i].pmodid);
+ j_option.text(pmod_list[i].pmodname);
+
+ j_pmod.append(j_option);
+ }
+ });
});
j_create.on('hide',function(e){
j_create.find('input').val('');
});
+ j_create.find('button.submit').on('click',function(e){
+ var title = j_create.find('[name="title"]').val();
+ var pmodid = parseInt(j_create.find('[name="pmod"]').val());
+
+ com.call_backend('core/problem/','create_problem',function(result){
+ var data = result.data;
+ var err = null;
+
+ if(com.is_callerr(result)){
+ if(data == 'title_too_short'){
+ err = '題目名稱過短';
+ }else if(data == 'title_too_long'){
+ err = '題目名稱過長';
+ }
+
+ if(err != null){
+ index.add_alert('alert-error','失敗',err);
+ }else{
+ index.add_alert('','警告','管理發生錯誤');
+ }
+ }else{
+ j_create.modal('hide');
+ index.add_alert('alert-success','成功','題目已建立');
+ _update_list();
+ }
+ },title,pmodid);
+ });
+ j_create.find('button.cancel').on('click',function(e){
+ j_create.modal('hide');
+ });
+
+ j_set.on('show',function(e){
+ j_set.find('[name="title"]').val(set_data.title);
+ });
+ j_set.on('hide',function(e){
+ j_set.find('input').val('');
+ });
+ j_set.find('button.submit').on('click',function(e){
+ var title = j_set.find('[name="title"]').val();
+
+ com.call_backend('core/problem/','set_problem',function(result){
+ var data = result.data;
+ var err = null;
+
+ if(com.is_callerr(result)){
+ if(data == 'title_too_short'){
+ err = '題目名稱過短';
+ }else if(data == 'title_too_long'){
+ err = '題目名稱過長';
+ }
+
+ if(err != null){
+ index.add_alert('alert-error','失敗',err);
+ }else{
+ index.add_alert('','警告','管理發生錯誤');
+ }
+ }else{
+ j_set.modal('hide');
+ index.add_alert('alert-success','成功','題目已設定');
+ _update_list();
+ }
+ },set_data.proid,title);
+ });
+ j_set.find('button.cancel').on('click',function(e){
+ j_set.modal('hide');
+ });
+
+ _update_list();
});
- }else{
-
}
return 'cont';
diff --git a/src/js/stat.js b/src/js/stat.js
new file mode 100644
index 0000000..d9d1962
--- /dev/null
+++ b/src/js/stat.js
@@ -0,0 +1,41 @@
+'use strict'
+
+var stat = new function(){
+ var that = this;
+ var j_index_page;
+ var stat_node;
+
+ that.ready = function(){
+ j_index_page = $('#index_page');
+
+ stat_node = new vus.node('stat');
+ stat_node.url_chg = function(direct,url_upart,url_dpart,param){
+ if(direct == 'in'){
+ index.set_menu('狀態');
+ index.clear_tabnav();
+
+ com.loadpage('/toj/html/stat.html').done(function(){
+ var j_log = j_index_page.find('div.backend');
+
+ imc.Proxy.instance.register_call('core/stat/','print_log',function(callback,data){
+ var i;
+ var j_line;
+
+ if(data.charCodeAt(0) != 10){
+ j_line = $('<div></div>');
+ j_line.text(data);
+
+ j_log.prepend(j_line);
+ }
+ callback('Success');
+ });
+ });
+ }else if(direct == 'out'){
+ imc.Proxy.instance.unregister_call('core/stat/','print_log');
+ }
+
+ return 'cont';
+ };
+ com.vus_root.child_set(stat_node);
+ };
+};
diff --git a/src/py/backend_server.py b/src/py/backend_server.py
index 5a58445..6d0ceec 100755
--- a/src/py/backend_server.py
+++ b/src/py/backend_server.py
@@ -1,5 +1,7 @@
#! /usr/bin/env python
+import traceback
+import sys
import socket
import json
import datetime
@@ -23,10 +25,21 @@ from tojauth import TOJAuth
from test_blob import TOJBlobTable,TOJBlobHandle
from imc.blobclient import BlobClient
+class StdLogger(object):
+ def __init__(self,callback):
+ self._callback = callback
+
+ def write(self,data):
+ self._callback(data)
+
+ def flush(self):
+ pass
+
class BackendWorker(tornado.tcpserver.TCPServer):
def __init__(self,center_addr,ws_port):
super().__init__()
+ self._log = StdLogger(self._send_log)
self._ioloop = tornado.ioloop.IOLoop.current()
self.center_addr = center_addr
self.sock_addr = None
@@ -39,6 +52,9 @@ class BackendWorker(tornado.tcpserver.TCPServer):
self._client_linkmap = {}
def start(self):
+ sys.stdout = self._log
+ sys.stderr = self._log
+
sock_port = random.randrange(4096,8192)
self.sock_addr = ('10.8.0.6',sock_port)
@@ -121,6 +137,7 @@ class BackendWorker(tornado.tcpserver.TCPServer):
mod.load('Notice','notice',self._idendesc,self._get_link)
mod.load('UserMg','user',self._idendesc,self._get_link)
mod.load('SquareMg','square',self._idendesc,self._get_link)
+ mod.load('ProblemMg','problem',self._idendesc,self._get_link)
mod.load('Mail','mail',self._idendesc,self._get_link)
except Exception as e:
@@ -156,8 +173,13 @@ class BackendWorker(tornado.tcpserver.TCPServer):
TOJBlobHandle)
blobclient.open_container('test','ACTIVE')
- handle = blobclient.open('test','testblob',TOJBlobHandle.WRITE |
- TOJBlobHandle.CREATE)
+ try:
+ handle = blobclient.open(
+ 'test','testblob',
+ TOJBlobHandle.WRITE | TOJBlobHandle.CREATE
+ )
+ except:
+ pass
print(handle._fileno)
handle.write(bytes('Hello Data','utf-8'),0)
handle.commit(False);
@@ -275,6 +297,14 @@ class BackendWorker(tornado.tcpserver.TCPServer):
return ret
@imc.async.caller
+ def _send_log(self,data):
+ links = self._client_linkmap.keys()
+
+ with TOJAuth.change_current_iden(self._idendesc):
+ for link in links:
+ Proxy.instance.call_async(link + 'core/stat/','print_log',10000,None,data)
+
+ @imc.async.caller
def _test_get_client_list(self,talk,talk2):
stat,ret = Proxy.instance.call(TOJAuth.get_current_iden()['link'] + 'test/route/','80s',1000,'attation','mega')
print(ret)
diff --git a/src/py/imc/blobclient.py b/src/py/imc/blobclient.py
index 8d54ffe..f4879af 100755
--- a/src/py/imc/blobclient.py
+++ b/src/py/imc/blobclient.py
@@ -165,8 +165,11 @@ class BlobClient:
# TODO:
# pend operation when client can't imc call server
return False
- # TODO:
- # if commit success , copy tmpfile to location
+ else:
+ # TODO:
+ # if commit success , copy tmpfile to location
+ if ret:
+ blobhandle.copy_tmp()
# TODO:
# opencounts ?
@@ -227,7 +230,8 @@ class BlobClient:
self._opencounts[blob] += 1
return handle
- def close(self, blobhandle):
- blob = ''.join([blobhandle._name, '_',
- str(blobhandle.get_rev())])
- self._opencounts[blob] -= 1
+ def close(self, blobhandle):
+ blob = ''.join([blobhandle._name, '_',
+ str(blobhandle.get_rev())])
+ self._opencounts[blob] -= 1
+
diff --git a/src/py/imc/blobhandle.py b/src/py/imc/blobhandle.py
index b957162..40ff523 100755
--- a/src/py/imc/blobhandle.py
+++ b/src/py/imc/blobhandle.py
@@ -24,7 +24,7 @@ class BlobHandle:
'_', str(self.get_rev())])
if flag & BlobHandle.CREATE:
if not flag & BlobHandle.WRITE:
- raise Exception("invalid flag")
+ raise ValueError("invalid flag")
else:
self._need_commit = True
self._createtag = True
@@ -33,7 +33,7 @@ class BlobHandle:
self._tmpfile = self.gen_tmp()
def __del__(self):
- self._del_tmp()
+ self.del_tmp()
self._blobclient.close(self)
def create(self):
@@ -121,6 +121,14 @@ class BlobHandle:
commit_info['written'] = self._written
return self._blobclient.commit(commit_info, flag, self)
+ def copy_tmp(self):
+ BlobHandle.copy_file(
+ self._tmpfile,
+ ''.join([self._location, self._info['container'], '_',
+ self._name, '_', str(self._info['rev'])])
+ )
+ pass
+
@abstractmethod
def gen_tmp(self):
# return tmp file path
@@ -144,6 +152,11 @@ class BlobHandle:
@staticmethod
@abstractmethod
+ def copy_file(source, dest):
+ pass
+
+ @staticmethod
+ @abstractmethod
def del_blob(blobpath):
pass
diff --git a/src/py/imc/blobtable.py b/src/py/imc/blobtable.py
new file mode 100755
index 0000000..34e2d01
--- /dev/null
+++ b/src/py/imc/blobtable.py
@@ -0,0 +1,65 @@
+#! /usr/bin/env python
+
+from abc import abstractmethod
+
+class BlobTable:
+ @abstractmethod
+ def __init__(self):
+ pass
+
+ # client
+ # server
+ @abstractmethod
+ def get_blob_list(self, container=None):
+ # return a dict {blobname:rev}
+ # if container is not None , only return blobs in that container
+ pass
+
+ # client
+ # server
+ @abstractmethod
+ def get_blob_info(self, blobname, attr=None):
+ # if the blobname doesn't exist, return None
+ if attr is None:
+ # return blob info
+ pass
+ else:
+ # return specific attribute
+ pass
+
+ # server
+ @abstractmethod
+ def create_container(self, container):
+ pass
+
+ # server
+ @abstractmethod
+ def del_container(self, container):
+ pass
+
+ # server
+ @abstractmethod
+ def get_container_list(self):
+ # return a set of container
+ pass
+
+ # client
+ # server
+ @abstractmethod
+ def update_blob(self, blobname, info):
+ pass
+
+ # client
+ # server
+ @abstractmethod
+ def del_blob(self, blobname):
+ pass
+
+"""
+info:
+ rev (int)
+ container (str)
+ metadata (str)
+ size (???)
+ commit_time (???)
+"""
diff --git a/src/py/problem.py b/src/py/problem.py
new file mode 100644
index 0000000..443408a
--- /dev/null
+++ b/src/py/problem.py
@@ -0,0 +1,282 @@
+from tojauth import TOJAuth
+from asyncdb import AsyncDB
+import mod
+import com
+import imc.async
+from imc.proxy import Proxy
+import config
+
+class ProblemMg:
+ _accessid = 6
+
+ TITLE_LEN_MIN = 1
+ TITLE_LEN_MAX = 100
+
+ def __init__(self, mod_idendesc, get_link_fn):
+ ProblemMg.db = AsyncDB(config.CORE_DBNAME, config.CORE_DBUSER,
+ config.CORE_DBPASSWORD)
+ ProblemMg._idendesc = mod_idendesc
+ self.get_link = get_link_fn
+ self._pmod_list = {}
+
+ Proxy.instance.register_call(
+ 'core/problem/', 'create_problem', self.create_problem)
+ Proxy.instance.register_call(
+ 'core/problem/', 'delete_problem', self.delete_problem)
+ Proxy.instance.register_call(
+ 'core/problem/', 'set_problem', self.imc_set_problem)
+ Proxy.instance.register_call(
+ 'core/problem/', 'list_problem', self.list_problem)
+ Proxy.instance.register_call(
+ 'core/problem/', 'list_pmod', self.list_pmod)
+
+ def unload(self):
+ Proxy.instance.unregister_call(
+ 'core/problem/', 'create_problem')
+ Proxy.instance.register_call(
+ 'core/problem/', 'delete_problem')
+ Proxy.instance.unregister_call(
+ 'core/problem/', 'set_problem')
+ Proxy.instance.unregister_call(
+ 'core/problem/', 'list_problem')
+ Proxy.instance.unregister_call(
+ 'core/problem/', 'list_problem')
+
+ @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_EXECUTE)
+ def load_problem(self, proid):
+ if proid in self._pmod_list:
+ return self._pmod_list[proid]
+
+ proinfo = self.get_problem_info_by_proid(proid)
+ pmodname = self.proinfo['pmodname']
+ pmod = mod.load_pmod(pmodname)
+ self._pmod_list[proid] = pmod(self._idendesc, self.get_link, proid)
+
+ return self._pmod_list[proid]
+
+ @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_EXECUTE)
+ def unload_problem(self, proid):
+ if proid in self._pmod_list:
+ self._pmod_list[proid].unload(True)
+ del self._pmod_list[proid]
+
+ @imc.async.caller
+ def create_problem(self, title, pmodid):
+ if(
+ type(title) != str or
+ type(pmodid) != 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'
+
+ if not self.does_pmodid_exist(pmodid):
+ return 'Epmodid'
+
+ proid = self._create_problem(title, pmodid)
+ return {'proid': proid}
+
+ @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_CREATE)
+ def _create_problem(self, title, pmodid):
+ cur = self.db.cursor()
+ sqlstr = ('INSERT INTO "PROBLEM" ("title", "pmodid", "accessid") '
+ 'VALUES (%s, %s, %s) RETURNING "proid";')
+ sqlarr = (title, pmodid, 0)
+ cur.execute(sqlstr, sqlarr)
+
+ proid = None
+ for data in cur:
+ proid = data[0]
+
+ if proid == None:
+ return None
+
+ user_idenid = TOJAuth.get_current_iden()['idenid']
+ with TOJAuth.change_current_iden(self._idendesc):
+ accessid = TOJAuth.instance.create_access(user_idenid)
+
+ sqlstr = ('UPDATE "PROBLEM" SET "accessid" = %s WHERE "proid" = %s;')
+ sqlarr = (accessid, proid)
+ cur.execute(sqlstr, sqlarr)
+
+ TOJAuth.instance.set_access_list(
+ accessid, TOJAuth.ROLEID_PROBLEM_ADMIN_GROUP,
+ TOJAuth.ACCESS_ALL
+ )
+
+ # pmodname = self.get_pmodname_by_pmodid(pmodid)
+ # pmod = mod.load_pmod(pmodname)
+
+ # pmod.create_problem_data(proid)
+
+ return proid
+
+ @imc.async.caller
+ def delete_problem(self, proid):
+ if(
+ type(proid) != int
+ ):
+ return 'Eparameter'
+
+ if not self.does_proid_exist(proid):
+ return 'Eproid'
+
+ self._delete_problem(proid)
+
+ return 'Success'
+
+ def _delete_problem(self, proid):
+ accessid = self.get_accessid_by_proid(proid)
+ TOJAuth.check_access_func(accessid, TOJAuth.ACCESS_DELETE)
+
+ # proinfo = self.get_problem_info_by_proid(proid)
+ # pmodname = proinfo['pmodname']
+ # pmod = mod.load_pmod(pmodname)
+
+ with TOJAuth.change_current_iden(self._idendesc):
+ self.unload_problem(proid)
+
+ # pmod.delete_problem_data(proid)
+
+ TOJAuth.instance.del_access(accessid)
+
+ cur = self.db.cursor()
+ sqlstr = ('DELETE FROM "PROBLEM" WHERE "proid" = %s;')
+ sqlarr = (proid, )
+ cur.execute(sqlstr, sqlarr)
+
+ @imc.async.caller
+ def imc_set_problem(self, proid, title):
+ if(
+ type(proid) != int or
+ type(title) != str
+ ):
+ return 'Eparameter'
+
+ if len(title) < self.TITLE_LEN_MIN:
+ return 'Etitle_too_short'
+ elif len(title) > self.TITLE_LEN_MAX:
+ return 'Etitle_too_long'
+
+ if not self.does_proid_exist(proid):
+ return 'Eproid'
+
+ self.set_problem(proid, title)
+
+ return 'Success'
+
+ def set_problem(self, proid, title):
+ accessid = self.get_accessid_by_proid(proid)
+ TOJAuth.check_access_func(accessid, TOJAuth.ACCESS_WRITE)
+
+ cur = self.db.cursor()
+ sqlstr = ('UPDATE "PROBLEM" SET "title" = %s WHERE "proid" = %s;')
+ sqlarr = (title, proid)
+ cur.execute(sqlstr, sqlarr)
+
+ @imc.async.caller
+ def list_problem(self):
+ ret = self._list_problem()
+
+ return ret
+
+ @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_EXECUTE)
+ def _list_problem(self):
+ cur = self.db.cursor()
+ sqlstr = ('SELECT "proid", "title", "pmodid" FROM "PROBLEM" ORDER BY '
+ '"proid" ASC;')
+ cur.execute(sqlstr)
+
+ problem_list = []
+ for data in cur:
+ obj = {}
+ obj['proid'] = data[0]
+ obj['title'] = data[1]
+ obj['pmodid'] = data[2]
+
+ problem_list.append(obj)
+
+ return problem_list
+
+ @imc.async.caller
+ def get_problem_info(self, proid):
+ if(
+ type(proid) != int
+ ):
+ return 'Eparameter'
+
+ ret = self.get_problem_info_by_proid(proid)
+
+ if ret == None:
+ return 'Eproid'
+
+ return ret
+
+ @imc.async.caller
+ def list_pmod(self):
+ cur = self.db.cursor()
+ sqlstr = ('SELECT "pmodid", "pmodname", "info" FROM "PMOD" ORDER BY '
+ '"pmodid" ASC;')
+ cur.execute(sqlstr)
+
+ pmod_list = []
+ for data in cur:
+ obj = {}
+ obj['pmodid'] = data[0]
+ obj['pmodname'] = data[1]
+ obj['info'] = data[2]
+
+ pmod_list.append(obj)
+
+ return pmod_list
+
+ def get_accessid_by_proid(self, proid):
+ cur = self.db.cursor()
+ sqlstr = ('SELECT "accessid" FROM "PROBLEM" WHERE "proid" = %s;')
+ sqlarr = (proid, )
+ cur.execute(sqlstr, sqlarr)
+
+ accessid = None
+ for data in cur:
+ accessid = data[0]
+
+ return accessid
+
+ def get_problem_info_by_proid(self, proid):
+ cur = self.db.cursor()
+ sqlstr = ('SELECT "proid", "title", "pmodid" FROM "PROBLEM" WHERE '
+ '"proid" = %s;')
+ sqlarr = (proid, )
+ cur.execute(sqlstr, sqlarr)
+
+ ret = None
+ for data in cur:
+ ret = {}
+ ret['proid'] = data[0]
+ ret['title'] = data[1]
+ ret['pmodid'] = data[2]
+
+ # ret['pmodname'] = self.get_pmodname_by_pmodid(obj['pmodid'])
+
+ return ret
+
+ def does_proid_exist(self, proid):
+ pro_info = self.get_problem_info_by_proid(proid)
+
+ return pro_info != None
+
+ def get_pmodname_by_pmodid(self, pmodid):
+ return 'ABC'
+
+ def does_pmodid_exist(self, pmodid):
+ pmodname = self.get_pmodname_by_pmodid(pmodid)
+
+ return pmodname != None
+
+class Problem:
+ def unload(self, Force):
+ pass
+
diff --git a/src/py/square.py b/src/py/square.py
index bf16621..159120b 100644
--- a/src/py/square.py
+++ b/src/py/square.py
@@ -80,7 +80,7 @@ class SquareMg:
return self._sqmod_list[sqid]
sqinfo = self.get_square_info_by_sqid(sqid)
- sqmodname = self.get_sqmodname_by_sqmodid(sqinfo['sqmodid'])
+ sqmodname = sqinfo['sqmodname']
sqmod = mod.load_sqmod(sqmodname)
self._sqmod_list[sqid] = sqmod(self._idendesc, self.get_link, sqid)
@@ -194,7 +194,7 @@ class SquareMg:
TOJAuth.check_access_func(accessid, TOJAuth.ACCESS_DELETE)
sqinfo = self.get_square_info_by_sqid(sqid)
- sqmodname = self.get_sqmodname_by_sqmodid(sqinfo['sqmodid'])
+ sqmodname = sqinfo['sqmodname']
sqmod = mod.load_sqmod(sqmodname)
with TOJAuth.change_current_iden(self._idendesc):
@@ -202,8 +202,7 @@ class SquareMg:
sqmod.delete_square_data(sqid)
- with TOJAuth.change_current_iden(self._idendesc):
- TOJAuth.instance.del_access(accessid)
+ TOJAuth.instance.del_access(accessid)
cur = self.db.cursor()
sqlstr = ('DELETE FROM "SQUARE" WHERE "sqid" = %s;')
@@ -472,6 +471,7 @@ class SquareMg:
obj['sqmodid'] = data[0]
obj['sqmodname'] = data[1]
obj['info'] = data[2]
+
sqmod_list.append(obj)
return sqmod_list
@@ -632,7 +632,7 @@ class SquareMg:
return sqmodname != None
class Square:
- def unload(self):
+ def unload(self, Force):
pass
class Group:
diff --git a/src/py/user.py b/src/py/user.py
index ba6b4d9..d261384 100755
--- a/src/py/user.py
+++ b/src/py/user.py
@@ -126,6 +126,9 @@ class UserMg:
self, username, passhash, nickname, email, avatar, aboutme, cover
):
roleid = TOJAuth.instance.create_role(username, TOJAuth.ROLETYPE_USER)
+ with TOJAuth.change_current_iden(self._idendesc):
+ TOJAuth.instance.set_role_relation(
+ roleid, TOJAuth.ROLEID_USER_GROUP)
cur = self.db.cursor()
sqlstr = ('INSERT INTO "USER" ("username", "passhash", "nickname", '