From d315884b8eb05dd8357b36c1dd60454a22a6838c Mon Sep 17 00:00:00 2001 From: yamat0jp Date: Wed, 30 Nov 2016 23:19:58 +0900 Subject: [PATCH] first commit --- index.py | 179 +++++++++++++++++++++++++-------------------------------------- 1 file changed, 71 insertions(+), 108 deletions(-) diff --git a/index.py b/index.py index 8325185..88835f3 100755 --- a/index.py +++ b/index.py @@ -1,12 +1,9 @@ import os.path -import shutil,copy -import tornado.auth +import re import tornado.escape import tornado.web -from tinydb import TinyDB,Query,where -from tinydb.storages import MemoryStorage -from tinydb.operations import delete +import pymongo from datetime import datetime class BaseHandler(tornado.web.RequestHandler): @@ -22,26 +19,28 @@ class BaseHandler(tornado.web.RequestHandler): class IndexHandler(BaseHandler): def get(self,dbname,page='0'): - params = self.application.db.get(where('kinds') == 'conf') + params = self.application.db['params'].find_one() 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': - self.application.db.table(dbname) + self.application.db[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.table(dbname) + table = self.application.db[dbname] start = (pos-1)*i if start < 0: - start = len(table)-i + start = table.count()-i if start < 0: start = 0 - rec = sorted(table.all(),key=lambda x: x['number'])[start:start+i] - if len(table) >= 10*i: + rec = table.find() + rec.sort('number') + rec.skip(start).limit(i) + if table.count() >= 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) @@ -51,7 +50,7 @@ class LoginHandler(BaseHandler): self.render('login.htm') def post(self): - pw = self.application.db.get(where('kinds') == 'conf') + pw = self.application.db['params'].find_one() if self.get_argument('password') == pw['password']: self.set_current_user('admin') dbname = self.get_argument('record') @@ -64,18 +63,14 @@ class LogoutHandler(BaseHandler): class NaviHandler(tornado.web.RequestHandler): 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 - + coll = self.application.db.collection_names(include_system_collections=False) + self.render('top.htm',coll=coll,full=self.full) + def full(self,dbname): - 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: + if dbname in self.application.db.collection_names(include_system_collections=False): + i = 10*self.application.db['params'].find_one()['count'] + table = self.application.db[dbname] + if table.count() >= i: return True return False @@ -85,14 +80,15 @@ class TitleHandler(NaviHandler): self.render('title.htm',coll=rec,full=self.full) def title(self): - for x in self.name(): + for x in self.application.db.collection_names(include_system_collections=False): item = {} item['name'] = x - table = self.application.db.table(x) + table = self.application.db[x] i = len(table) item['count'] = i - if table.contains(where('number') == 1) == True: - s = table.get(where('number') == 1)['title'] + tmp = table.find_one({'number':1}) + if tmp: + s = tmp['title'] else: s = '' item['title'] = s @@ -100,11 +96,18 @@ class TitleHandler(NaviHandler): item['date'] = '' item['date2'] = 0 else: - rec = sorted(table.all(),key=lambda k: k['number']) + rec = table.find().sort('number') s = rec[i-1]['date'] item['date'] = s i = datetime.strptime(s,'%Y/%m/%d %H:%M') - item['date2'] = 31*i.month+i.day + year = datetime.now().year-i.year + if year == 0: + j = 800 + elif year == 1: + j = 400 + else: + j = 0 + item['date2'] = j+31*(i.month-1)+i.day yield item class RegistHandler(tornado.web.RequestHandler): @@ -112,7 +115,7 @@ class RegistHandler(tornado.web.RequestHandler): if self.application.collection(dbname) == False: raise tornado.web.HTTPError(404) return - rec = self.application.db.get(where('kinds') == 'conf') + rec = self.application.db[dbname].find_one() words = rec['bad_words'] out = rec['out_words'] na = self.get_argument('name') @@ -138,17 +141,17 @@ class RegistHandler(tornado.web.RequestHandler): error = error + u'本文がありません.' elif i > 1000: error = error +u'文字数が1,000をこえました.' - article = self.application.db.table(dbname) - if len(article) == 0: + article = self.application.db[dbname] + if article.count() == 0: no = 1 - else: - item = sorted(article.all(),key=lambda x: x['number'])[len(article)-1] + else: + items = article.find() + item = items.sort('number')[article.count()-1] no = item['number']+1 if error == '': s = datetime.now() reg = {'number':no,'name':na,'title':sub,'comment':text,'raw':com,'password':pw,'date':s.strftime('%Y/%m/%d %H:%M')} article.insert(reg) - restart() self.set_cookie('username',tornado.escape.url_escape(na)) self.redirect('/'+dbname+'#article') else: @@ -188,9 +191,9 @@ class AdminHandler(BaseHandler): if self.application.collection(dbname) == False: raise tornado.web.HTTPError(404) return - table = self.application.db.table(dbname) - rec = sorted(table.all(),key=lambda x: x['number']) - mente = self.application.db.get(where('kinds') == 'conf') + table = self.application.db[dbname] + rec = table.find().sort('number') + mente = self.application.db['params'].find_one() if mente['mentenance'] == True: check = 'checked=checked' else: @@ -199,64 +202,42 @@ class AdminHandler(BaseHandler): i = mente['count'] start = (pos-1)*i if start < 0: - start = len(table)-i + start = table.count()-i if start < 0: start = 0 - restart() - self.application.db = TinyDB(st.json) - self.render('modules/admin.htm',position=pos,records=rec[start:start+i],mente=check,password=mente['password'],db=dbname) + rec.skip(start).limit(i) + self.render('modules/admin.htm',position=pos,records=rec,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.get(where('kinds') == 'conf')['mentenance'] + param = self.application.db['params'].find_one() 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: - self.application.db.update({'mentenance':mente,'password':word},where('kinds') == 'conf') + param.update({'mentenance':mente,'password':word}) + param.save(param) elif func == 'del': - table = self.application.db.table(dbname) + table = self.application.db[dbname] for x in self.get_arguments('item'): - table.remove(where('number') == int(x)) - restart() + table.remove({'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()) - restart() class UserHandler(tornado.web.RequestHandler): def post(self,dbname): num = int(self.get_argument('number')) pas = self.get_argument('password') - table = self.application.db.table(dbname) - qwr = Query() - obj = table.get(qwr.number == num) + table = self.application.db[dbname] + obj = table.find_one({'number':num}) if obj and(obj['password'] == pas): - table.remove(qwr.number == num) + table.remove({'number':num}) self.redirect('/'+dbname) class SearchHandler(tornado.web.RequestHandler): @@ -264,7 +245,7 @@ class SearchHandler(tornado.web.RequestHandler): self.word = tornado.escape.url_unescape(self.get_argument('word1')) self.radiobox = self.get_argument('filter') self.set_cookie('search',tornado.escape.url_escape(self.word)) - rec = self.search(dbname) + rec = sorted(self.search(dbname),key=lambda x: x['number']) self.render('modules/search.htm',records=rec,word1=self.word,db=dbname) def get(self,dbname): @@ -275,37 +256,28 @@ class SearchHandler(tornado.web.RequestHandler): word = tornado.escape.url_unescape(word) self.render('modules/search.htm',records=[],word1=word,db=dbname) - def search(self,name): - table = self.application.db.table(name) + def search(self,dbname): + table = self.application.db[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': - rec = [] - mem = TinyDB(storage=MemoryStorage) - for x in table.search(query): - result = '' + if self.radiobox == 'comment': + for x in table.find({'$or':[{'name':re.compile(element[0])},{'name':re.compile(element[1])},{'name':re.compile(element[2])}]}): + com = '' for text in x['raw'].splitlines(True): for word in self.word.split(): if text.find(word) > -1: - result = result+'

