aboutsummaryrefslogtreecommitdiffstats
path: root/src/py/square.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/py/square.py')
-rw-r--r--src/py/square.py323
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
+