def main(web, build): # -------------------------------------------------------------------------- # # urlの妥当性の確認 # #if not web.get('type'): # return web.redirect('/open/passremind') u = re.match(r'(.+)\.([0-9]+)', web.get('type')) uno = u.group(2) unohash = u.group(1) uno16 = blossom.md5(uno, 16) # # クッキーの値に妥当性がないとメールアドレスの入力画面へ戻る # if uno16 != unohash: return web.redirect('/passremind') if web.post('pass1'): pass1 = web.post('pass1') pass2 = web.post('pass2') # # バリテーションチェック、入力内容に問題がなければmassageに"notvalidator"が入る # 問題があればエラー内容がmassageに入る # massage = matsuoka_func.pass_validator(pass1, pass2, varchar=8) if not massage == "notvalidator": return web.redirect('/signin?message=' + str(massage)) # # パスワードの再設定 # passhash16 = blossom.md5(pass1, 16) sql = """ UPDATE `user` SET `passhash` = 0x""" + passhash16 + """ WHERE `uno` = %(uno)s;""" params = {'uno': uno} web.db.exe(sql, params=params, key=True) return web.redirect('/signin?message=passwordChanged') local = {} return build(web, local, '/open/open.passreset.html')
def main(web, build): # -------------------------------------------------------------------------- # # POST # if web.environ('REQUEST_METHOD')=='POST': mailaddr = web.post('mailaddr') params = { 'mailaddr':mailaddr } sql = """ SELECT `uno`,`admin`,`ano` FROM `user` WHERE `mailaddr` = %(mailaddr)s AND `deleted` = 0;""" row = web.db.exe(sql, params=params, key=True) uno = row['uno'] # # userが存在しない場合、メールを送信しない # if not row: return web.redirect('/signin?message=userNotFound') # # unoのhass化 # uno16 = blossom.md5(row['uno'], 16) hash = str(uno16) + '.' + str(uno) # # パスワード再設定ページのメールを送信 # txt = blossom.read('../template/eml/open.passremind.eml') txt = txt % { 'mailaddr' :'*****@*****.**', 'HTTP_HOST':web._environ['HTTP_HOST'], 'hash' :hash } result = blossom.Mail.send(txt) local = { } #return build(web, local, '/open/open.passremind.html') return build(web, local,'/open/' \ + web.path.replace('/', '.')[1:] + '.html')
def compile(web, ext, files, option): # # src, dst, wch # timehash = blossom.md5(str(time.time()).encode(), 16) path_src = '../gulpd.workspace/src/' + timehash path_dst = '../gulpd.workspace/dst/' + timehash path_wch = '../gulpd.workspace/wch/' + timehash + '.' + ext # # ソースコード配置 # for cid, body in files.items(): blossom.write(path_src + cid, body) # # 削除のための所有権を得るために出力先ディレクトリを自前で作成しておく # os.mkdir(path_dst) os.chmod(path_dst, 0o777) # # コンパイル開始 # blossom.write(path_wch, blossom.json(option)) time.sleep(.3) # # コンパイル終了 # body = None c = .0 while c < 4.0: time.sleep(.1) body = blossom.read(path_dst + '/gulp.' + ext) if body: break else: c += .1 else: body = '@Error\nCompile Timeout.' # # @Error|not # if body.startswith('@Error\n'): # # エラーメッセージ整形 # # 内容に含まれるファイルのフルパスが一般利用者に知られるのは # セキュリティ上の理由から好ましくないため、パスの接頭部分を削除して # ユーザのファイルシステム上のパスに変換する。 # body = body[7:] body = re.sub(r'[./\w]+' + timehash, '', body) if body == 'undefined': body = 'Unknown Error' else: # # ソースマップ # # ファイル末尾の表記を削除する # //# sourceMappingURL=gulp.scss.map # body = re.sub(r'\s*//# sourceMappingURL=.+\s*', '', body) # # 外部ファイルへ書き出されているマップを追記する。 # if option.get('sourcemaps'): filename = path_dst + '/gulp.' + ext + '.map' sourcemap = blossom.read(filename, raw=True) if sourcemap: import base64 body += ('\n' + '/*# sourceMappingURL=data:application/json;base64,' + base64.b64encode(sourcemap).decode() + ' */') else: web.log('Not Found: ' + filename, 'red') # # 掃除 # try: shutil.rmtree(path_src, ignore_errors=True) except: pass try: shutil.rmtree(path_dst, ignore_errors=True) except: pass try: os.remove(path_wch) except: pass # # 以上の処理で使用済みの作業ディレクトリは削除されているはずだが、 # それ以前の処理にて削除されず残っているディレクトリがある場合は、 # 60秒経過を基準にして削除する。 # for dir0 in ('../gulpd.workspace/src', '../gulpd.workspace/dst'): for dir1 in os.listdir(dir0): abs_path = dir0 + '/' + dir1 if os.stat(abs_path).st_mtime < web.now4 - 60: # # log # web.log('shutil.rmtree(' + abs_path + ')', 'red') # # 削除 # shutil.rmtree(abs_path, ignore_errors=True) # # return # return body
def main(web, build): # -------------------------------------------------------------------------- # # エラー時の送信メッセージを準備 # message = '/admin/user.import' + '?' # # userの新規登録 # if web.environ('REQUEST_METHOD') == 'POST': asno = web.post('assign') admin = web.post('admin') name0 = web.post('name0') name1 = web.post('name1') # # フルネールを生成 # fullname = str(name0 + name1) # # カタカナ以外が入力されているとFalseが帰ってくる # name2 = matsuoka_func.katakana_validator(web.post('name2')) name3 = matsuoka_func.katakana_validator(web.post('name3')) # # その結果メッセージが送信される # if name2 == False or name3 == False: message += "&message1=name_notkatakana" # # 誕生日のバリテーションチェック # if len(web.post('birthday')) != 8: message += "&message2=birthday_notlen8" if not re.match(r'[0-9]+', web.post('birthday')): message += "&message3=birthday_notnumeric" # # エラーが存在していればリダイレクト # if re.match('.+&message.+', message): return web.redirect(str(message)) mailaddr = web.post('mailaddr') letters = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' password = ''.join( random.choices(string.ascii_letters + string.digits, k=8)) gender = web.post('gender', 0) ba = web.post('birthday') bayear = ba[0:4] bamonth = ba[4:6] baday = ba[6:8] months = re.match('0([0-9])', bamonth) days = re.match('0([0-9])', baday) if months: bamonth = months.group(1) if days: baday = days.group(1) ba = web.post('joinday') jyear = ba[0:4] jmonth = ba[4:6] jday = ba[6:8] jmonths = re.match('0([0-9])', jmonth) jdays = re.match('0([0-9])', jday) if jmonths: jmonth = jmonths.group(1) if jdays: jday = jdays.group(1) birthday = datetime.datetime(int(bayear), int(bamonth), int(baday), 0, 0).strftime('%s') joinday = datetime.datetime(int(jyear), int(jmonth), int(jday), 0, 0).strftime('%s') created4 = web.now4 # # passwordをハッシュ化 # passhash16 = blossom.md5(password, 16) # # userテーブルに登録 # sql = """ INSERT INTO `user` (`uno`, `ano`, `asno`, `admin`, `name0`, `name1`, `name2`, `name3`, `mailaddr`, `passhash`, `gender`, `birthday`, `joinday`, `created4`) VALUES (NULL, %(ano)s, '%(asno)s', %(admin)s, %(name0)s, %(name1)s, %(name2)s, %(name3)s, %(mailaddr)s, 0x""" + passhash16 + """, %(gender)s, %(birthday)s, %(joinday)s, %(created4)s);""" params = { 'ano': int(web.ano), 'asno': int(asno), 'admin': int(admin), 'name0': str(name0), 'name1': str(name1), 'name2': str(name2), 'name3': str(name3), 'mailaddr': str(mailaddr), 'gender': int(gender), 'birthday': int(birthday), 'joinday': int(joinday), 'created4': int(created4), } web.db.exe(sql, params=params, key=True) # # 登録したユーザーにメールを送信 # sql = """ SELECT `uno` FROM `user` WHERE 1 ORDER BY `uno` ASC LIMIT 1 """ appuseruno = web.db.exe(sql, key=True) uno16 = blossom.md5(appuseruno, 16) hash = str(uno16) + '.' + str(web.uno) txt = blossom.read('../template/eml/admin.import_user.eml') txt = txt % { 'fullname': fullname, 'mailaddr': mailaddr, 'password': password, 'HTTP_HOST': web._environ['HTTP_HOST'], 'hash': hash } # # メールが送信できなかった時の処理(demonは除く) # try: result = blossom.Mail.send(txt) except: sql = """ DELETE `uno` FROM `user` WHERE `uno` = %(uno)s """ params = { 'uno': user['uno'], } web.db.exe(sql, params=params, key=True) message += "&message10=mail_notsend" return web.redirect(str(message)) # # 空のroleを作成 # ここで作っておかないと/growth/role内で処理するのが面倒になる # sql = """ SELECT * FROM `user` WHERE `ano` = %(ano)s""" params = { 'ano': web.ano, } users = web.db.exe(sql, params=params) sql = """ SELECT * FROM `user` ORDER BY `user`.`created4` DESC LIMIT 1 """ user = web.db.exe(sql, key=True) for i, v in enumerate(users): # # 登録したばかりのユーザーをvunoとして、 # 全てのunoに対してjsonが入っていないレコードを作成 # # sql = """ # INSERT INTO `role` # (`uno`, `vuno`, `time4`, `deleted`) # VALUES # (%(uno)s, %(vuno)s, %(time4)s, %(deleted)s);""" # params = { # 'uno' :user['uno'], # 'vuno' :users[i]['uno'], # 'time4' :web.now4, # 'deleted':0, # } # web.db.exe(sql,params=params) # # # # ↑の処理だけだと、既存unoに対してのvunoは作成できるが、 # # 逆は存在しないので改めて作る # # # sql = """ # INSERT INTO `role` # (`uno`, `vuno`,`time4`,`deleted`) # VALUES # (%(vuno)s, %(uno)s, %(time4)s, %(deleted)s) # """ # params = { # 'uno' :user['uno'], # 'vuno' :users[i]['uno'], # 'time4' :web.now4, # 'deleted':1, # } # web.db.exe(sql,params=params) # # invlovmentoも同様に生成する # sql = """ INSERT INTO `involvement` (`uno`, `vuno`, `time4`, `depth`, `deleted`) VALUES (%(uno)s, %(vuno)s, %(time4)s, `depth` ,%(deleted)s);""" params = { 'uno': user['uno'], 'vuno': users[i]['uno'], 'time4': web.now4, 'depth': 0, 'deleted': 0, } web.db.exe(sql, params=params) if users[i]['uno'] == user['uno']: continue sql = """ INSERT INTO `involvement` (`uno`, `vuno`, `time4`, `depth`, `deleted`) VALUES (%(vuno)s, %(uno)s, %(time4)s, `depth` ,%(deleted)s);""" params = { 'uno': user['uno'], 'vuno': users[i]['uno'], 'time4': web.now4, 'depth': 0, 'deleted': 0, } web.db.exe(sql, params=params) # # 登録が成功したメッセージ # return web.redirect('/admin/users?message1=appuser') # # 部署一覧を取得して新規登録画面へ遷移 # sql = """ SELECT `asname`,`asno` FROM `assign` WHERE `ano` = %(ano)s""" params = { 'ano': web.ano, } assign = web.db.exe(sql, params=params, key=False) local = { 'item': assign, 'user_icon': web.user_icon, } return build(web, local,'/admin/' \ + web.path.replace('/', '.')[1:] + '.html')
def main(web, build): # -------------------------------------------------------------------------- # # 選択したuser情報 # if web.get("details"): # # user情報 # sql = """ SELECT SQL_CALC_FOUND_ROWS `user`.`uno`, `user`.`name0`, `user`.`name1`,`user`.`name2`, `user`.`name3`, `user`.`passhash`, `user`.`created4`, `assign`.`asname`, `icon`.`uno` AS `has_icon` FROM `user` LEFT JOIN `assign` ON `user`.`asno` = `assign`.`asno` LEFT JOIN `icon` ON `icon`.`uno` = `user`.`uno` WHERE `user`.uno = %(uno)s AND `user`.`deleted` = 0;""" params = { 'uno': web.get("details"), } user = web.db.exe(sql, params=params) # # そのuserの関わり合い # sql1 = """ SELECT SQL_CALC_FOUND_ROWS CONCAT(name0, name1) AS `fullname`, `asname`, `depth` ,`vuno`,`involvement`.`uno`, `involvement`.`time4`, `involvement`.`deleted` FROM `user` LEFT JOIN `involvement` ON `user`.`uno` = `involvement`.`vuno` LEFT JOIN `assign` USING (`asno`) WHERE (`involvement`.`uno`,`involvement`.`time4`) IN ( SELECT `uno`,MAX(`time4`) AS `time4` FROM `involvement` WHERE `uno` = %(uno)s AND NOT `depth` = 0 GROUP BY `vuno` ) AND NOT `depth` = 0 AND NOT `vuno` = %(uno)s ORDER BY `depth` DESC""" params = {'uno': web.get("details")} involvement_users = web.db.exe(sql1, params=params) # # 関わり合いがない場合、involvement_usersを送信しない # if not involvement_users: local = { 'user': user, 'user_icon': web.user_icon, } return build(web, local, \ '/admin/' + web.path.replace('/', '.')[1:] + '.html') # # 100分率用に全員のdepthを合計 # sumdepth = 0 for k, v in enumerate(involvement_users): sumdepth += v['depth'] # # それぞれのdepthの割合を求める # 同時にvunoの画像も取得 # for k, v in enumerate(involvement_users): if v['depth'] == 0: continue v['parcent'] = round((v['depth'] / sumdepth * 100), 1) icon = matsuoka_func.get_icon(web, int(v['uno'])) v['icon'] = icon['has_icon'] v['icon_uno'] = icon['uno'] # # 異議 # sql = """ SELECT * FROM `significance` LEFT JOIN `user` ON `user`.`uno` = `significance`.`vuno` LEFT JOIN `icon` ON `icon`.`uno` = `user`.`uno` LEFT JOIN `significance_statetext` ON `significance`.`state` = `significance_statetext`.`state` WHERE `significance`.`uno` = %(uno)s AND `user`.`deleted` =0""" params = { 'uno': web.get("details"), } significance = web.db.exe(sql, params=params) # # 異議が存在しなければスルー # if not significance: local = { 'user': user, 'involvement_users': involvement_users, 'user_icon': web.user_icon, } return build(web, local, \ '/admin/' + web.path.replace('/', '.')[1:] + '.html') # # timestampをUNIXに # for k, v in enumerate(significance): v['time4'] = datetime.datetime.fromtimestamp(int( v['time4'])).strftime('%Y-%m-%d') local = { 'user': user, 'involvement_users': involvement_users, 'significance': significance, 'user_icon': web.user_icon, } return build(web, local, \ '/admin/' + web.path.replace('/', '.')[1:] + '.html') # # 初期画面 # # ページリング # if web.get('page'): page = web.get('page') page = int(page) - int(1) else: page = 0 length = 10 sql_order = "CONCAT(name2, name3) ASC" # # 一覧表示(初期表示、及び検索欄が空白のまま検索した時)、除名リスト(deleted=1)も取得 # if not web.get('q') or web.get('q') == "": search_word = "" sql = """ SELECT SQL_CALC_FOUND_ROWS `user`.`uno`, `user`.`name0`, `user`.`name1`, `user`.`name2`, `user`.`name3`, `user`.`passhash`, `user`.`created4`, `assign`.`asname`, `icon`.`uno` AS `has_icon`, `significance`.`state` FROM `user` LEFT JOIN `significance` ON `significance`.`uno` = `user`.`uno` LEFT JOIN `assign` ON `user`.`asno` = `assign`.`asno` LEFT JOIN `icon` ON `icon`.`uno` = `user`.`uno` WHERE `user`.`deleted` = 0 AND `user`.`ano` = %(ano)s AND `user`.`ano` = %(ano)s ORDER BY """ + sql_order + """ LIMIT """ + str(length * page) + ", " + str(length) + ";" params = { 'ano': web.ano, } users = web.db.exe(sql, params=params, key=False) users_found = web.db.exe('SELECT FOUND_ROWS();', params=params, key=True) # # 検索結果表示 # if web.get('q'): search_word = web.get('q') sql = """ SELECT SQL_CALC_FOUND_ROWS `user`.`uno`, `user`.`name0`, `user`.`name1`,`user`.`name2`, `user`.`name3`, `user`.`passhash`, `user`.`created4`, `assign`.`asname`, `icon`.`uno` AS `has_icon` `significance`.`sno` FROM `user` LEFT JOIN `significance` ON `significance`.`uno` = `user`.`uno` LEFT JOIN `assign` ON `user`.`asno` = `assign`.`asno` LEFT JOIN `icon` ON `icon`.`uno` = `user`.`uno` WHERE (CONCAT(`user`.`name0` ,`user`.`name1` ,`user`.`name2`, `user`.`name3`) LIKE %(search)s) AND `user`.`deleted` = %(deleted)s ORDER BY """ + sql_order + """ LIMIT """ + str(length * page) + ", " + str(length) + ";" params = { 'ano': web.ano, 'search': str('%' + search_word + '%'), } users = web.db.exe(sql, params=params, key=False) users_found = web.db.exe('SELECT FOUND_ROWS();', params=params, key=True) # # 画像とタイムスタンプの変換 # for i, user in enumerate(users): umode = blossom.md5(user['uno'], 16) created4 = user['created4'] user['created4'] = datetime.date.fromtimestamp(created4) #web.log(user['state'],"RED") web.log(user['state'], "RED") if user['state'] == 4 or user['state'] == None: users[i] = { 'uno': user['uno'], 'umode': umode, 'name0': user['name0'], 'name1': user['name1'], 'name2': user['name2'], 'name3': user['name3'], 'created4': user['created4'], 'asname': user['asname'], 'state': bool(False), 'has_icon': bool(user['has_icon']) } else: users[i] = { 'uno': user['uno'], 'umode': umode, 'name0': user['name0'], 'name1': user['name1'], 'name2': user['name2'], 'name3': user['name3'], 'created4': user['created4'], 'asname': user['asname'], 'state': bool(True), 'has_icon': bool(user['has_icon']) } # # pagenav # if web.environ("SERVER_NAME") == "system.nocc.tech": web.url = "https://system.nocc.tech/admin/users" else: web.url = "https://design.nocc.tech/admin/users" pagenav = blossom.pagenav(users_found / length, page) for i, v in enumerate(pagenav): pagenav[i]['href'] = web.urljoin([{'page': v['i'], 'message': None}]) local = { 'user_icon': web.user_icon, 'users': users, 'pagenav': pagenav, 'search_word': search_word, } return build(web, local,'/admin/' \ + web.path.replace('/', '.')[1:] + '.html')
def main(web, build): # -------------------------------------------------------------------------- # # POST # if web.environ('REQUEST_METHOD') == 'POST': mailaddr = web.post('mailaddr') password = web.post('password') if mailaddr == 'dateset' and password == 'dateset': sql = """ INSERT INTO `account` (aname, limitinvolvement, created4, deleted) VALUES ('株式会社トワール', 20, 1604464503, 0) """ web.db.exe(sql) sql = """ INSERT INTO `assign` (ano, pasno, asname, deleted) VALUES (0, 0, '未所属', 0) """ web.db.exe(sql) sql = """ INSERT INTO `user` (ano, asno, admin, buno, name0, name1, name2, name3, mailaddr, passhash, gender, birthday, joinday, created4, deleted) VALUES (1, 1, 1, 0, '濵野', '裕希', 'ハマノ', 'ユウキ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '有本', '昇平', 'アリモト', 'ショウヘイ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '芳野', '絵理', 'ヨシノ', 'エリ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '渡邉', '朋洋', 'ワタナベ', 'トモヒロ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '網野', '克則', 'アミノ', 'カツノリ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '西口', '翔', 'ニシグチ', 'ショウ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '松本', '理惠', 'マツモト', 'リエ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '臼杵', '高太郎', 'ウスキ', 'コウタロウ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '森藤', '早紀', 'モリフジ', 'サキ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, 'チア', 'ウィンイン', 'チア', 'ウィンイン', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '松岡', '亮輔', 'マツオカ', 'リョウスケ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '岩﨑', '政人', 'イワサキ', 'マサト', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '土井', '一通', 'ドイ', 'カズミチ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '西川', '将弘', 'ニシカワ', 'マサヒロ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '篠原', 'きよの', 'シノハラ', 'キヨノ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0), (1, 1, 1, 0, '寺尾', '美香', 'テラオ', 'ミカ', '*****@*****.**', 1111, 0, 826470000, 1582988400, 1583074800, 0); """ web.db.exe(sql) # # invlovment # sql1 = """ SELECT `uno`,`name1` FROM `user` WHERE 1 ORDER BY `uno` DESC; """ sql2 = """ SELECT `uno`,`name1` FROM `user` WHERE 1 ORDER BY `uno` ASC; """ userde = web.db.exe(sql1) useras = web.db.exe(sql2) img = [] i = 1 while True: try: with open('dummyimg/iconsample' + str(i) + '.jpg', 'rb') as f: img.append(f.read()) #img[i - 1] = io.StringIO(img[i - 1]), #web.log(Image.open('dummyimg/iconsample' + str(i) + '.jpg'),"RED") except: break i += 1 for k1, v1 in enumerate(userde): sql1 = """ INSERT INTO `icon` (`uno`, `img`) VALUES (%(uno)s, %(img)s) """ params = { 'uno': v1['uno'], 'img': random.choice(img), } web.db.exe(sql1, params=params) for k2, v2 in enumerate(useras): depth1 = random.randint(0, 5) depth2 = random.randint(1000, 10000) sql1 = """ INSERT INTO `role` (`uno`, `vuno`,`time4`,`deleted`) VALUES (%(vuno)s, %(uno)s, %(time4)s, %(deleted)s) """ params = { 'uno': v1['uno'], 'vuno': v2['uno'], 'time4': web.now4, 'deleted': 1, } web.db.exe(sql1, params=params) if depth1 != 0: params = { 'uno': v1['uno'], 'vuno': v2['uno'], 'time4': int(web.now4 + 1), 'deleted': 0, } web.db.exe(sql1, params=params) if v1['uno'] == v2['uno']: continue sql1 = """ INSERT INTO `involvement` (`uno`, `vuno`,`time4`,`depth`,`deleted`) VALUES (%(vuno)s, %(uno)s, %(time4)s, %(depth)s, %(deleted)s) """ params1 = { 'uno': v1['uno'], 'vuno': v2['uno'], 'time4': web.now4, 'depth': 0, 'deleted': 1, } web.db.exe(sql1, params=params1) if depth1 != 0: params1 = { 'uno': v1['uno'], 'vuno': v2['uno'], 'time4': int(web.now4 + 1), 'depth': depth1, 'deleted': 0, } else: params1 = { 'uno': v1['uno'], 'vuno': v2['uno'], 'time4': int(web.now4 + 1), 'depth': 0, 'deleted': 0, } web.db.exe(sql1, params=params1) sql1 = """ INSERT INTO `salary_evaluation` (`uno`, `vuno`,`time4`,`hourlywage`,`deleted`) VALUES (%(vuno)s, %(uno)s, %(time4)s, %(hourlywage)s, %(deleted)s) """ params1 = { 'uno': v1['uno'], 'vuno': v2['uno'], 'time4': web.now4, 'hourlywage': 0, 'deleted': 1, } web.db.exe(sql1, params=params1) if depth1 != 0: params1 = { 'uno': v1['uno'], 'vuno': v2['uno'], 'time4': int(web.now4 + 1), 'hourlywage': depth2, 'deleted': 0, } web.db.exe(sql1, params=params1) sql = """ INSERT INTO `job` (ano, jname, created4, updated4, deleted) VALUES (0, '作業1', 1583074800, 1583074800,0), (0, '作業2', 1583074800, 1583074800,0), (0, '作業3', 1583074800, 1583074800,0), (0, '作業4', 1583074800, 1583074800,0), (0, '作業5', 1583074800, 1583074800,0); """ web.db.exe(sql) sql = """ INSERT INTO `significance_statetext` (state, text) VALUES (0, '未処理'), (1, '既読'), (2, '確認中'), (3, '保留'), (4, '解決済'); """ web.db.exe(sql) sql = """ INSERT INTO `job_definition` (jno, time4, edited_uno, rankA, rankB, rankC, rankD, text) VALUES (0, 1583074800, 0, '作業1rankAテキスト', '作業1rankBテキスト','作業1rankCテキスト','作業1rankDテキスト','作業1備考'), (1, 1583074800, 0, '作業2rankAテキスト', '作業2rankBテキスト','作業2rankCテキスト','作業2rankDテキスト','作業2備考'), (2, 1583074800, 0, '作業3rankAテキスト', '作業3rankBテキスト','作業3rankCテキスト','作業3rankDテキスト','作業3備考'), (3, 1583074800, 0, '作業4rankAテキスト', '作業4rankBテキスト','作業4rankCテキスト','作業4rankDテキスト','作業4備考'), (4, 1583074800, 0, '作業5rankAテキスト', '作業5rankBテキスト','作業5rankCテキスト','作業5rankDテキスト','作業5備考'); """ sql = """ INSERT INTO `bind_user_job` (uno, jno, rank, updated4) VALUES (0, 0, 'A', 1583074801), (0, 1, 'B', 1583074802), (0, 2, 'D', 1583074803), (0, 3, 'C', 1583074804), (0, 4, 'B', 1583074805); """ web.db.exe(sql) # # nocc_matsuokaの内容をnocc_okazakiを同期する (いずれ消す) # if mailaddr == 'db' and password == 'db': src = 'nocc_system' dst = 'nocc_design' # # 削除 # tables = web.db.exe("SHOW TABLES FROM `" + dst + "`") for table in tables: web.db.exe("DROP TABLE `" + dst + "`.`" + table + "`;") # # 複製 # tables = web.db.exe("SHOW TABLES FROM `" + src + "`;") for table in tables: # # 構造の複製 # sql = """ CREATE TABLE """ + dst + "." + table + """ LIKE `""" + src + "`.`" + table + "`;" web.db.exe(sql) # # 内容の複製 # sql = """ INSERT INTO """ + dst + "." + table + """ SELECT * FROM `""" + src + "`.`" + table + "`;" web.db.exe(sql) web.log("dbを同期しました", "RED") return web.redirect('?message=failed') if mailaddr == 'systemdestroy' and password == 'systemdestroy': src = 'nocc_system' tables = web.db.exe("SHOW TABLES FROM `" + src + "`;") for table in tables: web.db.exe("TRUNCATE TABLE `" + table + "`;") web.log("全テーブルのレコードを削除しました", "RED") return web.redirect('?message=failed') if mailaddr == 'designdestroy' and password == 'designdestroy': src = 'nocc_design' tables = web.db.exe("SHOW TABLES FROM `" + src + "`;") for table in tables: web.db.exe("TRUNCATE TABLE `" + table + "`;") web.log("全テーブルのレコードを削除しました", "RED") return web.redirect('?message=failed') # # ルートでない場合にdbに接続する # if not mailaddr == 'root' and not password == 'root': passhash16 = blossom.md5(password, 16) sql = """ SELECT `uno`,`admin`,`ano` FROM `user` WHERE `mailaddr` = %(mailaddr)s AND `deleted` = 0""" #AND `passhash` = 0x""" + passhash16 + ";" params = { 'mailaddr': mailaddr, } row = web.db.exe(sql, params=params, key=True) if not row: return web.redirect('?message=failed') admin = row['admin'] uno = row['uno'] if mailaddr == 'root' and password == 'root': # ルートだった場合 web.setcookie_secure('root', 'root', maxage=1800) return web.redirect('/root/') elif int(admin) == 1: # # adminだった場合 web.setcookie_secure('admin', str(uno), maxage=1800) mf.significance(web) return web.redirect('/admin/') elif int(admin) == 0: # # adminじゃなかった場合 # web.setcookie_secure('user', str(uno), maxage=1800) return web.redirect('/user/') # # build # local = {} return build(web, local, '/open/open.signin.html')
def main(web, build): # ----------------------------------------------------------------------------- # # anoを取得 # ano = mf.from_uno_getdb_ano(web, web.uno, cookie=False) # # 未処理の意義があるかどうか # # # ログイン中のユーザーの画像を取得 # user_icon = mf.get_icon(web, web.uno) # # ページリングの設定 # if web.get('userspage'): userspage_page = web.get('userspage') deletedpage_page = 0 userspage_page = int(userspage_page) - int(1) elif web.get('deletedpage'): deletedpage_page = web.get('deletedpage') userspage_page = 0 deletedpage_page = int(deletedpage_page) - int(1) else: deletedpage_page = 0 userspage_page = 0 length = 10 sql_order = "CONCAT(name2, name3) ASC" # # 一覧表示(初期表示、及び検索欄が空白のまま検索した時)、除名リスト(deleted=1)も取得 # if not web.get('q') or web.get('q') == "": for i in range(2): if i == 0: page = userspage_page else: page = deletedpage_page search_word = "" sql = """ SELECT SQL_CALC_FOUND_ROWS `user`.`uno`, `user`.`name0`, `user`.`name1`, `user`.`name2`, `user`.`name3`, `user`.`passhash`, `user`.`created4`, `assign`.`asname`, `icon`.`uno` AS `has_icon` FROM `user` LEFT JOIN `assign` ON `user`.`asno` = `assign`.`asno` LEFT JOIN `icon` ON `icon`.`uno` = `user`.`uno` WHERE `user`.`deleted` = %(deleted)s AND `user`.`ano` = %(ano)s AND `user`.`ano` = %(ano)s ORDER BY """ + sql_order + """ LIMIT """ + str(length * page) + ", " + str(length) + ";" params = {'ano': ano, 'deleted': i} if i == 0: users = web.db.exe(sql, params=params, key=False) users_found = web.db.exe('SELECT FOUND_ROWS();', params=params, key=True) else: deleted_users = web.db.exe(sql, params=params, key=False) deleted_found = web.db.exe('SELECT FOUND_ROWS();', params=params, key=True) # # 検索結果表示 # if web.get('q'): search_word = web.get('q') for i in range(2): if i == 0: page = userspage_page else: page = deletedpage_page sql = """ SELECT SQL_CALC_FOUND_ROWS `user`.`uno`, `user`.`name0`, `user`.`name1`,`user`.`name2`, `user`.`name3`, `user`.`passhash`, `user`.`created4`, `assign`.`asname`, `icon`.`uno` AS `has_icon` FROM `user` LEFT JOIN `assign` ON `user`.`asno` = `assign`.`asno` LEFT JOIN `icon` ON `icon`.`uno` = `user`.`uno` WHERE (CONCAT(`user`.`name0` ,`user`.`name1` ,`user`.`name2`, `user`.`name3`) LIKE %(search)s) AND `user`.`deleted` = %(deleted)s ORDER BY """ + sql_order + """ LIMIT """ + str(length * page) + ", " + str(length) + ";" params = { 'ano': ano, 'search': str('%' + search_word + '%'), 'deleted': i, } if i == 0: users = web.db.exe(sql, params=params, key=False) users_found = web.db.exe('SELECT FOUND_ROWS();', params=params, key=True) else: deleted_users = web.db.exe(sql, params=params, key=False) deleted_found = web.db.exe('SELECT FOUND_ROWS();', params=params, key=True) # # 画像とタイムスタンプの変換 # for i, user in enumerate(users): umode = blossom.md5(user['uno'], 16) created4 = user['created4'] user['created4'] = datetime.date.fromtimestamp(created4) users[i] = { 'uno': user['uno'], 'umode': umode, 'name0': user['name0'], 'name1': user['name1'], 'name2': user['name2'], 'name3': user['name3'], 'created4': user['created4'], 'asname': user['asname'], 'has_icon': bool(user['has_icon']) } for i, deleted_user in enumerate(deleted_users): umode = blossom.md5(deleted_user, 16) created4 = deleted_user['created4'] deleted_user['created4'] = datetime.date.fromtimestamp(created4) deleted_users[i] = { 'uno': deleted_user['uno'], 'umode': umode, 'name0': deleted_user['name0'], 'name1': deleted_user['name1'], 'name2': deleted_user['name2'], 'name3': deleted_user['name3'], 'created4': deleted_user['created4'], 'asname': deleted_user['asname'], 'has_icon': bool(deleted_user['has_icon']) } # # pagenav # #urlをリセット if web.environ("SERVER_NAME") == "system.nocc.tech": web.url = "https://system.nocc.tech/admin/users" else: web.url = "https://design.nocc.tech/admin/users" users_pagenav = blossom.pagenav(users_found / length, userspage_page) deleted_pagenav = blossom.pagenav(deleted_found / length, deletedpage_page) for i, v in enumerate(users_pagenav): users_pagenav[i]['href'] = web.urljoin([{ 'userspage': v['i'], 'message': None }]) for i, v in enumerate(deleted_pagenav): deleted_pagenav[i]['href'] = web.urljoin([{ 'deletedpage': v['i'], 'message': None }]) web.log(type(users_pagenav), "RED") local = { 'user_icon': user_icon, 'users': users, 'deleted_users': deleted_users, 'users_pagenav': users_pagenav, 'deleted_pagenav': deleted_pagenav, 'search_word': search_word, } return build(web, local,'/admin/' \ + web.path.replace('/', '.')[1:] + '.html')