diff options
Diffstat (limited to 'src/py/square.py')
-rw-r--r-- | src/py/square.py | 323 |
1 files changed, 268 insertions, 55 deletions
diff --git a/src/py/square.py b/src/py/square.py index 68f1be4..ebdf9fb 100644 --- a/src/py/square.py +++ b/src/py/square.py @@ -1,7 +1,10 @@ +import datetime + from tojauth import TOJAuth from asyncdb import AsyncDB -from user import UserMg -import imc.proxy +import mod +import imc.async +from imc.proxy import Proxy import config class SquareMg: @@ -9,23 +12,64 @@ class SquareMg: TITLE_LEN_MIN = 1 TITLE_LEN_MAX = 100 + INTRO_LEN_MIN = 0 + INTRO_LEN_MAX = 1000 + LOGO_LEN_MIN = 0 + LOGO_LEN_MAX = 200 SQUARE_CATE_NUM_MAX = 50 + JOIN_REJECT = 1 + JOIN_ACCEPT = 2 + JOIN_PENDING = 3 + + STATUS_WAITING = 1 + STATUS_RUNNING = 2 + STATUS_ENDED = 3 + def __init__(self, mod_idendesc, get_link_fn): - SquareMg.instance = self SquareMg.db = AsyncDB(config.CORE_DBNAME, config.CORE_DBUSER, config.CORE_DBPASSWORD) SquareMg._idendesc = mod_idendesc self.get_link = get_link_fn + self._sqmod_list = {} + + Proxy.instance.register_call( + 'core/square/', 'list_category', self.list_category) + Proxy.instance.register_call( + 'core/square/', 'list_square', self.list_square) + Proxy.instance.register_call( + 'core/square/', 'join_square', self.join_square) + Proxy.instance.register_call( + 'core/square/', 'quit_square', self.quit_square) + + @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_EXECUTE) + def load_square(self, sqid): + if sqid in self._sqmod_list: + return self._sqmod_list[sqid] + + sqinfo = self.get_square_info_by_sqid(sqid) + sqmodname = self.get_sqmodname_by_sqmodid(sqinfo['sqmodid']) + sqmod = mod.load_sqmod(sqmodname) + self._sqmod_list[sqid] = sqmod(self._idendesc, self.get_link, sqid) + + return self._sqmod_list[sqid] + + @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_EXECUTE) + def unload_square(self, sqid): + if sqid in self._sqmod_list: + self._sqmod_list[sqid].unload(True) + del self._sqmod_list[sqid] @imc.async.caller - def create_square(self, title, hidden, sqmodid, category = []): + def create_square(self, title, hidden, sqmodid, intro, logo, category = []): if( type(title) != str or type(hidden) != bool or type(sqmodid) != int or - type(category) != list + type(category) != list or + type(intro) != str or + type(logo) != str ): return 'Eparameter' @@ -39,6 +83,14 @@ class SquareMg: 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' if len(category) > self.SQUARE_CATE_NUM_MAX: return 'Etoo_many_category' @@ -49,38 +101,47 @@ class SquareMg: if not self.does_cateid_exist(cateid): return 'Eno_such_cateid' - sqid = self._create_square(title, hidden, sqmodid) + if not self.does_sqmodid_exist(sqmodid): + return 'Eno_such_sqmodid' + + sqid = self._create_square(title, hidden, sqmodid, intro, logo) self._set_square_category(sqid, category) return {'sqid': sqid} @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_CREATE) - def _create_square(self, title, hidden, sqmodid): + def _create_square(self, title, hidden, sqmodid, intro, logo): cur = self.db.cursor() sqlstr = ('INSERT INTO "SQUARE" ("title", "hidden", "sqmodid", ' - '"accessid") VALUES (%s, %s, %s, %s) RETURNING "sqid";') - sqlarr = (title, hidden, sqmodid, 0) + '"intro", "logo", "accessid") VALUES (%s, %s, %s, %s, ' + '%s, %s) RETURNING "sqid";') + sqlarr = (title, hidden, sqmodid, intro, logo, 0) cur.execute(sqlstr, sqlarr) sqid = None for data in cur: sqid = data[0] - if sqid != None: - user_idenid = TOJAuth.get_current_iden()['idenid'] - with TOJAuth.change_current_iden(self._idendesc): - accessid = TOJAuth.instance.create_access(user_idenid) + if sqid == None: + return None - sqlstr = ('UPDATE "SQUARE" SET "accessid" = %s WHERE "sqid" = %s;') - sqlarr = (accessid, sqid) - cur.execute(sqlstr, sqlarr) + user_idenid = TOJAuth.get_current_iden()['idenid'] + with TOJAuth.change_current_iden(self._idendesc): + accessid = TOJAuth.instance.create_access(user_idenid) - with TOJAuth.change_current_iden(self._idendesc): - TOJAuth.instance.set_access_list( - accessid, TOJAuth.ROLEID_SQUARE_ADMIN_GROUP, - TOJAuth.ACCESS_ALL - ) + sqlstr = ('UPDATE "SQUARE" SET "accessid" = %s WHERE "sqid" = %s;') + 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 + ) + + sqmodname = self.get_sqmodname_by_sqmodid(sqmodid) + sqmod = mod.load_sqmod(sqmodname) - # sqmod.create_square_data(sqid) + sqmod.create_square_data(sqid) return sqid; @@ -100,7 +161,14 @@ class SquareMg: accessid = self.get_accessid_by_sqid(sqid) TOJAuth.check_access_func(accessid, TOJAuth.ACCESS_DELETE) - # sqmod.delete_square_data(sqid) + sqinfo = self.get_square_info_by_sqid(sqid) + sqmodname = self.get_sqmodname_by_sqmodid(sqinfo['sqmodid']) + sqmod = mod.load_sqmod(sqmodname) + + with TOJAuth.change_current_iden(self._idendesc): + self.unload_square(sqid) + + sqmod.delete_square_data(sqid) with TOJAuth.change_current_iden(self._idendesc): TOJAuth.instance.del_access(accessid) @@ -110,6 +178,10 @@ class SquareMg: sqlarr = (sqid, ) cur.execute() + sqlstr = ('DELETE FROM "SQUARE_USER" WHERE "sqid" = %s;') + sqlarr = (sqid, ) + cur.execute() + @imc.async.caller def list_square(self, cateid = None): if( @@ -118,40 +190,36 @@ class SquareMg: return 'Eparameter' ret = None - if cateid == None: - ret = self._list_square_all() - else: - if not self.does_cateid_exist(cateid): - return 'Eno_such_cateid' - ret = self._list_square_category(cateid) + if cateid != None and not self.does_cateid_exist(cateid): + return 'Eno_such_cateid' - return ret + uid = mod.UserMg.get_current_uid() - def _list_square_category(self, cateid): - cur = self.db.cursor() - sqlstr = ('SELECT "sqid", "title", "start_time", "end_time", "hidden",' - ' "sqmodid" FROM "SQUARE" WHERE %s = ANY ("cateid");') - sqlarr = (cateid, ) - cur.execute(sqlstr, sqlarr) - - ret = [] - for data in cur: - obj = {} - obj['sqid'] = data[0] - obj['title'] = data[1] - obj['start_time'] = data[2] - obj['end_time'] = data[3] - obj['hidden'] = data[4] - obj['sqmodid'] = data[5] - ret.append(obj) + ret = self._list_square_category(cateid, uid) return ret - def _list_square_all(self): + def _list_square_category(self, cateid, uid): cur = self.db.cursor() - sqlstr = ('SELECT "sqid", "title", "start_time", "end_time", "hidden",' - ' "sqmodid" FROM "SQUARE";') - cur.execute(sqlstr) + sqlsel = ('SELECT "SQUARE"."sqid", "title", "start_time", "end_time", ' + '"hidden", "sqmodid", "intro", "logo"') + sqlfrom = (' FROM "SQUARE"') + sqlwhere = (' WHERE true') + sqlarr = [] + + if uid != None: + sqlsel = sqlsel + (', "active"') + sqlfrom = sqlfrom + (' LEFT JOIN "SQUARE_USER" ON "SQUARE"."sqid"' + ' = "SQUARE_USER"."sqid" AND "SQUARE_USER".' + '"uid" = %s') + sqlarr.append(uid) + + if cateid != None: + sqlwhere = sqlwhere + (' AND %s = ANY ("cateid")') + sqlarr.append(cateid) + + sqlstr = sqlsel + sqlfrom + sqlwhere + ';' + cur.execute(sqlstr, sqlarr) ret = [] for data in cur: @@ -162,6 +230,24 @@ class SquareMg: obj['end_time'] = data[3] obj['hidden'] = data[4] obj['sqmodid'] = data[5] + obj['intro'] = data[6] + obj['logo'] = data[7] + if uid != None: + obj['active'] = data[8] + + nowtime = datetime.datetime.now(datetime.timezone.utc) + + if obj['start_time'] == None: + obj['status'] = self.STATUS_RUNNING + elif nowtime < obj['start_time']: + obj['status'] = self.STATUS_WAITING + elif obj['end_time'] == None: + obj['status'] = self.STATUS_RUNNING + elif nowtime > obj['end_time']: + obj['status'] = self.STATUS_ENDED + else: + obj['status'] = self.STATUS_RUNNING + ret.append(obj) return ret @@ -246,16 +332,117 @@ class SquareMg: sq_accessid = self.get_accessid_by_sqid(sqid) TOJAuth.check_access_func(sq_accessid, TOJAuth.ACCESS_WRITE) + if category == {}: + category = {0} + cur = self.db.cursor() sqlstr = ('UPDATE "SQUARE" SET "cateid" = %s WHERE "sqid" = %s;') sqlarr = (category, sqid) cur.execute(sqlstr, sqlarr) + @imc.async.caller + def list_category(self): + cur = self.db.cursor() + sqlstr = ('SELECT "cateid", "catename" FROM "CATEGORY" ORDER BY ' + '"cateid" ASC;') + cur.execute(sqlstr) + + cate_list = [] + for data in cur: + cate = {} + cate['cateid'] = data[0] + cate['catename'] = data[1] + + if cate['cateid'] == 0: + zerocate = cate + else: + cate_list.append(cate) + + cate_list.append(zerocate) + + return cate_list + + @imc.async.caller + def join_square(self, sqid): + if( + type(sqid) != int + ): + return 'Eparameter' + + uid = mod.UserMg.get_current_uid() + if uid == None: + return 'Euid' + + sq = self.get_square_info_by_sqid(sqid) + if sq == None: + return 'Eno_such_sqid' + + with TOJAuth.change_current_iden(self._idendesc): + sqobj = self.load_square(sqid) + + result = sqobj.join_square(uid) + + if result == self.JOIN_REJECT: + return 'Ereject' + elif result == self.JOIN_PENDING: + with TOJAuth.change_current_iden(self._idendesc): + self._set_user_square_relation(uid, sqid, False) + return {'active': False} + 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' + + @imc.async.caller + def quit_square(self, sqid): + if( + type(sqid) != int + ): + return 'Eparameter' + + uid = mod.UserMg.get_current_uid() + if uid == None: + return 'Euid' + + sq = self.get_square_info_by_sqid(sqid) + if sq == None: + return 'Eno_such_sqid' + + with TOJAuth.change_current_iden(self._idendesc): + sqobj = self.load_square(sqid) + + sqobj.quit_square(uid) + + with TOJAuth.change_current_iden(self._idendesc): + self._del_user_square_relation(uid, sqid) + + @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_WRITE) + def _set_user_square_relation(self, uid, sqid, active): + cur = self.db.cursor() + name = 'SQUARE_USER' + cond = { + 'sqid': sqid, + 'uid': uid + } + value = { + 'active': active + } + cur.upsert(name, cond, value) + + @TOJAuth.check_access(_accessid, TOJAuth.ACCESS_WRITE) + def _del_user_square_relation(self, uid, sqid): + cur = self.db.cursor() + sqlstr = ('DELETE FROM "SQUARE_USER" WHERE "uid" = %s AND "sqid" = %s;') + sqlarr = (uid, sqid) + cur.execute(sqlstr, sqlarr) + def get_square_info_by_sqid(self, sqid): cur = self.db.cursor() sqlstr = ('SELECT "sqid", "title", "start_time", "end_time", ' - '"hidden", "sqmodid", "cateid" FROM "SQUARE" WHERE ' - '"sqid" = %s;') + '"hidden", "sqmodid", "intro", "logo", "cateid" FROM ' + '"SQUARE" WHERE "sqid" = %s;') sqlarr = (sqid, ) cur.execute(sqlstr, sqlarr) @@ -268,7 +455,12 @@ class SquareMg: ret['end_time'] = data[3] ret['hidden'] = data[4] ret['sqmodid'] = data[5] - ret['cateid'] = data[6] + ret['intro'] = data[6] + ret['logo'] = data[7] + ret['cateid'] = data[8] + + if 0 in ret['cateid']: + ret['cateid'] = [] return ret @@ -304,8 +496,29 @@ class SquareMg: catename = self.get_catename_by_cateid(cateid) return catename != None + def get_sqmodname_by_sqmodid(self, sqmodid): + cur = self.db.cursor() + sqlstr = ('SELECT "sqmodname" FROM "SQMOD" WHERE "sqmodid" = %s;') + sqlarr = (sqmodid, ) + cur.execute(sqlstr, sqlarr) + + sqmodname = None + for data in cur: + sqmodname = data[0] + + return sqmodname + + def does_sqmodid_exist(self, sqmodid): + sqmodname = self.get_sqmodname_by_sqmodid(sqmodid) + return sqmodname != None + + def unload(): + pass + class Square: - pass + def unload(self): + pass class Group: pass + |