From 7a6c4fa24d572ff0bfc1b4d92f994be407ab7724 Mon Sep 17 00:00:00 2001 From: yamat0jp Date: Tue, 6 Dec 2016 21:07:16 +0900 Subject: [PATCH] origin master -> tined --- index.py | 167 ++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 95 insertions(+), 72 deletions(-) diff --git a/index.py b/index.py index 3345183..30593b8 100755 --- a/index.py +++ b/index.py @@ -1,11 +1,18 @@ -import os -import re +import os.path +import shutil import tornado.escape import tornado.web -import pymongo +import tornado.httpserver +import tornado.ioloop +import tornado.options +from tornado.options import define,options +from tinydb import TinyDB,Query,where +from tinydb.operations import delete from datetime import datetime +define('port',default=8000,help='run on the given port',type=int) + class BaseHandler(tornado.web.RequestHandler): def get_current_user(self): user = self.get_secure_cookie('admin_user') @@ -19,30 +26,26 @@ class BaseHandler(tornado.web.RequestHandler): class IndexHandler(BaseHandler): def get(self,dbname,page='0'): - params = self.application.db['params'].find_one() + params = self.application.db.get(where('kinds') == 'conf') if params['mentenance'] == True: self.render('mentenance.htm',title=params['title'],db=dbname) if self.application.collection(dbname) == False: if self.current_user == b'admin': - coll = self.application.db[dbname] - coll.insert({}) - coll.remove({}) + self.application.db.table(dbname) else: raise tornado.web.HTTPError(404) return i = params['count'] na = tornado.escape.url_unescape(self.get_cookie("username",u"誰かさん")) pos = self.application.gpos(dbname,page) - table = self.application.db[dbname] + table = self.application.db.table(dbname) start = (pos-1)*i if start < 0: - start = table.count()-i + start = len(table)-i if start < 0: start = 0 - rec = table.find() - rec.sort('number') - rec.skip(start).limit(i) - if table.count() >= 10*i: + rec = sorted(table.all(),key=lambda x: x['number'])[start:start+i] + if len(table) >= 10*i: self.render('modules/full.htm',position=pos,records=rec,data=params,db=dbname) return self.render('modules/index.htm',position=pos,records=rec,data=params,username=na,db=dbname) @@ -52,7 +55,7 @@ class LoginHandler(BaseHandler): self.render('login.htm') def post(self): - pw = self.application.db['params'].find_one() + pw = self.application.db.get(where('kinds') == 'conf') if self.get_argument('password') == pw['password']: self.set_current_user('admin') dbname = self.get_argument('record') @@ -64,15 +67,19 @@ class LogoutHandler(BaseHandler): self.redirect('/login') class NaviHandler(tornado.web.RequestHandler): - def get(self): - coll = sorted(self.application.coll(),key=str.lower) - self.render('top.htm',coll=coll,full=self.full) - + def get(self): + self.render('top.htm',coll=sorted(self.name()),full=self.full) + + def name(self): + for x in self.application.db.tables(): + if x != '_default': + yield x + def full(self,dbname): - if dbname in self.application.db.collection_names(): - i = 10*self.application.db['params'].find_one()['count'] - table = self.application.db[dbname] - if table.count() >= i: + if dbname in self.application.db.tables(): + i = 10*self.application.db.get(where('kinds') == 'conf')['count'] + table = self.application.db.table(dbname) + if len(table) >= i: return True return False @@ -82,16 +89,14 @@ class TitleHandler(NaviHandler): self.render('title.htm',coll=rec,full=self.full) def title(self): - name = self.application.coll() - for x in name: + for x in self.name(): item = {} item['name'] = x - table = self.application.db[x] - i = table.count() + table = self.application.db.table(x) + i = len(table) item['count'] = i - tmp = table.find_one({'number':1}) - if tmp: - s = tmp['title'] + if table.contains(where('number') == 1) == True: + s = table.get(where('number') == 1)['title'] else: s = '' item['title'] = s @@ -99,7 +104,7 @@ class TitleHandler(NaviHandler): item['date'] = '' item['date2'] = 0 else: - rec = table.find().sort('number') + rec = sorted(table.all(),key=lambda k: k['number']) s = rec[i-1]['date'] item['date'] = s i = datetime.strptime(s,'%Y/%m/%d %H:%M') @@ -118,11 +123,11 @@ class RegistHandler(tornado.web.RequestHandler): if self.application.collection(dbname) == False: raise tornado.web.HTTPError(404) return - rec = self.application.db['params'].find_one() + rec = self.application.db.get(where('kinds') == 'conf') words = rec['bad_words'] out = rec['out_words'] - na = self.get_argument('name') - sub = self.get_argument('title') + na = self.get_argument('name',u'誰かさん') + sub = self.get_argument('title',u'タイトルなし') com = self.get_argument('comment') text = '' i = 0 @@ -138,18 +143,15 @@ class RegistHandler(tornado.web.RequestHandler): i += len(line) text = text+'

