diff options
author | pzread <netfirewall@gmail.com> | 2013-07-01 01:36:42 +0800 |
---|---|---|
committer | pzread <netfirewall@gmail.com> | 2013-07-01 01:36:42 +0800 |
commit | 11c1e8d39a35e2e21cd15673461e3ec5ce1e5ceb (patch) | |
tree | 5ee49afd50b0a457bbcbd39ddc863b2b676d32b8 | |
parent | 2fcbd95c84b5ad35ac28888f8e910e8a442258fc (diff) | |
download | taiwan-online-judge-11c1e8d39a35e2e21cd15673461e3ec5ce1e5ceb.tar.gz taiwan-online-judge-11c1e8d39a35e2e21cd15673461e3ec5ce1e5ceb.tar.zst taiwan-online-judge-11c1e8d39a35e2e21cd15673461e3ec5ce1e5ceb.zip |
Add problem. Add system stat
-rw-r--r-- | src/css/stat.less | 9 | ||||
-rw-r--r-- | src/html/index.html | 4 | ||||
-rw-r--r-- | src/html/stat.html | 6 | ||||
-rw-r--r-- | src/js/imc.js | 2 | ||||
-rw-r--r-- | src/js/mail.js | 1 | ||||
-rw-r--r-- | src/js/manage.js | 312 | ||||
-rw-r--r-- | src/js/stat.js | 41 | ||||
-rwxr-xr-x | src/py/backend_server.py | 34 | ||||
-rwxr-xr-x | src/py/imc/blobclient.py | 16 | ||||
-rwxr-xr-x | src/py/imc/blobhandle.py | 17 | ||||
-rwxr-xr-x | src/py/imc/blobtable.py | 65 | ||||
-rw-r--r-- | src/py/problem.py | 282 | ||||
-rw-r--r-- | src/py/square.py | 10 | ||||
-rwxr-xr-x | src/py/user.py | 3 |
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", ' |