'+text+'

' + com = com +'

'+text+'

' break else: - result = result+'

'+text+'

' - i = mem.insert(x) - mem.update({'comment':result},eids=[i]) - rec = sorted(mem.all(),key=lambda x: x['number']) - mem.close() - return rec + com = com+'

'+text+'

' + x['comment'] = com + yield x else: - rec = table.search(query) - return sorted(rec,key=lambda x: x['number']) + for x in table.find({'$or':[{'name':element[0]},{'name':element[1]},{'name':element[2]}]}): + yield x class FooterModule(tornado.web.UIModule): def render(self,number,url,link): @@ -313,7 +285,8 @@ class FooterModule(tornado.web.UIModule): class Application(tornado.web.Application): def __init__(self): - self.db = TinyDB(st.json) + client = pymongo.MongoClient() + self.db = client['collection'] 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), @@ -323,35 +296,25 @@ class Application(tornado.web.Application): 'ui_modules':{'Footer':FooterModule}, 'cookie_secret':'bZJc2sWbQLKos6GkHn/VB9oXwQt8SOROkRvJ5/xJ89E=', 'xsrf_cookies':True, - #'debug':True, + 'debug':True, 'login_url':'/login' } tornado.web.Application.__init__(self,handlers,**settings) def gpos(self,dbname,page): - params = self.db.get(where('kinds') == 'conf') + params = self.db['params'].find_one() pos = int(page) if pos <= 0: pos = 0 - elif (pos-1)*params['count'] >= len(self.db.table(dbname)): + elif (pos-1)*params['count'] >= self.db[dbname].count(): pos = 0 return pos def collection(self,name): - for x in self.db.tables(): - if x == name: - return True + if name in self.db.collection_names(): + return True else: return False -class static(): - json = 'static/db/db.json' - bak = 'static/db/bak.json' - -st = static() app = Application() -def restart(): - pass - #app.db.close() - #app.db = TinyDB(st.json) -- 2.11.0