'+self.link(line)+'

' pw = self.get_argument('password') - if sub == '': - sub = u'タイトルなし.' if i == 0: error = error + u'本文がありません.' elif i > 1000: error = error +u'文字数が1,000をこえました.' - article = self.application.db[dbname] - if article.count() == 0: + article = self.application.db.table(dbname) + if len(article) == 0: no = 1 - else: - items = article.find() - item = items.sort('number')[article.count()-1] + else: + item = sorted(article.all(),key=lambda x: x['number'])[len(article)-1] no = item['number']+1 if error == '': s = datetime.now() @@ -194,9 +196,9 @@ class AdminHandler(BaseHandler): if self.application.collection(dbname) == False: raise tornado.web.HTTPError(404) return - table = self.application.db[dbname] - rec = table.find().sort('number') - mente = self.application.db['params'].find_one() + table = self.application.db.table(dbname) + rec = sorted(table.all(),key=lambda x: x['number']) + mente = self.application.db.get(where('kinds') == 'conf') if mente['mentenance'] == True: check = 'checked=checked' else: @@ -205,34 +207,50 @@ class AdminHandler(BaseHandler): i = mente['count'] start = (pos-1)*i if start < 0: - start = table.count()-i + start = len(table)-i if start < 0: start = 0 - rec.skip(start).limit(i) - self.render('modules/admin.htm',position=pos,records=rec,mente=check,password=mente['password'],db=dbname) + self.render('modules/admin.htm',position=pos,records=rec[start:start+i],mente=check,password=mente['password'],db=dbname) class AdminConfHandler(BaseHandler): @tornado.web.authenticated def post(self,dbname,func): if func == 'set': - param = self.application.db['params'].find_one() + param = self.application.db.get(where('kinds') == 'conf')['mentenance'] if self.get_argument('mente','') == 'on': mente = True + if param != mente: + self.store() else: mente = False + if param != mente: + self.restore() word = self.get_argument('pass','') if word == '': self.render('regist.htm',content='パスワードを設定してください') return else: - param['mentenance']=mente - param['password']=word - self.application.db['params'].save(param) + self.application.db.update({'mentenance':mente,'password':word},where('kinds') == 'conf') elif func == 'del': - table = self.application.db[dbname] + table = self.application.db.table(dbname) for x in self.get_arguments('item'): - table.remove({'number':int(x)}) + table.remove(where('number') == int(x)) self.redirect('/'+dbname+'/admin/0/') + + def store(self): + self.application.db.close() + shutil.copy(st.json,st.bak) + self.application.db = TinyDB(st.json) + + def restore(self): + database = self.application.db + bak = TinyDB(st.bak) + for x in database.tables(): + if self.application.collection(x) == True: + database.purge_table(x) + if x in bak.tables(): + table = database.table(x) + table.insert_multiple(bak.table(x).all()) class UserHandler(tornado.web.RequestHandler): def post(self,dbname): @@ -240,10 +258,11 @@ class UserHandler(tornado.web.RequestHandler): if num.isdigit() == True: num = int(num) pas = self.get_argument('password') - table = self.application.db[dbname] - obj = table.find_one({'number':num}) + table = self.application.db.table(dbname) + qwr = Query() + obj = table.get(qwr.number == num) if obj and(obj['password'] == pas): - table.remove({'number':num}) + table.remove(qwr.number == num) self.redirect('/'+dbname) class SearchHandler(tornado.web.RequestHandler): @@ -263,14 +282,18 @@ class SearchHandler(tornado.web.RequestHandler): self.render('modules/search.htm',records=[],word1=word,db=dbname) def search(self,dbname): - table = self.application.db[dbname] + table = self.application.db.table(dbname) element = self.word.split() if len(element) == 0: element = [''] while len(element) < 3: element.append(element[0]) + if self.radiobox == 'comment': + query = (Query().raw.search(element[0])) | (Query().raw.search(element[1])) | (Query().raw.search(element[2])) + else: + query = (Query().name == element[0]) | (Query().name == element[1]) | (Query().name == element[2]) if self.radiobox == 'comment': - for x in table.find({'$or':[{'raw':re.compile(element[0])},{'raw':re.compile(element[1])},{'raw':re.compile(element[2])}]}): + for x in table.search(query): com = '' for text in x['raw'].splitlines(True): for word in self.word.split(): @@ -282,8 +305,8 @@ class SearchHandler(tornado.web.RequestHandler): x['comment'] = com yield x else: - for x in table.find({'$or':[{'name':element[0]},{'name':element[1]},{'name':element[2]}]}): - yield x + for x in table.search(query): + yield x class FooterModule(tornado.web.UIModule): def render(self,number,url,link): @@ -291,6 +314,7 @@ class FooterModule(tornado.web.UIModule): class Application(tornado.web.Application): def __init__(self): + self.db = TinyDB(st.json) handlers = [(r'/',NaviHandler),(r'/login',LoginHandler),(r'/logout',LogoutHandler),(r'/title',TitleHandler), (r'/([a-zA-Z0-9_]+)',IndexHandler),(r'/([a-zA-Z0-9_]+)/([0-9]+)/',IndexHandler), (r'/([a-zA-Z0-9_]+)/admin/([0-9]+)/',AdminHandler),(r'/([a-zA-Z0-9_]+)/admin/([a-z]+)/',AdminConfHandler),(r'/([a-zA-Z0-9_]+)/userdel',UserHandler), @@ -306,28 +330,27 @@ class Application(tornado.web.Application): tornado.web.Application.__init__(self,handlers,**settings) def gpos(self,dbname,page): - params = self.db['params'].find_one() + params = self.db.get(where('kinds') == 'conf') pos = int(page) if pos <= 0: pos = 0 - elif (pos-1)*params['count'] >= self.db[dbname].count(): + elif (pos-1)*params['count'] >= len(self.db.table(dbname)): pos = 0 return pos def collection(self,name): - if name in self.db.collection_names(): + if name in self.db.tables(): return True else: return False - def coll(self): - name = self.db.collection_names() - for x in ['params','objectlabs-system.admin.collections','objectlabs-system','system.indexes']: - if x in name: - name.remove(x) - return name +class static(): + json = 'static/db/db.json' + bak = 'static/db/bak.json' -app = Application() -MONGOLAB_URI = 'mongodb://kainushi:1234abcd@ds113678.mlab.com:13678/heroku_n905jfw2' -conn = pymongo.MongoClient(MONGOLAB_URI,13678) -app.db = conn.heroku_n905jfw2 +st = static() +if __name__ == '__main__': + tornado.options.parse_command_line() + http_server = tornado.httpserver.HTTPServer(Application()) + http_server.listen(options.port) + tornado.ioloop.IOLoop.instance().start() -- 2.11.0